commit d30cb95ed12f87de23c3d9f38120623754cc5b4f Author: holger.trampe Date: Fri Jun 11 12:34:33 2021 +0200 First diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ad7ba3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +digitale agentur - README \ No newline at end of file diff --git a/adm/__init__.py b/adm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/adm/__pycache__/__init__.cpython-38.pyc b/adm/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..2b3c0e4 Binary files /dev/null and b/adm/__pycache__/__init__.cpython-38.pyc differ diff --git a/adm/__pycache__/admin.cpython-38.pyc b/adm/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..ea8a587 Binary files /dev/null and b/adm/__pycache__/admin.cpython-38.pyc differ diff --git a/adm/__pycache__/apps.cpython-38.pyc b/adm/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..ac20205 Binary files /dev/null and b/adm/__pycache__/apps.cpython-38.pyc differ diff --git a/adm/__pycache__/forms.cpython-38.pyc b/adm/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..aca5bf4 Binary files /dev/null and b/adm/__pycache__/forms.cpython-38.pyc differ diff --git a/adm/__pycache__/models.cpython-38.pyc b/adm/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..27d5f9b Binary files /dev/null and b/adm/__pycache__/models.cpython-38.pyc differ diff --git a/adm/__pycache__/urls.cpython-38.pyc b/adm/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..bf9b01d Binary files /dev/null and b/adm/__pycache__/urls.cpython-38.pyc differ diff --git a/adm/__pycache__/views.cpython-38.pyc b/adm/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..886cc32 Binary files /dev/null and b/adm/__pycache__/views.cpython-38.pyc differ diff --git a/adm/admin.py b/adm/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/adm/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/adm/apps.py b/adm/apps.py new file mode 100644 index 0000000..da47601 --- /dev/null +++ b/adm/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AdmConfig(AppConfig): + name = 'adm' diff --git a/adm/forms.py b/adm/forms.py new file mode 100644 index 0000000..aeacad6 --- /dev/null +++ b/adm/forms.py @@ -0,0 +1,57 @@ +from django import forms +from django.forms import ModelForm +from users.models import AgencyBills +from timemanagement.models import Absence, AbsenceReason, FreeDays, Workday, Breaks +from bootstrap_datepicker_plus import DatePickerInput + +class AgencyBillForm(forms.ModelForm): + + class Meta: + model = AgencyBills + fields = ['agency', 'start'] + labels = { + 'agency' : "Agentur", + 'start' : "Leistungszeitraum Start", + } + +class AdmWorkdayForm(forms.ModelForm): + + class Meta: + model = Workday + labels = { + "start" : "Start", + "end" : "Ende", + "target" : "Zielarbeitszeit", + "freefield" : "Notiz" + } + + fields = [ + "start", "end", "target", "freefield" + ] + widgets = { + 'start': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + 'end': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + } + +# ADD BREAK FORM +class AdmBreakAddForm(forms.ModelForm): + class Meta: + model = Breaks + labels = { + "start" : "Start", + "end" : "Ende" + } + + fields = [ + "start", "end" + ] + widgets = { + 'start': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + 'end': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + } + + def __init__(self, *arg, **kwargs): + super(AdmBreakAddForm, self).__init__(*arg, **kwargs) + self.fields['start'].required = True + self.fields['end'].required = True + diff --git a/adm/migrations/0001_initial.py b/adm/migrations/0001_initial.py new file mode 100644 index 0000000..69dc208 --- /dev/null +++ b/adm/migrations/0001_initial.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0 on 2020-10-09 17:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='MainStatistic', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('agencys', models.IntegerField(default=0)), + ('users', models.IntegerField(default=0)), + ('standards', models.IntegerField(default=0)), + ('chatmessages', models.IntegerField(default=0)), + ], + ), + ] diff --git a/adm/migrations/0002_mainstatistic_staticdate.py b/adm/migrations/0002_mainstatistic_staticdate.py new file mode 100644 index 0000000..f1de755 --- /dev/null +++ b/adm/migrations/0002_mainstatistic_staticdate.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0 on 2020-10-09 17:03 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('adm', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='mainstatistic', + name='staticdate', + field=models.DateField(default=django.utils.timezone.now), + ), + ] diff --git a/adm/migrations/0003_auto_20210128_0947.py b/adm/migrations/0003_auto_20210128_0947.py new file mode 100644 index 0000000..0b74dbc --- /dev/null +++ b/adm/migrations/0003_auto_20210128_0947.py @@ -0,0 +1,58 @@ +# Generated by Django 3.0 on 2021-01-28 09:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('adm', '0002_mainstatistic_staticdate'), + ] + + operations = [ + migrations.AddField( + model_name='mainstatistic', + name='absenceobjects', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='mainstatistic', + name='active_abos', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='mainstatistic', + name='agency_activerecover', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='mainstatistic', + name='agency_recoverobjects', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='mainstatistic', + name='allfiles', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='mainstatistic', + name='allfiles_storage', + field=models.FloatField(default=0.0), + ), + migrations.AddField( + model_name='mainstatistic', + name='logins', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='mainstatistic', + name='organizerobjects', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='mainstatistic', + name='user_active_timemanagement', + field=models.IntegerField(default=0), + ), + ] diff --git a/adm/migrations/0004_mainsalesmonth.py b/adm/migrations/0004_mainsalesmonth.py new file mode 100644 index 0000000..6696687 --- /dev/null +++ b/adm/migrations/0004_mainsalesmonth.py @@ -0,0 +1,22 @@ +# Generated by Django 3.0 on 2021-01-28 11:22 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('adm', '0003_auto_20210128_0947'), + ] + + operations = [ + migrations.CreateModel( + name='MainSalesMonth', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('salesmonthdate', models.DateField(default=django.utils.timezone.now)), + ('value', models.FloatField(default=0.0)), + ], + ), + ] diff --git a/adm/migrations/0005_mainstatistic_mra.py b/adm/migrations/0005_mainstatistic_mra.py new file mode 100644 index 0000000..b5c7125 --- /dev/null +++ b/adm/migrations/0005_mainstatistic_mra.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2021-02-19 10:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('adm', '0004_mainsalesmonth'), + ] + + operations = [ + migrations.AddField( + model_name='mainstatistic', + name='mra', + field=models.FloatField(default=0.0), + ), + ] diff --git a/adm/migrations/0006_auto_20210219_1025.py b/adm/migrations/0006_auto_20210219_1025.py new file mode 100644 index 0000000..f611733 --- /dev/null +++ b/adm/migrations/0006_auto_20210219_1025.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2021-02-19 10:25 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('adm', '0005_mainstatistic_mra'), + ] + + operations = [ + migrations.RenameField( + model_name='mainstatistic', + old_name='mra', + new_name='mrr', + ), + ] diff --git a/adm/migrations/0007_agblog.py b/adm/migrations/0007_agblog.py new file mode 100644 index 0000000..91b5548 --- /dev/null +++ b/adm/migrations/0007_agblog.py @@ -0,0 +1,20 @@ +# Generated by Django 3.0 on 2021-03-26 11:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('adm', '0006_auto_20210219_1025'), + ] + + operations = [ + migrations.CreateModel( + name='AGBLog', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('entry', models.CharField(default='', max_length=5000)), + ], + ), + ] diff --git a/adm/migrations/__init__.py b/adm/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/adm/migrations/__pycache__/0001_initial.cpython-38.pyc b/adm/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..af3d8c4 Binary files /dev/null and b/adm/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/adm/migrations/__pycache__/0002_mainstatistic_staticdate.cpython-38.pyc b/adm/migrations/__pycache__/0002_mainstatistic_staticdate.cpython-38.pyc new file mode 100644 index 0000000..0198389 Binary files /dev/null and b/adm/migrations/__pycache__/0002_mainstatistic_staticdate.cpython-38.pyc differ diff --git a/adm/migrations/__pycache__/0003_auto_20210128_0947.cpython-38.pyc b/adm/migrations/__pycache__/0003_auto_20210128_0947.cpython-38.pyc new file mode 100644 index 0000000..7353820 Binary files /dev/null and b/adm/migrations/__pycache__/0003_auto_20210128_0947.cpython-38.pyc differ diff --git a/adm/migrations/__pycache__/0004_mainsalesmonth.cpython-38.pyc b/adm/migrations/__pycache__/0004_mainsalesmonth.cpython-38.pyc new file mode 100644 index 0000000..e30f0e0 Binary files /dev/null and b/adm/migrations/__pycache__/0004_mainsalesmonth.cpython-38.pyc differ diff --git a/adm/migrations/__pycache__/0005_mainstatistic_mra.cpython-38.pyc b/adm/migrations/__pycache__/0005_mainstatistic_mra.cpython-38.pyc new file mode 100644 index 0000000..d2443ca Binary files /dev/null and b/adm/migrations/__pycache__/0005_mainstatistic_mra.cpython-38.pyc differ diff --git a/adm/migrations/__pycache__/0006_auto_20210219_1025.cpython-38.pyc b/adm/migrations/__pycache__/0006_auto_20210219_1025.cpython-38.pyc new file mode 100644 index 0000000..aca540f Binary files /dev/null and b/adm/migrations/__pycache__/0006_auto_20210219_1025.cpython-38.pyc differ diff --git a/adm/migrations/__pycache__/0007_agblog.cpython-38.pyc b/adm/migrations/__pycache__/0007_agblog.cpython-38.pyc new file mode 100644 index 0000000..79ee28d Binary files /dev/null and b/adm/migrations/__pycache__/0007_agblog.cpython-38.pyc differ diff --git a/adm/migrations/__pycache__/__init__.cpython-38.pyc b/adm/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..5759bd3 Binary files /dev/null and b/adm/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/adm/models.py b/adm/models.py new file mode 100644 index 0000000..60a88b1 --- /dev/null +++ b/adm/models.py @@ -0,0 +1,28 @@ +from django.db import models +from django.utils import timezone +# Create your models here. +# MAIN RECOVERDIR PASSWORD AND CONFIG +class MainStatistic(models.Model): + staticdate = models.DateField(default=timezone.now) + agencys = models.IntegerField(default=0) + users = models.IntegerField(default=0) + standards = models.IntegerField(default=0) + chatmessages = models.IntegerField(default=0) + active_abos = models.IntegerField(default=0) + absenceobjects = models.IntegerField(default=0) + user_active_timemanagement = models.IntegerField(default=0) + organizerobjects = models.IntegerField(default=0) + agency_activerecover = models.IntegerField(default=0) + agency_recoverobjects = models.IntegerField(default=0) + allfiles = models.IntegerField(default=0) + allfiles_storage = models.FloatField(default=0.0) + logins = models.IntegerField(default=0) + mrr = models.FloatField(default=0.0) + +class MainSalesMonth(models.Model): + salesmonthdate = models.DateField(default=timezone.now) + value = models.FloatField(default=0.0) + + +class AGBLog(models.Model): + entry = models.CharField(default="", max_length=5000) \ No newline at end of file diff --git a/adm/templates/adm/adm_addbill.html b/adm/templates/adm/adm_addbill.html new file mode 100644 index 0000000..7d291f4 --- /dev/null +++ b/adm/templates/adm/adm_addbill.html @@ -0,0 +1,42 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} +{% load mathfilters %} +{% load crispy_forms_tags %} +{% load humanize %} +{% load counter_tag %} +
+

Rechnung manuell erstellen

+
+Achtung! Sie sind in Begriff, eine Rechnung manuell zu erstellen! Achten Sie auf die korrekte Agentur sowie Start- und Endtermin! Prüfen Sie vor Anlagen Ihre Eingaben! +
+ +
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} + +
+ + +
+ +
+ Abbrechen + + + + +{% endblock content %} diff --git a/adm/templates/adm/adm_admdelconfirm.html b/adm/templates/adm/adm_admdelconfirm.html new file mode 100644 index 0000000..7b47108 --- /dev/null +++ b/adm/templates/adm/adm_admdelconfirm.html @@ -0,0 +1,42 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} +{% load mathfilters %} +{% load humanize %} +{% load counter_tag %} +
+

Agentur löschen + + + +

+
+Sie sind im Begriff, die Agentur {{object.name}} zu löschen! Damit werden alle Daten der Agentur unwiderruflich entfernt. Möchten Sie fortfahren? +
+Bitte bestätigen! +
+ + +
+ +
+
+ {% csrf_token %} + Abbrechen + + + + +{% endblock content %} diff --git a/adm/templates/adm/adm_agency_single.html b/adm/templates/adm/adm_agency_single.html new file mode 100644 index 0000000..46b8554 --- /dev/null +++ b/adm/templates/adm/adm_agency_single.html @@ -0,0 +1,112 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} +{% getAgencyData agency as agdata %} +
+

Agentur {{agency.name}} + + + + + +

+
+
Daten der Agentur
+ + + + + + + + + + + + + + + + +
Registriert am{{agency.registerdate|date:"d.m.Y"}} +
Nutzer{{agdata.0}}
Standards{{agdata.1}}
Bezahlstatus{% if agency.paymentstatus == 0 %} Normal {% else %}Kostenlos{% endif %}
+
+
Rechnungen (letzten drei)
+{% if bills|length == 0 %} +Es liegen keine Rechnungen vor. +{% else %} + + + + + + + + + + {% for bill in bills %} + + + + + + {% endfor %} + +
Rechnungs-Nr.DatumStatus
{{bill.billnumber}}{{bill.billdate|date:"d.m.Y"}} + {% if bill.billstatus == "open" %} {% elif bill.billstatus == "paid" %} {% endif %} +
+{% endif %} +
+
Nutzerübersicht ({{agdata.0}})
+ + + + + + + + + + + + {% for ele in users_of_agency %} + + + + + + + + {% endfor %} + +
VornameNachnameFunktionLetzter LoginOrgan. Sichtbar
{{ele.first_name}}{{ele.last_name}}{{ele.profile.func|default:""}}{{ele.last_login|date:"d.m.Y, H:i"|default:""}}{% if ele.profile.visible %} Sichtbar {% else %} Nicht sichtbar {% endif %}
+
+
+ + + +
+{% endblock content %} \ No newline at end of file diff --git a/adm/templates/adm/adm_agencys.html b/adm/templates/adm/adm_agencys.html new file mode 100644 index 0000000..45b6613 --- /dev/null +++ b/adm/templates/adm/adm_agencys.html @@ -0,0 +1,68 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} +
+

Agenturübersicht

+{% loadAboCount as abocount %} +Aktive Abos: {{abocount}} +
+ + + + + + + + + + + + {% for ele in agencys %} + {% getAgencyData ele as agdata %} + + + + + + + + {% endfor %} + +
AgenturnameRegistriert amMitarbeiterStandardsAbo
{{ele.name}}{{ele.registerdate}}{{agdata.0}}{{agdata.1}} + {% if ele.paymentplan == 1 %} + Aktiv + {% else %} + - + {% endif %} +
+
+ + +{% endblock content %} \ No newline at end of file diff --git a/adm/templates/adm/adm_base.html b/adm/templates/adm/adm_base.html new file mode 100644 index 0000000..6d03f8a --- /dev/null +++ b/adm/templates/adm/adm_base.html @@ -0,0 +1,724 @@ +{% load static %} +{% load counter_tag %} + + + + + + + + + + Digitale Agentur - Administrativer Bereich + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + +
+ + +
+ + {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} + {% block content %} + {% endblock %} +
+
 
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if request.user.profile.showtooltips %} + +{% endif %} + + + + + + diff --git a/adm/templates/adm/adm_bills.html b/adm/templates/adm/adm_bills.html new file mode 100644 index 0000000..44fc5ef --- /dev/null +++ b/adm/templates/adm/adm_bills.html @@ -0,0 +1,141 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} +{% load mathfilters %} +{% load humanize %} +{% load counter_tag %} +
+

Rechungsübersicht + +  Rechnung + +

+
+ + + + + + + + + + + + + + {% for ele in bills %} + + + + + + + + + + {% endfor %} + +
AgenturRechnungsnummerRechnungsdatumLeistung StartLeistung EndeBetragStatus
{{ele.agency.name}}{{ele.billnumber}}{{ele.billdate|date:"d.m.Y"}}{{ele.start|date:"d.m.Y"}}{{ele.end|date:"d.m.Y"}} + {% loadBillValue ele as fm %} + {% if fm != False %} + {{fm|floatformat:2|intcomma}} € + {% else %} + Fehler bei Rechnungsabfrage (ID {{ele.pk}}) + {% endif %} + + {% if ele.billstatus == "open" %} {% elif ele.billstatus == "paid" %} {% endif %} +
+
+ + +

Rechungsübersicht STORNO + +  Rechnung + +

+
+ + + + + + + + + + + + + + {% for ele in bills_storno %} + + + + + + + + + + {% endfor %} + +
AgenturRechnungsnummerRechnungsdatumLeistung StartLeistung EndeBetragStatus
{{ele.agency.name}}{{ele.billnumber}}{{ele.billdate|date:"d.m.Y"}}{{ele.start|date:"d.m.Y"}}{{ele.end|date:"d.m.Y"}} + {% loadBillValue ele as fm %} + {% if fm != False %} + {{fm|floatformat:2|intcomma}} € + {% else %} + Fehler bei Rechnungsabfrage (ID {{ele.pk}}) + {% endif %} + + {% if ele.billstatus == "open" %} {% elif ele.billstatus == "paid" %} {% endif %} +
+
+ +{% endblock content %} \ No newline at end of file diff --git a/adm/templates/adm/adm_break_add.html b/adm/templates/adm/adm_break_add.html new file mode 100644 index 0000000..955b310 --- /dev/null +++ b/adm/templates/adm/adm_break_add.html @@ -0,0 +1,22 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% if request.user.profile.agency.module_timemanagement %} +
+ +

Zum Arbeitstag am {{workday.start|date:"d.m.Y"}} Pause hinzufügen

+
+
+
+ {% csrf_token %} + {{form.media}} + {{form}} + +
+ Abbrechen + +
+
+ +{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/adm/templates/adm/adm_break_delete.html b/adm/templates/adm/adm_break_delete.html new file mode 100644 index 0000000..4cfa48c --- /dev/null +++ b/adm/templates/adm/adm_break_delete.html @@ -0,0 +1,13 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load crispy_forms_tags %} +
+

Pause des Arbeitstags von {{object.user.get_full_name}} am {{object.workday.start|date:"d.m.Y"}} löschen?

+
+
+ {% csrf_token %} +

Achtung! Das Löschen kann nicht rückgängig gemacht werden. Die Pause von {{object.start|date:"H:i"}} bis {{object.end|date:"H:i"}} wird entfernt!

+Abbrechen + +
+{% endblock content %} diff --git a/adm/templates/adm/adm_main.html b/adm/templates/adm/adm_main.html new file mode 100644 index 0000000..04ce1a4 --- /dev/null +++ b/adm/templates/adm/adm_main.html @@ -0,0 +1,228 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} +{% load humanize %} +{% load mathfilters %} +
+{% if statistik|length > 0 %} +{% getlaststat as statistik_last %} +

Statistik vom {{statistik.0.staticdate|date:"d.m.Y"}} bis {{statistik_last.staticdate|date:"d.m.Y"}} +

+{% else %} +

Statisk noch nicht begonnen

+{% endif %} +
+
+ +
+
+{% getMRR as finalmrr %} +
MRR: {{finalmrr|floatformat:2|intcomma}} €
+
+
Monatliche Umsätze
+ + + + + + {% for m in money %} + + + + + {% endfor %} +
MonatUmsatz
+ {{m.salesmonthdate|date:"m/Y"}} + + {{m.value}} € +
+ + +
+
Zahlenübersicht stand jetzt
+ + + + + + + + + + + + + +
Agenturen{{agencycount}}
Nutzer{{usercount}}
Standards{{standardcount}}
+ + + + +
+Bestellungen der Notfallhilfe als CSV herunterladen +
+ + +{% endblock content %} diff --git a/adm/templates/adm/adm_user_single.html b/adm/templates/adm/adm_user_single.html new file mode 100644 index 0000000..277139c --- /dev/null +++ b/adm/templates/adm/adm_user_single.html @@ -0,0 +1,347 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} + +
+
+
+ +
+
+

{{userdata.get_full_name}} aus {{userdata.profile.agency.name}}

+ + + + + + + + + + + + + +
Name{{userdata.get_full_name}}
E-Mail{{userdata.email}}
Letzter Login{{userdata.last_login|default:"-"}}
+
+
+
+ + + +
+ + +{% endblock content %} \ No newline at end of file diff --git a/adm/templates/adm/adm_users.html b/adm/templates/adm/adm_users.html new file mode 100644 index 0000000..0bacee5 --- /dev/null +++ b/adm/templates/adm/adm_users.html @@ -0,0 +1,49 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load adm_tags %} +
+

Nutzerübersicht ({{users|length}})

+
+ + + + + + + + + + {% for ele in users %} + + + + + + {% endfor %} + +
NameE-MailAgentur
{{ele.get_full_name}}{{ele.email}}{{ele.profile.agency.name}}
+
+ +{% endblock content %} \ No newline at end of file diff --git a/adm/templates/adm/adm_workday_add.html b/adm/templates/adm/adm_workday_add.html new file mode 100644 index 0000000..44b77b9 --- /dev/null +++ b/adm/templates/adm/adm_workday_add.html @@ -0,0 +1,23 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% if request.user.profile.agency.module_timemanagement %} +
+ +

Arbeitstag für {{user.get_full_name}} erstellen

+
+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} + +
+ + Abbrechen + +
+
+ +{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/adm/templates/adm/adm_workday_delete.html b/adm/templates/adm/adm_workday_delete.html new file mode 100644 index 0000000..a7092fa --- /dev/null +++ b/adm/templates/adm/adm_workday_delete.html @@ -0,0 +1,13 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load crispy_forms_tags %} +
+

Arbeitstag von {{object.user.get_full_name}} am {{object.start|date:"d.m.Y"}} löschen?

+
+
+ {% csrf_token %} +

Achtung! Das Löschen kann nicht rückgängig gemacht werden. Der komplette Arbeitstag wird entfernt!

+Abbrechen + +
+{% endblock content %} diff --git a/adm/templates/adm/adm_workday_update.html b/adm/templates/adm/adm_workday_update.html new file mode 100644 index 0000000..b444a52 --- /dev/null +++ b/adm/templates/adm/adm_workday_update.html @@ -0,0 +1,67 @@ +{% extends "adm/adm_base.html" %} +{% block content %} +{% load crispy_forms_tags %} +
+

Arbeitstag von {{object.user.get_full_name}} am {{object.start|date:"d.m.Y"}} aktualisieren

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+
Pausen
++ Pause

+{% if object.breaks.all|length > 0 %} + + + + + + + + + + + {% for break in object.breaks.all %} + + + + + + + {% endfor %} + +
StartEnde
{{forloop.counter}}{{break.start|date:"H:i"}}{{break.end|date:"H:i"}}
+ +{% else %} +

Arbeitstag hat keine Pausen

+{% endif %} + + +Abbrechen + +
+ +{% endblock content %} diff --git a/adm/templatetags/__init__.py b/adm/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/adm/templatetags/__pycache__/__init__.cpython-38.pyc b/adm/templatetags/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..2f586fb Binary files /dev/null and b/adm/templatetags/__pycache__/__init__.cpython-38.pyc differ diff --git a/adm/templatetags/__pycache__/adm_tags.cpython-38.pyc b/adm/templatetags/__pycache__/adm_tags.cpython-38.pyc new file mode 100644 index 0000000..2f3a5ee Binary files /dev/null and b/adm/templatetags/__pycache__/adm_tags.cpython-38.pyc differ diff --git a/adm/templatetags/adm_tags.py b/adm/templatetags/adm_tags.py new file mode 100644 index 0000000..25bc2b8 --- /dev/null +++ b/adm/templatetags/adm_tags.py @@ -0,0 +1,95 @@ +from django import template +from django.contrib.auth.models import Group, User +from users.models import AgencyGroup, Agency, AgencyNetwork, AgencyNetworkPreperation, UserTime, UserYearAbsenceInfo +from standards.models import Standards, StandardCommentRate, StandardComments +from timemanagement.models import Workday, FreeDays, Absence +from message.models import Message +import os +from django.conf import settings +from django.utils import timezone +from datetime import date +import datetime +from adm.models import MainStatistic +register = template.Library() +import requests +from django.conf import settings +import json +''' + + Agenturdaten zurückgeben + + TASK: Hier noch mehr Datenfelder über die Agentur hinzunehmen, bei Bedarf + +''' +@register.simple_tag +def getAgencyData(ele): + data = [0,1] + data[0] = len(User.objects.filter(profile__agency=ele)) + data[1] = len(Standards.objects.filter(agency=ele)) + return data + +# Gibt den letzten Statisk-Datensatz zurück +@register.simple_tag +def getlaststat(): + return MainStatistic.objects.all().order_by("-staticdate")[:1][0] + +# Gibt die AgencyGroup anhand einer Gruppe zurück +@register.simple_tag +def getAgencyGroupName(group): + try: + return AgencyGroup.objects.get(group=group) + except: + return "Nicht gefunden" + +@register.simple_tag +def loadAboCount(): + return len(Agency.objects.filter(paymentplan=1)) + +# Return Bill-Value with Tax +@register.simple_tag +def loadBillValue(bill): + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + lexdata = { + "renderType" : "pdf" + } + + json_data = json.dumps(lexdata) + + returnvalue = False + try: + r_final = requests.get("https://api.lexoffice.io/v1/invoices/"+bill.lexid, data=json_data, headers=headers) + billdata = json.loads(r_final.text) + returnvalue = billdata['totalPrice']['totalGrossAmount'] + except: + pass + + return returnvalue + +''' + + Hier wird der aktuelle Umsatz berechnet anhand Abos und Mitarbeiterzahlen + +''' +@register.simple_tag +def getMRR(): + # Berechnung das MRR + finalmrr = 0 + allag_withabo = Agency.objects.filter(paymentplan=1) + abos = len(allag_withabo) * 21 + extrausercount = 0 + for ag in allag_withabo: + user_ag = User.objects.filter(profile__agency=ag) + if len(user_ag) > 3: + extrausercount += len(user_ag) - 3 + finalmrr = abos + 3*extrausercount + + return finalmrr + + + + diff --git a/adm/tests.py b/adm/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/adm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/adm/urls.py b/adm/urls.py new file mode 100644 index 0000000..2f0acda --- /dev/null +++ b/adm/urls.py @@ -0,0 +1,26 @@ +from django.urls import path +from .views import * +from django.contrib.auth.decorators import login_required, permission_required +from django.contrib.admin.views.decorators import staff_member_required + +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('', AdmMain.as_view(), name='adm-main'), + path('ag/', AdmAgencys.as_view(), name="adm-agencys"), + path('us/', AdmUsers.as_view(), name="adm-users"), + path('agsingle/', AdmAgencySingle.as_view(), name="adm-agency-single"), + path('ad/del/', delAgency.as_view(), name='adm-agency-delete'), + path('ag/bills/', AdmBills.as_view(), name="adm-bills"), + path('usersingle/', AdmUserSingle.as_view(), name="adm-user-single"), + path('cron/', statisticCronJob, name="adm-cron"), + path('getorders/', getCSVRDOrders, name="getorders"), + path('adm/addbill', AdmAddBill.as_view(), name="admbill-add"), + path('wd//update', AdmWorkdayUpdate.as_view(), name="adm-workday-update"), + path('wd/add/', AdmWorkdayAdd.as_view(), name="adm-workday-add"), + path('wd//delete', AdmWorkdayDelete.as_view(), name="adm-workday-delete"), + path('wd/break//delete', AdmBreakDelete.as_view(), name="adm-break-delete"), + path('wd//break/add', AdmAddBreak.as_view(), name="adm-break-add"), +] diff --git a/adm/views.py b/adm/views.py new file mode 100644 index 0000000..684f999 --- /dev/null +++ b/adm/views.py @@ -0,0 +1,679 @@ +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView, FormView, TemplateView +from django.contrib import messages +from django.shortcuts import render, redirect, reverse +from django.urls import reverse_lazy +from django.conf import settings +from django.http import HttpResponseRedirect,HttpResponse, JsonResponse +from .models import MainStatistic, MainSalesMonth +from django.contrib.auth.models import User +from chat.models import ChatMessage +from users.models import Agency, AgencyBills, RegNotfallhilfe +from standards.models import Standards +import csv, os +from auditlog.models import LogEntry +import json +from users.models import UserYearAbsenceInfo, UserTime +from timemanagement.models import Workday, Absence, Breaks +from recoverdir.models import * +from .forms import AgencyBillForm, AdmWorkdayForm, AdmBreakAddForm +from datetime import date, timedelta, datetime +from organizer.models import QuickLinks, AGContacts, AGPassword +from django.core.mail import EmailMessage +from django.core.mail import EmailMultiAlternatives +import io as BytesIO +import base64 +from django.http import HttpResponse +from dateutil.relativedelta import * +import requests +from django.template.loader import render_to_string +from cloud.models import DataFile +import math +import requests +''' +Prüfung, ob angemeldeter User Mitarbeiterstatus hat. IMMER PER DISPATCH EINBAUEN! +''' +def checkForStuffUser(request): + if request.user.is_staff: + return True + else: + return False + +''' + + CSV mit Bestellungen herunterladen + +''' +def getCSVRDOrders(request): + if(request.method == "GET"): + + response = HttpResponse(content_type='text/csv') + + today = date.today() + + response['Content-Disposition'] = 'attachment; charset=UTF-8; filename="DA-Export_NF_Bestellungen_' + str(today.day) + '_'+ str(today.month)+'_'+ str(today.year)+'.csv"' + + writer = csv.writer(response) + writer.writerow(['Datum', 'E-Mail', 'Name', 'Personalnummer', 'mitgliedsnummer', 'PLZ', 'Stadt', 'Strasse', 'Rabatt']) + orders = RegNotfallhilfe.objects.filter(wassend=False) + + for order in orders: + rabatt = "NEIN" + if order.rabatt: + rabatt = "JA" + writer.writerow([str(order.orderdate),str(order.mail),str(order.name),str(order.persnumber),str(order.mitgliedsnummer),str(order.plz), str(order.stadt),str(order.street), rabatt ]) + order.wassend = True + order.save() + return response + else: + pass + + +class delAgency(DeleteView): + model = Agency + success_url = reverse_lazy("adm-agencys") + template_name = "adm/adm_admdelconfirm.html" + + def delete(self, *args, **kwargs): + # Alle Abwesenheiten werden entfernt und dann erst die Agentur + Absence.objects.filter(agency=self.get_object().pk).all().delete() + + messages.success(self.request, f'Agentur erfolgreich gelöscht!') + return super(delAgency, self).delete(*args, **kwargs) + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + +''' +Hauptansicht Statisik +''' +class AdmMain(TemplateView): + template_name = "adm/adm_main.html" + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context.update({'active_link' : "adm-statistic"}) + + context.update({'statistik' : MainStatistic.objects.all().order_by('staticdate') }) + context.update({ + "agencycount" : len(Agency.objects.all()), + "usercount" : len(User.objects.all().exclude(is_staff=True, is_superuser=True)), + "standardcount" : len(Standards.objects.all()), + "chatmessagescount" : len(ChatMessage.objects.all()), + "money" : MainSalesMonth.objects.all(), + }) + return context + +''' + +Gesatmübersicht aller Rechnungen + +''' +class AdmBills(TemplateView): + + template_name = "adm/adm_bills.html" + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context.update({'active_link' : "adm-bills"}) + context.update({'bills' : AgencyBills.objects.all().exclude(billstatus="voided")}) + context.update({'bills_storno' : AgencyBills.objects.filter(billstatus="voided")}) + return context + + +''' +Erstellen einer neuen Rechnung +''' +class AdmAddBill(CreateView): + template_name = "adm/adm_addbill.html" + model = AgencyBills + success_url = reverse_lazy('adm-bills') + form_class = AgencyBillForm + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + + def form_valid(self, form): + + today = date.today() + + agency = form.cleaned_data['agency'] + + # USERCOUNT BERECHNEN + usercount = len(User.objects.filter(profile__agency=agency)) + + if(usercount < 4): + usercount = 0 + else: + usercount = usercount - 3 + + # HEADERS CURL + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + plan = 1 + + start_date = form.cleaned_data["start"] + start_date_string = start_date.strftime("%d.%m.%Y") + end_date = start_date + relativedelta(months=1) + end_date = end_date - relativedelta(days=1) + end_date_string= end_date.strftime("%d.%m.%Y") + + # Rechnungsdatum passt ja + voucher_date_today = date.today().strftime("%Y-%m-%d") + + monthword = "Monat" + + lexdata = { + "voucherDate": voucher_date_today + "T00:00:00.000+00:00", + "address" : { + "name" : agency.name, + "street": agency.street, + "zip": agency.plz, + "city": agency.city, + "countryCode" : "DE" + }, + "totalPrice" : { + "currency" : "EUR", + }, + "lineItems" : [ + { + "type" : "custom", + "name" : "Digitale Agentur: Grundbetrag für " + str(plan) + " " + monthword, + "quantity" : 1, + "unitName" : "Stück", + "description" : "Zeitraum " + start_date_string + " - " + end_date_string, + "unitPrice" : + { + "currency" : "EUR", + "netAmount" : 21.00, + "taxRatePercentage" : 19 + }, + }, + { + "type" : "custom", + "name" : "Digitale Agentur: Zusätzliche Nutzer", + "description" : "Zeitraum " + start_date_string + " - " + end_date_string, + "quantity" : usercount, + "unitName" : "Stück", + "unitPrice" : + { + "currency" : "EUR", + "netAmount" : 3, + "taxRatePercentage" : 19 + }, + } + ], + "taxConditions": { + "taxType": "net" + }, + #"paymentConditions": { + # "paymentTermLabel": "Bitte zahlen Sie innerhalb von 14 Tagen.", + # "paymentTermDuration": 14, + #}, + "shippingConditions": { + #"shippingDate": voucher_date_today + "T00:00:00.000+00:00", + "shippingType": "none" + } + } + json_data = json.dumps(lexdata) + # WIEDER RAUSNEHMEN + # NEUE RECHNUNG ALs ENTWURF + + #r = requests.post("https://api.lexoffice.io/v1/invoices/", data=json_data, headers=headers) + # RICHTIGE RECHNUNG + r = requests.post("https://api.lexoffice.io/v1/invoices/?finalize=true", data=json_data, headers=headers) + + if(r.status_code == 201): + + response_text = json.loads(r.text) + newbill_id = response_text["id"] + + # OrganizationId berechnen, wenn noch nicht gesetzt + r = requests.get("https://api.lexoffice.io/v1/invoices/" + response_text["id"], data=json_data, headers=headers) + response_text = json.loads(r.text) + + form.instance.agency = agency + form.instance.lexid = newbill_id + form.instance.agency = agency + form.instance.billtype="invoice" + form.instance.billnumber = response_text["voucherNumber"] + form.instance.billstatus = response_text["voucherStatus"] + form.instance.start = start_date + form.instance.end = end_date + form.instance.plan = plan + form.instance.usercount = usercount + #newbill = AgencyBills(agency=agency, lexid=newbill_id, billtype="invoice", billnumber=response_text["voucherNumber"], billstatus=response_text["voucherStatus"], start=start_date, end=end_date, plan=plan, usercount=usercount) + form.save() + + mail_to_send = "" + if(agency.payment_address == None): + mail_to_send = agency.agency_email + else: + mail_to_send = agency.payment_address + + + + # BCC Mail with Object - NICHT DEN IMPORT VERGESSEN!!! + email = EmailMultiAlternatives( + 'Digitale Agentur | Rechnung ' + str(response_text["voucherNumber"]), + 'Sehr geehrte Nutzer, hiermit erhalten Sie eine neue Rechnung für die Digitale Agentur. Ihr Team der Digitalen Agentur', + 'noreply@digitale-agentur.com', + [mail_to_send], + ['info@digitale-agentur.com'], + headers={}, + ) + + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + lexdata = { + "renderType" : "pdf" + } + + json_data = json.dumps(lexdata) + + r_final = requests.get("https://api.lexoffice.io/v1/invoices/"+newbill_id+"/document", data=json_data, headers=headers) + json.loads(r_final.text) + + base64String = requests.get("https://api.lexoffice.io/v1/files/"+json.loads(r_final.text)["documentFileId"]+"/", data=json_data, headers=headers) + + content = base64.b64decode(base64String.text) + + msg_html = render_to_string('users/newbill_mail.html', {}) + email.attach_alternative(msg_html, "text/html") + email.attach('Rechnung_' + str(response_text["voucherNumber"]) + '.pdf', content, "application/pdf") + email.send() + + return super(AdmAddBill, self).form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context.update({'active_link' : "adm-agencys"}) + + #context.update({'agencys' : Agency.objects.all()}) + + return context + + +''' +Gesamtansicht der Agenturen +''' +class AdmAgencys(TemplateView): + template_name = "adm/adm_agencys.html" + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context.update({'active_link' : "adm-agencys"}) + + context.update({'agencys' : Agency.objects.all()}) + + return context + + +class AdmUsers(TemplateView): + template_name = "adm/adm_users.html" + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + context.update({'active_link' : "adm-users"}) + + context.update({'users' : User.objects.all().exclude(is_staff=True, is_superuser=True)}) + + return context + +''' +Einzelansicht der Agenturen +''' +class AdmAgencySingle(TemplateView): + template_name = "adm/adm_agency_single.html" + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : "adm-agencys"}) + context.update({'agency' : Agency.objects.get(pk=kwargs['agpk'])}) + context.update({'bills' : AgencyBills.objects.filter(agency=Agency.objects.get(pk=kwargs['agpk'])).order_by('-billdate')[:3]}) + context.update({'users_of_agency' : User.objects.filter(profile__agency=Agency.objects.get(pk=kwargs['agpk'])).order_by('-last_name')}) + return context + +class AdmUserSingle(TemplateView): + template_name = "adm/adm_user_single.html" + + def dispatch(self, *args, **kwargs): + if(checkForStuffUser(self.request)): + return super().dispatch(*args, **kwargs) + else: + messages.warning(self.request, f'Sie benötigen einen Mitarbeiter-Account, um diese Seiten aufzurufen!') + return redirect("login") + + def get_context_data(self, **kwargs): + + userrequested = User.objects.get(pk=kwargs['uspk']) + + context = super().get_context_data(**kwargs) + context.update({'active_link' : "adm-users"}) + context.update({'userdata' : userrequested}) + + # Loading Logindata + logdata = LogEntry.objects.filter(object_pk=kwargs['uspk'])[:50] + + logdata_logins = [] + + for ele in reversed(logdata): + try: + datestring = json.loads(ele.changes)["last_login"][1] + + datestring = datestring.split(".")[0] + logdata_logins.append(datetime.strptime(datestring, '%Y-%m-%d %H:%M:%S')) + except: + pass + + context.update({'logdata' : logdata_logins}) + + context.update({'workdays' : Workday.objects.filter(user=userrequested)}) + context.update({'absences' : Absence.objects.filter(user=userrequested)}) + context.update({'yearinfo' : UserYearAbsenceInfo.objects.filter(user=userrequested)}) + context.update({'usertimedata' : UserTime.objects.get(user=userrequested)}) + return context + + + +# CRONJOB, um die Statistik zu füllen! +def statisticCronJob(request, code): + data = {} + + if(code == settings.CRONAPIKEY_STATSTIC): + print("STATISTIC is running...") + today = date.today() + ''' + + = models.FloatField(default=0.0) + logins = models.IntegerField(default=0) + ''' + # AGENCYS + agencycount = len(Agency.objects.all()) + # USERS + usercount = len(User.objects.all().exclude(is_staff=True, is_superuser=True)) + # STANDARDS + standardcount = len(Standards.objects.all()) + # CHATMESSAGES + chatmesscount = len(ChatMessage.objects.all()) + # ABOCOUNT + abocount = len(Agency.objects.filter(paymentplan=1)) + # ABSENCE OBJECTS + absenceobjects = len(Absence.objects.all()) + # USER WITH TIMEMANAGEMENT + user_active_timemanagement = len(User.objects.filter(usertime__usetime=True)) + # ORGANIZEROBJECTS + organizerobjects = len(QuickLinks.objects.all()) + len(AGContacts.objects.all()) + len(AGPassword.objects.all()) + # AGENCY WITH RECOVERPASS + agency_activerecover = 0 + agency_activerecover_all = RecoverDirSetting.objects.all() + for re in agency_activerecover_all: + if len(re.logpass) > 0: + agency_activerecover += 1 + + # FILES + ''' + TODO: Hier bitte einmal checken, ob umbenannte Dateien auch gefunden werden können oder nicht + ''' + allfiles = 0 + try: + files_data = DataFile.objects.all() + allfiles = len(files_data) + # FILE SOTRAGE + allfiles_storage = 0.0 + for f in files_data: + allfiles_storage += os.stat(f.file.path).st_size + except: + pass + + # LOGINS YESTERDAY + yesterday = today - timedelta(days=1) + logins = 0 + for u in User.objects.all(): + try: + logdata = list(LogEntry.objects.filter(object_pk=u.pk)[:1])[0] + datestring = json.loads(logdata.changes)["last_login"][1] + datestring = datestring.split(".")[0] + logdate = datetime.strptime(datestring, '%Y-%m-%d %H:%M:%S') + logdate = logdate.date() + if logdate == yesterday: + logins += 1 + except: + pass + + # RECOVEROBJECTS + agency_recoverobjects = len(PersLetter.objects.all()) + len(Handlungsleitfaden.objects.all()) + len(RDContact.objects.all()) + len(RDTrustPerson.objects.all()) + len(Documents.objects.all()) + len(HandlungsleitfadenVF.objects.all()) + len(DepositVollmacht.objects.all()) + len(ErgoVerDir.objects.all()) + len(OnlineBank.objects.all()) + len(StreamingAbo.objects.all()) + len(DigitalAccounts.objects.all()) + len(Personal.objects.all()) + len(RDContract.objects.all()) + len(RDElse.objects.all()) + + # COUNT INVOICES WHEN FIRST DAY OF MONTH + lastmonth = today - timedelta(days=today.day) + monthvalue = 0.0 + if today.day == 1: + for bill in AgencyBills.objects.filter(billdate__month=lastmonth.month): + + newvalue = getLexOfficeBill(bill.lexid) + if newvalue != False: + monthvalue += newvalue + + nm = MainSalesMonth(value=monthvalue, salesmonthdate=lastmonth) + nm.save() + + + # Monatlicher MRR + finalrma = 0 + allag_withabo = Agency.objects.filter(paymentplan=1) + abos = len(allag_withabo) * 21 + extrausercount = 0 + for ag in allag_withabo: + user_ag = User.objects.filter(profile__agency=ag) + if len(user_ag) > 3: + extrausercount += len(user_ag) - 3 + finalmrr = abos + 3*extrausercount + + newMainS = MainStatistic(agencys=agencycount,users=usercount,standards=standardcount,chatmessages=chatmesscount, active_abos=abocount, absenceobjects=absenceobjects, user_active_timemanagement=user_active_timemanagement, organizerobjects=organizerobjects, agency_recoverobjects=agency_recoverobjects, allfiles=allfiles, allfiles_storage=allfiles_storage, logins=logins, mrr=finalmrr) + newMainS.save() + data.update({"status" : "success"}) + else: + print("API STATISTIC CODE FAILED") + data.update({"status" : "failed"}) + return JsonResponse(data) + +# Return an Tax-Free Value of bill +def getLexOfficeBill(billid): + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + lexdata = { + "renderType" : "pdf" + } + + json_data = json.dumps(lexdata) + + returnvalue = False + try: + r_final = requests.get("https://api.lexoffice.io/v1/invoices/"+billid, data=json_data, headers=headers) + billdata = json.loads(r_final.text) + returnvalue = billdata['totalPrice']['totalNetAmount'] + except: + pass + + return returnvalue + +def convert_size(size_bytes): + if size_bytes == 0: + return "0B" + size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") + i = int(math.floor(math.log(size_bytes, 1024))) + p = math.pow(1024, i) + s = round(size_bytes / p, 2) + return "%s %s" % (s, size_name[i]) + + + + +''' WORKDAY VIEWS + + Hier sind alle Views für Arbeitstage und Pausen (Create, Update, Delete) + +''' + +class AdmWorkdayAdd(CreateView): + model = Workday + template_name = "adm/adm_workday_add.html" + form_class = AdmWorkdayForm + + def form_valid(self, form): + wd_user = User.objects.get(pk=self.kwargs['uspk']) + wd = Workday(user=wd_user, agency=wd_user.profile.agency, start=form.cleaned_data['start'], end=form.cleaned_data['end'], target=form.cleaned_data["target"], freefield=form.cleaned_data["freefield"]) + wd.save() + return HttpResponseRedirect(self.get_success_url()) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'adm-users'}) + context.update({'user' : User.objects.get(pk=self.kwargs['uspk'])}) + return context + + def get_success_url(self): + return reverse('adm-user-single', kwargs={'uspk': self.kwargs['uspk']}) + + + +class AdmWorkdayUpdate(UpdateView): + model = Workday + form_class = AdmWorkdayForm + template_name = "adm/adm_workday_update.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'adm-users'}) + return context + + def get_success_url(self): + return reverse('adm-user-single', kwargs={'uspk': self.get_object().user.pk}) + + +class AdmWorkdayDelete(DeleteView): + model = Workday + template_name = "adm/adm_workday_delete.html" + + def get_success_url(self): + return reverse('adm-user-single', kwargs={'uspk': self.get_object().user.pk}) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'adm-users'}) + return context + + + +class AdmBreakDelete(DeleteView): + model = Breaks + template_name = "adm/adm_break_delete.html" + + def get_success_url(self): + return reverse('adm-workday-update', kwargs={'pk': self.get_object().workday.pk}) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'adm-users'}) + return context + + + +class AdmAddBreak(CreateView): + model = Breaks + template_name = "adm/adm_break_add.html" + form_class = AdmBreakAddForm + + def form_valid(self, form): + wd = Workday.objects.get(pk=self.kwargs['pk']) + b = Breaks(user=wd.user, agency=wd.user.profile.agency, workday=wd, start=form.cleaned_data["start"], end=form.cleaned_data["end"]) + b.save() + wd.breaks.add(b) + wd.save() + return HttpResponseRedirect(self.get_success_url()) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'adm-users'}) + context.update({'workday' : Workday.objects.get(pk=self.kwargs['pk'])}) + return context + + def get_success_url(self): + return reverse('adm-workday-update', kwargs={'pk': self.kwargs['pk']}) + + + + + + + + + + + + + + + + diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/__pycache__/__init__.cpython-38.pyc b/api/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..8f070bf Binary files /dev/null and b/api/__pycache__/__init__.cpython-38.pyc differ diff --git a/api/__pycache__/serializers.cpython-38.pyc b/api/__pycache__/serializers.cpython-38.pyc new file mode 100644 index 0000000..8209f50 Binary files /dev/null and b/api/__pycache__/serializers.cpython-38.pyc differ diff --git a/api/__pycache__/urls.cpython-38.pyc b/api/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..e700c6f Binary files /dev/null and b/api/__pycache__/urls.cpython-38.pyc differ diff --git a/api/__pycache__/views.cpython-38.pyc b/api/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..96f2a99 Binary files /dev/null and b/api/__pycache__/views.cpython-38.pyc differ diff --git a/api/admin.py b/api/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/api/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/api/apps.py b/api/apps.py new file mode 100644 index 0000000..d87006d --- /dev/null +++ b/api/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + name = 'api' diff --git a/api/migrations/__init__.py b/api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/models.py b/api/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/api/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/api/serializers.py b/api/serializers.py new file mode 100644 index 0000000..3975105 --- /dev/null +++ b/api/serializers.py @@ -0,0 +1,54 @@ +from django.contrib.auth.models import User +from rest_framework import serializers +from rest_framework.validators import UniqueTogetherValidator +from standards.models import Standards +from chat.models import ChatRoom, ChatMessage + +class StandardsSerializer(serializers.ModelSerializer): + + username = serializers.SerializerMethodField('getCreatedByUser') + last_modified_on = serializers.SerializerMethodField('getFormatedLastModified') + + class Meta: + model = Standards + fields = ["id", "name", "last_modified_on", "username", "content"] + + def getCreatedByUser(self, standard): + return standard.created_standard_by.first_name + " " + standard.created_standard_by.first_name + + def getFormatedLastModified(self, standard): + return standard.last_modified_on.strftime("%d.%m.%Y %H:%M") + + +class ChatRoomSerializer(serializers.ModelSerializer): + + class Meta: + model = ChatRoom + fields = ["id", "roomname", "roomname_channel"] + +class ChatMessageSerializer(serializers.ModelSerializer): + sendtime = serializers.SerializerMethodField('getFormatedMessageTimeStarted') + + class Meta: + model = ChatMessage + fields = ["author", "content", "sendtime"] + + +class ChatRoomFullSerializer(serializers.ModelSerializer): + + chatroom_createddate = serializers.SerializerMethodField('getFormatedChatStarted') + #messages = ChatMessageSerializer(many=True) + + class Meta: + model = ChatRoom + fields = ["id", "roomname", "roomname_channel", "chatroom_createddate", "chatmembers", "chatmember_single","messages", "creator"] + depth = 2 + + def getFormatedChatStarted(self, chatroom): + return chatroom.chatroom_createddate.strftime("%d.%m.%Y %H:%M") + + + + + + \ No newline at end of file diff --git a/api/tests.py b/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/api/urls.py b/api/urls.py new file mode 100644 index 0000000..987d2ed --- /dev/null +++ b/api/urls.py @@ -0,0 +1,14 @@ +from django.urls import path +from .views import GetUserId +from . import views + +app_name = 'api' +urlpatterns = [ + path('getuserid/', GetUserId.as_view(), name='api-getuserid'), + path('getstandards/', views.getStandardList, name='api-getstandards'), + path('getsinglestandard/', views.getSingleStandard, name='api-getsinglestandards'), + path('logout/', views.logoutByToken, name='api-logout'), + path('getchatrooms/', views.getchatrooms, name='api-getchatrooms'), + path('getsinglechat/', views.getsinglechat, name='api-getsinglechat'), + path('chatnewmessage/', views.savenewchatmessage, name='api-savechatmessage'), +] \ No newline at end of file diff --git a/api/views.py b/api/views.py new file mode 100644 index 0000000..a7037f8 --- /dev/null +++ b/api/views.py @@ -0,0 +1,77 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework.permissions import IsAuthenticated # <-- Here +import json +from standards.models import Standards +from rest_framework import serializers +from .serializers import StandardsSerializer, ChatRoomSerializer, ChatRoomFullSerializer +from rest_framework.decorators import api_view, permission_classes +from rest_framework import status +from rest_framework.authentication import SessionAuthentication, BasicAuthentication, TokenAuthentication +from rest_framework.decorators import authentication_classes +from chat.models import ChatRoom, ChatMessage +from django.http import HttpResponseRedirect,HttpResponse, JsonResponse + +from timemanagement.models import Absence + +class GetUserId(APIView): + permission_classes = (IsAuthenticated,) # <-- And here + + def post(self, request): + return Response({"userid" : self.request.user.pk}) + + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def getStandardList(request): + standards = Standards.objects.filter(agency=request.user.profile.agency) + ser = StandardsSerializer(standards, many=True) + return Response(ser.data, status=status.HTTP_200_OK) + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def getSingleStandard(request, pk): + standard = Standards.objects.get(pk=int(pk)) + ser = StandardsSerializer(standard, many=False) + return Response(ser.data, status=status.HTTP_200_OK) + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def logoutByToken(request): + print(request) + request.user.auth_token.delete() + return Response(status=status.HTTP_200_OK) + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def getchatrooms(request): + chatrooms = ChatRoom.objects.filter(creator=request.user) | ChatRoom.objects.filter(chatmember_single=request.user) + chatrooms_ser = ChatRoomSerializer(chatrooms, many=True) + return Response(chatrooms_ser.data, status=status.HTTP_200_OK) + + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def getsinglechat(request, pk): + chatroom = ChatRoom.objects.get(pk=pk) + if chatroom.creator == request.user or chatroom.chatmember_single == request.user or (request.user in chatroom.chatmembers.all()): + chatroom_ser = ChatRoomFullSerializer(chatroom, many=False) + return Response(chatroom_ser.data, status=status.HTTP_200_OK) + else: + return Response(status=status.HTTP_403_FORBIDDEN) + + +@api_view(['POST', ]) +@permission_classes((IsAuthenticated,)) +def savenewchatmessage(request): + room = ChatRoom.objects.get(pk=request.POST["room"]) + if(request.user == room.creator or request.user == room.chatmember_single): + newmessage = ChatMessage(room=room, author=request.user, content=request.POST["message"]) + newmessage.save() + room.messages.add(newmessage) + room.save() + return Response(status=status.HTTP_200_OK) + else: + return Response(status=status.HTTP_403_FORBIDDEN) + + diff --git a/areas/__init__.py b/areas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/areas/__pycache__/__init__.cpython-38.pyc b/areas/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..b704cf4 Binary files /dev/null and b/areas/__pycache__/__init__.cpython-38.pyc differ diff --git a/areas/__pycache__/admin.cpython-38.pyc b/areas/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..733f848 Binary files /dev/null and b/areas/__pycache__/admin.cpython-38.pyc differ diff --git a/areas/__pycache__/apps.cpython-38.pyc b/areas/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..99e866d Binary files /dev/null and b/areas/__pycache__/apps.cpython-38.pyc differ diff --git a/areas/__pycache__/forms.cpython-38.pyc b/areas/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..cf1f501 Binary files /dev/null and b/areas/__pycache__/forms.cpython-38.pyc differ diff --git a/areas/__pycache__/models.cpython-38.pyc b/areas/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..40c7615 Binary files /dev/null and b/areas/__pycache__/models.cpython-38.pyc differ diff --git a/areas/__pycache__/urls.cpython-38.pyc b/areas/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..f2b5377 Binary files /dev/null and b/areas/__pycache__/urls.cpython-38.pyc differ diff --git a/areas/__pycache__/views.cpython-38.pyc b/areas/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..2de919d Binary files /dev/null and b/areas/__pycache__/views.cpython-38.pyc differ diff --git a/areas/admin.py b/areas/admin.py new file mode 100644 index 0000000..51b6303 --- /dev/null +++ b/areas/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import Areas + +# Register your models here. +admin.site.register(Areas) \ No newline at end of file diff --git a/areas/apps.py b/areas/apps.py new file mode 100644 index 0000000..9dad5c0 --- /dev/null +++ b/areas/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AreasConfig(AppConfig): + name = 'areas' diff --git a/areas/forms.py b/areas/forms.py new file mode 100644 index 0000000..6032309 --- /dev/null +++ b/areas/forms.py @@ -0,0 +1,19 @@ +from django import forms +from django.forms import ModelForm +from django.forms.widgets import TextInput +from .models import Areas +from django.contrib.auth.models import User + +class AreaAddAreaForm(forms.ModelForm): + + class Meta: + model = Areas + labels = { + "name" : "Bereichsname", + "color" : "Farbe", + "desc" : "Beschreibung", + "visible": "Im Organigramm sichtbar" + + } + fields = ['name', 'color', 'desc'] + diff --git a/areas/migrations/0001_initial.py b/areas/migrations/0001_initial.py new file mode 100644 index 0000000..b0d508f --- /dev/null +++ b/areas/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +import colorful.fields +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Areas', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('color', colorful.fields.RGBColorField(blank=True, colors=['#FFB900', '#E74856', '#0078D7', '#0099BC', '#7A7574'], default='#0099BC')), + ('desc', models.TextField(blank=True, max_length=3000)), + ('created_area_date', models.DateField(blank=True, default=datetime.date.today)), + ('visible', models.BooleanField(default=True)), + ('areaorder', models.IntegerField(default=0)), + ], + ), + ] diff --git a/areas/migrations/0002_auto_20200925_0713.py b/areas/migrations/0002_auto_20200925_0713.py new file mode 100644 index 0000000..e5edbf9 --- /dev/null +++ b/areas/migrations/0002_auto_20200925_0713.py @@ -0,0 +1,34 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('areas', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='areas', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency'), + ), + migrations.AddField( + model_name='areas', + name='created_area_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='areas', + name='usersfield', + field=models.ManyToManyField(blank=True, related_name='users_in_area', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/areas/migrations/0003_auto_20201204_0927.py b/areas/migrations/0003_auto_20201204_0927.py new file mode 100644 index 0000000..4e00d07 --- /dev/null +++ b/areas/migrations/0003_auto_20201204_0927.py @@ -0,0 +1,20 @@ +# Generated by Django 3.0 on 2020-12-04 09:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0031_auto_20201204_0927'), + ('areas', '0002_auto_20200925_0713'), + ] + + operations = [ + migrations.AlterField( + model_name='areas', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/areas/migrations/__init__.py b/areas/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/areas/migrations/__pycache__/0001_initial.cpython-38.pyc b/areas/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..442ab58 Binary files /dev/null and b/areas/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/areas/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc b/areas/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc new file mode 100644 index 0000000..83427ca Binary files /dev/null and b/areas/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc differ diff --git a/areas/migrations/__pycache__/0003_auto_20201204_0927.cpython-38.pyc b/areas/migrations/__pycache__/0003_auto_20201204_0927.cpython-38.pyc new file mode 100644 index 0000000..4050cea Binary files /dev/null and b/areas/migrations/__pycache__/0003_auto_20201204_0927.cpython-38.pyc differ diff --git a/areas/migrations/__pycache__/__init__.cpython-38.pyc b/areas/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..d6c8d8a Binary files /dev/null and b/areas/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/areas/models.py b/areas/models.py new file mode 100644 index 0000000..6be2c42 --- /dev/null +++ b/areas/models.py @@ -0,0 +1,39 @@ +from django.db import models +from users.models import Agency +from django.urls import reverse +from colorful.fields import RGBColorField +from django.contrib.auth.models import User +import datetime + +''' + +Model Areas + +Verwaltet alle gespeicherten Bereiche für die Agentur. Wird eine neue erstellt, +wird dieser die Agency zugewiesen. Das Farb-Feld ist für später, damit im +Ogranigramm eine Farbe für den jeweiligen Bereich festgelegt wird. + +users speichert alle primary-Keys der User, welche diesem Bereich zugeordnet sind! + +''' +class Areas(models.Model): + + # Wenn die Area gelöscht wird, wird NICHT die Agency gelöscht + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + name = models.CharField(max_length=200, blank=False) + color = RGBColorField(colors=['#FFB900', '#E74856', '#0078D7', '#0099BC', '#7A7574'], default='#0099BC', blank=True) + desc = models.TextField(max_length=3000, blank=True) + usersfield = models.ManyToManyField(User, blank=True, related_name='users_in_area') + created_area_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + created_area_date = models.DateField(default=datetime.date.today, blank=True) + visible = models.BooleanField(default=True) + areaorder = models.IntegerField(default=0) + + def __str__(self): + return f'{self.name}' + + # Hier Path für Templates des Models mit Parametern + def get_absolute_url(self): + return reverse('areas-update', kwargs={'pk':self.pk}) + + diff --git a/areas/templates/areas/area_confirm_delete_DELETE.html b/areas/templates/areas/area_confirm_delete_DELETE.html new file mode 100644 index 0000000..5a73330 --- /dev/null +++ b/areas/templates/areas/area_confirm_delete_DELETE.html @@ -0,0 +1,22 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+
+ +
+ +
+
+ +
+ {% csrf_token %} +

Alle unter diesem Bereich erstellten Aufgaben und Standards werden gelöscht!

+
+   + Abbrechen +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/areas/templates/areas/areas_add_DELETE.html b/areas/templates/areas/areas_add_DELETE.html new file mode 100644 index 0000000..8402eb9 --- /dev/null +++ b/areas/templates/areas/areas_add_DELETE.html @@ -0,0 +1,43 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Neuen Bereich anlegen

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+ Farbe +
+

Nachdem Erstellen eines Bereichs können Mitarbeiter zugewiesen werden.

+
+   + Abbrechen +
+
+ + + + +{% endblock content %} diff --git a/areas/templates/areas/areas_management_DELETE.html b/areas/templates/areas/areas_management_DELETE.html new file mode 100644 index 0000000..b187327 --- /dev/null +++ b/areas/templates/areas/areas_management_DELETE.html @@ -0,0 +1,101 @@ +{% extends "users/base.html" %} +{% block content %} + +
+

Bereichsverwaltung

+
+

+ Bereiche unterteilen die Agentur in verschiedene Verantwortungsbereiche. +

+
+ +
+
+
+ +
+
+ + + + + + + + + + + + {% for item in areas_of_agency %} + + + + + + + + {% endfor %} + +
NameErstellt vonErstellt amFarbe 
{{ item.name }}{{ item.created_area_by.first_name }} {{ item.created_area_by.last_name }}{{ item.created_area_date }}
+ + +
+
+
+ + +{% endblock content %} diff --git a/areas/templates/areas/areas_update_DELETE.html b/areas/templates/areas/areas_update_DELETE.html new file mode 100644 index 0000000..2922aeb --- /dev/null +++ b/areas/templates/areas/areas_update_DELETE.html @@ -0,0 +1,172 @@ +{% extends "users/base.html" %} +{% load static %} +{% load crispy_forms_tags %} +{% block content %} +
+

Bereich aktualisieren

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+ Farbe +
+
Mitarbeiter hinzufügen
+
+ +
+ + +
+ + {% for us in possible_users %} + + {% endfor %} + + +
+
+
Zugewiesene Mitarbeiter
+
+ {% if added_users|length > 0 %} + + {% for us in added_users %} + {{ us.first_name }} {{ us.last_name }}   + + {% endfor %} + {% else %} +

Diesem Bereich ist noch kein Mitarbeiter zugewiesen.

+ {% endif %} +
+
+ +   + Abbrechen +
+
+ + + + +{% endblock content %} diff --git a/areas/tests.py b/areas/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/areas/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/areas/urls.py b/areas/urls.py new file mode 100644 index 0000000..4c17845 --- /dev/null +++ b/areas/urls.py @@ -0,0 +1,19 @@ +from django.urls import path +from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required, permission_required + +from . import views +''' + +'' - Startseite nach erfolgreichem LOGIN +logout - Logoutseite nach LOGOUT + +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('areaajax/', views.area_addareas_ajax, name="area-ajaxview"), + path('updateorder/', views.area_neworder, name="area-ajaxorder") +] + + diff --git a/areas/views.py b/areas/views.py new file mode 100644 index 0000000..95ea9ce --- /dev/null +++ b/areas/views.py @@ -0,0 +1,95 @@ +from django.shortcuts import render +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView, View +from .models import Areas +from django.contrib import messages +from .forms import AreaAddAreaForm +from django.contrib.auth.models import User +from django.http import HttpResponse, JsonResponse +import json +from django.contrib.auth.decorators import login_required +from users.priomodel import Prio +from tasks.models import Tasks + +@login_required +def area_addareas_ajax(request): + if request.method == 'GET': + # ADD USER TO MANY-TO-MANY USERSFIELD + if request.GET['action'] == 'adduser': + area = Areas.objects.get(pk=request.GET['objectid']) + + if(area.agency == request.user.profile.agency): + area.usersfield.add(User.objects.get(pk=request.GET['userid'])) + area.save() + # REMOVE USER TO MANY-TO-MANY USERSFIELD + elif request.GET['action'] == 'remuser': + area = Areas.objects.get(pk=request.GET['objectid']) + if(area.agency == request.user.profile.agency): + area.usersfield.remove(User.objects.get(pk=request.GET['userid'])) + area.save() + userid = request.GET['userid'] + workinguser = User.objects.get(pk=userid) + username_clean = workinguser.first_name + " " + workinguser.last_name + + # Getting Remaining-Users + area = Areas.objects.get(pk=request.GET['objectid']) + if(area.agency == request.user.profile.agency): + added_users = area.usersfield.all() + possible_users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).exclude(pk__in=added_users) + possible_users_js = list(possible_users.values()) + # Cleaned out, that only data is neede will send to the side (first/last-name and id) + final_possible_users = {} + for ele in possible_users_js: + final_possible_users.update({'first_name':ele['first_name'],'last_name':ele['last_name'],'id':ele['id']}) + # Counter for remaining users to show/hide "Keine Mitarbeiter"-Div + remaining_users_counter = len(added_users) + return JsonResponse({'userid' : userid, 'username_clean' : username_clean, 'remaining_users':possible_users_js, 'remaining_users_counter' : final_possible_users}) + else: + return HttpResponse("Request method is not a GET") + +''' + + Update the Area-Order by drag and drop. Save per ID and order in table, example: + ID ORDER + 0 --> 0 + 4 --> 1 + 2 --> 2 + 5 --> 3 + + Triggered by ajax in areas_management.html + Save all areas after drag n drop elements in table + +''' +@login_required +def area_neworder(request): + if request.method == 'GET': + if request.GET['action'] == 'newareaorder': + neworderdata = json.loads(request.GET['finalod']) + for ele in neworderdata: + area = Areas.objects.get(pk=ele['id']) + if(area.agency == request.user.profile.agency): + area.areaorder = ele['neworder'] + area.save() + return HttpResponse("UPDATED") + elif request.GET['action'] == 'newtaskorder': + tempuser = User.objects.get(pk=request.GET['userid']) + neworderdata = json.loads(request.GET['finalod']) + for ele in neworderdata: + print(request.GET['userid']) + print(ele) + prio = Prio.objects.filter(user__pk=request.GET['userid'], task__pk=ele['id']) + # PRIO FOUND + if(len(prio) > 0): + task = Tasks.objects.get(pk=ele['id']) + if(task.agency == request.user.profile.agency): + prio[0].prio = ele['neworder'] + prio[0].save() + # NO PRIO FOUND - CREATE, SET NEW ORDER AND SAVE + else: + task = Tasks.objects.get(pk=ele['id']) + if(task.agency == request.user.profile.agency): + newprio = Prio(user=tempuser, task=Tasks.objects.get(pk=ele['id']), prio=ele['neworder']).save() + + return HttpResponse("UPDATED") + else: + return HttpResponse("Request method is not a GET") \ No newline at end of file diff --git a/chat/__init__.py b/chat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/chat/__pycache__/__init__.cpython-38.pyc b/chat/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..cacae91 Binary files /dev/null and b/chat/__pycache__/__init__.cpython-38.pyc differ diff --git a/chat/__pycache__/admin.cpython-38.pyc b/chat/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..f54edb2 Binary files /dev/null and b/chat/__pycache__/admin.cpython-38.pyc differ diff --git a/chat/__pycache__/apps.cpython-38.pyc b/chat/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..ac9146c Binary files /dev/null and b/chat/__pycache__/apps.cpython-38.pyc differ diff --git a/chat/__pycache__/forms.cpython-38.pyc b/chat/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..869d273 Binary files /dev/null and b/chat/__pycache__/forms.cpython-38.pyc differ diff --git a/chat/__pycache__/models.cpython-38.pyc b/chat/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..92bd089 Binary files /dev/null and b/chat/__pycache__/models.cpython-38.pyc differ diff --git a/chat/__pycache__/urls.cpython-38.pyc b/chat/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..a683d83 Binary files /dev/null and b/chat/__pycache__/urls.cpython-38.pyc differ diff --git a/chat/__pycache__/views.cpython-38.pyc b/chat/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..5429b8e Binary files /dev/null and b/chat/__pycache__/views.cpython-38.pyc differ diff --git a/chat/admin.py b/chat/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/chat/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/chat/apps.py b/chat/apps.py new file mode 100644 index 0000000..8ebb9f0 --- /dev/null +++ b/chat/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ChatConfig(AppConfig): + name = 'chat' diff --git a/chat/forms.py b/chat/forms.py new file mode 100644 index 0000000..6748bbf --- /dev/null +++ b/chat/forms.py @@ -0,0 +1,41 @@ +from django import forms +from .models import ChatRoom +from users.models import UserFullName + + +class ChatUpdateChatRoom(forms.ModelForm): + + class Meta: + model = ChatRoom + labels = { + "roomname" : "Raumname", + "chatmembers" : "Mitglieder", + "chatmembers_admin" : "Verwalter", + } + + fields = ['roomname', 'chatmembers', 'chatmembers_admin'] + + def __init__(self, *args, **kwargs): + super(ChatUpdateChatRoom, self).__init__(*args, **kwargs) + print(kwargs["instance"].creator.profile.agency.pk) + self.fields['chatmembers'] = forms.MultipleChoiceField(required=True, label="Mitglieder", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].creator.profile.agency.pk)], widget=forms.CheckboxSelectMultiple()) + self.fields['chatmembers_admin'] = forms.MultipleChoiceField(required=False, label="Raumverwalter", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].creator.profile.agency.pk)], widget=forms.CheckboxSelectMultiple()) + +class ChatAddChatRoom(forms.ModelForm): + + class Meta: + model = ChatRoom + labels = { + "roomname" : "Raumname", + "chatmembers" : "Mitglieder", + "chatmembers_admin" : "Verwalter", + } + + fields = ['roomname', 'chatmembers', 'chatmembers_admin'] + + def __init__(self, *args, **kwargs): + + super(ChatAddChatRoom, self).__init__(*args, **kwargs) + print(kwargs["instance"]) + self.fields['chatmembers'] = forms.MultipleChoiceField(required=True, label="Mitglieder", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].profile.agency.pk)], widget=forms.CheckboxSelectMultiple()) + self.fields['chatmembers_admin'] = forms.MultipleChoiceField(required=False, label="Raumverwalter", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=kwargs["instance"].profile.agency.pk)], widget=forms.CheckboxSelectMultiple()) diff --git a/chat/migrations/0001_initial.py b/chat/migrations/0001_initial.py new file mode 100644 index 0000000..5ba61da --- /dev/null +++ b/chat/migrations/0001_initial.py @@ -0,0 +1,50 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import django_cryptography.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='ChatMessage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', django_cryptography.fields.encrypt(models.CharField(default='', max_length=5000))), + ('sendtime', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='ChatRoom', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('chatroomtype', models.IntegerField(default=0)), + ('roomname', models.CharField(default='', max_length=200)), + ('grouproomname', models.CharField(default='', max_length=200)), + ('roomname_channel', models.CharField(max_length=200)), + ('chatroom_createddate', models.DateTimeField(blank=True)), + ('viewstatus', models.IntegerField(default=True)), + ('chatmember_single', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='singleuserchat', to=settings.AUTH_USER_MODEL)), + ('chatmembers', models.ManyToManyField(blank=True, related_name='users_in_chatroom', to=settings.AUTH_USER_MODEL)), + ('chatmembers_admin', models.ManyToManyField(blank=True, related_name='adminusers_in_chatroom', to=settings.AUTH_USER_MODEL)), + ('creator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ('messages', models.ManyToManyField(blank=True, related_name='all_chatmessages', to='chat.ChatMessage')), + ], + ), + migrations.AddField( + model_name='chatmessage', + name='room', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='chat.ChatRoom'), + ), + ] diff --git a/chat/migrations/__init__.py b/chat/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/chat/migrations/__pycache__/0001_initial.cpython-38.pyc b/chat/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..398a6bf Binary files /dev/null and b/chat/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/chat/migrations/__pycache__/__init__.cpython-38.pyc b/chat/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..ce0e6a3 Binary files /dev/null and b/chat/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/chat/models.py b/chat/models.py new file mode 100644 index 0000000..3323845 --- /dev/null +++ b/chat/models.py @@ -0,0 +1,57 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency +from django.urls import reverse +from django.utils import timezone +from django_cryptography.fields import encrypt + +''' +MODEL ChatMessage +''' +class ChatMessage(models.Model): + author = models.ForeignKey(User, on_delete=models.CASCADE) + content = encrypt(models.CharField(max_length=5000, blank=False, default="")) + sendtime = models.DateTimeField(default=timezone.now, blank=True) + room = models.ForeignKey("ChatRoom", on_delete=models.CASCADE) + +''' +Model ChatRoom +''' +class ChatRoom(models.Model): + + creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) + ''' + chatroomtype + + 0 - User-User-Chat + 1 - Group-Chat + + ''' + chatroomtype = models.IntegerField(default=0) + roomname = models.CharField(max_length=200, blank=False, default="") + grouproomname = models.CharField(max_length=200, blank=False, default="") + # This field is for random-String Django Channels + roomname_channel = models.CharField(max_length=200, blank=False) + chatmembers = models.ManyToManyField(User, blank=True, related_name='users_in_chatroom') + chatmembers_admin = models.ManyToManyField(User, blank=True, related_name='adminusers_in_chatroom') + chatroom_createddate = models.DateTimeField(blank=True) + chatmember_single = models.ForeignKey(User, related_name='singleuserchat', on_delete=models.CASCADE, null=True, blank=True) + ''' + VIEWSTATUS + + 0 - Hide and Close + 1 - Hide, but visible in base.html + 2 - Full visible + + ''' + viewstatus = models.IntegerField(default=True) + messages = models.ManyToManyField("ChatMessage", blank=True, related_name='all_chatmessages') + + def __str__(self): + return f'{self.roomname}' + + def get_absolute_url(self): + return reverse('chat-update', kwargs={'pk':self.pk}) + + + diff --git a/chat/templates/chat/chat_allusers.html b/chat/templates/chat/chat_allusers.html new file mode 100644 index 0000000..24adbcb --- /dev/null +++ b/chat/templates/chat/chat_allusers.html @@ -0,0 +1,76 @@ + +
+
+ + {% for user in usersofagency %} + +
+ {% endfor %} +
+ + \ No newline at end of file diff --git a/chat/templates/chat/chat_allusers_SAVE.html b/chat/templates/chat/chat_allusers_SAVE.html new file mode 100644 index 0000000..42bd07f --- /dev/null +++ b/chat/templates/chat/chat_allusers_SAVE.html @@ -0,0 +1,86 @@ + +
+
+
Chat öffnen + +
+
+
+
+ {% for user in usersofagency %} + {% if forloop.counter|divisibleby:6 %} +
+
+ {% endif %} + + +
+ +
+
+
+ {{user.first_name}} {{user.last_name}} + +
+
+ {% endfor %} +
+
+
+ + \ No newline at end of file diff --git a/chat/templates/chat/chat_content.html b/chat/templates/chat/chat_content.html new file mode 100644 index 0000000..16946fd --- /dev/null +++ b/chat/templates/chat/chat_content.html @@ -0,0 +1,211 @@ +{% load counter_tag %} +{% if roomdata.creator == user %} +

{{roomdata.chatmember_single.first_name}} {{roomdata.chatmember_single.last_name}}

+{% else %} +

{{roomdata.creator.first_name}} {{roomdata.creator.last_name}}

+{% endif %} + +
+
+
+ +
+ Unterhaltung gestartet am {{roomdata.chatroom_createddate}} +
+
+ +
+ {% for message in roomdata.messages.all %} + + {% if forloop.counter0 == 0 %} + {% setMessageDayInfo message %} + {% else %} + {% getMessageDayInfo message as newday %} + {% if newday == True %} +
+
+
+ {{message.sendtime|date:"d.m.Y"}} +
+
+ {% endif %} + {% endif %} + + {% if message.author == request.user %} +
+
+ +
+
 {{message.sendtime|date:"H:i"}}
+
+ + {{message.content}} + +
+
+ {% else %} +
+
+ +
+
{{message.author.first_name}} {{message.author.last_name}}, {{message.sendtime|date:"H:i"}}
+
+ + {{message.content}} + +
+
+ {% endif %} + {% endfor %} +
+   +
+ +
+ +   + +
+ +
+ + \ No newline at end of file diff --git a/chat/templates/chat/chat_content_basechat.html b/chat/templates/chat/chat_content_basechat.html new file mode 100644 index 0000000..ec89415 --- /dev/null +++ b/chat/templates/chat/chat_content_basechat.html @@ -0,0 +1,255 @@ + +{% load counter_tag %} +{% if roomdata.creator == user %} +

{{roomdata.chatmember_single.first_name}} {{roomdata.chatmember_single.last_name}} +{% else %} +

{{roomdata.creator.first_name}} {{roomdata.creator.last_name}} +{% endif %} + +

+
+
+
+ +
+ Unterhaltung gestartet am {{roomdata.chatroom_createddate}} +
+
+ +
+ {% for message in roomdata.messages.all %} + + {% if forloop.counter0 == 0 %} + {% setMessageDayInfo message %} + {% else %} + {% getMessageDayInfo message as newday %} + {% if newday == True %} +
+
+
+ {{message.sendtime|date:"d.m.Y"}} +
+
+ {% endif %} + {% endif %} + + {% if message.author == request.user %} +
+
+ +
+
 {{message.sendtime|date:"H:i"}}
+
+ + {{message.content}} + +
+
+ {% else %} +
+
+ +
+
{{message.author.first_name}} {{message.author.last_name}}, {{message.sendtime|date:"H:i"}}
+
+ + {{message.content}} + +
+
+ {% endif %} + {% endfor %} +
+   +
+ +
+ +   + +
+ +
+ + \ No newline at end of file diff --git a/chat/templates/chat/chat_content_groupchat.html b/chat/templates/chat/chat_content_groupchat.html new file mode 100644 index 0000000..0b84f6f --- /dev/null +++ b/chat/templates/chat/chat_content_groupchat.html @@ -0,0 +1,255 @@ +{% load counter_tag %} +

{{roomdata.roomname}} + {% if user in roomdata.chatmembers_admin.all or user == roomdata.creator %} + + + + + {% endif %} +

+ + +
+
+
+ +
+ Unterhaltung gestartet am {{roomdata.chatroom_createddate}} +
+
+ +
+ {% for message in roomdata.messages.all %} + + {% if forloop.counter0 == 0 %} + {% setMessageDayInfo message %} + {% else %} + {% getMessageDayInfo message as newday %} + {% if newday == True %} +
+
+
+ {{message.sendtime|date:"d.m.Y"}} +
+
+ {% endif %} + {% endif %} + + {% if message.author == request.user %} +
+
+ +
+
 {{message.sendtime|date:"H:i"}} +
+
+ + {{message.content}} + +
+
+ {% else %} +
+
+ +
+
{{message.author.first_name}} {{message.author.last_name}}, {{message.sendtime|date:"H:i"}}
+
+ + {{message.content}} + +
+
+ {% endif %} + {% endfor %} +
+   +
+ +
+ +   + +
+ +
+ + + + +{% if user in roomdata.chatmembers_admin.all or user == roomdata.creator %} + + +{% endif %} diff --git a/chat/templates/chat/chat_othermessage.html b/chat/templates/chat/chat_othermessage.html new file mode 100644 index 0000000..cfc2bdf --- /dev/null +++ b/chat/templates/chat/chat_othermessage.html @@ -0,0 +1,11 @@ +
+
+ +
+
{{newmessage.author.first_name}} {{newmessage.author.last_name}}, {{newmessage.sendtime|date:"H:i"}}
+
+ + {{newmessage.content}} + +
+
\ No newline at end of file diff --git a/chat/templates/chat/chat_ownmessage.html b/chat/templates/chat/chat_ownmessage.html new file mode 100644 index 0000000..bf01cd9 --- /dev/null +++ b/chat/templates/chat/chat_ownmessage.html @@ -0,0 +1,11 @@ +
+
+ +
+
 {{newmessage.sendtime|date:"H:i"}}
+
+ + {{newmessage.content}} + +
+
diff --git a/chat/templates/chat/chatmanagement.html b/chat/templates/chat/chatmanagement.html new file mode 100644 index 0000000..35527eb --- /dev/null +++ b/chat/templates/chat/chatmanagement.html @@ -0,0 +1,264 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_chat %} + +
+

Chat  + + + +

+
+
+ +
+ +
+
+ {% for user in usersofagency %} +
+
+
+
+ +
+
+
+
{{user.first_name}} {{user.last_name}}
+
+
+
+ {% endfor %} + + {% for chatroom in chatrooms %} + {% if user in chatroom.chatmembers.all or user in chatroom.chatmembers_admin.all or user == chatroom.creator and chatroom.chatroomtype == 1 %} +
+
+
+
{{chatroom.roomname}} +
+ {% for member in chatroom.chatmembers.all %} + {{member.first_name}} {{member.last_name}}{% if forloop.counter < chatroom.chatmembers.all|length %}, {% endif %} + {% endfor %} + +
+
+
+ {% endif %} + {% endfor %} + + + +
+
+
+
+ + + + + + + +{% else %} +

Das Module Chat wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/chat/templates/chat/chatmanagement_SAVE.html b/chat/templates/chat/chatmanagement_SAVE.html new file mode 100644 index 0000000..73dd178 --- /dev/null +++ b/chat/templates/chat/chatmanagement_SAVE.html @@ -0,0 +1,340 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_chat %} + +
+

Chat  +

+
+
+ +
+ +
+ + + +
+
+
+
+ +
+
+
+
+ {% for user in usersofagency %} +
+
+
+
+ +
+
+
+
{{user.first_name}} {{user.last_name}}
+
+
+
+ {% endfor %} +
+
+
+ +
+
+
+ + +
+
+
+
+ {% for chatroom in chatrooms %} + {% if user in chatroom.chatmembers.all or user in chatroom.chatmembers_admin.all or user == chatroom.creator and chatroom.chatroomtype == 1 %} +
+
+
+
{{chatroom.roomname}} +
+ {% for member in chatroom.chatmembers.all %} + {{member.first_name}} {{member.last_name}}{% if forloop.counter < chatroom.chatmembers.all|length %}, {% endif %} + {% endfor %} + +
+
+
+ {% endif %} + {% endfor %} +
+
+
+
+ + + +
+
+
+ + + + + + + + +{% else %} +

Das Module Chat wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/chat/templates/chat/chatmanagement_addgc.html b/chat/templates/chat/chatmanagement_addgc.html new file mode 100644 index 0000000..6d8f2bb --- /dev/null +++ b/chat/templates/chat/chatmanagement_addgc.html @@ -0,0 +1,57 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_chat %} +
+

Gruppenchat

+
+
+ {% csrf_token %} + {{form|crispy}} + Sie selbst sind Raumverwalter und können auch später weitere Mitglieder hinzufügen. +
+ Abbrechen + +
+ +
+ + + + +{% else %} +

Das Module Chat wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} + + diff --git a/chat/tests.py b/chat/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/chat/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/chat/urls.py b/chat/urls.py new file mode 100644 index 0000000..d20f00f --- /dev/null +++ b/chat/urls.py @@ -0,0 +1,14 @@ +from django.urls import path +from . import views + +app_name = 'chat' +urlpatterns = [ + path('managemenet/', views.chatmanagement, name='chat-management'), + path('addgc/', views.ChatAddGroupChat, name='chat-addgroup'), + path('addgc/update/', views.ChatUpdateGroupChat.as_view(), name='chat-update'), + path('ajaxchat', views.chatajaxmain, name="chat-ajax"), + path('ajaxchat/getloggedusers', views.getloggedusers, name="chtaajax-getloggedusers"), + path('ajaxchat/getloggedusersdata', views.getloggedusersdata, name="chtaajax-getloggedusers-data") + + +] \ No newline at end of file diff --git a/chat/views.py b/chat/views.py new file mode 100644 index 0000000..95ba670 --- /dev/null +++ b/chat/views.py @@ -0,0 +1,194 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.decorators import login_required +from channels_presence.models import Presence +from django.http import HttpResponseRedirect,HttpResponse, JsonResponse +from django.contrib.auth.models import User +from channels_presence.models import Room +from channels_presence.models import Presence +import channels.layers +from django.utils import timezone +from .models import ChatRoom, ChatMessage +from .forms import ChatAddChatRoom, ChatUpdateChatRoom +from django.contrib import messages +from django.views.generic import UpdateView +from django.urls import reverse_lazy +from django.contrib.auth.mixins import LoginRequiredMixin + +# Create your views here. +@login_required +def chatmanagement(request): + + users_online = Room.objects.get(channel_name="agency_" + str(request.user.profile.agency.pk)) + + context = { + 'active_link' : 'chat', + "usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).exclude(pk=request.user.pk).order_by("last_name"), + "onlineusers" : users_online.get_users(), + "chatrooms" : ChatRoom.objects.all() + + } + return render(request, 'chat/chatmanagement.html', context) + +@login_required +def ChatAddGroupChat(request): + if request.method == "POST": + form = ChatAddChatRoom(request.POST, instance=request.user) + + if(form.is_valid()): + newchatroom = ChatRoom(creator=request.user, chatroomtype=1, roomname=form.cleaned_data["roomname"], roomname_channel="groupchat", chatroom_createddate=timezone.now(), viewstatus=0) + newchatroom.save() + newchatroom.chatmembers.set(form.cleaned_data["chatmembers"]) + newchatroom.chatmembers_admin.set(form.cleaned_data["chatmembers_admin"]) + + newchatroom.save() + messages.success(request, f'Raum angelegt!') + else: + messages.success(request, f'Raum konnte nicht angelegt werden!') + + return redirect('chat:chat-management') + else: + context = { + 'active_link' : 'chat', + "form" : ChatAddChatRoom(instance=request.user) + } + return render(request, 'chat/chatmanagement_addgc.html', context) + +class ChatUpdateGroupChat(LoginRequiredMixin, UpdateView): + model = ChatRoom + template_name = 'chat/chatmanagement_addgc.html' + success_url = reverse_lazy('chat:chat-management') + form_class = ChatUpdateChatRoom + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Chatraum aktualisiert!') + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super(ChatUpdateGroupChat, self).get_context_data(**kwargs) + context['active_link'] = 'chat' + print(context) + return context + +@login_required +def getloggedusers(request): + if request.method == "GET": + + users_online = Room.objects.get(channel_name="agency_" + str(request.user.profile.agency.pk)) + + context = { + "usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).exclude(pk=request.user.pk).order_by("last_name"), + "onlineusers" : users_online.get_users() + } + + return render(request, "chat/chat_allusers.html", context) + else: + return JsonResponse({}) + +@login_required +def getloggedusersdata(request): + + user_online_final = [] + user_besch_final = [] + user_abw_final = [] + user_off_final = [] + + if request.method == "GET": + + users_online = Room.objects.get(channel_name="agency_" + str(request.user.profile.agency.pk)).get_users() + users_agency = User.objects.filter(profile__agency=request.user.profile.agency).exclude(pk=request.user.pk) + + for u in users_agency: + if(u in users_online): + if(u.profile.onlinestatus == 0): + user_online_final.append("" + str(u.pk)) + elif(u.profile.onlinestatus == 1): + user_besch_final.append("" + str(u.pk)) + elif(u.profile.onlinestatus == 2): + user_abw_final.append("" + str(u.pk)) + elif(u.profile.onlinestatus == 3): + user_off_final.append("" + str(u.pk)) + + return JsonResponse({"user_online_final" : user_online_final, "user_besch_final" : user_besch_final, "user_abw_final" : user_abw_final, "user_off_final" : user_off_final}) + else: + return JsonResponse({}) + +@login_required +def chatajaxmain(request): + if request.method == "GET": + + context = {} + choosenroom = "" + if request.GET["action"] == "startnewchat_user_user": + singleuserid = request.GET["new_chat_userid"] + getroom = ChatRoom.objects.filter(chatmember_single__pk=singleuserid, creator=request.user) | ChatRoom.objects.filter(creator__pk=singleuserid, chatmember_single=request.user) + singleuser = User.objects.get(pk=singleuserid) + # NO PRIVATE CHAT THERE, CREATE ONE! + if(len(getroom) == 0): + newchatroom = ChatRoom(creator=request.user, chatroomtype=0, roomname=singleuser.first_name + " " + singleuser.last_name, roomname_channel="privatechat_" + str(request.user.pk) + "_" + singleuserid, chatmember_single=singleuser, chatroom_createddate=timezone.now(), viewstatus=0) + newchatroom.save() + context = { + "roomdata" : newchatroom + } + else: + context = { + "roomdata" : list(getroom)[0] + } + if(request.GET["is_basechat"] == "1"): + return render(request, "chat/chat_content_basechat.html", context) + else: + return render(request, "chat/chat_content.html", context) + # NACHRICHT LÖSCHEN + elif request.GET["action"] == "delmessage": + message_to_del = ChatMessage.objects.get(pk=request.GET["messageid"]) + if(message_to_del.author == request.user): + message_to_del.delete() + return JsonResponse({"status" : "OK"}) + else: + return JsonResponse({"status" : "FORBIDDEN"}) + # GRUPPENCHAT LÖSCHEN + elif request.GET["action"] == "remove_chatroom": + chatroom = ChatRoom.objects.get(pk=request.GET["groupchatid"]) + if(request.user == chatroom.creator or request.user in chatroom.chatmembers_admin.all()): + chatroom.delete() + messages.success(request, f'Raum gelöscht!') + return JsonResponse({"status" : "RELOAD"}) + else: + messages.success(request, f'Das dürfen Sie nicht!') + return JsonResponse({"status" : "RELOAD"}) + # GRUPPENCHAT ÖFFNEN + elif request.GET["action"] == "startnewchat_groupchat": + + chatroom = ChatRoom.objects.get(pk=request.GET["groupchatid"]) + + if(request.user == chatroom.creator or request.user in chatroom.chatmembers.all() or request.user in chatroom.chatmembers_admin.all()): + context = { + "roomdata" : chatroom + } + return render(request, "chat/chat_content_groupchat.html", context) + else: + JsonResponse({"status" : "Error on CHATAJAXMAIN"}) + elif request.GET["action"] == "addnewmessage": + room = ChatRoom.objects.get(pk=request.GET["room"]) + if(request.user == room.creator or request.user == room.chatmember_single or request.user in room.chatmembers.all() or request.user in room.chatmembers_admin.all()): + + newmessage = ChatMessage(room=room, author=request.user, content=request.GET["message"]) + newmessage.save() + room.messages.add(newmessage) + room.save() + return render(request, "chat/chat_ownmessage.html", {"newmessage" : newmessage}) + else: + JsonResponse({"status" : "Error on CHATAJAXMAIN"}) + elif request.GET["action"] == "loadnewestmessage": + room = ChatRoom.objects.get(pk=request.GET["room"]) + last_message = list(room.messages.order_by('-sendtime'))[0] + + if(last_message.author == request.user): + return render(request, "chat/chat_ownmessage.html", {"newmessage" : last_message}) + else: + return render(request, "chat/chat_othermessage.html", {"newmessage" : last_message}) + + else: + return JsonResponse({"status" : "Error on CHATAJAXMAIN"}) + + diff --git a/cloud/__init__.py b/cloud/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cloud/__pycache__/__init__.cpython-38.pyc b/cloud/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..00f41ce Binary files /dev/null and b/cloud/__pycache__/__init__.cpython-38.pyc differ diff --git a/cloud/__pycache__/admin.cpython-38.pyc b/cloud/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..3d374b4 Binary files /dev/null and b/cloud/__pycache__/admin.cpython-38.pyc differ diff --git a/cloud/__pycache__/apps.cpython-38.pyc b/cloud/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..fe99f64 Binary files /dev/null and b/cloud/__pycache__/apps.cpython-38.pyc differ diff --git a/cloud/__pycache__/forms.cpython-38.pyc b/cloud/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..17d582a Binary files /dev/null and b/cloud/__pycache__/forms.cpython-38.pyc differ diff --git a/cloud/__pycache__/models.cpython-38.pyc b/cloud/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..4e6e855 Binary files /dev/null and b/cloud/__pycache__/models.cpython-38.pyc differ diff --git a/cloud/__pycache__/urls.cpython-38.pyc b/cloud/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..688fd4c Binary files /dev/null and b/cloud/__pycache__/urls.cpython-38.pyc differ diff --git a/cloud/__pycache__/views.cpython-38.pyc b/cloud/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..0603b58 Binary files /dev/null and b/cloud/__pycache__/views.cpython-38.pyc differ diff --git a/cloud/admin.py b/cloud/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/cloud/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/cloud/apps.py b/cloud/apps.py new file mode 100644 index 0000000..7545afe --- /dev/null +++ b/cloud/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class CloudConfig(AppConfig): + name = 'cloud' diff --git a/cloud/forms.py b/cloud/forms.py new file mode 100644 index 0000000..cf37c63 --- /dev/null +++ b/cloud/forms.py @@ -0,0 +1,12 @@ +from django import forms +from django.forms import ModelForm +from .models import Data, DataFile + +class CloudAddFileForm(forms.ModelForm): + + class Meta: + model = Data + labels = { + "file" : "Datei hochladen", + } + fields = ['file'] diff --git a/cloud/migrations/0001_initial.py b/cloud/migrations/0001_initial.py new file mode 100644 index 0000000..70d782e --- /dev/null +++ b/cloud/migrations/0001_initial.py @@ -0,0 +1,50 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +import cloud.models +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Data', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('subdir', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('def1', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('file', models.FileField(max_length=255, null=True, upload_to=cloud.models.user_directory_path)), + ('date_created', models.DateTimeField(default=django.utils.timezone.now)), + ('date_last_modified', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), + migrations.CreateModel( + name='DataDir', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('def2', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('is_root', models.BooleanField(default=False)), + ('is_defaultstandard', models.BooleanField(default=False)), + ('date_created', models.DateTimeField(default=django.utils.timezone.now)), + ('date_last_modified', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), + migrations.CreateModel( + name='DataFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('def2', models.CharField(blank=True, default='', max_length=2000, null=True)), + ('file', models.FileField(blank=True, max_length=255, null=True, upload_to=cloud.models.user_directory_path)), + ('date_created', models.DateTimeField(default=django.utils.timezone.now)), + ('date_last_modified', models.DateTimeField(default=django.utils.timezone.now)), + ], + ), + ] diff --git a/cloud/migrations/0002_auto_20200925_0713.py b/cloud/migrations/0002_auto_20200925_0713.py new file mode 100644 index 0000000..8aa2fc2 --- /dev/null +++ b/cloud/migrations/0002_auto_20200925_0713.py @@ -0,0 +1,69 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cloud', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='datafile', + name='agency', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='datafile', + name='owner', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='datafile', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='thisfileindir', to='cloud.DataDir'), + ), + migrations.AddField( + model_name='datadir', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='datadir', + name='dirs', + field=models.ManyToManyField(blank=True, related_name='dirs_in_dirs', to='cloud.DataDir'), + ), + migrations.AddField( + model_name='datadir', + name='owner', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='datadir', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dir_in_dir', to='cloud.DataDir'), + ), + migrations.AddField( + model_name='datadir', + name='visibleby', + field=models.ManyToManyField(blank=True, related_name='visible_by_user', to='users.AgencyGroup'), + ), + migrations.AddField( + model_name='data', + name='agency', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='data', + name='owner', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/cloud/migrations/0003_auto_20210312_0923.py b/cloud/migrations/0003_auto_20210312_0923.py new file mode 100644 index 0000000..9eeacd1 --- /dev/null +++ b/cloud/migrations/0003_auto_20210312_0923.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0 on 2021-03-12 09:23 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cloud', '0002_auto_20200925_0713'), + ] + + operations = [ + migrations.AlterField( + model_name='datafile', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='thisfileindir', to='cloud.DataDir'), + ), + ] diff --git a/cloud/migrations/__init__.py b/cloud/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cloud/migrations/__pycache__/0001_initial.cpython-38.pyc b/cloud/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..d58c68d Binary files /dev/null and b/cloud/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc b/cloud/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc new file mode 100644 index 0000000..3cdeb8b Binary files /dev/null and b/cloud/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0003_auto_20210312_0923.cpython-38.pyc b/cloud/migrations/__pycache__/0003_auto_20210312_0923.cpython-38.pyc new file mode 100644 index 0000000..8de941c Binary files /dev/null and b/cloud/migrations/__pycache__/0003_auto_20210312_0923.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0010_auto_20200214_2241.cpython-38.pyc b/cloud/migrations/__pycache__/0010_auto_20200214_2241.cpython-38.pyc new file mode 100644 index 0000000..ef5ca55 Binary files /dev/null and b/cloud/migrations/__pycache__/0010_auto_20200214_2241.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0011_auto_20200214_2241.cpython-38.pyc b/cloud/migrations/__pycache__/0011_auto_20200214_2241.cpython-38.pyc new file mode 100644 index 0000000..05cd638 Binary files /dev/null and b/cloud/migrations/__pycache__/0011_auto_20200214_2241.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0012_auto_20200214_2313.cpython-38.pyc b/cloud/migrations/__pycache__/0012_auto_20200214_2313.cpython-38.pyc new file mode 100644 index 0000000..56406f9 Binary files /dev/null and b/cloud/migrations/__pycache__/0012_auto_20200214_2313.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0013_auto_20200215_1347.cpython-38.pyc b/cloud/migrations/__pycache__/0013_auto_20200215_1347.cpython-38.pyc new file mode 100644 index 0000000..93684c6 Binary files /dev/null and b/cloud/migrations/__pycache__/0013_auto_20200215_1347.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0014_auto_20200215_1411.cpython-38.pyc b/cloud/migrations/__pycache__/0014_auto_20200215_1411.cpython-38.pyc new file mode 100644 index 0000000..a8ee809 Binary files /dev/null and b/cloud/migrations/__pycache__/0014_auto_20200215_1411.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0015_auto_20200215_1427.cpython-38.pyc b/cloud/migrations/__pycache__/0015_auto_20200215_1427.cpython-38.pyc new file mode 100644 index 0000000..d35eb6e Binary files /dev/null and b/cloud/migrations/__pycache__/0015_auto_20200215_1427.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0016_remove_datadir_datafiles.cpython-38.pyc b/cloud/migrations/__pycache__/0016_remove_datadir_datafiles.cpython-38.pyc new file mode 100644 index 0000000..d6b69ce Binary files /dev/null and b/cloud/migrations/__pycache__/0016_remove_datadir_datafiles.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0017_auto_20200215_1910.cpython-38.pyc b/cloud/migrations/__pycache__/0017_auto_20200215_1910.cpython-38.pyc new file mode 100644 index 0000000..ce6a17b Binary files /dev/null and b/cloud/migrations/__pycache__/0017_auto_20200215_1910.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/0018_auto_20200215_1911.cpython-38.pyc b/cloud/migrations/__pycache__/0018_auto_20200215_1911.cpython-38.pyc new file mode 100644 index 0000000..4747555 Binary files /dev/null and b/cloud/migrations/__pycache__/0018_auto_20200215_1911.cpython-38.pyc differ diff --git a/cloud/migrations/__pycache__/__init__.cpython-38.pyc b/cloud/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..1188a24 Binary files /dev/null and b/cloud/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/cloud/models.py b/cloud/models.py new file mode 100644 index 0000000..bd03a89 --- /dev/null +++ b/cloud/models.py @@ -0,0 +1,53 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency, AgencyGroup +# Create your models here. +from django.db import models +from django.utils import timezone +from django.conf import settings + +def user_directory_path(instance, filename): + # file will be uploaded to MEDIA_ROOT/agency_/files// + return 'agencydata/agency_{0}/files/{1}'.format(instance.agency.pk, filename) + +class Data(models.Model): + subdir = models.CharField(max_length=2000, default="", blank=True, null=True) + def1 = models.CharField(max_length=2000, default="", blank=True, null=True) + file = models.FileField(null=True, max_length=255, upload_to=user_directory_path) + date_created = models.DateTimeField(default = timezone.now) + date_last_modified = models.DateTimeField(default = timezone.now) + owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, default=None) + + def __str__(self): + return str(self.file.name) + +class DataDir(models.Model): + name = models.CharField(max_length=2000, default="", blank=True, null=True) + def2 = models.CharField(max_length=2000, default="", blank=True, null=True) + is_root = models.BooleanField(default=False) + is_defaultstandard = models.BooleanField(default=False) + dirs = models.ManyToManyField('self', blank=True, related_name='dirs_in_dirs', symmetrical = False) + visibleby = models.ManyToManyField(AgencyGroup, blank=True, related_name='visible_by_user') + date_created = models.DateTimeField(default = timezone.now) + date_last_modified = models.DateTimeField(default = timezone.now) + owner = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + parent = models.ForeignKey('DataDir', on_delete=models.CASCADE, blank=True, null=True, related_name='dir_in_dir') + + def __str__(self): + return str(self.name) + +class DataFile(models.Model): + name = models.CharField(max_length=2000, default="", blank=True, null=True) + def2 = models.CharField(max_length=2000, default="", blank=True, null=True) + file = models.FileField(null=True, max_length=255, upload_to=user_directory_path, blank=True) + date_created = models.DateTimeField(default = timezone.now) + date_last_modified = models.DateTimeField(default = timezone.now) + owner = models.ForeignKey(User, on_delete=models.SET_NULL, default=None, blank=True, null=True) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, default=None, blank=True, null=True) + parent = models.ForeignKey(DataDir, on_delete=models.CASCADE, related_name='thisfileindir', blank=True, null=True) + + def __str__(self): + return str(self.name) + diff --git a/cloud/templates/cloud/cloud_main.html b/cloud/templates/cloud/cloud_main.html new file mode 100644 index 0000000..a4338dc --- /dev/null +++ b/cloud/templates/cloud/cloud_main.html @@ -0,0 +1,1167 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load static %} +{% block content %} + +
+ + +
+
+

Dateien{% if request.user.profile.showtooltips %} {% endif %} +

+
+
+ +
+ +
+
Belegter Speicherplatz: {{actquota}} / 2 GB
+
+ + + +{% if user|usergperm:"filesviewer" %} + + + + + + + + + + + + + {% for d in dirs %} + + {% setbool False %} + + {% for dirgroup in d.visibleby.all %} + {% if user|has_group:dirgroup.group.name %} + {% setbool True %} + {% endif %} + {% endfor %} + + {% if d.visibleby.all|length == 0 %} + {% setbool True %} + {% endif %} + + {% getbool as groupchecker %} + {% if groupchecker %} + + {% else %} + + {% endif %} + + + + + + + + {% endfor %} + {% for file in files %} + + + + + + + + + {% endfor %} + +
NameEigentümerErstelltGeändert
+ + {% if groupchecker %} + {{d.name}} + {% else %} +  {{d.name}} + + {% endif %} + {{d.owner.first_name}} {{d.owner.last_name}}{{d.date_created|date:"d.m.Y G:i"}}{{d.date_last_modified|date:"d.m.Y G:i"}} + {% if user|usergperm:"filedirmanager" and groupchecker and d.is_defaultstandard == False %} + + {% endif %} +
+ + {{file.name}}{{file.owner.first_name}} {{file.owner.last_name}}{{file.date_created|date:"d.m.Y G:i"}}{{file.date_last_modified|date:"d.m.Y G:i"}} + {% if user|usergperm:"filesmanager" %} + + {% endif %} +
+{% endif %} +{% if user|usergperm:"filesmanager" %} +
+ +
+ +
+Erlaubte Dateitypen: doc/docx, xls/xlsx/xlsm, odt, ods, ppt/pptx, mov, avi, svg, png, jpg/jpeg, mp3, mp4, wav, zip, rar, mwv, flv, eps, txt, pdf. Maximale Uploadgröße: 2 GB +
+{% endif %} + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + {% if user|usergperm:"filesmanager" %} + +{% endif %} + + + + + + + + + + + +{% endblock %} diff --git a/cloud/templates/cloud/noentrie.html b/cloud/templates/cloud/noentrie.html new file mode 100644 index 0000000..bddf137 --- /dev/null +++ b/cloud/templates/cloud/noentrie.html @@ -0,0 +1,7 @@ +{% extends "users/base.html" %} +{% block content %} +
+

Auf diesen Dateibereich haben Sie keinen Zugriff!

+
+
+{% endblock %} \ No newline at end of file diff --git a/cloud/tests.py b/cloud/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/cloud/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/cloud/urls.py b/cloud/urls.py new file mode 100644 index 0000000..3cf57ab --- /dev/null +++ b/cloud/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from .views import CloudMain +from . import views + +urlpatterns = [ + path('', CloudMain, name='cloud-main'), + path('clajax/', views.adddirbyajax, name="cloud-adddir"), + path('clajax/', views.adddirbyajax, name="cloud-adddir"), + path('trydown/', views.trydownloadfile, name="cloud-td"), +] diff --git a/cloud/views.py b/cloud/views.py new file mode 100644 index 0000000..3ff9352 --- /dev/null +++ b/cloud/views.py @@ -0,0 +1,343 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView +from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required +from django.views.generic import TemplateView +from .models import Data +from django.views.generic.edit import FormView +from .forms import CloudAddFileForm +from django.conf import settings +from django.core.files.storage import default_storage +from digitaleagentur.settings import BASE_DIR +from django.http import JsonResponse, HttpResponse, Http404 +from .models import DataDir, DataFile +from datetime import datetime +from users.models import AgencyGroup +from django.conf import settings +from django.http import FileResponse +from standards.models import Standards +from django.contrib import messages +import os +import sys +from django.conf import settings + +''' + + Prüft, ob ein Nutzer in diesen Ordner Zugriffsrechte hat. Läuft den gesamten Strang bis nach oben, + ob ein Übergeordneter Ordner Rechte einschränkt. + +''' +@login_required +def checkUserDirRights(request, startdir, userid): + canview = True + user = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) + usergroups=list(user.groups.all()) + grouptomach = [] + singleObj = DataDir.objects.get(pk=startdir.pk, agency=request.user.profile.agency) + # AGENCYCHECK + if(singleObj.agency.pk == user.profile.agency.pk): + + # Get dirs to check + while( singleObj.is_root != True and canview == True): + + for g in singleObj.visibleby.all(): + grouptomach.append(g.group) + + if(len(grouptomach) == 0): + canview = True + else: + if(len(set(usergroups).intersection(grouptomach)) > 0): + canview = True + else: + canview = False + + grouptomach = [] + singleObj = DataDir.objects.get(pk=singleObj.parent.pk, agency=request.user.profile.agency) + + else: + canview = False + return canview + +def folder_size(path='.'): + total = 0 + for entry in os.scandir(path): + if entry.is_file(): + total += entry.stat().st_size + elif entry.is_dir(): + total += folder_size(entry.path) + + total_gb = round(total/1024.0**3, 3) + return total_gb + +@login_required +def CloudMain(request, pk): + diragency = [] + alldirs = [] + context = {} + breadcrump = [] + files = [] + rootid = list(DataDir.objects.filter(is_root=True, agency=request.user.profile.agency))[0].pk + if(pk == "first"): + diragency = list(DataDir.objects.filter(is_root=True, agency=request.user.profile.agency))[0] + + alldirs = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=diragency).order_by("name") + + context = { + 'active_link' : 'cloud', + 'dirs' : alldirs, + 'parentid' : diragency.pk, + 'files' : DataFile.objects.filter(parent=diragency, agency=request.user.profile.agency).order_by("name"), + 'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency).order_by("agencygroupname"), + "rootid" : rootid, + "actquota" : str(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")), + "percent_quota" : int(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")/(2/100)) + } + else: + + # CHECK IF USER HAS RIGHTS TO SEE THIS DIR + groupsofdir = DataDir.objects.get(pk=pk, agency=request.user.profile.agency) + if checkUserDirRights(request, groupsofdir, request.user.pk): + alldirs = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=pk).order_by("name") + vieweddir = list(DataDir.objects.filter(pk=pk, agency=request.user.profile.agency))[0] + + singleObj = DataDir.objects.get(pk=pk, agency=request.user.profile.agency) + while( singleObj.is_root != True): + breadcrump.append(singleObj) + singleObj = DataDir.objects.get(pk=singleObj.parent.pk, agency=request.user.profile.agency) + # Navi oben einmal umdrehen + breadcrump = breadcrump[::-1] + + context = { + 'active_link' : 'cloud', + 'dirs' : alldirs, + 'parentid' : pk, + 'breadcrump' : breadcrump, + 'files' : DataFile.objects.filter(parent=vieweddir, agency=request.user.profile.agency).order_by("name"), + 'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency).order_by("agencygroupname"), + "rootid" : rootid, + "actquota" : str(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")), + "percent_quota" : int(folder_size(BASE_DIR + "/media/agencydata/agency_"+str(request.user.profile.agency.pk)+"/files")/(2/100)) + } + else: + context = { + 'active_link' : 'cloud', + } + return render(request, 'cloud/noentrie.html', context) + + return render(request, 'cloud/cloud_main.html', context) + + +@login_required +def adddirbyajax(request, parent): + success = True + data = {} + + if(request.method == "GET"): + # NEW DIR + if(request.GET.get("action") == "adddir"): + parentid = request.GET.get("parent") + newdirname = request.GET.get("newdirname") + parent_obj = DataDir.objects.get(pk=parentid, agency=request.user.profile.agency) + tempdir = DataDir(name=newdirname, parent=parent_obj, agency=request.user.profile.agency, owner=request.user) + tempdir.save() + parent_obj.dirs.add(tempdir) + parent_obj.save() + # RETURN DIRNAME + elif(request.GET.get("action") == "getname_dir"): + dirobj = DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency) + data = {'dirname' : dirobj.name} + # RETURN COMPLETE AGENCY DIR LIST + elif(request.GET.get("action") == "getdirlist"): + data = {'agencydirlist' : loadAgencyDirList(request)} + # RETURN FILENAME + elif(request.GET.get("action") == "getname_file"): + fileobj = DataFile.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency) + + linked_standards = Standards.objects.filter(agency=request.user.profile.agency); + linked_standards_final = [] + for ls in linked_standards: + if(fileobj in ls.addedfiles.all()): + linked_standards_final.append({ "id" : ls.pk, "name" : ls.name }); + data = {'filename' : fileobj.name, 'linked_standards' : linked_standards_final} + # CHECK DOUBLE FILENAME + elif(request.GET.get("action") == "check_doublefile"): + fileobj = list(DataFile.objects.filter(name__icontains=request.GET.get('name'), agency=request.user.profile.agency)) + if len(fileobj) > 0: + data = {"found" : True} + else: + data = {"found" : False} + # DELETE FILE + elif(request.GET.get("action") == "del_file"): + DataFile.objects.filter(pk=request.GET.get('id'), agency=request.user.profile.agency).delete() + # CHANGE DIR NAME + elif(request.GET.get("action") == "change_dir_name"): + dirobj = DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency) + dirobj.name = request.GET.get("newdirname") + dirobj.date_last_modified = datetime.now() + dirobj.save() + # DELETE DIR + elif(request.GET.get("action") == "del_dir"): + try: + DataFile.objects.filter(parent=request.GET.get('id'), agency=request.user.profile.agency).delete() + DataDir.objects.filter(parent=request.GET.get('id'), agency=request.user.profile.agency).delete() + DataDir.objects.get(pk=request.GET.get('id'), agency=request.user.profile.agency).delete() + except: + success = False + # MOVE FILE + elif(request.GET.get("action") == "movefile"): + tempdatafile = DataFile.objects.get(pk=request.GET.get('fileid'), agency=request.user.profile.agency) + tempdatafile.parent = DataDir.objects.get(pk=request.GET.get('newpar'), agency=request.user.profile.agency) + tempdatafile.date_last_modified = datetime.now() + tempdatafile.save() + # GROUPS + # DIR + elif(request.GET.get("action") == "changedirgroups"): + dirid = request.GET.get('dirid') + groupid = request.GET.get('groupid') + value = request.GET.get('value') + if(value == "true"): + DataDir.objects.get(pk=dirid, agency=request.user.profile.agency).visibleby.add(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency)) + else: + DataDir.objects.get(pk=dirid, agency=request.user.profile.agency).visibleby.remove(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency)) + # GET GROUPS + + elif(request.GET.get("action") == "getgroupsofdir"): + dirid = request.GET.get('dirid') + allgroupsofdir = DataDir.objects.get(pk=dirid, agency=request.user.profile.agency).visibleby.all() + grouopsid = [] + for ag in allgroupsofdir: + grouopsid.append({"id" : ag.pk}) + data = {"gdir" : grouopsid} + + # REPLACE FILE + elif(request.GET.get("action") == "replacefile"): + oldid = DataFile.objects.get(pk=request.GET.get('oldid'), agency=request.user.profile.agency) + newid = DataFile.objects.get(pk=request.GET.get('newid'), agency=request.user.profile.agency) + if(oldid != None and newid != None and oldid != newid): + + linked_standards = Standards.objects.filter(agency=request.user.profile.agency); + replacecounter = 0 + for standard in linked_standards: + if(oldid in standard.addedfiles.all()): + standard.addedfiles.remove(oldid) + standard.addedfiles.add(newid) + standard.save() + replacecounter += 1 + + if(request.GET.get('delold') == "1"): + oldid.delete() + + data = {"success" : True} + if(replacecounter > 0): + if(replacecounter == 1): + messages.success(request, f'Datei wurde in einem Standard ersetzt.') + else: + messages.success(request, f'Datei wurde in '+str(replacecounter)+' Standards ersetzt.') + else: + data = {"success" : False} + + elif request.method == 'POST': + tempdir = False + tempdir = DataDir.objects.get(pk=parent) + uploadsource = request.POST["uploadsource"] + replace = request.POST["replace"] + + print(replace) + + # DECODE + request.decoding = 'utf-8' + + # VALIDATE FILE-TYPE + file_ext_arr = request.FILES['uploadedfile'].name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + allowed_types = ["txt", "TXT", "png", "PNG", "jpeg", "JPEG", "jpg", "JPG", "PDF", "pdf", "csv", "CSV", "DOC", "doc", "DOCX", "docx", "ODT", "odt", "PPT", "ppt", "PPTX", "pptx", "XLS", "xls", "XLSX", "xlsx", "xlsm", "XLSM", "mov", "MOV", "SVG", "svg", "ZIP", "zip", "RAR", "rar", "EPS", "eps", "MP3", "mp3", "WAV", "wav", "avi", "AVI", "FLV", "flv", "MP4", "mp4", "PAGES", "pages", "NUMBERS", "numbers", "ics", "ICS"] + file_ok = False + + for t in allowed_types: + if t == file_ext: + file_ok = True + + if(file_ok): + datadir_parentid = 0 + if(uploadsource == "standards"): + datadir_parentid = list(DataDir.objects.filter(is_defaultstandard=True, agency__pk=request.user.profile.agency.pk))[0] + else: + datadir_parentid = tempdir + + if(replace == "0"): + tempdatafile = DataFile(file=request.FILES['uploadedfile'], name=request.FILES['uploadedfile'].name, owner=request.user, parent=datadir_parentid, agency=request.user.profile.agency) + else: + tempdatafile = list(DataFile.objects.filter(name__icontains=request.FILES['uploadedfile'].name, agency=request.user.profile.agency))[0] + tempdatafile.file.delete() + tempdatafile.file = request.FILES['uploadedfile'] + + try: + tempdatafile.save() + except: + success = False + print("Fehler beim Speichern der Datei") + data = {'savedobj_id' : tempdatafile.pk, 'savedobj_name' : tempdatafile.name} + else: + success = False + + return JsonResponse({"success" : success, "data" : data}) + +@login_required +def loadAgencyDirList(request): + alldirs = [] + + diragency = list(DataDir.objects.filter(is_root=True, agency=request.user.profile.agency))[0] + alldirs_root = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=diragency).order_by("name") + + for d in alldirs_root: + alldirs.append({"id" : d.pk, "parent" : "", "name" : d.name, 'subdirs' : getsubdirs(request, d.pk)}) + + return alldirs + +@login_required +def getsubdirs(request, dirid): + subdirs = [] + actid = False + if(isinstance(dirid, DataDir)): + actid = dirid.pk + else: + actid = dirid + alldirs_sub = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=dirid).order_by("name") + + for subdir in alldirs_sub: + tempsubsubdir = DataDir.objects.filter(is_root=False, agency=request.user.profile.agency, parent=subdir).order_by("name") + if(len(tempsubsubdir) > 0): + subdirs.append({"id" : subdir.pk, "parent" : actid, "name" : subdir.name, 'subdirs' : getsubdirs(request, subdir)}) + else: + subdirs.append({"id" : subdir.pk, "parent" : actid, "name" : subdir.name, 'subdirs' : []}) + return subdirs + +''' + + Hier wird geprüft, ob die angeforderte Datei für diesesn Nutzer herunterladbar ist oder nicht. Leitet auf die + Kein-Zugriff-Seite weiter ODER sendet die Datei. Der "echte" Datei-Link bleibt jederzeit auf dem Server :) + +''' +@login_required +def trydownloadfile(request, pk): + file = DataFile.objects.get(pk=pk) + checkuserrights = checkUserDirRights(request, file.parent, request.user.id) + if(checkuserrights): + file_path = os.path.join(settings.MEDIA_ROOT, file.file.name) + if os.path.exists(file_path): + with open(file_path, 'rb') as fh: + file_ext = file.name.split(".")[1] + response = HttpResponse(fh.read(), content_type="application/file") + response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path) + return response + raise Http404 + + return response + else: + context = { + 'active_link' : 'cloud', + } + return render(request, 'cloud/noentrie.html', context) + + \ No newline at end of file diff --git a/dasettings/__init__.py b/dasettings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dasettings/__pycache__/__init__.cpython-38.pyc b/dasettings/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..3e52170 Binary files /dev/null and b/dasettings/__pycache__/__init__.cpython-38.pyc differ diff --git a/dasettings/__pycache__/admin.cpython-38.pyc b/dasettings/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..4a60a4c Binary files /dev/null and b/dasettings/__pycache__/admin.cpython-38.pyc differ diff --git a/dasettings/__pycache__/apps.cpython-38.pyc b/dasettings/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..f7c6f57 Binary files /dev/null and b/dasettings/__pycache__/apps.cpython-38.pyc differ diff --git a/dasettings/__pycache__/forms.cpython-38.pyc b/dasettings/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..0d7a8fe Binary files /dev/null and b/dasettings/__pycache__/forms.cpython-38.pyc differ diff --git a/dasettings/__pycache__/models.cpython-38.pyc b/dasettings/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..1445e6b Binary files /dev/null and b/dasettings/__pycache__/models.cpython-38.pyc differ diff --git a/dasettings/__pycache__/urls.cpython-38.pyc b/dasettings/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..deaceae Binary files /dev/null and b/dasettings/__pycache__/urls.cpython-38.pyc differ diff --git a/dasettings/__pycache__/views.cpython-38.pyc b/dasettings/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..653c730 Binary files /dev/null and b/dasettings/__pycache__/views.cpython-38.pyc differ diff --git a/dasettings/admin.py b/dasettings/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/dasettings/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/dasettings/apps.py b/dasettings/apps.py new file mode 100644 index 0000000..8764e82 --- /dev/null +++ b/dasettings/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class DASettingsConfig(AppConfig): + name = 'dasettings' diff --git a/dasettings/forms.py b/dasettings/forms.py new file mode 100644 index 0000000..2f47f1c --- /dev/null +++ b/dasettings/forms.py @@ -0,0 +1,471 @@ +from django import forms +from django.db import models +from django.contrib.auth.models import User +from users.models import AgencyGroup, Agency, Profile, AgencyJob, AgencyNetwork, UserTime, UserNotifications +from PIL import Image +from bootstrap_datepicker_plus import DatePickerInput +from django.utils.translation import gettext as _ +from timemanagement.models import AbsenceReason + +class AgencyOrganigrammForm(forms.ModelForm): + class Meta: + model = Agency + fields = ['dynamicprofile'] + + labels = { + 'dynamicprofile' : "Dynamischer Steckbrief" + } + +class AgencyNetworkForm(forms.ModelForm): + class Meta: + model = AgencyNetwork + fields = ['name', 'publicjoin'] + + labels = { + "name" : "Name des Agenturverbunds", + "publicjoin" : "Beitritt ohne Bestätigung" + } + +# Change logged Users Data (Usernamen an Email) NUR HIER MÖGLICH! +class UsersSelfChangeForm(forms.ModelForm): + email = forms.EmailField() + + class Meta: + model = User + fields = ['email'] + +class AgencyBillMail(forms.ModelForm): + class Meta: + model = Agency + fields = ['payment_address'] + + labels = { + 'payment_address' : 'E-Mail für Rechnungen' + } + +class AgencyBillPlan(forms.ModelForm): + + class Meta: + model = Agency + fields = ['name','inhaber','agency_email', 'phone', 'street', 'plz', 'city', 'paymentplan', 'agb', 'contract', 'lexofficeid'] + labels = { + "name" : "Agenturname", + "inhaber" : "Inhaber", + "street" : "Straße und Hausnummer", + "plz" : "PLZ", + "city" : "Stadt", + "agency_email" : "E-Mail", + "phone" : "Telefon", + "agb" : "AGB akzeptieren", + "contract" : "AV-Vertrag akzeptieren" + } + + + def __init__(self, *args, **kwargs): + super(AgencyBillPlan, self).__init__(*args, **kwargs) + self.fields['paymentplan'] = forms.CharField(initial=1, required=True, widget=forms.HiddenInput()) + self.fields['lexofficeid'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + self.fields['name'] = forms.CharField(required=True, label="Agenturname") + + self.fields['inhaber'] = forms.CharField(required=True, label="Inhaber") + + self.fields['agency_email'] = forms.CharField(required=True, label="E-Mailadresse") + self.fields['phone'] = forms.CharField(required=True, label="Telefon") + self.fields['street'] = forms.CharField(required=True, label="Straße und Hausnummer") + self.fields['plz'] = forms.CharField(required=True, label="PLZ") + self.fields['city'] = forms.CharField(required=True, label="Stadt") + + self.fields['vve'] = forms.CharField(required=True, label="VVE-Mitgliedsnummer - Ihre Mitgliedsnummer entnehmen Sie bitte der Teilnahmebestätigung zur VVE-Jahrestagung.") + + self.fields['agb'] = forms.BooleanField(required=True, label="AGB's akzeptieren") + self.fields['contract'] = forms.BooleanField(required=True, label="AV-Vertrag akzeptieren") + self.fields['recoverdir'] = forms.BooleanField(required=False, label="Notfallhilfe für 15,00 € bestellen. Sie erhalten eine separate E-Mail vom VVE.") + + +class AgencyEndBillPlan(forms.ModelForm): + class Meta: + model = Agency + fields = ['paymentplan'] + + def __init__(self, *args, **kwargs): + super(AgencyEndBillPlan, self).__init__(*args, **kwargs) + self.fields['paymentplan'] = forms.CharField(initial=None, required=True, widget=forms.HiddenInput()) + + +# Form für die Benachrichtigungseinstellungen +''' +class UsersNotificationForm(forms.ModelForm): + + class Meta: + model = Profile + labels = { + "news_mail" : "Agentur-News", + #"user_standard_public_mail" : "Veröffentlichung meiner Standards", + "agency_new_standard_mail" : "Neue Agentur-Standards", + 'add_new_group_mail' : "Gruppenmitgliedschaften", + 'add_task_mail' : "Tätigkeitsbereich", + 'user_messages_mail' : "Mitteilungen" + } + #fields = ['news_mail', 'news_push', 'user_standard_public_mail', 'user_standard_public_push', 'agency_new_standard_mail', 'agency_new_standard_push', 'add_new_group_mail', 'add_new_group_push', 'add_task_mail', 'add_task_push', 'user_messages_mail', 'user_messages_push'] + fields = ['news_mail', 'news_push', 'agency_new_standard_mail', 'agency_new_standard_push', 'add_new_group_mail', 'add_new_group_push', 'add_task_mail', 'add_task_push', 'user_messages_mail', 'user_messages_push'] +''' +# Form für die Benachrichtigungseinstellungen STANDARDS +class UsersNotificationFormStandard(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "standard_created_mail" : "Neuer Standard", + "standard_update_mail" : "Standard verändert", + "standard_delete_mail" : "Standard gelöscht", + "standard_created_unpub_mail" : "Neuer, unveröffentlichter Standard" + + } + fields = [ + 'standard_created_mail', + 'standard_created_push', + 'standard_update_mail', + 'standard_update_push', + 'standard_delete_mail', + 'standard_delete_push', + 'standard_created_unpub_mail', + 'standard_created_unpub_push', + ] + + +# Form für die Benachrichtigungseinstellungen NEWS +class UsersNotificationFormNews(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "news_created_mail" : "Neuer Agenturnews", + + } + fields = [ + 'news_created_mail', + 'news_created_push', + ] + +# Form für die Benachrichtigungseinstellungen MESSAGES +class UsersNotificationFormMessages(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "message_received_mail" : "Neuer Mitteilung", + + } + fields = [ + 'message_received_mail', + 'message_received_push', + ] + +# Form für die Benachrichtigungseinstellungen CHAT +class UsersNotificationFormChat(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "chat_received_mail" : "Verpasste Chatnachrichten", + "chat_room_activity_mail" : "Raumaktivitäten", + + } + fields = [ + 'chat_received_mail', + 'chat_received_push', + 'chat_room_activity_mail', + 'chat_room_activity_push', + ] + +# Form für die Benachrichtigungseinstellungen FILES +class UsersNotificationFormFiles(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "filedir_created_mail" : "Datei/Ordner erstellt", + "filedir_update_mail" : "Datei/Ordner aktualisiert", + "filedir_delete_mail" : "Datei/Ordner gelöscht", + + } + fields = [ + 'filedir_created_mail', + 'filedir_created_push', + 'filedir_update_mail', + 'filedir_update_push', + 'filedir_delete_mail', + 'filedir_delete_push', + ] + +# Form für die Benachrichtigungseinstellungen ABSENCE AND TIME +class UsersNotificationFormAbTime(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "absence_created_mail" : "Anfrage erstellt", + "absence_user_is_rep_mail" : "Als Vertreter eingesetzt", + "absence_user_is_rep_reminder_mail" : "Erinnerung für Vertretung", + "time_data_changed_mail" : "Abwesenheit bearbeitet", + } + fields = [ + 'absence_created_mail', + 'absence_created_push', + 'absence_user_is_rep_mail', + 'absence_user_is_rep_push', + 'absence_user_is_rep_reminder_mail', + 'absence_user_is_rep_reminder_push', + 'time_data_changed_mail', + 'time_data_changed_push', + ] + +# Form für die Benachrichtigungseinstellungen GRUPPEN +class UsersNotificationFormGroups(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "group_activity_mail" : "Mitgliedschaftsänderung", + "group_rights_mail" : "Rechteänderung", + + } + fields = [ + 'group_activity_mail', + 'group_activity_push', + 'group_rights_mail', + 'group_rights_push', + ] + +# Form für die Benachrichtigungseinstellungen Tätigkeitsbereiche +class UsersNotificationFormTasks(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "task_activity_mail" : "Tätigkeiten", + + } + fields = [ + 'task_activity_mail', + 'task_activity_push', + ] + +# Form für die Benachrichtigungseinstellungen GRUPPEN +class UsersNotificationFormAgn(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "agn_standard_created_mail" : "Neuer Standard", + "agn_standard_copied_mail" : "Standard wurde übernommen", + "agn_standard_comment_mail" : "Kommentar zu Standard aus meiner Agentur", + "agn_standard_comment_react_mail" : "Reaktion zu meinem Kommentar", + "agn_own_change_mail" : "Änderungen meiner Agenturverbunde", + "agn_other_change_mail" : "Änderung anderer Agenturverbunde", + } + fields = [ + 'agn_standard_created_mail', + 'agn_standard_created_push', + 'agn_standard_copied_mail', + 'agn_standard_copied_push', + 'agn_standard_comment_mail', + 'agn_standard_comment_push', + 'agn_standard_comment_react_mail', + 'agn_standard_comment_react_push', + 'agn_own_change_mail', + 'agn_own_change_push', + 'agn_other_change_mail', + 'agn_other_change_push', + ] + + +class UsersNotificationFormOrganizer(forms.ModelForm): + + class Meta: + model = UserNotifications + labels = { + "ql_created_mail" : "Quicklink erstellt", + "ql_update_mail" : "Quicklink aktualisiert", + "ql_delete_mail" : "Quicklink gelöscht", + "contact_created_mail" : "Kontakt erstellt", + "contact_update_mail" : "Kontakt aktualisiert", + "contact_delete_mail" : "Kontakt gelöscht", + "password_created_mail" : "Passwort erstellt", + "password_update_mail" : "Passwort aktualisiert", + "password_delete_mail" : "Passwort gelöscht", + } + fields = [ + 'ql_created_mail', + 'ql_created_push', + 'ql_update_mail', + 'ql_update_push', + 'ql_delete_mail', + 'ql_delete_push', + 'contact_created_mail', + 'contact_created_push', + 'contact_update_mail', + 'contact_update_push', + 'contact_delete_mail', + 'contact_delete_push', + 'password_created_mail', + 'password_created_push', + 'password_update_mail', + 'password_update_push', + 'password_delete_mail', + 'password_delete_push', + ] + + + +# Usertime Form +class UserTimeForm(forms.ModelForm): + class Meta: + model = UserTime + labels = { + "loose_holidedate" : "Resturlaub verfällt am (XX.XX.)", + "startdate" : "Einstellungsdatum", + "wd_mo" : "Montag", + "wd_tu" : "Dienstag", + "wd_we" : "Mittwoch", + "wd_th" : "Donnerstag", + "wd_fr" : "Freitag", + "wd_sa" : "Samstag", + "wd_so" : "Sonntag", + "usetime" : "Zeiterfassung" , + "startcount" : "Bisheriges Gleitzeitkonto", + "usetime_start" : "Zeiterfassung ab" + } + fields = ["startcount", "startdate", "usetime", "usetime_start", "wd_mo", "wd_tu", "wd_we", "wd_th", "wd_fr", "wd_sa", "wd_so", "loose_holidedate"] + widgets = { + "startdate" : DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}), + "usetime_start" : DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}) + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['startdate'].required = True + self.fields['usetime_start'].required = False + self.fields['startcount'].required = False + self.fields['usetime'].required = False + #self.fields['usetime'].widget.attrs['readonly'] = True + #self.fields['usetime_start'].widget.attrs['readonly'] = True + + +# PERMISSION GROUPS FORM +class AgencyGroupPerms(forms.Form): + ''' + Permission-System + + Persmissions werden im Model gesetzt, hier automatisch als Form ausgegeben. + Hat der Nutzer eine der genannten Rechte, wird die Checkbox automatisch TRUE gesetzt. + Die erstellen Felder werden entsprechend den Feldern hinzugefügt und ausgegeben. + + @param: user + - User ist der aufgerufene User! + ''' + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + temprof = AgencyGroup + for ele in temprof._meta.permissions: + self.fields[ele[0]] = forms.BooleanField(required=False, initial=False, help_text=(ele[1])) + +# LOADING ALL MODUL-OPTIONS +class AgencyModulsForm(forms.ModelForm): + + class Meta: + model = Agency + labels = { + 'module_news' : "Agentur-News", + 'module_organizer' : "Organizer", + 'module_files' : "Dateien", + 'module_organigramm' : "Organigramm", + 'module_messages' : "Mitteilungen", + 'module_chat' : "Chat", + 'module_timemanagement' : "Abwesenheits- und Zeiterfassung", + #'module_timemanagement' : "Abwesenheitsplanung", + } + fields = ['module_news','module_organizer','module_files','module_organigramm', 'module_messages', 'module_chat', 'module_timemanagement'] + + # RAUSNHEMEN WENN DEV DONE + def __init__(self, *args, **kwargs): + super(AgencyModulsForm, self).__init__(*args, **kwargs) + #self.fields['module_timemanagement'].widget.attrs['readonly'] = True + #self.fields['module_timemanagement'].widget.attrs['disabled'] = True + + +# NEW USER FORM +class UserNewUserForm(forms.ModelForm): + + class Meta: + model = User + fields = ["first_name", "last_name", "email"] + + + error_messages = { + 'email': { + 'unique': _("Diese E-Mailadresse ist bereits vergeben."), + }, + } + +# NEW USER PROFILE FORM +class UserProfileForm(forms.ModelForm): + + x = forms.FloatField(widget=forms.HiddenInput()) + y = forms.FloatField(widget=forms.HiddenInput()) + width = forms.FloatField(widget=forms.HiddenInput()) + height = forms.FloatField(widget=forms.HiddenInput()) + rotation = forms.FloatField(widget=forms.HiddenInput()) + + class Meta: + model = Profile + labels = { + "persnumber" : "Personalnummer", + "visible" : "Im Organigramm sichtbar", + "phonemobile" : "Mobilnummer", + "phone_public" : "Nur Interne Verwendung der Mobilnummer", + "phoneland" : "Festnetznummer", + "image": "Profilbild", + "func" : "Agenturfunktion", + "compfunc" : "Tätigkeit" + } + widgets = {"parent" : forms.HiddenInput()} + fields = ["parent", "func", "compfunc", "visible", "phoneland", "phonemobile", "phone_public", "persnumber", "image" ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['func'].queryset = AgencyJob.objects.filter(agency__pk=self.instance.agency.pk) + + def save(self): + photo = super(UserProfileForm, self).save() + try: + x = self.cleaned_data.get('x') + y = self.cleaned_data.get('y') + w = self.cleaned_data.get('width') + h = self.cleaned_data.get('height') + rotation = self.cleaned_data.get('rotation') + image = Image.open(photo.image) + rotatet_image = image.rotate(rotation, expand=True) + cropped_image = rotatet_image.crop((x, y, w+x, h+y)) + resized_image = cropped_image.resize((416, 416), Image.ANTIALIAS) + resized_image.save(photo.image.path) + return photo + except: + print("no photo") + + +class AbsenceReasonForm(forms.ModelForm): + + rgb_color = forms.CharField(widget=forms.HiddenInput()) + + class Meta: + model = AbsenceReason + labels = { + "name" : "Bezeichnung", + "need_confirm" : "Muss bestätigt werden", + "need_rep" : "Muss vertreten werden", + "is_holiday" : "Geht vom Urlaub ab", + "is_time" : "Geht vom Gleitzeitkonto ab" + } + fields = ["name", "need_confirm", "need_rep", "is_holiday", "is_time", "rgb_color"] diff --git a/dasettings/migrations/__init__.py b/dasettings/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dasettings/migrations/__pycache__/__init__.cpython-38.pyc b/dasettings/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..59c1984 Binary files /dev/null and b/dasettings/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/dasettings/models.py b/dasettings/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/dasettings/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/dasettings/templates/dasettings/absencereason_add.html b/dasettings/templates/dasettings/absencereason_add.html new file mode 100644 index 0000000..14e5f05 --- /dev/null +++ b/dasettings/templates/dasettings/absencereason_add.html @@ -0,0 +1,61 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load static %} +{% block content %} +{% if request.user.profile.agency.module_timemanagement %} + + + +
+

Abwesenheitskategorie anlegen

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+ +
+
+
+   + Abbrechen +
+
+ + +{% else %} +

Das Modul Abwesenheitsplanung wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} + diff --git a/dasettings/templates/dasettings/absencereason_confirm_delete.html b/dasettings/templates/dasettings/absencereason_confirm_delete.html new file mode 100644 index 0000000..79b2989 --- /dev/null +++ b/dasettings/templates/dasettings/absencereason_confirm_delete.html @@ -0,0 +1,23 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_timemanagement %} +
+
+
+ +
+
+
+
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% else %} +

Das Modul Abwesenheitsplanung wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/absencereason_update.html b/dasettings/templates/dasettings/absencereason_update.html new file mode 100644 index 0000000..d29a3a4 --- /dev/null +++ b/dasettings/templates/dasettings/absencereason_update.html @@ -0,0 +1,79 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load static %} +{% block content %} +{% if request.user.profile.agency.module_timemanagement %} + + + +
+

Abwesenheitskategorie aktualisieren

+
+
+ {% csrf_token %} + {{form|crispy}} +
+ +
+
+
+   + Abbrechen +
+
+ +{% else %} +

Das Modul Abwesenheitsplanung wurden in ihrer Agentur deaktiviert.

+{% endif %} + + +{% endblock content %} + diff --git a/dasettings/templates/dasettings/addagencynetwork_content.html b/dasettings/templates/dasettings/addagencynetwork_content.html new file mode 100644 index 0000000..f9f2d64 --- /dev/null +++ b/dasettings/templates/dasettings/addagencynetwork_content.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Agenturverbund

+
+

Informationen zum Agenturverbund

+

+ Ein Agenturverbund schließt mehrere Agenturen zusammen. Dabei legen Sie als Ersteller fest, wie der Verbund heißt und wie andere Agenturen beitreten können. Nachdem der Verbund angelegt ist, erhalten Sie einen Link. Mit diesem Link können andere Agenturen beitreten, in dem sie auf den Link klicken. Anschließend erhalten Sie eine Information, welche Agenturen beitreten wollen und können diese dann aufnehmen. +

+

+ Wollen Sie einen öffentlichen Verbund, in den jede Agentur ohne Ihre Bestätigung beitreten kann, aktivieren Sie die Checkbox "Beitritt ohne Bestätigung". Standardmäßig können diese Agenturen nur Standards übernehmen, aber nicht eigene Standards in den Verbund teilen. In unserem Wiki erhalten Sie dazu weitere Informationen. +

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+ Abbrechen + +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/agency_content.html b/dasettings/templates/dasettings/agency_content.html new file mode 100644 index 0000000..e071fe7 --- /dev/null +++ b/dasettings/templates/dasettings/agency_content.html @@ -0,0 +1,331 @@ +{% load crispy_forms_tags %} +{% load static %} + +
+ + +
+ +
+ + + {% csrf_token %} + {{formfield.media}} +
+ +
+
+ {% for formfield in agencyform %} + {% if forloop.counter|divisibleby:5 %} +
+
+ {{formfield|as_crispy_field}} + {% else %} + {{formfield|as_crispy_field}} + {% endif %} + {% endfor %} +
+ +
+
+
+
+   +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/dasettings/templates/dasettings/agencynetwork_agmanagement_content.html b/dasettings/templates/dasettings/agencynetwork_agmanagement_content.html new file mode 100644 index 0000000..dfe7d1c --- /dev/null +++ b/dasettings/templates/dasettings/agencynetwork_agmanagement_content.html @@ -0,0 +1,273 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load static %} +{% block content %} +
+

Agenturen in Verbund {{agn.name}} + +

+{% if outstanding|length > 0 %} +
+
Ausstehende Einladungen
+ +
+ + + + + + + + + {% for agn_s in outstanding %} + + + + + {% endfor %} + +
Agenturname 
{{agn_s.wanted_agency.name}} + Annehmen + +   +
+
+{% endif %} + + +
+
Agenturen im Verbund{% if request.user.profile.showtooltips %} {% endif %}
+ {% if request.user.profile.agency in agn.adminagencys.all %} +
+ + + + + + + + + + + + {% for agn_s in allagofagn %} + {% ifaginadminagn agn.pk agn_s.pk as is_adminag %} + {% ifmember agn.pk agn_s.pk as is_member %} + {% ifsharemember agn.pk agn_s.pk as is_sharemember %} + + + + + + + + + {% endfor %} + +
AgenturnameNur MitgliedInhalte teilenAdministratives Mitglied 
{{agn_s.name}} + {% if agn_s != request.user.profile.agency %} + + {%endif%} +
+
+ {% else %} + +
+ + + + + + + + + {% for agn_s in allagofagn %} + + + + + {% endfor %} + +
AgenturnameRechte
{{agn_s.name}} + {% if agn_s in agn.adminagencys.all %}Administratives Mitglied + {% elif agn_s in agn.members.all %}Mitglied + {% elif agn_s in agn.sharemembers.all %}Inhalte teilen + {% endif %} +
+
+ + {% endif %} + + +
+ + + + + + + +{% endblock content %} diff --git a/dasettings/templates/dasettings/agencynetwork_content.html b/dasettings/templates/dasettings/agencynetwork_content.html new file mode 100644 index 0000000..1260797 --- /dev/null +++ b/dasettings/templates/dasettings/agencynetwork_content.html @@ -0,0 +1,207 @@ +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load static %} + Agenturverbund +
+

Ihre Agenturverbünde

+
+ + + + + + + + + + + + + + + + {% for agn in agencynetworks %} + {% getsumofallag agn.pk as agsum %} + {% getoutstandinginvites agn.pk as outstanding %} + {% ifaginadminagn agn.pk request.user.profile.agency.pk as is_adminag %} + + + + + + + + + + + + {% endfor %} + +
NameLink{% if request.user.profile.showtooltips %} {% endif %}ErstelleragenturErstellt durchErstellt amLetzte Aktivität amAgenturenStandards 
{{agn.name}} + {% if is_adminag %} + +     + + {% endif %} + {{agn.creator_agency.name }} +   + {{agn.creator.first_name }} {{agn.creator.last_name }}{{agn.created_on }}{{agn.lastactivity}}{% if outstanding %} {% endif %}{{agsum}}{{agn.standards.all|length}} + {% if is_adminag %} + + + + + {% else %} + + {% endif %} +
+
+ +{% for agn in agencynetworks %} + +{% endfor %} + + + + + + + + + \ No newline at end of file diff --git a/dasettings/templates/dasettings/bill_removepayplan.html b/dasettings/templates/dasettings/bill_removepayplan.html new file mode 100644 index 0000000..cc55fdf --- /dev/null +++ b/dasettings/templates/dasettings/bill_removepayplan.html @@ -0,0 +1,36 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% block content %} +
+

Abonnement kündigen

+
+
+ {% csrf_token %} + {{form|crispy}} +

Beenden Sie das Abonnement, erhalten Sie keine automatische Verlängerung. Beachten Sie, dass sich Ihre Mitarbeiter spätestens zwei Wochen nach dem letzten Tag des bezahlten Zeitraums Ihre Digitale Agentur nicht mehr anmelden können.

+

Sie können jederzeit ein neues Abonnement starten. Dieser beginnt dann frühestens nach dem Tag, an dem das aktuelle Abonnement ausläuft.

+
+
+ Abbrechen +   +
+
+
+{% endblock content %} + + + + + + + + + + + + + + + + diff --git a/dasettings/templates/dasettings/bill_single.html b/dasettings/templates/dasettings/bill_single.html new file mode 100644 index 0000000..6282e62 --- /dev/null +++ b/dasettings/templates/dasettings/bill_single.html @@ -0,0 +1,8 @@ +{% extends "users/base.html" %} +{% block content %} +
+

Rechnung betrachten

+
+ Hier herunterladen +
+{% endblock content %} diff --git a/dasettings/templates/dasettings/calc_content.html b/dasettings/templates/dasettings/calc_content.html new file mode 100644 index 0000000..aa7aa39 --- /dev/null +++ b/dasettings/templates/dasettings/calc_content.html @@ -0,0 +1,103 @@ +{% load mathfilters %} +{% load humanize %} +{% load counter_tag %} +{% if request.user.profile.agency.paymentstatus == 1 %} +

Ihre Agentur darf die Plattform kostenlos nutzen. Vielen Dank für Ihre Unterstützung!

+{% else %} + +
+
+
+
+
Ihr Betrag
+

Ihr monatlicher Nutzungsbetrag setzt sich wie folgt zusammen:

+ + + + + + {% loadUserCount request.user as usercount %} + {% loadUserCountMoney request.user as usercount_pay %} + + + + {% loadMWST user as mwst %} + + + + + + + {% loadFinalMoney user as fm %} + + +
Grundbetrag (inkl. 3 Nutzer)21,00 €
{{usercount}} zusätzliche Nutzer (3,00 € pro Nutzer){{usercount_pay|floatformat:2}} €
Gesetzliche MwSt. (19%){{mwst|floatformat:2|intcomma}} €

Monatlicher Bruttobetrag{{fm|floatformat:2|intcomma}} €
+
+
Ihre Zahlungsweise
+ + {% getNextMonth request.user.profile.agency as nextMonth %} + {% if bills|length == 0 %} + Es wurde noch kein Abonnement gestartet und keine Rechnungen gefunden. Sie können die Digitale Agentur bis zum {{nextMonth|date:"d.m.Y"}} kostenlos nutzen. Möchten Sie die Digitale Agentur auch nach diesem Zeitraum nutzen, starten Sie bitte ein neues Abonnement. +
+ Abonnement starten + {% elif bills|length > 0 and request.user.profile.agency.paymentplan == 0 %} + Ihre aktuelle Rechnungen erlaubt Ihnen die Nutzung der Digitalen Agentur bis zum {{bills.0.end|date:"d.m.Y"}}. Danach wird der Zugang gesperrt. Starten Sie ein neues Abonnement, um die Digitale Agentur auch weiterhin zu nutzen.
+ Abonnement starten + {% else %} + Die Abrechnung erfolgt monatlich. Die nächste Rechnungserstellung erfolgt am {{bills.0.end|date:"d.m.Y"}}.
+ Abonnement kündigen + {% endif %} +
+
Fragen, Hilfe, Kündigung
+ Bei Fragen zu Ihrer Abrechnung oder Kündigung wenden Sie sich bitte über das Kontaktformular an uns. Weitere Informationen finden Sie in den AGB's. +
+
+
+
+ +
+
+
E-Mail-Adresse
+ Bei neuen Rechnungen erfolgt eine automatische Benachrichtigung an folgende E-Mailadresse:
+ {% if request.user.profile.agency.payment_address == None %} + Es wurde keine Adresse hinterlegt. Die Adresse wird an die Agenturadresse versendet: {{request.user.profile.agency.agency_email}} + {% else %} + {{request.user.profile.agency.payment_address}} + {% endif %} +
+ E-Mailadresse ändern +
+
+ +
+
+
Rechnungen
+ {% if bills|length == 0 %} + Es liegen keine Rechnungen vor. + {% endif %} + + + + + + + + + + {% for bill in bills %} + + + + + + {% endfor %} + +
Rechnungs-Nr.DatumStatus
{{bill.billnumber}}{{bill.billdate|date:"d.m.Y"}} + {% if bill.billstatus == "open" %} {% elif bill.billstatus == "paid" %} {% endif %} +
+
+
+
+ +
+{% endif %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/calc_content_SAVE.html b/dasettings/templates/dasettings/calc_content_SAVE.html new file mode 100644 index 0000000..c251475 --- /dev/null +++ b/dasettings/templates/dasettings/calc_content_SAVE.html @@ -0,0 +1,7 @@ +{% load mathfilters %} +{% load humanize %} +

Kontostand: {{request.user.profile.agency.balance|floatformat:0}} €

+

Nächste Abbuchung am {{request.user.profile.agency.nextdebiting|date:"d.m.Y"}}

+

Max. Nutzungszeit:  {{request.user.profile.agency.balance|div:30|floatformat:0}} Monate

+

IBAN: DE4412345678912345

+

Laden Sie das Konto mit einem beliebigen Geldbetrag auf. Die Kosten belaufen sich auf 30 € pro Monat zzgl. gebuchter Module.

diff --git a/dasettings/templates/dasettings/change_absence_yeardata.html b/dasettings/templates/dasettings/change_absence_yeardata.html new file mode 100644 index 0000000..0bf9564 --- /dev/null +++ b/dasettings/templates/dasettings/change_absence_yeardata.html @@ -0,0 +1,42 @@ + + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + {% for ab_info in user_years.all %} + {% if forloop.counter0 > 0 %} + + {% else %} + + {% endif %} + {% endfor %} + + +
Jahr{{ab_info.year}}
Urlaub +
+ +
+
Genommener Urlaub{{ab_info.days_inuse}}
Resturlaub aus Vorjahr +
+ +
+
 
\ No newline at end of file diff --git a/dasettings/templates/dasettings/dasettings_billmail.html b/dasettings/templates/dasettings/dasettings_billmail.html new file mode 100644 index 0000000..f9fd7f8 --- /dev/null +++ b/dasettings/templates/dasettings/dasettings_billmail.html @@ -0,0 +1,16 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Rechnungs-E-Mail aktualisieren

+
+
+ {% csrf_token %} +
+ {{form|crispy}} +
+   + Abbrechen + +
+{% endblock content %} diff --git a/dasettings/templates/dasettings/dasettings_billplan.html b/dasettings/templates/dasettings/dasettings_billplan.html new file mode 100644 index 0000000..225a33e --- /dev/null +++ b/dasettings/templates/dasettings/dasettings_billplan.html @@ -0,0 +1,98 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load mathfilters %} +{% load humanize %} +{% load counter_tag %} +{% block content %} +
+

Abonnement starten

+
+
+ {% csrf_token %} +
+
+
Agenturdaten überprüfen
+
+ {% for formfield in form %} + {% if formfield.name != 'agb' and formfield.name != 'contract' and formfield.name != 'recoverdir' %} + {{formfield|as_crispy_field}} + {% endif %} + {% endfor %} + +
+
+
Abonnement festlegen
+
+

Das Abonnement der Digitalen Agentur umfasst die Nutzung inkl. der aktuellen Nutzeranzahl und verlängert sich automatisch. Nach jedem Monat wird eine neue Rechnung erstellt. Sie können innerhalb eines Monats ihr Abonnement kündigen. + +


+

Mit Klick auf dem Button Jetzt kostenpflichtig bestellen wird eine Rechnung für Ihre Agentur generiert und per E-Mail an die hinterlegte Rechnungs-E-Mailadresse oder an die Agentur-E-Mailadresse versendet. Der Rechnungsbetrag muss innerhalb von 14 Tagen beglichen werden. +


+ Beginn des Leistungszeitraums: {{end|date:"d.m.Y"}}
+ {% loadFinalMoney user as fm %} + Aktueller Rechnungsbetrag: {{fm|floatformat:2|intcomma}} € +
+ {{form.contract}}  AV-Vertrag*
+ {{form.agb}}  AGB's*
+ {{form.recoverdir|as_crispy_field}} + + + +
+ +
+
+
+ Abbrechen +   +
+
+
+ + +{% endblock content %} + + + + + + + + + + + + + + + + diff --git a/dasettings/templates/dasettings/data_absence_yeardata.html b/dasettings/templates/dasettings/data_absence_yeardata.html new file mode 100644 index 0000000..57a0f39 --- /dev/null +++ b/dasettings/templates/dasettings/data_absence_yeardata.html @@ -0,0 +1,37 @@ + + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + {% for ab_info in user_years.all %} + {% if forloop.counter0 > 0 %} + + {% else %} + + {% endif %} + {% endfor %} + + +
Jahr{{ab_info.year}}
Urlaub{{ab_info.days}}
Genommener Urlaub{{ab_info.days_inuse}}
Resturlaub aus Vorjahr{{ab_info.restdays}} 
+ \ No newline at end of file diff --git a/dasettings/templates/dasettings/delagencynetwork_content.html b/dasettings/templates/dasettings/delagencynetwork_content.html new file mode 100644 index 0000000..a906101 --- /dev/null +++ b/dasettings/templates/dasettings/delagencynetwork_content.html @@ -0,0 +1,16 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Agenturverbund löschen

+
+ Achtung! Wenn Sie den Agenturverbund löschen, können die Agenturen innerhalb des Verbunds keine Informationen mehr austauschen. +
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/freedays_add.html b/dasettings/templates/dasettings/freedays_add.html new file mode 100644 index 0000000..21cb54b --- /dev/null +++ b/dasettings/templates/dasettings/freedays_add.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_timemanagement %} +
+

Freien Tag anlegen

+
+
+ {% csrf_token %} + {{form.media}} + {{ form|crispy }} +
+   + Abbrechen +
+
+{% else %} +

Das Modul Abwesenheitsplanung wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/dasettings/templates/dasettings/freedays_confirm_delete.html b/dasettings/templates/dasettings/freedays_confirm_delete.html new file mode 100644 index 0000000..2bfd368 --- /dev/null +++ b/dasettings/templates/dasettings/freedays_confirm_delete.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_timemanagement %} +
+
+
+ +
+
+
+ +
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% else %} +

Das Modul Abwesenheitsplanung wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/freedays_management.html b/dasettings/templates/dasettings/freedays_management.html new file mode 100644 index 0000000..911568a --- /dev/null +++ b/dasettings/templates/dasettings/freedays_management.html @@ -0,0 +1,257 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} +
+ +

Feiertage und Schließtage{% if request.user.profile.showtooltips %} {% endif %} +  Feiertage  +  Freier Tag +

+
+
+
+ + + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + + + {% for fd in freedays %} + + + + + + {% endfor %} + +
NameTag 
{{ fd.name }}{{ fd.day|date:"d. F Y" }} + {% if user|usergperm:"moduleorganizer" %} + + + + {% endif %} +
+
+ +
+ + + + + + + + + + + + + +{% endblock content %} diff --git a/dasettings/templates/dasettings/groups_content.html b/dasettings/templates/dasettings/groups_content.html new file mode 100644 index 0000000..d7d6af9 --- /dev/null +++ b/dasettings/templates/dasettings/groups_content.html @@ -0,0 +1,493 @@ +{% load counter_tag %} +
+ + + + +
+
+{% for aggroup in agencygroups %} + {% setvar 0 %} + {% for user in usersofagency %} + {% for group in user.groups.all %} + {% if group.name == aggroup.group.name %} + {% incvar %} + {% endif %} + {% endfor %} + {% endfor %} + {% getvar as varcounter %} +
+
+
+     + + {% if not aggroup.savefordel %} + + {% endif %} + {% if not aggroup.savefordel %} + + {% endif %} +
+
+ +
+
+
Gruppenrechte{% if request.user.profile.showtooltips %} {% endif %}
+ {% if aggroup.agencygroupname != "Notfallhilfe" %} +
+
+ {% for perm in perms %} + {% if perm.help_text != "Notfallhilfe verwalten" %} + {% if forloop.counter|divisibleby:8 %} +
+
+
+ + +
+ {% else %} +
+ + +
+ {% endif %} + {% endif %} + {% endfor %} +
+
+
+ {% else %} + Die Gruppe Notfallhilfe ist für keine weiteren Rechte konfigurierbar. +
+ {% endif %} +
+
Mitarbeiter zur Gruppe {{aggroup.agencygroupname}} hinzufügen
+
+ +
+ +
+ + {% for user in usersofagency %} + {% if not user|has_group:aggroup.group.name %} + + +
+
+
Gruppenmitglieder in {{aggroup.agencygroupname}}
+ {% if varcounter > 0 %} + + {% else %} + Diese Gruppe hat noch keine Mitglieder. + {% endif %} +
+ {% for user in usersofagency %} + {% for group in user.groups.all %} + {% if group.name == aggroup.group.name %} + {% if request.user == user and aggroup.is_admin %} + + {% else %} + {{ user.first_name }} {{ user.last_name }}   + + {% endif %} + {% endif %} + {% endfor %} + {% endfor %} +
+
+ +
+
+
+ +{% if request.user.profile.agency.module_recoverdir %} + {% if forloop.counter == 3 %} +
+ {% endif %} + + {% else %} + + {% if forloop.counter == 2 %} +
+ {% endif %} +{% endif %} +{% endfor %} +
+
+
+ +{% for aggroup in agencygroups %} + {% for p in aggroup.group.permissions.all %} + {% for perm in perms %} + {% if p.codename == perm.name %} + + {% endif %} + {% endfor %} + {% endfor %} +{% endfor %} + + + + + + + \ No newline at end of file diff --git a/dasettings/templates/dasettings/joinagn_first.html b/dasettings/templates/dasettings/joinagn_first.html new file mode 100644 index 0000000..bb5d31e --- /dev/null +++ b/dasettings/templates/dasettings/joinagn_first.html @@ -0,0 +1,140 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% block content %} +
+

Agenturverbund {{agn.name}} beitreten

+
+ +
+
+
Verbundinfos
+ {% getsumofallag agn.pk as agsum %} + {% getsumofallstandards agn.pk as ag_standardsum %} + +
Gründeragentur {{agn.creator_agency.name }}
+
Gegründet von {{agn.creator.first_name }} {{agn.creator.last_name }}
+
Grüdungsdatum {{agn.created_on }}
+
Agenturen {{agsum}}
+
Standards {{agn.standards.all|length}}
+
Letzte Aktivität {{agn.lastactivity}}
+ + {% if agn.publicjoin %} +
+ Das Beitreten zu diesem Verbund ist öffentlich. Sie können daher sofort nach Beitritt die geteilten Informationen einsehen, aber selber keine Informationen in den Verbund teilen. + {% endif %} +
+
Agenturen im Verbund
+ Verwaltende Agenturen: + {% for a in agn.adminagencys.all %} +  {{a.name}}{% if forloop.counter < agn.adminagencys.all|length %},{% endif %}{% endfor %} +
+ {% if agn.members.all|length > 0 or agn.sharemembers.all|length %} + Mitgliedsagenturen betrachten + +
+
+ + + + + + +
+ Möchten Sie diesem Verbund beitreten? +
+ + +
+{% endblock content %} diff --git a/dasettings/templates/dasettings/modulesettings_organigramm.html b/dasettings/templates/dasettings/modulesettings_organigramm.html new file mode 100644 index 0000000..089f0f8 --- /dev/null +++ b/dasettings/templates/dasettings/modulesettings_organigramm.html @@ -0,0 +1,21 @@ +{% load crispy_forms_tags %} +
+ {% csrf_token %} + {{modsettings_organigramm|crispy}} +
+ \ No newline at end of file diff --git a/dasettings/templates/dasettings/modulesettings_timemanagement.html b/dasettings/templates/dasettings/modulesettings_timemanagement.html new file mode 100644 index 0000000..df4a99a --- /dev/null +++ b/dasettings/templates/dasettings/modulesettings_timemanagement.html @@ -0,0 +1,106 @@ +{% load crispy_forms_tags %} +{% load counter_tag %} +

Abwesenheitskategorien{% if request.user.profile.showtooltips %} {% endif %} +  Kategorie +

+ + + + + + + + + + + + + + {% for ab in modsettings_tm_abcat %} + + + + + + + + + + {% endfor %} + +
BezeichnungBestätigungVertretungGleitzeitUrlaubstagFarbe 
{{ab.name}}{% if ab.need_confirm %} {% else %} {% endif %}{% if ab.need_rep %} {% else %} {% endif %}{% if ab.is_time %} {% endif %}{% if ab.is_holiday %} {% endif %} + {% if user|usergperm:"moduleorganizer" %} + + + + + + + + + {% endif %} +
+ Abwesenheitskategorien legen fest, wie sich eine Abwesenheit bzgl. Bestätigung durch einen Mitarbeiter mit entsprechenden Rechten und eines Vertretes verhält. +
+

Externer Zugriff{% if request.user.profile.showtooltips %} {% endif %} +

+ + {% if request.user.profile.agency.agencycal_publicstatus == 1 %} + Externer Zugriff erlaubt. + {% else %} + Externer Zugriff gesperrt. + {% endif %} +
+ Feiertage bearbeiten + + + + + \ No newline at end of file diff --git a/dasettings/templates/dasettings/moduls_content.html b/dasettings/templates/dasettings/moduls_content.html new file mode 100644 index 0000000..e016555 --- /dev/null +++ b/dasettings/templates/dasettings/moduls_content.html @@ -0,0 +1,82 @@ +{% load crispy_forms_tags %} +
+ + + + + + + + + + + {% csrf_token %} + + +{% for formfield in modulform %} + + + + + +{% endfor %} + +
ModulAktiviertEinstellungen
{{formfield.label_tag}}{{formfield}} + {% if formfield.name == 'module_organigramm' and user.profile.agency.module_organigramm %} + + {% elif formfield.name == 'module_timemanagement' and user.profile.agency.module_timemanagement %} + + {% endif %} +
+ + +
+ +{% for formfield in modulform %} + +
+
+{% endfor %} diff --git a/dasettings/templates/dasettings/notifications_content.html b/dasettings/templates/dasettings/notifications_content.html new file mode 100644 index 0000000..27542cb --- /dev/null +++ b/dasettings/templates/dasettings/notifications_content.html @@ -0,0 +1,421 @@ +{% load crispy_forms_tags %} +
+ +
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_standard %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_news %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_groups %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_task %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + + + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_files %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_organizer %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_messages %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_chat %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_abtime %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ + + +
+
+
+ +
+
+ +
+
+ + + + + + + + + + {% for formfield in notificationforms_agn %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} + {% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+
+
+
+ +
+
+ diff --git a/dasettings/templates/dasettings/notifications_content_OLD.html b/dasettings/templates/dasettings/notifications_content_OLD.html new file mode 100644 index 0000000..6a1f722 --- /dev/null +++ b/dasettings/templates/dasettings/notifications_content_OLD.html @@ -0,0 +1,64 @@ +{% load crispy_forms_tags %} +
+ + + + + + + + + +{% for formfield in notificationform %} + {% if forloop.counter|divisibleby:2 %} + + + {% else %} + + + + {% endif %} +{% endfor %} + +
BenachrichtigungE-MailPush
{{formfield}}
{{formfield.label_tag}}{{formfield}}
+ +
+ \ No newline at end of file diff --git a/dasettings/templates/dasettings/profil_content.html b/dasettings/templates/dasettings/profil_content.html new file mode 100644 index 0000000..08a5514 --- /dev/null +++ b/dasettings/templates/dasettings/profil_content.html @@ -0,0 +1,116 @@ +{% load crispy_forms_tags %} +
+ +
+ +
+
+
+
Name
+

+ {{ user.first_name }} {{ user.last_name }} +

+
E-Mail
+

+ {{ user.email }} +

+
Agenturfunktion
+

+ {{ user.profile.func }} +

+
+
+
Tätigkeit
+

+ {{ user.profile.compfunc }} +

+
Festnetz
+

+ {{ user.profile.phoneland }} +

+
Mobil
+

+ {{ user.profile.phonemobile }} +

+
+
+
+
+ +
+
+ {% csrf_token %} + + +
+ + Profil bearbeiten + + {% if request.user.profile.showtooltips %} +
+ + +
+ {% else %} +
+ + +
+ {% endif %} + + {{ userform|crispy }} +
+ + Agenturrelevante Daten (Bild, Telefonnummer etc.) werden in der Benutzerverwaltung verändert. +
+   +
+
+
+ {% csrf_token %} + + +
+ + {{ passwordform|crispy}} +
+ +
+   +
+
+
+ diff --git a/dasettings/templates/dasettings/settings.html b/dasettings/templates/dasettings/settings.html new file mode 100644 index 0000000..27a3456 --- /dev/null +++ b/dasettings/templates/dasettings/settings.html @@ -0,0 +1,530 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} + +
+ + +
+
+ + +
+
+ +

Einstellungen{% if request.user.profile.showtooltips %} {% endif %}

+
+ +
+
+
Profileinstellungen{% if request.user.profile.showtooltips %} {% endif %}
+
+ {% block profil_content %} + {% include "dasettings/profil_content.html" %} + {% endblock %} +
+
+
Benachrichtigungen{% if request.user.profile.showtooltips %} {% endif %}
+ + {% block notifications_content %} + {% include "dasettings/notifications_content.html" %} + {% endblock %} +
+ {% if user|usergperm:"agencyinfo" %} +
+
Agenturinformationen{% if request.user.profile.showtooltips %} {% endif %} + +
+
+ {% block agency_content %} + {% include "dasettings/agency_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"agencyinfo" %} +
+
Abrechnung{% if request.user.profile.showtooltips %} {% endif %}
+
+ {% block calc_content %} + {% include "dasettings/calc_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"agencynetwork" %} +
+
Agenturverbünde{% if request.user.profile.showtooltips %} {% endif %} + +
+
+ {% block agencynetwork_content %} + {% include "dasettings/agencynetwork_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"structuremanager" %} +
+
Struktur{% if request.user.profile.showtooltips %} {% endif %} + +
+
+ {% block structure_content %} + {% include "dasettings/structure_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"usermanager" %} +
+
Mitarbeiter{% if request.user.profile.showtooltips %} {% endif %} + +
+
+ {% block user_content %} + {% include "dasettings/user_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"groupmanager" %} +
+
Gruppen{% if request.user.profile.showtooltips %} {% endif %} + +
+
+ {% block groups_content %} + {% include "dasettings/groups_content.html" %} + {% endblock %} +
+ {% endif %} + {% if user|usergperm:"modulesconfig" %} +
+
Module{% if request.user.profile.showtooltips %} {% endif %}
+ {% block moduls_content %} + {% include "dasettings/moduls_content.html" %} + {% endblock %} +
+ {% endif %} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% endblock content %} diff --git a/dasettings/templates/dasettings/structure_content.html b/dasettings/templates/dasettings/structure_content.html new file mode 100644 index 0000000..75a1431 --- /dev/null +++ b/dasettings/templates/dasettings/structure_content.html @@ -0,0 +1,789 @@ +{% load static %} +{% load counter_tag %} + + + + + + + + +
+ +
+
+
+
+{%for area in agencyareas%} +
+
+
+ +      + + + + + +
+
+
+
+ + + + + + + + + + + + + {% for task in alltasks %} + {% if task.area.pk == area.pk %} + + + + + + + + {% endif %} + {% endfor %} + +
NameBereichErstellt vonErstellt am 
{{task.name }}{{ task.area.name }}{{ task.created_area_by.first_name }} {{ task.created_area_by.last_name }}{{ task.created_area_date }} + + + +
+
+
+
+{% endfor %} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dasettings/templates/dasettings/user_changemaindata.html b/dasettings/templates/dasettings/user_changemaindata.html new file mode 100644 index 0000000..8694f97 --- /dev/null +++ b/dasettings/templates/dasettings/user_changemaindata.html @@ -0,0 +1,16 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Stammdaten von {{user_fullname}} ändern

+
+
+ {% csrf_token %} + {{ userform|crispy }} +
+ Abbrechen + +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/user_content.html b/dasettings/templates/dasettings/user_content.html new file mode 100644 index 0000000..32a644d --- /dev/null +++ b/dasettings/templates/dasettings/user_content.html @@ -0,0 +1,92 @@ +{% load counter_tag %} + Mitarbeiter +
+
+
+ + + + + + + + + + + + + + + + {% for item in usersofagency %} + + + + + + + + + + + + {% endfor %} + +
VornameNachnameE-MailAgenturfunktionTätigkeitTelefonMobil 
{{item.first_name }}{{ item.last_name }}{{ item.email }}{% if item.profile.func == None %}-{%else%}{{ item.profile.func }}{%endif%}{{ item.profile.compfunc }}{{ item.profile.phoneland }}{{ item.profile.phonemobile }} + {% if item != request.user %} + + {% endif %} +
+
+
+ + + + diff --git a/dasettings/templates/dasettings/user_newuser_step1.html b/dasettings/templates/dasettings/user_newuser_step1.html new file mode 100644 index 0000000..eb89e0b --- /dev/null +++ b/dasettings/templates/dasettings/user_newuser_step1.html @@ -0,0 +1,35 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Neuer Benutzer 

+
+
+
Schritt 1: Stammdaten
+
+Legen Sie hier die Stammdaten des neuen Mitarbeiters fest. + +
+ {% csrf_token %} + {{ newuserform|crispy }} + +
+ + +
+ *: Der Benutzer erhält direkt eine E-Mail mit einem Link zur Passworterstellung, wenn der Haken bei E-Mailbenachrichtung schicken gesetzt ist. Dies kann später auch wiederholt werden. + + {% if request.user.profile.agency.paymentplan != "0" %} +
+

Der neu erstellte Nutzer wird zum nächsten Monat des Abrechnungszeitraums berechnet.

+ {% endif %} + +
+ Abbrechen + +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/dasettings/templates/dasettings/user_usprof.html b/dasettings/templates/dasettings/user_usprof.html new file mode 100644 index 0000000..4468ce6 --- /dev/null +++ b/dasettings/templates/dasettings/user_usprof.html @@ -0,0 +1,702 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load static %} +{% block content %} + + + + +
+ + +
+
+ + +
+ + +
+

Mitarbeiter {{user_fullname}}  

+
+ {% if newuser == 1 %} +
+
Schritt 2: Profildaten festlegen
+
+ {% endif %} +
+ +
+
+
+
Name
+

+ {{ user_fullname }}  +

+
E-Mail
+

+ {{ mail }}  +

+
+    +

+
+
+
+
+
+
+ + +
+
+ +
+ +
+
Gruppen 
+
+
+ {% for g in agencygroups %} + {% if forloop.counter|divisibleby:6 %} +
+
+ {% if vieweduser|useringroupbyid:g.group.name %} + + {% else %} + + {% endif %} + +
+ {% else %} +
+ {% if vieweduser|useringroupbyid:g.group.name %} + + {% else %} + + {% endif %} + +
+ {% endif %} + {% endfor %} +
+
+
+
+
Übergeordneter Mitarbeiter 
+ +
+
+
Persönliches Profil
+ {% csrf_token %} +
+
+ + {% for field in profileform %} + {% if forloop.counter|divisibleby:6 %} +
+
+ {{field|as_crispy_field}} + {% else %} + {{field|as_crispy_field}} + {% endif %} + {% endfor %} +
+
+
+ {% if newuser == 1 %} + Profil später bearbeiten + {% else %} + Abbrechen + {% endif%} + + {% if newuser == 1 %} + + {% else %} + + {% endif %} + +
+
+
+ + +
+
+ {% csrf_token %} + +
Zeiterfassung 
+
+
+ {{usertime_form.usetime|as_crispy_field}} +
+
+ {{usertime_form.usetime_start|as_crispy_field}} +
+
+ {{usertime_form.startcount|as_crispy_field}} +
+ {% if usertochangefull.usertime.usetime %} +
+ Zurücksetzen + {% if request.user.profile.showtooltips %} {% endif %} +
+ +
+ {% endif %} +
+ + + +
Arbeitszeiten 
+
+ + + + + + + + + + +
{{usertime_form.wd_mo|as_crispy_field}}{{usertime_form.wd_tu|as_crispy_field}}{{usertime_form.wd_we|as_crispy_field}}{{usertime_form.wd_th|as_crispy_field}}{{usertime_form.wd_fr|as_crispy_field}}{{usertime_form.wd_sa|as_crispy_field}}{{usertime_form.wd_so|as_crispy_field}}
+
+
+
+
+
Urlaub 
+
+ {{usertime_form.media}} +
+
+ {{usertime_form.startdate|as_crispy_field}} +
+
+ {{usertime_form.loose_holidedate|as_crispy_field}} +
+
+
Urlaub Jahresübersicht  + + +
+
+ + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + {% for ab_info in user_years.all %} + + {% endfor %} + + + + {% for ab_info in user_years.all %} + {% if forloop.counter0 > 0 %} + + {% else %} + + {% endif %} + {% endfor %} + + +
Jahr{{ab_info.year}}
Urlaub{{ab_info.days}}
Genommener Urlaub{{ab_info.days_inuse}}
Resturlaub aus Vorjahr{{ab_info.restdays}} 
+
+
+
+
+ + Abbrechen +
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + + + + + +{% endblock content %} diff --git a/dasettings/tests.py b/dasettings/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/dasettings/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/dasettings/urls.py b/dasettings/urls.py new file mode 100644 index 0000000..b169384 --- /dev/null +++ b/dasettings/urls.py @@ -0,0 +1,42 @@ +from django.urls import path +from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required, permission_required +from . import views +from .views import FreeDayDeleteView, AbsenceReasonDeleteView, AbsenceReasonUpdateView, AbsenceReasonAddView +from .views import NewUserFirstStep, UserProfileUpdate, UserChangeMain, BillMailUpdate, BillPlanUpdate, GetBill, GetBillPDF, BillPlanEnd +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('main/', views.DASettings, name='dasettings'), + path('newuser/s1', permission_required('users.usermanager')(views.NewUserFirstStep), name='newuserfirst'), + path('newagn/', permission_required('users.agencynetwork')(views.AddAgencyNetwork), name='newagn'), + path('updateagn/', permission_required('users.agencynetwork')(views.UpdateAgencyNetwork), name='updateagn'), + path('delagn/', permission_required('users.agencynetwork')(views.DelAgencyNetwork), name='delagn'), + path('changeus//', permission_required('users.usermanager')(views.UserChangeMain), name='changeusermaindata'), + path('ajax/', views.SettingsAjaxRouter, name="dasettings-ajax"), + path('agnafjax/', views.AgencyNetworkAjaxSettings, name="dasettings-agnajax"), + path('usprof//', permission_required('users.usermanager')(views.UserProfileUpdate), name="user_updateprofile"), + path('agnni//', permission_required('users.agencynetwork')(views.AddMyAgencyToAgn), name='addagnecytoagnetwork'), + path('joinagn/', permission_required('users.agencynetwork')(views.JoinAGN), name='joinagn'), + path('managnag/', permission_required('users.agencynetwork')(views.ManageAgInAgn), name='managagn'), + path('managnag/acceptinv///', permission_required('users.agencynetwork')(views.AddAgToNetwork), name='acceptinvite'), + path('managnag/deli/', permission_required('users.agencynetwork')(views.DelAgInv), name='delinvite'), + #path('managnag/delfromagn//', permission_required('users.agencynetwork')(views.DelFromAgn), name='delagfromagn'), + path('modsettings/orga/', views.ModSettingsOrga, name="modsettings-orga"), + path('modsettings/tm/', views.ModSettingsTm, name="modsettings-tm"), + path('freedaysmn/', views.FreeDaysManagemenet, name="tm-managemenetfreedays"), + path('freedaysmn/', views.FreeDaysManagemenet, name="tm-initload"), + path('freedayadd/', views.FreeDayAdd, name="tm-freedayadd"), + path('freedaydel/', FreeDayDeleteView.as_view(), name="freeday-delete"), + path('abcatdel/', AbsenceReasonDeleteView.as_view(), name="abcat-delete"), + path('abcatupdate/', AbsenceReasonUpdateView.as_view(), name="abcat-update"), + path('abcatadd/', AbsenceReasonAddView.as_view(), name="abcat-add"), + path('ag/billmail/update/', permission_required('users.agencyinfo')(BillMailUpdate.as_view()), name='ag-billmailupdate'), + path('ag/billplan/', permission_required('users.agencyinfo')(BillPlanUpdate.as_view()), name='ag-billplanupdate'), + path('ag/getbill/', permission_required('users.agencyinfo')(GetBill), name='ag-getbill'), + path('ag/getbillpdf/', permission_required('users.agencyinfo')(GetBillPDF), name='ag-getbillpdf'), + path('ag/billplanend/', permission_required('users.agencyinfo')(BillPlanEnd.as_view()), name='ag-billplanend'), + +] \ No newline at end of file diff --git a/dasettings/views.py b/dasettings/views.py new file mode 100644 index 0000000..357bf04 --- /dev/null +++ b/dasettings/views.py @@ -0,0 +1,2191 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.decorators import login_required +from django.http import HttpResponseRedirect,HttpResponse, JsonResponse +from .forms import UsersSelfChangeForm, UsersNotificationFormStandard, AgencyGroupPerms, AgencyModulsForm, UserNewUserForm, UserProfileForm, AgencyNetworkForm, AgencyOrganigrammForm, UserTimeForm, AbsenceReasonForm, UsersNotificationFormNews, UsersNotificationFormFiles, UsersNotificationFormMessages ,UsersNotificationFormOrganizer, UsersNotificationFormChat, UsersNotificationFormAbTime, UsersNotificationFormGroups, UsersNotificationFormAgn, UsersNotificationFormTasks, AgencyBillMail, AgencyBillPlan, AgencyEndBillPlan +from django.contrib import messages +from django.contrib.auth import update_session_auth_hash +from django.contrib.auth.forms import PasswordChangeForm +from users.usersforms import AgencyUpdateForm +from users.models import AgencyJob, AgencyGroup, AgencyNetwork, Agency, AgencyNetworkPreperation, UserYearAbsenceInfo +from django.contrib.auth.models import User, Group, Permission +from users.models import UserTime, RegNotfallhilfe +import random +import string +from django.template.loader import render_to_string +from users.usersforms import UsersPermForm +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView +from users.models import Profile, UserNotifications, UserTime, AgencyBills +from areas.models import Areas +from tasks.models import Tasks +import webcolors +import datetime +from datetime import date +from standards.models import Standards +from timemanagement.models import AbsenceReason, FreeDays, Workday, Absence +from django.core.mail import send_mail +from django.conf import settings +import re, os, csv, requests +from django.templatetags.static import static +from django.db.models import DateField +from django.views.generic import DeleteView, UpdateView +from timemanagement.forms import AddFreeDayForm +from django.urls import reverse_lazy +import re +import json +from django.conf import settings # import the settings file +from PIL import Image +from datetime import date, timedelta +''' MAIL ''' +from django.core.mail import EmailMessage +from django.core.mail import EmailMultiAlternatives +import io as BytesIO +import base64 +from django.http import HttpResponse + +from django.db.models.signals import post_save +from users.signals import save_newabsence + +def randomString(stringLength=10): + """Generate a random string of fixed length """ + letters = string.ascii_lowercase + return ''.join(random.choice(letters) for i in range(stringLength)) + +@login_required +def checkForGroupName(request, newgroupname): + stat = True + groupsagency = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk) + for group in groupsagency: + if group.agencygroupname.upper() == newgroupname.upper(): + stat = False + return stat + +@login_required +def getAllForms(request, context): + # USERFORMS + userform = UsersSelfChangeForm(instance=request.user) + passwordform = PasswordChangeForm(request.user) + context.update({'userform' : userform}) + context.update({'passwordform' : passwordform}) + + # NOTIFICTAION FORMS + # STANDARDS + notificationforms_standard = UsersNotificationFormStandard(instance=request.user.usernotifications) + context.update({'notificationforms_standard' : notificationforms_standard}) + + notificationforms_news = UsersNotificationFormNews(instance=request.user.usernotifications) + context.update({'notificationforms_news' : notificationforms_news}) + + notificationforms_files = UsersNotificationFormFiles(instance=request.user.usernotifications) + context.update({'notificationforms_files' : notificationforms_files}) + + notificationforms_organizer = UsersNotificationFormOrganizer(instance=request.user.usernotifications) + context.update({'notificationforms_organizer' : notificationforms_organizer}) + + notificationforms_messages = UsersNotificationFormMessages(instance=request.user.usernotifications) + context.update({'notificationforms_messages' : notificationforms_messages}) + + notificationforms_chat = UsersNotificationFormChat(instance=request.user.usernotifications) + context.update({'notificationforms_chat' : notificationforms_chat}) + + notificationforms_abtime = UsersNotificationFormAbTime(instance=request.user.usernotifications) + context.update({'notificationforms_abtime' : notificationforms_abtime}) + + notificationforms_groups = UsersNotificationFormGroups(instance=request.user.usernotifications) + context.update({'notificationforms_groups' : notificationforms_groups}) + + notificationforms_agn = UsersNotificationFormAgn(instance=request.user.usernotifications) + context.update({'notificationforms_agn' : notificationforms_agn}) + + notificationforms_task = UsersNotificationFormTasks(instance=request.user.usernotifications) + context.update({'notificationforms_task' : notificationforms_task}) + + + + # AGENCY UPDATE FORMS + agencyform = AgencyUpdateForm(instance=request.user.profile.agency) + context.update({'agencyform' : agencyform}) + + #PERMS + perms = AgencyGroupPerms() + context.update({'perms' : perms}) + + #MODULFORMS + modulform = AgencyModulsForm(instance=request.user.profile.agency) + context.update({'modulform' : modulform}) + + #MODULSETTUNGS + #Modulsettings ORGANIGRAMM + modsettings_organigramm = AgencyOrganigrammForm(instance=request.user.profile.agency) + context.update({'modsettings_organigramm' : modsettings_organigramm}) + + #Modulsettings ABWESENHEIT- UND ZEITERFASSUNG + #modsettings_tm = AgencyTimeManagement(instance=request.user.profile.agency) + #context.update({'modsettings_tm' : modsettings_tm}) + context.update({"modsettings_tm_abcat" : AbsenceReason.objects.filter(agency=request.user.profile.agency).order_by("name") }) + + + # USER FOR USERTABLE + users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).order_by("last_name") + return context + + +''' + Lädt die Formulare für die einzelnen Einstellungen vollständig +''' +@login_required +def DASettings(request): + + + # CHECK FOR EVERY USER YEAR-DATA + uina = User.objects.filter(profile__agency=request.user.profile.agency) + today = date.today() + for u in uina: + + # NO YEARS FOUND + if len(UserYearAbsenceInfo.objects.filter(agency=request.user.profile.agency, user=u)) == 0: + # CREATE DATA FOR EVERY USER + UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year).save() + UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year+1).save() + UserYearAbsenceInfo(agency=request.user.profile.agency, user=u, year=today.year+2).save() + + # CREATE DATE FOR YEAR PLUS 2 + #elif len(UserYearAbsenceInfo.objects.filter(agency=user.profile.agency, year=today.year+2)) == 0: + # uina = User.objects.filter(profile__agency=user.profile.agency) + # + # for u in uina: + # UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year+2).save() + + + + + context = { + 'active_link' : 'dasettings', + 'baseurl' : settings.BASE_URL + } + context = getAllForms(request, context) + + # USERS FOR MEMBERS AND GROUPCOUNTERS + usersofagency = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).order_by("last_name") + context.update({"usersofagency" : usersofagency}) + + # LOAD AGENCYJOBS + context.update({"agencyjobs" : AgencyJob.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("name")}) + + # LOAD GROUPS + if request.user.profile.agency.module_recoverdir: + agencygroups = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("agencygroupname").order_by("-savefordel") + else: + agencygroups = AgencyGroup.objects.filter(agency__pk=request.user.profile.agency.pk).order_by("agencygroupname").order_by("-savefordel").exclude(agencygroupname="Notfallhilfe") + + context.update({"agencygroups" : agencygroups}) + + # LOAD AREAS + agencyareas = Areas.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('areaorder') + context.update({"agencyareas" : agencyareas}) + + # LOAD AGENCYNETWORKS + #agencynetworks = AgencyNetwork.objects.filter(creator_agency=request.user.profile.agency) | AgencyNetwork.objects.filter(adminagencys__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(members__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(sharemembers__in=[request.user.profile.agency.pk]) + + #agencynetworks = AgencyNetwork.objects.filter(adminagencys__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(members__in=[request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(sharemembers__in=[request.user.profile.agency.pk]) + + agencynetworks_all = AgencyNetwork.objects.all() + agencynetworks = [] + + for a in agencynetworks_all: + if request.user.profile.agency in a.adminagencys.all() or request.user.profile.agency in a.members.all() or request.user.profile.agency in a.sharemembers.all(): + agencynetworks.append(a) + + context.update({"agencynetworks" : agencynetworks}) + + # LOAD TASKS + alltasks = Tasks.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('name') + context.update({"alltasks" : alltasks}) + + if request.method == 'POST' and request.POST.get("settings_area") == "profil": + return SettingsProfilManagement(request, context) + elif request.method == 'POST' and request.POST.get("settings_area") == "agency": + return SettingsAgency(request, context) + elif request.method == 'POST' and request.POST.get("settings_area") == "moduls": + return SettingsAgencyModuls(request, context) + + + + # Returning the data from database for normal-loading Settings + else: + # DEFAULT DATA FORM-INFOS + # Hier müssen alle Standard-Formulare rein, damit die Seite Settings + # generell geladen werden kann. + # PROFILE FORMS + userform = UsersSelfChangeForm(instance=request.user) + passwordform = PasswordChangeForm(request.user) + context.update({'userform' : userform}) + context.update({'passwordform' : passwordform}) + + ############################### NOTIFIFORMS START ########################################## + notificationforms_standard = UsersNotificationFormStandard(instance=request.user.usernotifications) + context.update({'notificationforms_standard' : notificationforms_standard}) + + notificationforms_news = UsersNotificationFormNews(instance=request.user.usernotifications) + context.update({'notificationforms_news' : notificationforms_news}) + + notificationforms_files = UsersNotificationFormFiles(instance=request.user.usernotifications) + context.update({'notificationforms_files' : notificationforms_files}) + + notificationforms_organizer = UsersNotificationFormOrganizer(instance=request.user.usernotifications) + context.update({'notificationforms_organizer' : notificationforms_organizer}) + + notificationforms_messages = UsersNotificationFormMessages(instance=request.user.usernotifications) + context.update({'notificationforms_messages' : notificationforms_messages}) + + notificationforms_chat = UsersNotificationFormChat(instance=request.user.usernotifications) + context.update({'notificationforms_chat' : notificationforms_chat}) + + notificationforms_abtime = UsersNotificationFormAbTime(instance=request.user.usernotifications) + context.update({'notificationforms_abtime' : notificationforms_abtime}) + + notificationforms_groups = UsersNotificationFormGroups(instance=request.user.usernotifications) + context.update({'notificationforms_groups' : notificationforms_groups}) + + notificationforms_agn = UsersNotificationFormAgn(instance=request.user.usernotifications) + context.update({'notificationforms_agn' : notificationforms_agn}) + + notificationforms_task = UsersNotificationFormTasks(instance=request.user.usernotifications) + context.update({'notificationforms_task' : notificationforms_task}) + ############################### NOTIFIFORMS END ############################################ + + # AGENCY UPDATE FORMS + agencyform = AgencyUpdateForm(instance=request.user.profile.agency) + context.update({'agencyform' : agencyform}) + + # Abrechnung BILLS + + lexdata = {} + + # HEADERS CURL + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + #json_data = json.dumps(lexdata) + #r = requests.get("https://api.lexoffice.io/v1/invoices/"+AgencyBills.objects.filter(agency=request.user.profile.agency)[0].lexid, data=json_data, headers=headers) + #json.loads(r.text) + #print(r.text) + # Alle Rechnungen der Agentur abfragen + context.update({"bills" : AgencyBills.objects.filter(agency=request.user.profile.agency).order_by("-end")}) + + + return render(request, 'dasettings/settings.html', context) + +from django.http import FileResponse, Http404 + +@login_required +def GetBill(request, pk): + # HEADERS CURL + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + json_data = {} + + r = requests.get("https://api.lexoffice.io/v1/invoices/"+AgencyBills.objects.get(pk=pk).lexid+"/document", data=json_data, headers=headers) + + context = { + 'active_link' : 'dasettings', + 'bill' : AgencyBills.objects.get(pk=pk), + 'fileid' : json.loads(r.text)["documentFileId"] + } + + return render(request, 'dasettings/bill_single.html', context) + +import io as BytesIO +import base64 +from django.http import HttpResponse + +@login_required +def GetBillPDF(request, pk): + bill = AgencyBills.objects.get(pk=pk) + # Sicherheitscheck, ob der angefragte User zur Agentur gehört und das Recht hat, Agenturinfos zu bearbeiten + if ((bill.agency == request.user.profile.agency and request.user.has_perm("users.agencyinfo")) or request.user.is_staff): + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + lexdata = { + "renderType" : "pdf" + } + json_data = json.dumps(lexdata) + + r = requests.get("https://api.lexoffice.io/v1/invoices/"+bill.lexid+"/document", data=json_data, headers=headers) + json.loads(r.text) + + base64String = requests.get("https://api.lexoffice.io/v1/files/"+json.loads(r.text)["documentFileId"]+"/", data=json_data, headers=headers) + + buffer = BytesIO.BytesIO() + content = base64.b64decode(base64String.text) + buffer.write(content) + + response = HttpResponse(buffer.getvalue(),content_type="application/pdf") + response['Content-Disposition'] = 'inline;filename=some_file.pdf' + return response + else: + messages.warning(request, f'Diese Daten sind für Sie nicht einsehbar.') + return redirect("dasettings") + + + +''' + +AGENCY + +Hier werden die Agenturinfos ink. Agenturcropper für das Agenturbild angepasst. + +''' +@login_required +def SettingsAgency(request, context): + if request.POST.get("form_type") == "agencyform": + agencyform = AgencyUpdateForm(request.POST, instance=request.user.profile.agency) + if agencyform.is_valid(): + + agency = request.user.profile.agency + + if 'agencypic' in request.FILES: + request.user.profile.agency.agencypic = request.FILES['agencypic'] + agencyform.save() + else: + ''' + SAVE ONLY AG-DATA + ''' + agency.name = agencyform.cleaned_data.get('name') + agency.inhaber = agencyform.cleaned_data.get('inhaber') + agency.agency_email = agencyform.cleaned_data.get('agency_email') + agency.phone = agencyform.cleaned_data.get('phone') + agency.street = agencyform.cleaned_data.get('street') + agency.plz = agencyform.cleaned_data.get('plz') + agency.city = agencyform.cleaned_data.get('city') + agency.save() + #agencyform.save() + + context['agencyform'] = AgencyUpdateForm(instance=request.user.profile.agency) + messages.success(request, f'Agenturdaten aktualisiert!') + return render(request, 'dasettings/settings.html', context) + else: + messages.success(request, f'Daten falsch eingegeben!') + context['agencyform'] = AgencyUpdateForm(instance=request.user.profile.agency) + return render(request, 'dasettings/settings.html', context) + +from django.db.models import F, Func, Value + +@login_required +def FreeDaysManagemenet(request, initload=0): + if(initload==1): + context = { + 'active_link' : 'dasettings', + 'init_freedays' : True + } + return render(request, 'dasettings/freedays_management.html', context) + else: + context = { + 'active_link' : 'dasettings', + 'freedays' : FreeDays.objects.filter(agency=request.user.profile.agency).order_by("-day") + } + return render(request, 'dasettings/freedays_management.html', context) + +@login_required +def FreeDayAdd(request): + if request.POST: + freedayform = AddFreeDayForm(request.POST, instance=request.user.profile.agency) + if freedayform.is_valid(): + + allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency) + + for day in allfreedays: + double = False + if day.day == freedayform.cleaned_data['day'] and day.year == freedayform.cleaned_data['day'].year: + double = True + + + if double == False: + fd = FreeDays(agency=request.user.profile.agency, day=freedayform.cleaned_data['day'], year=freedayform.cleaned_data['day'].year, name=freedayform.cleaned_data['name']).save() + + messages.success(request, f'Freier Tag hinzugefügt') + else: + messages.warning(request, f'Am ' + str(freedayform.cleaned_data['day']) + " gibt es bereits einen Eintrag!") + + context = { + "active_link" : "dasettings", + } + return redirect("tm-managemenetfreedays") + else: + messages.success(request, f'Fehler beim hinzufügen!') + return redirect("tm-managemenetfreedays") + else: + context = { + "active_link" : "dasettings", + "form" : AddFreeDayForm() + } + return render(request, 'dasettings/freedays_add.html', context) + + +class FreeDayDeleteView(LoginRequiredMixin, DeleteView): + model = FreeDays + success_url = reverse_lazy('tm-managemenetfreedays') + template_name = 'dasettings/freedays_confirm_delete.html' + + def delete(self, request, *args, **kwargs): + response = super(FreeDayDeleteView, self).delete(request, *args, **kwargs) + messages.success(request, f'Freier Tag wurde gelöscht!') + return response + + def get_context_data(self, **kwargs): + context = super(FreeDayDeleteView, self).get_context_data(**kwargs) + context['active_link'] = 'dasettings' + return context + + +class AbsenceReasonDeleteView(LoginRequiredMixin, DeleteView): + model = AbsenceReason + success_url = reverse_lazy('dasettings') + template_name = 'dasettings/absencereason_confirm_delete.html' + + def delete(self, request, *args, **kwargs): + try: + response = super(AbsenceReasonDeleteView, self).delete(request, *args, **kwargs) + messages.success(request, f'Abwesenheitskategorie wurde gelöscht!') + return response + except: + + messages.success(request, f'Abwesenheitskategorie kann nicht gelöscht werden, da Abwesenheiten eingetragen wurden.') + return redirect('dasettings') + + + def get_context_data(self, **kwargs): + context = super(AbsenceReasonDeleteView, self).get_context_data(**kwargs) + context['active_link'] = 'dasettings' + return context + +class AbsenceReasonAddView(LoginRequiredMixin, CreateView): + model = AbsenceReason + success_url = reverse_lazy('dasettings') + form_class = AbsenceReasonForm + template_name = 'dasettings/absencereason_add.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'dasettings'}) + return context + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Abwesenheitskategorie angelegt!') + form.instance.color = form.cleaned_data["rgb_color"] + # SAVE OBJECTS TO SIGNALE! + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + +class AbsenceReasonUpdateView(LoginRequiredMixin, UpdateView): + model = AbsenceReason + template_name = 'dasettings/absencereason_update.html' + success_url = reverse_lazy('dasettings') + form_class = AbsenceReasonForm + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Abwesenheitskategorie aktualisiert!') + self.object.color = form.cleaned_data["rgb_color"] + self.object.save() + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super(AbsenceReasonUpdateView, self).get_context_data(**kwargs) + context['active_link'] = 'dasettings' + return context + +@login_required +def SettingsAgencyModuls(request, context): + if request.POST.get("form_type") == "agencymodform": + agencymoduleform = AgencyModulsForm(request.POST, instance=request.user.profile.agency) + if agencymoduleform.is_valid(): + + agencymoduleform.save() + + # Check, if Timemanagement is deactivate, to deactivate Zeiterfassung + if(request.user.profile.agency.module_timemanagement == False): + ag = request.user.profile.agency + #ag.module_timemanagement_ze = False + + if(request.user.has_perm("users.modulesconfig")): + FreeDays.objects.filter(agency=request.user.profile.agency).delete() + + ag.save() + + temp_freedays = FreeDays.objects.filter(agency=request.user.profile.agency) + + if(request.user.profile.agency.module_timemanagement and len(temp_freedays) == 0): + messages.success(request, f'Moduleinstellungen aktualisiert! Bitte prüfen Sie Ihre Feiertagseinstellungen') + return redirect('tm-initload', 1) + else: + context['modulform'] = AgencyModulsForm(instance=request.user.profile.agency) + messages.success(request, f'Moduleinstellungen aktualisiert!') + return render(request, 'dasettings/settings.html', context) + else: + context['modulform'] = AgencyModulsForm(instance=request.user.profile.agency) + messages.success(request, f'Fehler beim aktualisieren! Bitte wenden Sie sich an den Support.') + return render(request, 'dasettings/settings.html', context) + +''' + +Hier werden die Profilinfos des User zurückgesetzt; Parameter kommen von Settings() + +- Email +- Passwort aktualisieren + +''' +@login_required +def SettingsProfilManagement(request, context): + # Check, which form + # USERFORM + if request.POST.get("form_type") == "userform": + userform = UsersSelfChangeForm(request.POST, instance=request.user) + if userform.is_valid(): + usert = User.objects.get(pk=request.user.pk) + userform.save() + usert.username = userform.cleaned_data.get("email") + usert.email = userform.cleaned_data.get("email") + usert.save() + messages.success(request, f'E-Mailadresse aktualisiert!') + passwordform = PasswordChangeForm(request.user) + context['userform'] = userform + context['passwordform'] = passwordform + return render(request, 'dasettings/settings.html', context) + else: + messages.success(request, f'Keine E-Mailadresse eingegeben oder E-Mail bereits vorhanden!') + passwordform = PasswordChangeForm(request.user) + userform = UsersSelfChangeForm(instance=request.user) + context['userform'] = userform + context['passwordform'] = passwordform + return render(request, 'dasettings/settings.html', context) + # PASSWORDFORM + elif request.POST.get("form_type") == "passwordform": + passwordform = PasswordChangeForm(request.user, request.POST) + if passwordform.is_valid(): + passwordform.save() + update_session_auth_hash(request, request.user) + userform = UsersSelfChangeForm(instance=request.user) + context['userform'] = userform + context['passwordform'] = passwordform + messages.success(request, f'Passwort aktualisiert!') + return render(request, 'dasettings/settings.html', context) + else: + messages.success(request, f'Passwort falsch eingegeben!') + passwordform = PasswordChangeForm(request.user) + userform = UsersSelfChangeForm(instance=request.user) + context['userform'] = userform + context['passwordform'] = passwordform + return render(request, 'dasettings/settings.html', context) + +@login_required +def SettingsAjaxRouter(request): + success = False + data = {} + # UPDATE NOTIFICATIONS BY FIELDNAME AND NEW VALUE + ''' + if request.method == 'GET' and request.GET['action'] == "update_notifications" : + success = False + new_stat = request.GET['new_stat'] + field_to_change = getattr(request.user.profile, request.GET['fieldname']) + if(field_to_change or not field_to_change): + if(new_stat == "1"): + setattr(request.user.profile, request.GET['fieldname'], True) + else: + setattr(request.user.profile, request.GET['fieldname'], False) + request.user.profile.save() + success = True + ''' + if request.method == 'GET' and request.GET['action'] == "update_notifications" : + success = False + new_stat = request.GET['new_stat'] + field_to_change = getattr(request.user.usernotifications, request.GET['fieldname']) + if(field_to_change or not field_to_change): + if(new_stat == "1"): + setattr(request.user.usernotifications, request.GET['fieldname'], True) + else: + setattr(request.user.usernotifications, request.GET['fieldname'], False) + request.user.usernotifications.save() + success = True + # UPDATE TOOLTUP + elif request.method == 'GET' and request.GET['action'] == "change_showtooltips" : + newtooltipvalue = False + user = User.objects.get(pk=request.user.pk, profile__agency=request.user.profile.agency) + if(request.GET['newtoolvalue'] == "true"): + user.profile.showtooltips = True + newtooltipvalue = True + else: + user.profile.showtooltips = False + user.save() + success = True + data = {'newttvalue' : newtooltipvalue} + # UPDATE AGENCYJOB + elif request.method == 'GET' and request.GET['action'] == "update_agencyfunc" : + job_id = request.GET['id'] + job_value = request.GET['newvalue'] + tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) + tempjob.name = job_value + tempjob.save() + success = True + # DELETE AGENVY JOB FUNC - RETURN ONLY NAME FOR CONFIRM + elif request.method == 'GET' and request.GET['action'] == "get_agencyfunc" : + job_id = request.GET['id'] + tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) + data = {"funcname" : tempjob.name} + success = True + # DELETE FINAL AGECY JOB + elif request.method == 'GET' and request.GET['action'] == "delete_agencyfunc" : + job_id = request.GET['id'] + tempjob = AgencyJob.objects.get(pk=job_id, agency=request.user.profile.agency) + tempjob.delete() + success = True + elif request.method == 'GET' and request.GET['action'] == "add_agencyfunc" : + tempjob = AgencyJob(name="", agency=request.user.profile.agency) + tempjob.save() + data = {"new_id" : tempjob.pk} + success = True + # GRUPPENAMEN AKTUALISIEREN + elif request.method == 'GET' and request.GET['action'] == "update_groupname" : + group = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + if(checkForGroupName(request, request.GET['newvalue'])): + group.agencygroupname = request.GET['newvalue'] + group.save() + data = {"newvalue" : group.agencygroupname} + success = True + else: + success = False + # GRUPPENNAMEN HOLEN + elif request.method == 'GET' and request.GET['action'] == "get_groupname" : + group = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + data = {"groupname" : group.agencygroupname} + success = True + elif request.method == 'GET' and request.GET['action'] == "add_group" : + if(checkForGroupName(request, request.GET['newvalue'])): + tempgroup = Group(name=str(request.user.profile.agency.pk) + "_" + randomString(8)) + tempgroup.save() + tempgroup_ag = AgencyGroup(savefordel=False, group=tempgroup, agency=request.user.profile.agency, agencygroupname=request.GET['newvalue']) + tempgroup_ag.save() + success = True + data = {"group_id" : tempgroup_ag.pk, "group_name" : tempgroup_ag.agencygroupname} + else: + success = False + elif request.method == 'GET' and request.GET['action'] == "delete_group" : + groupag = AgencyGroup.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + group_to_del = groupag.group + group_to_del.delete() + success = True + # PERMISSIONS ON GROUP! + elif request.method == 'GET' and request.GET['action'] == "change_perm_group" : + success = True + group_id = request.GET['id'] + perm_name = request.GET['perm'] + val = request.GET['val'] + aggroup = AgencyGroup.objects.get(pk=group_id, agency=request.user.profile.agency) + # CHECK IF REQUESTED USER IS IN THIS AGENCY + if(request.user.profile.agency.pk == aggroup.agency.pk): + if(val == "true"): + tempperm = Permission.objects.get(codename=perm_name) + aggroup.group.permissions.add(tempperm) + else: + tempperm = Permission.objects.get(codename=perm_name) + aggroup.group.permissions.remove(tempperm) + else: + success = False + # REMOVE USER FROM GROUP + elif request.method == 'GET' and request.GET['action'] == "remove_user_from_group" : + success = True + groupid = request.GET['groupid'] + userid = request.GET['userid'] + aggroup = AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency) + usertoremove = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) + # CHECK IF REQUESTED USER IS IN THIS AGENCY + if(request.user.profile.agency.pk == aggroup.agency.pk): + if aggroup.group in usertoremove.groups.all(): + aggroup.group.user_set.remove(usertoremove) + + data = {"userid" : usertoremove.pk, "groupid" : aggroup.pk, "user_fname" : usertoremove.first_name, "user_lname" : usertoremove.last_name} + else: + success = False + # ADD USER TO GROUP + elif request.method == 'GET' and request.GET['action'] == "add_user_to_group" : + success = True + groupid = request.GET['groupid'] + userid = request.GET['userid'] + aggroup = AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency) + usertoadd = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) + # CHECK IF REQUESTED USER IS IN THIS AGENCY + if(request.user.profile.agency.pk == aggroup.agency.pk): + aggroup.group.user_set.add(usertoadd) + data = {"userid" : usertoadd.pk, "groupid" : aggroup.pk, "user_fname" : usertoadd.first_name, "user_lname" : usertoadd.last_name} + else: + success = False + # AREA + # AREANAMEN HOLEN + elif request.method == 'GET' and request.GET['action'] == "get_areaname" : + area = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + data = {"areaname" : area.name, "areacolor" : area.color} + success = True + # ARENAMEN UPDATE + elif request.method == 'GET' and request.GET['action'] == "update_areaname" : + area = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + area.name = request.GET['newvalue'] + area.color = request.GET['color'] + area.save() + data = {"newvalue" : area.name, "color" : area.color} + success = True + # ADD AREA + elif request.method == 'GET' and request.GET['action'] == "add_area" : + area = Areas(created_area_by=request.user, agency=request.user.profile.agency, name=request.GET["newvalue"], color=request.GET['color']) + area.save() + success = True + # REMOVE AREA + elif request.method == 'GET' and request.GET['action'] == "remove_area" : + todelarea = Areas.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + # REMOVE STANDARDS AREA + tempstandards = Standards.objects.filter(agency=request.user.profile.agency, area=todelarea) + if(request.user.has_perm('users.standardmanager')): + for s in tempstandards: + s.area = None + s.task = None + s.public = False + s.save() + + tasks = Tasks.objects.filter(agency=request.user.profile.agency, area=todelarea).delete() + todelarea.delete() + success = True + else: + success = False + + # ADD TASK + elif request.method == 'GET' and request.GET['action'] == "add_task" : + task = Tasks(created_area_by=request.user, area=Areas.objects.get(pk=request.GET['areaid']), agency=request.user.profile.agency, name=request.GET["newvalue"]) + task.save() + taskcreator_fullname = task.created_area_by.first_name + " " + task.created_area_by.last_name + data = {"name" : task.name, "newtaskid" : task.pk, "areaname" : task.area.name, "taskcreator_fullname" : taskcreator_fullname, "createdate" : task.created_area_date.strftime("%d. %B %Y")} + success = True + # TASKNAME VISIBLE UND USERS HOLEN + elif request.method == 'GET' and request.GET['action'] == "get_taskname" : + task = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + # User still in Area + # Get all Users from same Agency which are NOT in context_added_users + added_users = task.usersfield.all() + addus = {} + posus = {} + i = 0 + # GET ADDED USERS + for us in added_users: + addus.update({ i : {"fullname" : us.first_name + " " + us.last_name, "userid" : us.pk}}) + i += 1 + + # GET POSSIBLE TO ADD USERS + k = 0 + possible_users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).exclude(pk__in=added_users) + for us in possible_users: + posus.update({ k : {"fullname" : us.first_name + " " + us.last_name, "userid" : us.pk}}) + k += 1 + data = {"taskname" : task.name, "visible" : task.visible, "added_users" : addus, "addedl" : i, "possl" : k, "possible_users" : posus, "taskarea" : task.area.pk} + success = True + # REMOVE Task + elif request.method == 'GET' and request.GET['action'] == "remove_task" : + + todeltask = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + # REMOVE STANDARDS AREA + tempstandards = Standards.objects.filter(agency=request.user.profile.agency, task=todeltask) + if(request.user.has_perm('users.standardmanager')): + for s in tempstandards: + s.task = None + s.public = False + s.save() + todeltask.delete() + success = True + else: + success = False + #success = True + # UPDATE TASK VISIBLE + elif request.method == 'GET' and request.GET['action'] == "update_visible_taskname" : + task = Tasks.objects.get(pk=request.GET['id'], agency=request.user.profile.agency) + if(task.visible): + task.visible = False; + else: + task.visible = True; + task.save() + success = True + # UPDATE TASKNAME + elif request.method == 'GET' and request.GET['action'] == "change_taskname" : + task = Tasks.objects.get(pk=request.GET['id']) + task.name = request.GET["newvalue"] + data = {"newvalue" : task.name} + newareaid = request.GET["newareaid"] + standardsmoved = False + if int(task.area.pk) != int(newareaid): + standardsmoved = True + newareaobj = Areas.objects.get(pk=newareaid, agency=request.user.profile.agency) + Standards.objects.filter(agency=request.user.profile.agency, area=task.area, task=task).update(area=newareaobj) + task.area = newareaobj + task.save() + data = {"newvalue" : task.name, "smoved" : standardsmoved} + success = True + # UPDATE USER MAIL + elif request.method == 'GET' and request.GET['action'] == "update_usermail" : + tempuser = User.objects.get(pk=request.GET['userid']) + if(request.user.profile.agency == tempuser.profile.agency and request.user.has_perm('users.usermanager')): + tempmail = tempuser.email + regex = '^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$' + if(re.search(regex,request.GET['newmail'])): + newmail = request.GET['newmail'] + usertest = User.objects.filter(email=newmail) + if(len(usertest) > 0): + data = {"mail" : tempmail} + success = False + else: + tempuser.email = newmail + tempuser.username = newmail + tempuser.save() + success = True + else: + data = {"mail" : tempmail} + success = False + else: + success = False + # UPDATE USERNAME + elif request.method == 'GET' and request.GET['action'] == "update_usernames" : + tempuser = User.objects.get(pk=request.GET['userid']) + if(request.user.profile.agency == tempuser.profile.agency and request.user.has_perm('users.usermanager')): + regex = '^[a-zA-Z0-9_.-üöäÜÖÄ ]+$' + if(re.search(regex,request.GET['new_first_name']) and re.search(regex,request.GET['new_last_name'])): + tempuser.first_name = request.GET['new_first_name'] + tempuser.last_name = request.GET['new_last_name'] + tempuser.save() + data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} + success = True + else: + data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} + success = False + else: + data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} + success = False + # UPDATE FREEDAYS + elif request.method == 'GET' and request.GET['action'] == "initloadfreedays" : + if(request.user.has_perm('users.modulesconfig')): + temp_freedays = FreeDays.objects.filter(agency=request.user.profile.agency) + + if(len(temp_freedays) == 0): + tempdays_thisyear = loadingFreeDays(request.user.profile.agency.plz, date.today().year) + tempdays_lastyear = loadingFreeDays(request.user.profile.agency.plz, date.today().year - 1) + tempdays_nextyear = loadingFreeDays(request.user.profile.agency.plz, date.today().year + 1) + + if(tempdays_thisyear != False): + + for k in tempdays_lastyear.keys(): + tempdate = tempdays_lastyear[k]["datum"].split("-") + FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year-1).save() + + for k in tempdays_thisyear.keys(): + tempdate = tempdays_thisyear[k]["datum"].split("-") + FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year).save() + + for k in tempdays_nextyear.keys(): + tempdate = tempdays_nextyear[k]["datum"].split("-") + FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year+1).save() + messages.success(request, f'Feiertage erfolgreich gespeichert!') + success = True + else: + success = False + else: + data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} + success = False + + # LOAD MULTIPLE FREEDAYS + elif request.method == 'GET' and request.GET['action'] == "initloadfreedaysmulti" : + if(request.user.has_perm('users.modulesconfig')): + + #tempdays_year = False + if(request.GET["land"] == "true"): + + tempdays_year = loadingFreeDaysMulti(request.user.profile.agency.plz, request.GET["year"], True) + + allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency) + + if(tempdays_year != False): + for k in tempdays_year.keys(): + tempdate = tempdays_year[k].split("-") + + double = False + + for day in allfreedays: + if day.day == datetime.date(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])) and day.year == int(request.GET["year"]): + double = True + + + if double == False: + FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=int(request.GET["year"])).save() + + messages.success(request, f'Feiertage erfolgreich gespeichert!') + success = True + else: + success = False + + else: + tempdays_year = loadingFreeDaysMulti(request.user.profile.agency.plz, request.GET["year"], False) + allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency) + + if(tempdays_year != False): + for k in tempdays_year.keys(): + + double = False + + tempdate = tempdays_year[k]["datum"].split("-") + + for day in allfreedays: + + if day.day == datetime.date(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])) and day.year == int(request.GET["year"]): + double = True + if double == False: + FreeDays(agency=request.user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=int(request.GET["year"])).save() + + messages.success(request, f'Feiertage erfolgreich gespeichert!') + success = True + else: + success = False + else: + data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} + success = False + + # DELETE ALL FREE DAYS + elif request.method == 'GET' and request.GET['action'] == "delallfreedays" : + if(request.user.has_perm('users.modulesconfig')): + FreeDays.objects.filter(agency=request.user.profile.agency).delete() + messages.success(request, f'Feiertage erfolgreich entfernt!') + success = True + else: + data = {"userfullname" : tempuser.first_name + " " + tempuser.last_name} + success = False + #return render(request, 'dasettings/change_absence_yeardata.html', context) + + # HOLIDAYS UPDATE + elif request.method == 'GET' and request.GET['action'] == "update_holidays" : + context = { + "user_years" : UserYearAbsenceInfo.objects.filter(user=User.objects.get(pk=request.GET["userid"])), + } + return render(request, 'dasettings/change_absence_yeardata.html', context) + # UPDATE HOLIDAYS SAVE + elif request.method == 'GET' and request.GET['action'] == "update_holidays_save" : + # GET ELEMENTS + newHolidayData = request.GET["new_data_info"].split("___") + # EVERY ELEMENT GET ID AND SAVE NEW DAY-INFO + user_to_recalculate = User.objects.get(pk=request.GET["userid"]) + # DELETE ALL USED DAYS + absences = Absence.objects.filter(user=user_to_recalculate) + post_save.disconnect(save_newabsence, sender=Absence) + + for ab in absences: + ab.holidays_normal = 0.0 + ab.holidays_rest = 0.0 + ab.holidays_normal_next = 0.0 + ab.holidays_rest_next = 0.0 + ab.save() + + for ele in newHolidayData: + ele_elements = ele.split("__") + + if(len(ele_elements) == 2): + ele_id = ele_elements[0].split("_")[3] + ele_type = ele_elements[0].split("_")[2] + temp_year = UserYearAbsenceInfo.objects.get(pk=ele_id, agency=request.user.profile.agency) + if(ele_type == "nor"): + temp_year.days = ele_elements[1] + + elif(ele_type == "rest"): + temp_year.restdays = ele_elements[1] + + temp_year.days_inuse = 0 + temp_year.save() + + context = { + "user_years" : UserYearAbsenceInfo.objects.filter(user=User.objects.get(pk=request.GET["userid"])), + } + + + absences = Absence.objects.filter(user=user_to_recalculate, reason__is_holiday=True).order_by("start") + + ab_counter = 0 + + # RECALCULATE ALL ABSENCES + for ab in absences: + calculateNewAbsenceDate(ab) + ab_counter += 1 + post_save.connect(save_newabsence, sender=Absence) + tomany = "" + # After Absence checking + for year in UserYearAbsenceInfo.objects.filter(user=User.objects.get(pk=request.GET["userid"])): + if year.days_inuse > year.days+year.restdays: + tomany = "Es sind mehr Abwesenheiten eingetragen als verfügbar. Bitte prüfen Sie die Abwesenheiten des Mitarbeiters." + + context.update({"ab_counter" : ab_counter, "tomanyinfo" : tomany}) + return render(request, 'dasettings/data_absence_yeardata.html', context) + # RESET TIMEMANAGEMENT + elif request.method == "GET" and request.GET['action'] == "del_tmdata" : + tempuser = User.objects.get(pk=request.GET['userid']) + if(request.user.has_perm('users.usermanager') and request.user.profile.agency == tempuser.profile.agency): + deluntildate = tempuser.usertime.usetime_start + delete_days = Workday.objects.filter(user=tempuser, start__lt=deluntildate).delete() + return JsonResponse({"success" : success, "data" : data}) + # Change external Access + elif request.method == "GET" and request.GET['action'] == "changeexternalaccess" : + if(request.user.has_perm('users.absencemanager') and request.user.profile.agency.pk == int(request.GET['agency'])): + if(request.GET['newvalue'] == "true"): + request.user.profile.agency.agencycal_publicstatus = 1 + + if len(request.user.profile.agency.agencycalurl) == 0: + request.user.profile.agency.agencycalurl = randomStringNum(30) + request.user.profile.agency.agencycalurl_all = randomStringNum(30) + + request.user.profile.agency.save() + else: + request.user.profile.agency.agencycal_publicstatus = 0 + request.user.profile.agency.save() + else: + success = False + + return JsonResponse({"success" : success, "data" : data}) + else: + success = False + return JsonResponse({"success" : success, "data" : data}) + + +''' BERECHNUNG URLAUBSTAGE USW. ''' +def calculateNewAbsenceDate(instance): + + newdata = getFinalHolidayData(instance) + + abinfo = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year))[0] + abinfo_lastyear = "" + abinfo_nextyear = "" + + is_lastyear = False + + abinfo_lastyear = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year-1)) + if(len(abinfo_lastyear) > 0): + is_lastyear = True + abinfo_lastyear = abinfo_lastyear[0] + + is_nextyear = False + abinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year+1)) + if(len(abinfo_nextyear) > 0): + is_nextyear = True + abinfo_nextyear = abinfo_nextyear[0] + + multiple_info_needays = False + if(hasattr(newdata[3], "__len__")): + multiple_info_needays = True + + # Gleiches Jahr MIT Rest + if(multiple_info_needays and newdata[3][2] == False): + # Rest ist positiv, daher bleibt rest übrig, rest wird in absence gespeichert und vom rest des Jahres-Restes abgezogen + # Rest ist positiv, damit bleibt Rest übrig + if(newdata[3][0] > 0): + instance.holidays_rest = abinfo.restdays - newdata[3][0] + instance.save() + abinfo.restdays = newdata[3][0] + abinfo.save() + # Rest ist negativ + elif(newdata[3][0] < 0): + instance.holidays_rest = (abinfo.restdays - newdata[3][0]) - newdata[3][0]*(-1) + instance.holidays_normal = newdata[3][0]*(-1) + instance.save() + abinfo.restdays = 0 + abinfo.days_inuse = abinfo.days_inuse + newdata[3][0]*(-1) + abinfo.save() + # Rest ist Urlaubsdauer + else: + instance.holidays_rest = abinfo.restdays + instance.save() + #abinfo.days_inuse = abinfo.days_inuse + abinfo.restdays + abinfo.restdays = 0 + abinfo.save() + # Gleiches Jahr ohne Rest + elif(not multiple_info_needays): + abinfo.days_inuse = abinfo.days_inuse + newdata[3] + abinfo.save() + instance.holidays_normal = newdata[3] + instance.save() + # Mehrere Jahre + elif(multiple_info_needays and newdata[3][2] == True): + + abinfo.days_inuse = abinfo.days_inuse + newdata[3][0] + abinfo.save() + abinfo_nextyear.days_inuse = abinfo_nextyear.days_inuse + newdata[3][1] + abinfo_nextyear.restdays = abinfo_nextyear.restdays - newdata[3][3] + abinfo_nextyear.save() + + # Hier werden alle benötigten Tage von Vor- und Nächstem Jahr gespeichert + instance.holidays_normal = newdata[3][0] + instance.holidays_rest = 0 + instance.holidays_normal_next = newdata[3][1] + instance.holidays_rest_next = newdata[3][3] + instance.save() + +''' AB HIER WIEDER RAUSNEHMEN ''' +def getFinalHolidayData(abscence): + user = abscence.user + usertimedata = UserTime.objects.get(user=user) + today = date.today() + start_day_obj = abscence.start + end_day_obj = abscence.end + + try: + holidayloose_date = datetime.date(start_day_obj.year, int(usertimedata.loose_holidedate.split(".")[1]), int(usertimedata.loose_holidedate.split(".")[0])) + except: + holidayloose_date = datetime.date(2020, int(usertimedata.loose_holidedate.split(".")[1]), int(usertimedata.loose_holidedate.split(".")[0])) + + #start_half = abscence.start_ishalf + #end_half = abscence.end_ishalf + + start_half = False + if abscence.startday_info == "1" or abscence.startday_info == "2": + start_half = True + + end_half = False + if abscence.endday_info == "1" or abscence.endday_info == "2": + end_half = True + + choosenyear = abscence.start.year + yeardata = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, year=choosenyear))[0] + + holiday_thisyear = 0 + holiday_lastyear = yeardata.restdays + holiday_nextyear = 0 + + + + try: + holiday_nextyear = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].days - list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].days_inuse + holiday_nextyear_rest = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].restdays + except: + holiday_nextyear = yeardata.days + + # Urlaub innerhalb eines Jahres inkl. Prüfung auf Resturlaubsanspruch + if(end_day_obj.year == start_day_obj.year): + # Startt des Urlaubs NACH Verfallsdatum - nur aktuelles JAhr und die Zahl interessiert + if(start_day_obj > holidayloose_date): + need_days = (calculateHolidays(user, start_day_obj, end_day_obj, start_half, end_half))*(-1) + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days + else: + need_days = (calculateHolidays(user, start_day_obj, end_day_obj, start_half, end_half))*(-1) + # Kein Resturlaub + if(yeardata.restdays == 0.0): + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days + # Resturlaub vorhanden, berechne mit Resturlaub + else: + holiday_lastyear = yeardata.restdays + holiday_thisyear = yeardata.days - yeardata.days_inuse + temp_holiday = holiday_lastyear - need_days + if(temp_holiday < 0): + holiday_lastyear = 0 + holiday_thisyear = yeardata.days - yeardata.days_inuse + temp_holiday + need_days = [temp_holiday, holiday_thisyear, False] + else: + holiday_lastyear = yeardata.restdays - need_days + need_days = [temp_holiday, holiday_lastyear, False] + # Urlaub geht über das nächstes Jahr hinweg + else: + two_years = True + holiday_lastyear = yeardata.restdays + date_splitter = datetime.date(end_day_obj.year, 1, 1) + + need_days_this = (calculateHolidays(user, start_day_obj, date_splitter, start_half, False))*(-1) + + need_days_next = (calculateHolidays(user, date_splitter, end_day_obj, False, end_half))*(-1) + + need_days = (calculateHolidays(user, start_day_obj, date_splitter, start_half, False))*(-1) + (calculateHolidays(user, date_splitter, end_day_obj, False, end_half))*(-1) + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days_this + days_nextyear_normal = 0 + days_nextyear_rest = 0 + # Urlaub nächstes Jahr MIT und OHNE Rest + if(holiday_nextyear_rest == 0.0): + holiday_nextyear = holiday_nextyear - (calculateHolidays(user, date_splitter, end_day_obj, False, end_half))*(-1) + else: + temprest = holiday_nextyear_rest - need_days_next + # Rest reicht! + if(temprest >= 0): + holiday_nextyear_rest = temprest + days_nextyear_normal = 0 + days_nextyear_rest = need_days_next + # Rest reicht nicht + else: + holiday_nextyear_rest = 0 + holiday_nextyear += temprest + days_nextyear_rest = need_days_next + temprest + days_nextyear_normal = temprest * -1 + + # TAGE NORMAL, TAGE NEXT NORMAL, TRUE für 2jahre, TAGE NEXT REST + need_days = [need_days_this, days_nextyear_normal, True, days_nextyear_rest] + + data = [ holiday_thisyear, holiday_lastyear, holiday_nextyear, need_days ] + return data + + +def calculateHolidays(user, start, end, start_half, end_half): + restdays = 0 + allfreedays = FreeDays.objects.filter(agency=user.profile.agency) + if(end == start): + if(start_half): + return restdays - 0.5 + else: + return restdays - 1 + else: + if(end < start): + return False + else: + counter = 0 + if(start_half): + counter -= 0.5 + if(end_half): + counter -= 0.5 + + weekdays = [] + freedaycounter = 0 + for dt in daterange(start, end): + day_found = False + if dt.isoweekday() not in weekdays: + counter += 1 + for freeday in allfreedays.all(): + if(dt == freeday.day): + freedaycounter += 1 + day_found = True + if day_found == False: + if(dt.isoweekday() == 1): + if user.usertime.wd_mo == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 2): + if user.usertime.wd_tu == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 3): + if user.usertime.wd_we == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 4): + if user.usertime.wd_th == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 5): + if user.usertime.wd_fr == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 6): + if user.usertime.wd_sa == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 7): + if user.usertime.wd_so == 0.0: + freedaycounter += 1 + + return restdays - counter + freedaycounter + +# Gibt die Woche als Wochentage zurück +def daterange(date1, date2): + for n in range(int ((date2 - date1).days)+1): + yield date1 + timedelta(n) + +''' BERECHNUNG URLAUBSTAGE USW ENDE ''' + + +def randomStringNum(stringLength=20): + """Generate a random string of fixed length """ + lettersAndNumbers = string.ascii_lowercase + string.digits + string.ascii_uppercase + return ''.join(random.choice(lettersAndNumbers) for i in range(stringLength)) + + +def loadingFreeDays(plz, year): + # Getting land + file_path = os.path.join(settings.STATIC_ROOT, 'users/extra/plz_short.csv') + + land = False + + with open(file_path, 'rt') as csvfile: + filecsv = csv.reader(csvfile, delimiter=';') + for row in filecsv: + + if str(row[1]) == str(plz): + land = row[6] + break; + + + + if(land != False): + URL = "https://feiertage-api.de/api/" + PARAMS = {'jahr':year,'nur_land':land} + r = requests.get(url = URL, params = PARAMS) + return r.json() + else: + return False + + +def loadingFreeDaysMulti(plz, year, onlyland): + # Getting land + file_path = os.path.join(settings.STATIC_ROOT, 'users/extra/plz_short.csv') + + if(onlyland == False): + + land = False + + with open(file_path, 'rt') as csvfile: + filecsv = csv.reader(csvfile, delimiter=';') + for row in filecsv: + + if str(row[1]) == str(plz): + land = row[6] + break; + + URL = "https://feiertage-api.de/api/" + PARAMS = {'jahr':year,'nur_land':land} + r = requests.get(url = URL, params = PARAMS) + return r.json() + elif(onlyland == True): + URL = "https://feiertage-api.de/api/" + PARAMS = {'jahr':year,'nur_daten':1} + r = requests.get(url = URL, params = PARAMS) + return r.json() + else: + return False + +''' + UserProfileUpdate + + unterscheidet zwischen newuser=0 --> PROFIL AKTUALISIEREN + und newuser=1 --> PROFIL Neu speichern + +''' +@login_required +def UserProfileUpdate(request, pk, newuser=0): + usertochange = User.objects.get(pk=pk) + user_fullname = usertochange.first_name + " " + usertochange.last_name + parentuser = "" + if(usertochange.profile.parent != None): + parentuser = usertochange.profile.parent.pk + + if request.method == 'POST': + if 'image' in request.FILES: + usertochange.profile.image = request.FILES['image'] + formtosave = False + + if(request.POST["form_type"] == "profileform"): + + formtosave = UserProfileForm(request.POST, instance=usertochange.profile) + + if formtosave.is_valid(): + try: + usertochange.profile.parent = User.objects.get(pk=request.POST['usertoparent'], profile__agency=request.user.profile.agency) + usertochange.save() + except Exception as e: + usertochange.profile.parent = None + usertochange.save() + + formtosave.save() + messages.success(request, f'Profil gespeichert!') + return redirect('dasettings') + else: + messages.success(request, f'Fehlerhafte Eingabe!') + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'first_name' : usertochange.first_name, + 'last_name' : usertochange.last_name, + 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), + 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), + 'newuser' : newuser, + 'usertochangefull' : usertochange, + 'vieweduser' : usertochange.pk, + 'parentuser' : parentuser, + 'mail' : usertochange.email, + 'imagelink' : usertochange.profile.get_photo_url, + 'profileform' : UserProfileForm(instance=usertochange.profile), + 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) + } + return render(request, 'dasettings/user_usprof.html', context) + elif(request.POST["form_type"] == "contract"): + + formtosave = UserTimeForm(request.POST, instance=UserTime.objects.get(user=usertochange)) + if(formtosave.is_valid()): + # CHECK IF HOLIDAYS_LOOSE IS CORRECT + if(not re.match(r"^([1-9]{1}|0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-1]{1}).([1-9]{1}|0[0-9]{1}|1[0-2]{1}).$", formtosave.cleaned_data["loose_holidedate"])): + messages.success(request, f'Fehlerhafte Eingabe! Das Verfallsdatum der Urlaubstage ist ungültig oder das Format wurde nicht beachtet (TAG.MONAT.).') + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'first_name' : usertochange.first_name, + 'last_name' : usertochange.last_name, + 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), + 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), + 'newuser' : newuser, + 'usertochangefull' : usertochange, + 'vieweduser' : usertochange.pk, + 'parentuser' : parentuser, + 'mail' : usertochange.email, + 'imagelink' : usertochange.profile.get_photo_url, + 'profileform' : UserProfileForm(instance=usertochange.profile), + 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) + } + return render(request, 'dasettings/user_usprof.html', context) + else: + # TRY TO CREATE DATE + date = formtosave.cleaned_data["loose_holidedate"].split(".") + try: + datetime.date(int(2020), int(date[1]), int(date[0])) + messages.success(request, f'Vertragsdaten gespeichert!') + formtosave.save() + return redirect('dasettings') + except: + messages.success(request, f'Fehlerhafte Eingabe! Das Verfallsdatum der Urlaubstage ist ungültig!') + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'first_name' : usertochange.first_name, + 'last_name' : usertochange.last_name, + 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), + 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), + 'newuser' : newuser, + 'vieweduser' : usertochange.pk, + 'parentuser' : parentuser, + 'usertochangefull' : usertochange, + 'mail' : usertochange.email, + 'imagelink' : usertochange.profile.get_photo_url, + 'profileform' : UserProfileForm(instance=usertochange.profile), + 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) + } + return render(request, 'dasettings/user_usprof.html', context) + else: + messages.success(request, f'Fehlerhafte Eingabe! Das Verfallsdatum muss im Format TAG.MONAT. sein und existieren!') + context = { + 'active_link' : 'dasettings', + 'usertochangefull' : usertochange, + 'user_fullname' : user_fullname, + 'first_name' : usertochange.first_name, + 'last_name' : usertochange.last_name, + 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), + 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), + 'newuser' : newuser, + 'vieweduser' : usertochange.pk, + 'parentuser' : parentuser, + 'mail' : usertochange.email, + 'imagelink' : usertochange.profile.get_photo_url, + 'profileform' : UserProfileForm(instance=usertochange.profile), + 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True) + } + return render(request, 'dasettings/user_usprof.html', context) + + else: + usertime = "" + try: + usertime = UserTimeForm(instance=UserTime.objects.get(user=usertochange)) + except: + usertime = UserTime(user=usertochange) + usertime.save() + usertime = UserTimeForm(instance=UserTime.objects.get(user=usertochange)) + + + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'usertime_form' : UserTimeForm(instance=UserTime.objects.get(user=usertochange)), + 'user_years' : UserYearAbsenceInfo.objects.filter(user=usertochange), + 'first_name' : usertochange.first_name, + 'last_name' : usertochange.last_name, + 'newuser' : newuser, + 'mail' : usertochange.email, + 'vieweduser' : usertochange.pk, + 'usertochangefull' : usertochange, + 'imagelink' : usertochange.profile.get_photo_url, + 'profileform' : UserProfileForm(instance=usertochange.profile), + 'parentuser' : parentuser, + 'usertoparent' : User.objects.filter(profile__agency__pk=usertochange.profile.agency.pk, profile__visible=True), + 'agencygroups' : AgencyGroup.objects.filter(agency__pk=usertochange.profile.agency.pk).order_by("agencygroupname") + } + return render(request, 'dasettings/user_usprof.html', context) + +# View zur Veränderung der Stammdaten des Benutzers +@login_required +def UserChangeMain(request, pk): + usertochange = User.objects.get(pk=pk, profile__agency=request.user.profile.agency) + user_fullname = usertochange.first_name + " " + usertochange.last_name + if request.method == 'POST': + formtosave = UserNewUserForm(request.POST, instance=usertochange) + if formtosave.is_valid(): + formtosave.save() + formtosave.save() + messages.success(request, f'Stammdaten aktualisiert!') + return redirect('dasettings') + else: + messages.success(request, f'Fehlerhafte Eingabe! Mailadresse bereits vorhanden!') + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'userform' : UserNewUserForm(request.POST, instance=usertochange), + } + return render(request, 'dasettings/user_changemaindata.html', context) + else: + context = { + 'active_link' : 'dasettings', + 'user_fullname' : user_fullname, + 'userform' : UserNewUserForm(instance=usertochange), + } + return render(request, 'dasettings/user_changemaindata.html', context) + +# Method for first User-Creation-Step +@login_required +def NewUserFirstStep(request): + context = { + 'active_link' : 'dasettings' + } + if request.method == 'POST': + newuserform = UserNewUserForm(request.POST) + if newuserform.is_valid(): + if(request.POST.get("sendmailnewuser")): + msg_html = render_to_string('users/newusers_email.html', {'username': newuserform.cleaned_data.get('first_name') + " " + newuserform.cleaned_data.get('last_name')}) + send_mail(request.user.profile.agency.name + ' Account', 'Hallo ' + newuserform.cleaned_data.get('first_name') + ' ' + newuserform.cleaned_data.get('last_name') + '! Bitte setzen sie sich auf https://app.digitale-agentur.com/password-reset/ ein Passwort.','noreply@digitale-agentur.com',[newuserform.cleaned_data.get('email')],html_message=msg_html,fail_silently=True) + newuser = newuserform.save(commit=False) + newuser.username = newuser.email + newprofile = Profile(agency=request.user.profile.agency, parent=None) + newprofile.save() + newuser.profile = newprofile + newuser.save() + + # USERTIME + user_time = UserTime(user=newuser) + user_time.save() + # USER NOTIFICATIONS + user_notifications = UserNotifications(user=newuser) + user_notifications.save() + + newuser.usernotifications = user_notifications + newuser.usertime = user_time + + + newuser_id = newuser.id + messages.success(request, f'Benutzer angelegt!') + today = date.today() + UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year).save() + UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year+1).save() + UserYearAbsenceInfo(agency=request.user.profile.agency, user=newuser, year=today.year+2).save() + + getadmingroup = AgencyGroup.objects.filter(savefordel=True, is_admin=False, agency=request.user.profile.agency).exclude(agencygroupname="Notfallhilfe") + for g in getadmingroup: + g.group.user_set.add(newuser) + return redirect('/dasettings/usprof/'+str(newuser_id)+'/1') + else: + messages.success(request, f'Daten falsch eingegeben!') + context['newuserform'] = UserNewUserForm(request.POST) + return render(request, 'dasettings/user_newuser_step1.html', context) + + # Returning the data from database for normal-loading Settings + else: + newuserform = UserNewUserForm() + context.update({'newuserform' : newuserform}) + return render(request, 'dasettings/user_newuser_step1.html', context) + + +# NEUER AGENTURVERBUND +@login_required +def AddAgencyNetwork(request): + if request.method == 'POST': + newagn = AgencyNetworkForm(request.POST) + if(newagn.is_valid()): + newagn_object = AgencyNetwork(name=newagn.cleaned_data.get("name"), publicjoin=newagn.cleaned_data.get("publicjoin"), creator=request.user, creator_agency=request.user.profile.agency, networkid=randomString(20)) + newagn_object.save() + newagn_object.adminagencys.add(request.user.profile.agency) + messages.success(request, f'Agenturverbund ' + newagn_object.name + ' angelegt!') + return redirect('dasettings') + else: + context = { + 'active_link' : 'dasettings', + 'form' : AgencyNetworkForm(), + } + return render(request, 'dasettings/addagencynetwork_content.html', context) + +@login_required +def UpdateAgencyNetwork(request, pk): + if request.method == 'POST': + agn = AgencyNetwork.objects.get(pk=pk) + formdata = AgencyNetworkForm(request.POST) + if(formdata.is_valid()): + agn.name = formdata.cleaned_data.get("name") + agn.publicjoin= formdata.cleaned_data.get("publicjoin") + agn.save() + #newagn_object.adminagencys.add(request.user.profile.agency) + messages.success(request, f'Agenturverbund ' + agn.name + ' aktualisiert!') + return redirect('dasettings') + else: + context = { + 'active_link' : 'dasettings', + 'form' : AgencyNetworkForm(instance=AgencyNetwork.objects.get(pk=pk)), + } + return render(request, 'dasettings/addagencynetwork_content.html', context) + +@login_required +def DelAgencyNetwork(request, pk): + agn = AgencyNetwork.objects.get(pk=pk) + if request.method == 'POST': + if request.user.profile.agency in agn.adminagencys.all(): + agn.delete() + messages.success(request, f'Agenturverbund erfolgreich gelöscht!') + return redirect('dasettings') + else: + messages.success(request, f'Sie dürfen diesen Agenturverbund nicht löschen!') + return redirect('dasettings') + else: + context = { + 'active_link' : 'dasettings', + 'agn' : agn + } + return render(request, 'dasettings/delagencynetwork_content.html', context) + +@login_required +def AddMyAgencyToAgn(request, networkid): + agn = AgencyNetwork.objects.filter(networkid=networkid) + + if len(agn) == 0: + messages.info(request, f'Agenturverbund nicht gefunden!') + return redirect('dasettings') + else: + context = { + 'active_link' : 'dasettings', + 'agn' : list(agn)[0] + } + return render(request, 'dasettings/joinagn_first.html', context) + + +def IsAgencyInAgNetwork(agencyid, agnetworkid): + is_in = False + + agn = AgencyNetwork.objects.get(pk=agnetworkid) + agency = Agency.objects.get(pk=agencyid) + + if agency in agn.adminagencys.all(): + is_in = True + + if agency in agn.members.all(): + is_in = True + + if agency in agn.sharemembers.all(): + is_in = True + + return is_in + + +@login_required +def JoinAGN(request, pk): + if IsAgencyInAgNetwork(request.user.profile.agency.pk, pk): + messages.success(request, f'Ihre Agentur ist bereits in diesem Verbund!') + else: + agn = AgencyNetwork.objects.get(pk=pk) + if(agn.publicjoin): + messages.success(request, f'Verbund erfolgreich beigetreten!') + agn.members.add(request.user.profile.agency) + + # Benachrichtigung senden, dass eine neue Agentur dem Verbund beitreten will. DIe Info geht an alle administrativen Agenturen. + for adminagencys in agn.adminagencys.all(): + usersofagency = Users.objects.filter(profile__agency=adminagencys) + + for u in usersofagency: + if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_own_change_mail: + notificationtext = " eine neue Agentur ist dem Verbund " + agn.name + " beigetreten." + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_own_change_push: + newnotification = UserNotification(touser=u, notificationtext=" eine neue Agentur ist dem Verbund " + agn.name + " beigetreten.", notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Eine neue Agentur ist dem Verbund " + agn.name + " beigetreten."}) + else: + + # STATUS + # 1 WANTED AG ASKED TO TARGET NETWORK + agnp = AgencyNetworkPreperation(target_network=AgencyNetwork.objects.get(pk=pk), wanted_agency=request.user.profile.agency, status=1) + agnp.save() + + # Benachrichtigung senden, dass eine neue Agentur dem Verbund beitreten will. DIe Info geht an alle administrativen Agenturen. + for adminagencys in agn.adminagencys.all(): + usersofagency = Users.objects.filter(profile__agency=adminagencys) + + for u in usersofagency: + if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_own_change_mail: + notificationtext = " eine neue Agentur möchte dem Verbund " + agn.name + " beitreten." + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_own_change_push: + newnotification = UserNotification(touser=u, notificationtext=" eine neue Agentur möchte dem Verbund " + agn.name + " beitreten.", notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Eine neue Agentur möchte dem Verbund " + agn.name + " beitreten."}) + + messages.success(request, f'Ihre Anfrage zum Beitritt wurde versendet. Sie erhalten eine Information, wenn die Anfrage angenommen wurde!') + + + return redirect('dasettings') + +@login_required +def ManageAgInAgn(request, pk): + agn = AgencyNetwork.objects.filter(pk=pk) + + if len(agn) == 0: + messages.info(request, f'Agenturverband nicht gefunden!') + return redirect('dasettings') + else: + + network = list(agn)[0] + + allagofagn = [] + for a in network.members.all(): + allagofagn.append(a) + + for a in network.sharemembers.all(): + allagofagn.append(a) + + for a in network.adminagencys.all(): + allagofagn.append(a) + + context = { + 'active_link' : 'dasettings', + 'agn' : list(agn)[0], + 'outstanding': AgencyNetworkPreperation.objects.filter(target_network=list(agn)[0]) , + 'allagofagn' : allagofagn + } + return render(request, 'dasettings/agencynetwork_agmanagement_content.html', context) + +@login_required +def AddAgToNetwork(request, network, targetag, aginvpk): + + if IsAgencyInAgNetwork(Agency.objects.get(pk=targetag).pk, network): + messages.info(request, f'Sie sind bereits im Agenturverbund!') + return redirect('dasettings') + else: + + messages.info(request, f'Einladung angenommen!') + agn = AgencyNetwork.objects.get(pk=network) + + agn.members.add(Agency.objects.get(pk=targetag)) + AgencyNetworkPreperation.objects.get(pk=aginvpk).delete() + + return redirect('managagn', network) + +@login_required +def DelAgInv(request, pk): + AgencyNetworkPreperation.objects.get(pk=pk).delete() + messages.info(request, f'Einladung abgelehnt!') + return redirect('dasettings') + +@login_required +def DelFromAgn(request, agn, ag): + return redirect('managagn', agn) + +@login_required +def AgencyNetworkAjaxSettings(request): + success = False + data = {} + if request.method == 'GET' and request.GET['action'] == "remove_ag_from_agn": + agency = Agency.objects.get(pk=request.GET['agid']) + agencynetwork = AgencyNetwork.objects.get(pk=request.GET['agnid']) + + if(agency != None and agencynetwork != None): + agencynetwork.members.remove(agency) + agencynetwork.adminagencys.remove(agency) + agencynetwork.sharemembers.remove(agency) + success = True + + # Benachrichtigung senden, dass eine neue Agentur dem Verbund beitreten will. DIe Info geht an alle administrativen Agenturen. + usersofagency = Users.objects.filter(profile__agency=agency) + for u in usersofagency: + if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_other_change_mail: + notificationtext = " ihre Agentur wurde aus dem Verbund " + agencynetwork.name + " entfernt." + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_other_change_push: + newnotification = UserNotification(touser=u, notificationtext=" ihre Agentur wurde aus dem Verbund " + agencynetwork.name + " entfernt.", notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Ihre Agentur wurde aus dem Verbund " + agencynetwork.name + " entfernt."}) + + elif request.method == 'GET' and request.GET['action'] == "removeinv": + AgencyNetworkPreperation.objects.get(pk=request.GET['agn_inv']).delete() + success = True + elif request.method == 'GET' and request.GET['action'] == "changeagrights": + agency = Agency.objects.get(pk=request.GET['agency']) + agn = AgencyNetwork.objects.get(pk=request.GET['agnid']) + if(agency != None and agn != None): + agn.members.remove(agency) + agn.adminagencys.remove(agency) + agn.sharemembers.remove(agency) + if (request.GET['newstatus'] == "0"): + agn.members.add(agency) + elif (request.GET['newstatus'] == "1"): + agn.sharemembers.add(agency) + elif (request.GET['newstatus'] == "2"): + agn.adminagencys.add(agency) + success = True + + usersofagency = Users.objects.filter(profile__agency=agency) + for u in usersofagency: + if u.has_perm('users.agencynetwork') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_other_change_mail: + notificationtext = " ihre Agentur hat im Verbund " + agn.name + " andere Rechte erhalten." + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_other_change_push: + newnotification = UserNotification(touser=u, notificationtext=" ihre Agentur hat im Verbund " + agn.name + " andere Rechte erhalten.", notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Ihre Agentur hat im Verbund " + agn.name + " andere Rechte erhalten."}) + else: + success = False + return JsonResponse(data) + +@login_required +def ModSettingsOrga(request): + if request.method == 'GET' and request.user.has_perm("users.modulesconfig"): + if(request.GET['dynorga'] == "true"): + ag = request.user.profile.agency + ag.dynamicprofile = True + ag.save() + else: + ag = request.user.profile.agency + ag.dynamicprofile = False + ag.save() + return JsonResponse({}) + else: + return JsonResponse({}) + + +@login_required +def ModSettingsTm(request): + return JsonResponse({}) + ''' + if request.method == 'GET' and request.user.has_perm("users.modulesconfig"): + if(request.GET['aze'] == "true"): + ag = request.user.profile.agency + ag.module_timemanagement_ze = True + ag.save() + else: + ag = request.user.profile.agency + ag.module_timemanagement_ze = False + ag.save() + return JsonResponse({}) + else: + return JsonResponse({}) + ''' + +########## ABRECHNUNG ########## +class BillMailUpdate(UpdateView): + model = Agency + success_url = reverse_lazy('dasettings') + form_class = AgencyBillMail + template_name = "dasettings/dasettings_billmail.html" + + def form_valid(self, form): + messages.success(self.request, f"E-Mailadresse erfolgreich aktualisiert!") + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'dasettings'}) + return context +''' +def getBill(request, billid): + if(request.method == "GET"): + Bill = AgencyBills.objects.get(billid=billid) + + response = HttpResponse(content_type='text/pdf') + response['Content-Disposition'] = 'attachment; filename="RechnungPLATZHALTER.pdf"' + + + return response + else: + pass +''' +class BillPlanEnd(UpdateView): + model = Agency + success_url = reverse_lazy('dasettings') + form_class = AgencyEndBillPlan + template_name = "dasettings/bill_removepayplan.html" + + def form_valid(self, form): + self.object.paymentplan = 0 + messages.success(self.request, f"Abonnement gekündigt!") + + return super().form_valid(form) + +from dateutil.relativedelta import * +class BillPlanUpdate(UpdateView): + model = Agency + success_url = reverse_lazy('dasettings') + form_class = AgencyBillPlan + template_name = "dasettings/dasettings_billplan.html" + + # LexOffice Verbindung + def form_valid(self, form): + # Form einmal speichern, damit die Adressdaten usw. übernommen werden + form.save() + agency = self.request.user.profile.agency + month = agency.registerdate + + # Notfallhilfe soll mitbestellt werden + if form.cleaned_data.get("recoverdir") == True: + rd = RegNotfallhilfe() + rd.mail = form.cleaned_data.get('agency_email') + rd.name = form.cleaned_data.get('inhaber') + rd.persnumber = "n.v." + rd.mitgliedsnummer = form.cleaned_data.get("vve") + rd.plz = form.cleaned_data.get("plz") + rd.stadt = form.cleaned_data.get("city") + rd.street = form.cleaned_data.get("street") + rd.data_to_vh = True + rd.rabatt = True + rd.save() + + # Wenn die Agentur noch KEINE Lexoffice-ID hat, dann ist der Freimonat noch nicht durch. + if agency.lexofficeid == "": + month = month + relativedelta(months=1) + else: + month = AgencyBills.objects.filter(agency=self.request.user.profile.agency).order_by("-end")[0].end + + next_month = month + relativedelta(months=1) + + voucher_date = next_month.strftime("%Y-%m-%d") + + # USERCOUNT BERECHNEN + usercount = len(User.objects.filter(profile__agency=agency)) + + if(usercount < 4): + usercount = 0 + else: + usercount = usercount - 3 + + # HEADERS CURL + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + plan = 1 + + ''' + start_date = month + start_date_string = month.strftime("%d.%m.%Y") + end_date = month + relativedelta(months=1) + end_date = end_date - relativedelta(days=1) + end_date_string= end_date.strftime("%d.%m.%Y") + ''' + start_date = month + relativedelta(days=1) + start_date_string = start_date.strftime("%d.%m.%Y") + # Einen Monat weiter und dann wieder einen Tag zurück + end_date = month + relativedelta(months=1) + #end_date = end_date - relativedelta(days=1) + end_date_string= end_date.strftime("%d.%m.%Y") + + voucher_date_today = date.today().strftime("%Y-%m-%d") + # TASK: Was passiert bei Änderungen der Agenturdaten? + + # DataJSON + monthword = "Monate" + if form.cleaned_data['paymentplan'] == "1": + monthword = "Monat" + + lexdata = { + "voucherDate": voucher_date_today + "T00:00:00.000+00:00", + "address" : { + "name" : agency.name, + "street": agency.street, + "zip": agency.plz, + "city": agency.city, + "countryCode" : "DE" + }, + "totalPrice" : { + "currency" : "EUR", + }, + "lineItems" : [ + { + "type" : "custom", + "name" : "Digitale Agentur: Grundbetrag für " + str(plan) + " " + monthword, + "quantity" : 1, + "unitName" : "Stück", + "description" : "Zeitraum " + start_date_string + " - " + end_date_string, + "unitPrice" : + { + "currency" : "EUR", + "netAmount" : 21.00, + "taxRatePercentage" : 19 + }, + }, + { + "type" : "custom", + "name" : "Digitale Agentur: Zusätzliche Nutzer", + "description" : "Zeitraum " + start_date_string + " - " + end_date_string, + "quantity" : usercount, + "unitName" : "Stück", + "unitPrice" : + { + "currency" : "EUR", + "netAmount" : 3, + "taxRatePercentage" : 19 + }, + } + ], + "taxConditions": { + "taxType": "net" + }, + #"paymentConditions": { + # "paymentTermLabel": "Bitte zahlen Sie innerhalb von 14 Tagen.", + # "paymentTermDuration": 14, + #}, + "shippingConditions": { + #"shippingDate": voucher_date_today + "T00:00:00.000+00:00", + "shippingType": "none" + } + } + json_data = json.dumps(lexdata) + + self.object = form.save(commit=False) + + + r = requests.post("https://api.lexoffice.io/v1/invoices/?finalize=true", data=json_data, headers=headers) + # Als ENTWURF Rechnung anlegen + #r = requests.post("https://api.lexoffice.io/v1/invoices/", data=json_data, headers=headers) + + if(r.status_code == 201): + messages.success(self.request, f"Rechnung erstellt!") + # Response in JSON umwandeln + response_text = json.loads(r.text) + # Rechnungsidee speichern + + + # HEADERS CURL + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + json_data = json.dumps(lexdata) + newbill_id = response_text["id"] + + # OrganizationId berechnen, wenn noch nicht gesetzt + r = requests.get("https://api.lexoffice.io/v1/invoices/" + response_text["id"], data=json_data, headers=headers) + + response_text = json.loads(r.text) + if len(agency.lexofficeid) == 0: + self.object.lexofficeid = response_text["organizationId"] + + newbill = AgencyBills(agency=agency, lexid=newbill_id, billtype="invoice", billnumber=response_text["voucherNumber"], billstatus=response_text["voucherStatus"], start=start_date, end=end_date, plan=plan, usercount=usercount) + newbill.save() + self.object.save() + + mail_to_send = "" + if(self.request.user.profile.agency.payment_address == None): + mail_to_send = self.request.user.profile.agency.agency_email + else: + mail_to_send = self.request.user.profile.agency.payment_address + + msg_html = render_to_string('users/newbill_mail.html', {}) + # BCC Mail with Object - NICHT DEN IMPORT VERGESSEN!!! + email = EmailMultiAlternatives( + 'Digitale Agentur | Rechnung ' + str(response_text["voucherNumber"]), + 'Sehr geehrte Nutzer, hiermit erhalten Sie eine neue Rechnung für die Digitale Agentur. Ihr Team der Digitalen Agentur', + 'noreply@digitale-agentur.com', + [mail_to_send], + ['info@digitale-agentur.com'], + headers={}, + ) + + headers = { + 'Authorization': 'Bearer ' + settings.LEX_API, + 'Content-Type': 'application/json', + 'Accept': 'application/json', + } + + lexdata = { + "renderType" : "pdf" + } + + r_final = requests.get("https://api.lexoffice.io/v1/invoices/"+newbill_id+"/document", data=json_data, headers=headers) + json.loads(r_final.text) + + base64String = requests.get("https://api.lexoffice.io/v1/files/"+json.loads(r_final.text)["documentFileId"]+"/", data=json_data, headers=headers) + + content = base64.b64decode(base64String.text) + + msg_html = render_to_string('users/newbill_mail.html', {}) + email.attach_alternative(msg_html, "text/html") + email.attach('Rechnung_' + str(response_text["voucherNumber"]) + '.pdf', content, "application/pdf") + email.send() + + #send_mail('Digitale Agentur | Rechnung', 'Sehr geehrte Nutzer, es wurde eine Rechnung für Ihre digitale Agentur erstellt. Diese können Sie unter Einstellungen, Abrechnung einsehen.','noreply@digitale-agentur.com',[mail_to_send],html_message=msg_html,fail_silently=True) + + else: + messages.warning(self.request, f"Fehlercode "+str(r.status_code)+". Es wurde keine Rechnung erstellt. Bitte wenden Sie sich an den Support!") + + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + # Rechnungsbegin setzen + agency = self.request.user.profile.agency + + + if len(AgencyBills.objects.filter(agency=self.request.user.profile.agency)) == 0: + month = self.request.user.profile.agency.registerdate + relativedelta(months=1) + else: + month = AgencyBills.objects.filter(agency=self.request.user.profile.agency).order_by("-end")[0].end + + # Wenn die Agentur noch KEINE Lexoffice-ID hat, dann ist der Freimonat noch nicht durch. + if agency.lexofficeid == "": + month = month + relativedelta(months=1) + + + context.update({'active_link' : 'dasettings', 'end' : month}) + + return context + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/digitaleagentur/__init__.py b/digitaleagentur/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/digitaleagentur/__pycache__/__init__.cpython-37.pyc b/digitaleagentur/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..6fe3e84 Binary files /dev/null and b/digitaleagentur/__pycache__/__init__.cpython-37.pyc differ diff --git a/digitaleagentur/__pycache__/__init__.cpython-38.pyc b/digitaleagentur/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..b12ca31 Binary files /dev/null and b/digitaleagentur/__pycache__/__init__.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/routing.cpython-38.pyc b/digitaleagentur/__pycache__/routing.cpython-38.pyc new file mode 100644 index 0000000..aaac61e Binary files /dev/null and b/digitaleagentur/__pycache__/routing.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/sec.cpython-38.pyc b/digitaleagentur/__pycache__/sec.cpython-38.pyc new file mode 100644 index 0000000..cb7f537 Binary files /dev/null and b/digitaleagentur/__pycache__/sec.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/settings.cpython-37.pyc b/digitaleagentur/__pycache__/settings.cpython-37.pyc new file mode 100644 index 0000000..d8f790f Binary files /dev/null and b/digitaleagentur/__pycache__/settings.cpython-37.pyc differ diff --git a/digitaleagentur/__pycache__/settings.cpython-38.pyc b/digitaleagentur/__pycache__/settings.cpython-38.pyc new file mode 100644 index 0000000..148db74 Binary files /dev/null and b/digitaleagentur/__pycache__/settings.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/timemanagement_utils.cpython-38.pyc b/digitaleagentur/__pycache__/timemanagement_utils.cpython-38.pyc new file mode 100644 index 0000000..4f91f64 Binary files /dev/null and b/digitaleagentur/__pycache__/timemanagement_utils.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/urls.cpython-37.pyc b/digitaleagentur/__pycache__/urls.cpython-37.pyc new file mode 100644 index 0000000..a59fa2b Binary files /dev/null and b/digitaleagentur/__pycache__/urls.cpython-37.pyc differ diff --git a/digitaleagentur/__pycache__/urls.cpython-38.pyc b/digitaleagentur/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..61f466f Binary files /dev/null and b/digitaleagentur/__pycache__/urls.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/utils.cpython-38.pyc b/digitaleagentur/__pycache__/utils.cpython-38.pyc new file mode 100644 index 0000000..341f792 Binary files /dev/null and b/digitaleagentur/__pycache__/utils.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/views.cpython-38.pyc b/digitaleagentur/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..582e08a Binary files /dev/null and b/digitaleagentur/__pycache__/views.cpython-38.pyc differ diff --git a/digitaleagentur/__pycache__/wsgi.cpython-37.pyc b/digitaleagentur/__pycache__/wsgi.cpython-37.pyc new file mode 100644 index 0000000..5d9363b Binary files /dev/null and b/digitaleagentur/__pycache__/wsgi.cpython-37.pyc differ diff --git a/digitaleagentur/__pycache__/wsgi.cpython-38.pyc b/digitaleagentur/__pycache__/wsgi.cpython-38.pyc new file mode 100644 index 0000000..f44f0f3 Binary files /dev/null and b/digitaleagentur/__pycache__/wsgi.cpython-38.pyc differ diff --git a/digitaleagentur/asgi.py b/digitaleagentur/asgi.py new file mode 100644 index 0000000..27056c6 --- /dev/null +++ b/digitaleagentur/asgi.py @@ -0,0 +1,12 @@ +""" +ASGI entrypoint. Configures Django and then runs the application +defined in the ASGI_APPLICATION setting. +""" + +import os +import django +from channels.routing import get_default_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "digitaleagentur.settings") +django.setup() +application = get_default_application() \ No newline at end of file diff --git a/digitaleagentur/routing.py b/digitaleagentur/routing.py new file mode 100644 index 0000000..f67ce3e --- /dev/null +++ b/digitaleagentur/routing.py @@ -0,0 +1,12 @@ +from channels.auth import AuthMiddlewareStack +from channels.routing import ProtocolTypeRouter, URLRouter +import users.routing + +application = ProtocolTypeRouter({ + # Empty for now (http->django views is added by default) + 'websocket': AuthMiddlewareStack( + URLRouter( + users.routing.websocket_urlpatterns + ) + ), +}) \ No newline at end of file diff --git a/digitaleagentur/sec.py b/digitaleagentur/sec.py new file mode 100644 index 0000000..e126e56 --- /dev/null +++ b/digitaleagentur/sec.py @@ -0,0 +1,45 @@ +############################################## LOCAL ##################################### +BASE_URL = "http://localhost:8000/" + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +# Database +# https://docs.djangoproject.com/en/2.2/ref/settings/#databases +# DEV +''' +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME' : 'digitaleagentur', + 'HOST' : 'http://localhost:8889', + 'USER' : 'root', + 'PASSWORD' : '', + } +} +''' +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'da_debug', + 'USER': 'root', + 'PASSWORD': 'root', + 'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock', + 'PORT': '8889', + } +} +# MAIL DEV +EMAIL_HOST = 'gymhum.de' +EMAIL_PORT = 587 +EMAIL_USE_TLS = True +EMAIL_HOST_USER = "holger.trampe" +EMAIL_HOST_PASSWORD = "Motte2016_!" +DEFAULT_FROM_EMAIL = "holger.trampe@gymhum.de" + +# REDIS +REDIS_URL = ("localhost", 6379) + +ALLOWED_HOSTS = ['digitale-agentur.com', 'www.digitale-agentur.com', '127.0.0.1','localhost'] + +################################################### LOCAL ############################### + diff --git a/digitaleagentur/settings.py b/digitaleagentur/settings.py new file mode 100644 index 0000000..bd99ca0 --- /dev/null +++ b/digitaleagentur/settings.py @@ -0,0 +1,253 @@ +""" +Django settings for digitaleagentur project. + +Generated by 'django-admin startproject' using Django 2.2.7. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.2/ref/settings/ +""" +import os +from datetime import datetime, timedelta + +# IMPORT SEC-FILE +''' + + sec muss auf dem Server alle Account-Daten haben!!! + +''' +from digitaleagentur.sec import * + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# Nach zehn Stunden läuft der Cookie ab! +# TASK: Zehn stunden auto-auslog einmal checken Sekunden! +SESSION_COOKIE_AGE = 8*60*60 + + +CHANNELS_PRESENCE_MAX_AGE = 30 + +# FOR SUMMERNOTE ORIGIN +X_FRAME_OPTIONS = 'SAMEORIGIN' + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '_qv2t2lmsctjxpbb4rrp=op%_20_hxzonv^mvty1o85c)l$s^q' + +CRONAPIKEY = "gCddsaz6NOnE9QbXZM5LasdEk122D" +CRONAPIKEY_STATSTIC = "gCddsaz6NOnE9QbXZM5LasdEk122D" +MAILINFOKEY = "jka7sd8iukashdna78skduJAHDsu6dilaksdjba65a68iadbhjak" +# API KEY LEXOFFICE +#ALTER ZUM TESTEN +#LEX_API = "8f9ba01f-9e84-42c7-9548-48c254f14c19" + +# Gültig bis 17.10.2022 +LEX_API = "8dcbd7a5-9447-417f-a4a4-989818742a36" + +# KEYS FOR ENCRYPTED FILE FIELDS +DEFF_SALT = 'A-!GDtuKp?H/H5-UUatEh6ZcG/6h-VQf1OkDORRkK0(:(qCf//' +DEFF_PASSWORD = 'i8#vKXbrgHfdrPGns+O1n!s15bAF(3SE8tFNXuAGC0INHRo+EI' +DEFF_FETCH_URL_NAME = 'getdoc' + +#ALLOWED_HOSTS = ['digitale-agentur.com', 'www.digitale-agentur.com', '127.0.0.1', '192.168.178.101','localhost', 'dev01.digitale-agentur.com', '10.0.2.2'] +# FORWARD HEADERS +USE_X_FORWARDED_HOST = True +SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') + +# Application definition +INSTALLED_APPS = [ + 'django.contrib.contenttypes', + 'notificsys.apps.NotificsysConfig', + 'users.apps.UsersConfig', + 'dasettings.apps.DASettingsConfig', + 'areas.apps.AreasConfig', + 'orga.apps.OrgaConfig', + 'chat.apps.ChatConfig', + 'message.apps.MessageConfig', + 'cloud.apps.CloudConfig', + 'tasks.apps.TasksConfig', + 'organizer.apps.OrganizerConfig', + 'standards.apps.StandardsConfig', + 'timemanagement.apps.TimemanagementConfig', + 'recoverdir.apps.RecoverdirConfig', + 'news.apps.NewsConfig', + 'adm.apps.AdmConfig', + 'crispy_forms', + 'colorful', + 'django_summernote', + 'django.contrib.admin', + 'mathfilters', + 'django.contrib.humanize', + 'django.contrib.auth', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'bootstrap_datepicker_plus', + 'django_cleanup', + 'django_user_agents', + 'rest_framework', + 'rest_framework.authtoken', + 'channels', + 'channels_presence', + 'simple_history', + 'captcha', + 'auditlog', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django_user_agents.middleware.UserAgentMiddleware', + 'simple_history.middleware.HistoryRequestMiddleware', + 'auditlog.middleware.AuditlogMiddleware' +] + +ROOT_URLCONF = 'digitaleagentur.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework.authentication.TokenAuthentication', + ), + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.IsAuthenticated', + ], +} + +#WSGI_APPLICATION = 'digitaleagentur.wsgi.application' +ASGI_APPLICATION = "digitaleagentur.routing.application" +CHANNEL_LAYERS = { + 'default': { + 'BACKEND': 'channels_redis.core.RedisChannelLayer', + 'CONFIG': { + "hosts": [REDIS_URL], + }, + }, +} + + + +# Password validation +# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, + #{ + # 'NAME' : "passwords.auth_password_validators.ComplexityValidator", + #} +] + +PASSWORD_COMPLEXITY = { # You can omit any or all of these for no limit for that particular set + "UPPER": 1, # Uppercase + "LOWER": 1, # Lowercase + "LETTERS": 1, # Either uppercase or lowercase letters + "DIGITS": 1, # Digits + "SPECIAL": 1, # Not alphanumeric, space or punctuation character + "WORDS": 0 # Words (alphanumeric sequences separated by a whitespace or punctuation character) +} +# Internationalization +# https://docs.djangoproject.com/en/2.2/topics/i18n/ + +LANGUAGE_CODE = 'de' +LANG="de_DE.UTF-8" + +TIME_ZONE = 'CET' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = False + +DEFAULT_CHARSET = 'utf-8' + +# REDIRCETTARGET AFTER SUCCHESSFULLY LOGIN +LOGIN_REDIRECT_URL = 'users-dashboard' + +# LOGIN PAGE FOR LOGIN-REDIRECT +LOGIN_URL = 'login' + +STATIC_URL = '/static/' + + + +''' +SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) + '/..' + +STATICFILES_DIRS = (os.path.join(SITE_ROOT, 'users/static/'),) + +#STATIC_ROOT = (os.path.join(SITE_ROOT, 'collectedstatic')) +''' +############################# FÜR COMMIT +SITE_ROOT = os.path.dirname(os.path.realpath(__file__)) + '/..' +STATIC_ROOT = (os.path.join(SITE_ROOT, 'users/static/')) +#STATIC_ROOT = (os.path.join(BASE_DIR, 'users/static/')) + +#STATICFILES_DIRS = (os.path.join(SITE_ROOT, 'users/static/'),) + +# CRISPY +CRISPY_TEMPLATE_PACK = 'bootstrap4' + +# Bildspeicherpfad +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_URL = '/media/' + +# CRISPY +CRISPY_TEMPLATE_PACK = 'bootstrap4' + + +# FOR COLORFIELD +GRAPPELLI_CLEAN_INPUT_TYPES = False + +# EMAILs +EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + + + +# FOR DATEPICKER +BOOTSTRAP4 = { + 'include_jquery': True, +} + +OPTIONS={ + 'libraries': { + 'counter_tag': 'standards.tags', + 'adm_tag' : 'adm.tags' + }, +} \ No newline at end of file diff --git a/digitaleagentur/timemanagement_utils.py b/digitaleagentur/timemanagement_utils.py new file mode 100644 index 0000000..c909071 --- /dev/null +++ b/digitaleagentur/timemanagement_utils.py @@ -0,0 +1,64 @@ +from datetime import timedelta +from timemanagement.models import * +''' + + Hier sind alle Methoden gesammelt, die bei der Zeiterfassung eine Rolle spielen. + + + daterange() + - Gibt jeden Tag zwischen zwei Daten zurück + + @param: + date1 - Startdatum + date2 - Enddatum + + @return: + Array mit den entsprechenden Tagen + + getIsAbsenceStartEndHalf() + - Gibt True zurücke, wenn der Anfang oder das Ende einer Abwesenheit nur ein halber Tag ist, ansonsten False + + @param: + absence - Die zu prüfende Abwesenheit + + @return: + True -> Ist nur ein halber Tag + False -> Ist ein ganzer Tag + + + isfreedaycheck() + - Gibt True/False zurück, wenn der übergebene Tag innerhalb oder an einem Feiertag/freien Tag der Agentur lirgt. + + @param + user - Benutzer, um über user.profile.agency die entsprechende Agentur abzufragen + day - Tag, welcher geprüft werden soll + + @return: + True -> Übergebener Tag ist kein freier Tag oder kein Feiertag + False -> Übergebener Tag ist ein freier Tag oder ein Feiertag + +''' + +# Gibt die Woche als Wochentage zurück +def daterange(date1, date2): + for n in range(int ((date2 - date1).days)+1): + yield date1 + timedelta(n) + + +# Gibt True zurück, wenn eine Tag einer Abwesenheit nur ein halber Tag ist +def getIsAbsenceStartEndHalf(absence): + if absence.startday_info == "1" or absence.startday_info == "2" or absence.endday_info == "1" or absence.endday_info == "2": + return True + else: + return False + +# Gibt True zurück, wenn dieser Tag nicht an einem freien Tag liegt. +def isfreedaycheck(user, day): + if len(FreeDays.objects.filter(agency=user.profile.agency, day=day)) > 0: + return False + else: + return True + + + + diff --git a/digitaleagentur/urls.py b/digitaleagentur/urls.py new file mode 100644 index 0000000..fb97203 --- /dev/null +++ b/digitaleagentur/urls.py @@ -0,0 +1,56 @@ +from django.contrib import admin +from django.urls import path, include +from django.contrib.auth import views as auth_views +from django.conf import settings +from django.conf.urls.static import static +from users.views import AgencyCreateView, registerNewAgency, landingPage, registerNewAgencyRD, onlyRD +from . import views +from .views import GetCryptFile, GetCryptFileRecover +from django.contrib.auth.decorators import login_required +from rest_framework.authtoken.views import obtain_auth_token +from django_encrypted_filefield.constants import FETCH_URL_NAME +from django.conf.urls import url + + +urlpatterns = [ + path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'), + path('', include('users.urls'), name="dashboard-first"), + path('admin/', admin.site.urls), + path('dasettings/', include('dasettings.urls'), name="dasettings"), + path('messages/', include('message.urls'), name="messages"), + path('dashboard/', include('users.urls'), name="dashboard"), + path('areas/', include('areas.urls'), name="areas-management"), + path('tasks/', include('tasks.urls'), name="tasks-management"), + path('organizer/', include('organizer.urls'), name="ql-management"), + path('adm/', include('adm.urls'), name="adm"), + path('cloud/', include('cloud.urls'), name="cloud-main"), + path('standards/', include('standards.urls'), name="standards"), + path('rd/', include('recoverdir.urls'), name="recoverdir"), + path('news/', include('news.urls'), name="dashboard"), + path('orga/', include('orga.urls'), name="orga"), + path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html', html_email_template_name='users/password_reset_mail.html'), name='password-reset'), + path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name='password_reset_done'), + path('password-reset-confirm///', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name='password_reset_confirm'), + path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name='password_reset_complete'), + path('register/', registerNewAgency, name='register'), + path('registerdard/', registerNewAgencyRD, name='register-rd'), + path('registerrd/', onlyRD, name='register-ord'), + path('vve/', landingPage.as_view(), name="landingpage"), + path('register/done', views.registerdone, name='register-done'), + path('summernote/', include('django_summernote.urls')), + path('notifications/', include('notificsys.urls'), name="notifications"), + path('tm/', include('timemanagement.urls'), name="timemanagement"), + path('api/', include('api.urls', namespace='api')), + path('chat/', include('chat.urls'), name='chat'), + path('api-token-auth/', obtain_auth_token, name='api-token-auth'), + path('getdoc//', GetCryptFileRecover.as_view(), name=FETCH_URL_NAME), + path('getdoc/', GetCryptFile.as_view(), name=FETCH_URL_NAME), + path('captcha/', include('captcha.urls')), +] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + + +# ERROR HANDLERS +handler404 = 'users.views.handler404' +handler500 = 'users.views.handler500' \ No newline at end of file diff --git a/digitaleagentur/utils.py b/digitaleagentur/utils.py new file mode 100644 index 0000000..c58ed79 --- /dev/null +++ b/digitaleagentur/utils.py @@ -0,0 +1,110 @@ +from timemanagement.models import * +from digitaleagentur.timemanagement_utils import * +''' + + Hier sind Funktion implementiert, die in verschiedenen Module benötigt werden + + + getAbsenceForOneDay - Gibt Abwesenheit eines Users für einen Tag zurück + + +''' + +# getAbsenceForOneDay +''' + + Gibt eine Abwesenheit für einen übergebenen Tag zurück oder False, wenn keine Abwesenheit vorliegt. + + @param: + - user (der entsprechende Nutzer) + - day (Tag, welcher auf Abwesenheiten geprüft werden soll) + +''' +def getAbsenceForOneDay(user, day): + absencedays = Absence.objects.filter(agency=user.profile.agency, user=user, confirm_status=0) & (Absence.objects.filter(agency=user.profile.agency, user=user, start=day) | (Absence.objects.filter(agency=user.profile.agency, user=user, start__lt=day) & Absence.objects.filter(agency=user.profile.agency, user=user, end__gt=day)) | Absence.objects.filter(agency=user.profile.agency, user=user, end=day)) + + # Gibt es eine Abwesenheit an diesem Tag, welche einen halben Tag ist, dann gibt die Methode True zurück und bricht die Schleife ab! + for ab in absencedays: + if ab.startday_info == "1" or ab.startday_info == "2" or ab.endday_info == "1" or ab.endday_info == "2": + return True + + # Es gibt an diesem Tag keine Abwesenheit mit einem halben Tag + return False + +''' + + +# checkAbsenceWorkdayCollide() + + + Prüft, ob eine aktualisierte Abwesenheit Einfluss auf bereits bestehende Arbeitstage hat. Wenn zB nachträglich Arbeitstage eingetragen werden, dann würden diese hier angepasst werden. + + Folgende Fälle werden berücksichtigt: + - Halber Tag der Abwesenheit verringert die Zielarbeitszeit dieses Tags auf die Hälfte + - Abwesenheit ist der komplette Tag, dann wird dieser Arbeitstag gelöscht, wenn es is_time false ist, sprich die Zeiterfassung soll nicht angefasst werden + - Abwesenheit ist kompletter Tag und die Abwesenheit soll Zeiterfassung beeinflussen (z.B. Gleitzeit) dann wird der Arbeitstag nicht verändert. Ist die Gleitzeit ein halber Tag, wird die Zielarbeitszeit halbiert. +''' +def checkAbsenceWorkdayCollide(absence): + # Alle einzelnen Tage der Abwesenheit werden durchgegangen: + for day in daterange(absence.start, absence.end): + # Arbeitstage an diesem Tag werden geladen + workdays = Workday.objects.filter(user=absence.user, start__day=absence.start.day, start__month=absence.start.month, start__year=absence.start.year) + + # Wenn es Arbeitstage gibt, dann wird geprüft, ob die Abwesenheit diesen verändert hat. + for workday in workdays: + # Arbeitstag in Tag ohne Zeit umwandeln + # Wenn die Abwesenheit die Zeiterfassung NICHT ändert, muss diese ggf. geändert werden. Ansonsten bleibt sie gleich. + if absence.reason.is_time == False: + # Prüfung, ob der Tag halb ist oder nicht. Wenn ja, dann Zielarbeitszeit des Tages um die Hälfte reduzieren. + if (workday.start.day == absence.start.day and workday.start.month == absence.start.month and workday.start.year == absence.start.year) or (workday.end.day == absence.end.day and workday.end.month == absence.end.month and workday.end.year == absence.end.year): + if(getIsAbsenceStartEndHalf(absence)): + workday.target = workday.target / 2 + workday.save() + # Ganzer Tag vorhanden, Arbeitstag wird als löschen markiert, aber nicht gelöscht + else: + workday.delflag = True + workday.save() + else: + # Sollte der ganze Tag mal als zu löschen markiert worden sein, wird dies hier zurückgenommen + if workday.delflag == True: + workday.delflag = False + workday.save() + +def checkAbsenceWorkdayCollideDelete(absence): + # Alle einzelnen Tage der Abwesenheit werden durchgegangen: + for day in daterange(absence.start, absence.end): + # Arbeitstage an diesem Tag werden geladen + workdays = Workday.objects.filter(user=absence.user, start__day=absence.start.day, start__month=absence.start.month, start__year=absence.start.year) + + # Wenn es Arbeitstage gibt, dann wird geprüft, ob die Abwesenheit diesen verändert hat. + for workday in workdays: + # Arbeitstag in Tag ohne Zeit umwandeln + # Wenn die Abwesenheit die Zeiterfassung NICHT ändert, muss diese ggf. geändert werden. Ansonsten bleibt sie gleich. + if absence.reason.is_time == False: + # Prüfung, ob der Tag halb ist oder nicht. Wenn ja, dann Zielarbeitszeit des Tages um die Hälfte reduzieren. + if (workday.start.day == absence.start.day and workday.start.month == absence.start.month and workday.start.year == absence.start.year) or (workday.end.day == absence.end.day and workday.end.month == absence.end.month and workday.end.year == absence.end.year): + if(getIsAbsenceStartEndHalf(absence)): + workday.target = workday.target / 2 + workday.save() + # Ganzer Tag vorhanden, Arbeitstag wird als löschen markiert, aber nicht gelöscht + else: + workday.delflag = False + workday.save() + else: + # Sollte der ganze Tag mal als zu löschen markiert worden sein, wird dies hier zurückgenommen + if workday.delflag == True: + workday.delflag = False + workday.save() + + + + + + + + + + + + + diff --git a/digitaleagentur/views.py b/digitaleagentur/views.py new file mode 100644 index 0000000..e5bef5e --- /dev/null +++ b/digitaleagentur/views.py @@ -0,0 +1,177 @@ +from django.shortcuts import render +from django.contrib.auth.mixins import AccessMixin +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView, TemplateView +import requests +import magic +from django.conf import settings +from django.core.validators import URLValidator, ValidationError +from django.http import Http404, HttpResponse +from django.views.generic import View +import base64 +from cryptography.fernet import Fernet +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC +import os, six +from recoverdir.models import RecoverDirSetting +from datetime import datetime +from django.contrib import messages +from django.shortcuts import render, redirect, reverse + + +def _get_setting(name): + setting_name = "DEFF_{}".format(name) + return os.getenv(setting_name, getattr(settings, setting_name, None)) + + +def get_bytes(v): + + if isinstance(v, six.string_types): + return bytes(v.encode("utf-8")) + + if isinstance(v, bytes): + return v + + raise TypeError( + "SALT & PASSWORD must be specified as strings that convert nicely to " + "bytes." + ) + + +SALT = get_bytes(_get_setting("SALT")) +PASSWORD = get_bytes(_get_setting("PASSWORD")) +FETCH_URL_NAME = _get_setting("FETCH_URL_NAME") + +class Cryptographer(object): + + _fernet = Fernet(base64.urlsafe_b64encode(PBKDF2HMAC( + algorithm=hashes.SHA256(), + length=32, + salt=SALT, + iterations=100000, + backend=default_backend() + ).derive(PASSWORD))) + + @classmethod + def encrypted(cls, content): + return cls._fernet.encrypt(content) + + @classmethod + def decrypted(cls, content): + return cls._fernet.decrypt(content) + +def registerdone(request): + return render (request, 'users/registercomplete.html') + + +# TASK: Hier den Abruf von Dokumenten bei eingeloggtem Recover-Datum weniger als 10 Minuten implementieren +class GetCryptFileRecover(TemplateView): + def get(self, request, *args, **kwargs): + + try: + settings = RecoverDirSetting.objects.filter(agency_id=kwargs['agpk'])[0] + except IndexError: + messages.warning(self.request, f'Diese Agentur hat keine Notfallhilfe.') + return redirect('load-rd-external') + + if settings.lastlogg == None: + messages.warning(self.request, f'Bitte loggen Sie sich erneut ein!') + return redirect('load-rd-external') + else: + now = datetime.now() + time_delta = (now-settings.lastlogg) + total_seconds = time_delta.total_seconds() + minutes = total_seconds/60 + if(settings.lastlogg != None and minutes < 10): + # LOGIN OK AND LOGIN EARLIER THAN 10 MINUTES + path = kwargs.get("path") + + # No path? You're boned. Move along. + if not path: + raise Http404 + + if self._is_url(path): + content = requests.get(path, stream=True).raw.read() + + else: + # Normalise the path to strip out naughty attempts + #path = os.path.normpath(path).replace(settings.MEDIA_URL, settings.MEDIA_ROOT, 1) + path = "media/" + path + # Evil path request! + #if not path.startswith(settings.MEDIA_ROOT): + # print("404 startswith") + # raise Http404 + + # The file requested doesn't exist locally. A legit 404 + if not os.path.exists(path): + raise Http404 + + with open(path, "rb") as f: + content = f.read() + + content = Cryptographer.decrypted(content) + return HttpResponse(content, content_type=magic.Magic(mime=True).from_buffer(content)) + + else: + # LOGIN TO OLD - SET LASTLOGG TO NONE AND SEND MESSAGE + settings.lastlogg = None + settings.save() + messages.warning(self.request, f'Bitte loggen Sie sich erneut ein!') + return redirect('load-rd-external') + + @staticmethod + def _is_url(path): + try: + URLValidator()(path) + return True + except ValidationError: + return False + + + + + + +class GetCryptFile(DetailView): + + def get(self, request, *args, **kwargs): + + if(self.request.user.has_perm("users.recoverdirmanager")): + + path = kwargs.get("path") + + # No path? You're boned. Move along. + if not path: + raise Http404 + + if self._is_url(path): + content = requests.get(path, stream=True).raw.read() + + else: + # Normalise the path to strip out naughty attempts + path = os.path.normpath(path).replace(settings.MEDIA_URL, settings.MEDIA_ROOT, 1) + path = "media/" + path + # Evil path request! + #if not path.startswith(settings.MEDIA_ROOT): + # print("404 startswith") + # raise Http404 + + # The file requested doesn't exist locally. A legit 404 + if not os.path.exists(path): + raise Http404 + + with open(path, "rb") as f: + content = f.read() + + content = Cryptographer.decrypted(content) + return HttpResponse(content, content_type=magic.Magic(mime=True).from_buffer(content)) + else: + return render(request, 'cloud/noentrie.html') + + @staticmethod + def _is_url(path): + try: + URLValidator()(path) + return True + except ValidationError: + return False diff --git a/digitaleagentur/wsgi.py b/digitaleagentur/wsgi.py new file mode 100644 index 0000000..cee7f3e --- /dev/null +++ b/digitaleagentur/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for digitaleagentur project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'digitaleagentur.settings') + +application = get_wsgi_application() \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000..ae7a200 Binary files /dev/null and b/dump.rdb differ diff --git a/firstrun.py b/firstrun.py new file mode 100644 index 0000000..2de5e3e --- /dev/null +++ b/firstrun.py @@ -0,0 +1,34 @@ +from django.contrib.auth.models import User +from users.models import Profile,Agency + +import random +import string + +password_characters = string.ascii_letters + string.digits + string.punctuation +# USERNAME +username = "root" +password = "" + +i = 0 +while(i < 20): + password += random.choice(password_characters) + i += 1 + +print("USERNAME: " + username) +print("PASSWORD: " + password) +ag=Agency() +ag.save() +pr=Profile() +pr.agency=ag +try: + user=User.objects.create_user(username, 'noreply@digitale-agentur.com', password) +except: + user = User.objects.get(username=username) + user.first_name = 'ROOT' + user.last_name = 'ROOT' + pr.user=user + pr.save() + user.profile = pr + user.is_superuser = True + user.is_staff = True + user.save() \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..1bd0412 --- /dev/null +++ b/manage.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'digitaleagentur.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/media/.DS_Store b/media/.DS_Store new file mode 100644 index 0000000..09a1383 Binary files /dev/null and b/media/.DS_Store differ diff --git a/media/ag_default.jpg b/media/ag_default.jpg new file mode 100755 index 0000000..a282e60 Binary files /dev/null and b/media/ag_default.jpg differ diff --git a/media/ag_default_backup.jpg b/media/ag_default_backup.jpg new file mode 100755 index 0000000..a282e60 Binary files /dev/null and b/media/ag_default_backup.jpg differ diff --git a/media/agencydata/.DS_Store b/media/agencydata/.DS_Store new file mode 100644 index 0000000..fa4f35a Binary files /dev/null and b/media/agencydata/.DS_Store differ diff --git a/media/agencydata/agency_1/files/.DS_Store b/media/agencydata/agency_1/files/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/media/agencydata/agency_1/files/.DS_Store differ diff --git a/media/agencydata/agency_1/files/Fehlzeiten_Inf_12.pdf b/media/agencydata/agency_1/files/Fehlzeiten_Inf_12.pdf new file mode 100644 index 0000000..4563a8d Binary files /dev/null and b/media/agencydata/agency_1/files/Fehlzeiten_Inf_12.pdf differ diff --git a/media/agencydata/agency_1/files/test.ics b/media/agencydata/agency_1/files/test.ics new file mode 100644 index 0000000..5750d8d --- /dev/null +++ b/media/agencydata/agency_1/files/test.ics @@ -0,0 +1,67 @@ +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//digitale-agentur.com//DE +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-TIMEZONE:UTC +BEGIN:VEVENT +SUMMARY:Holger +DTSTART;VALUE=DATE:20200907 +DTEND;VALUE=DATE:20200925 +DTSTAMP;VALUE=DATE-TIME:20201218T181845Z +UID:2da_absence_ +CATEGORIES: +DESCRIPTION:Urlaub +URL:https://digitale-agentur.com +END:VEVENT +BEGIN:VEVENT +SUMMARY:Holger +DTSTART;VALUE=DATE:20201221 +DTEND;VALUE=DATE:20201228 +DTSTAMP;VALUE=DATE-TIME:20201218T181845Z +UID:3da_absence_ +CATEGORIES: +DESCRIPTION:Urlaub +URL:https://digitale-agentur.com +END:VEVENT +BEGIN:VEVENT +SUMMARY:Holger +DTSTART;VALUE=DATE:20201230 +DTEND;VALUE=DATE:20201231 +DTSTAMP;VALUE=DATE-TIME:20201218T181845Z +UID:4da_absence_ +CATEGORIES: +DESCRIPTION:Urlaub +URL:https://digitale-agentur.com +END:VEVENT +BEGIN:VEVENT +SUMMARY:Berta +DTSTART;VALUE=DATE:20201204 +DTEND;VALUE=DATE:20201209 +DTSTAMP;VALUE=DATE-TIME:20201218T181845Z +UID:7da_absence_ +CATEGORIES: +DESCRIPTION:Urlaub +URL:https://digitale-agentur.com +END:VEVENT +BEGIN:VEVENT +SUMMARY:Berta +DTSTART;VALUE=DATE:20201214 +DTEND;VALUE=DATE:20201215 +DTSTAMP;VALUE=DATE-TIME:20201218T181845Z +UID:10da_absence_ +CATEGORIES: +DESCRIPTION:Urlaub +URL:https://digitale-agentur.com +END:VEVENT +BEGIN:VEVENT +SUMMARY:Berta +DTSTART;VALUE=DATE:20201221 +DTEND;VALUE=DATE:20201224 +DTSTAMP;VALUE=DATE-TIME:20201218T181845Z +UID:11da_absence_ +CATEGORIES: +DESCRIPTION:Urlaub +URL:https://digitale-agentur.com +END:VEVENT +END:VCALENDAR diff --git a/media/default.jpg b/media/default.jpg new file mode 100644 index 0000000..81a567f Binary files /dev/null and b/media/default.jpg differ diff --git a/message/__init__.py b/message/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/message/__pycache__/__init__.cpython-38.pyc b/message/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..a604fc8 Binary files /dev/null and b/message/__pycache__/__init__.cpython-38.pyc differ diff --git a/message/__pycache__/admin.cpython-38.pyc b/message/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..b08d356 Binary files /dev/null and b/message/__pycache__/admin.cpython-38.pyc differ diff --git a/message/__pycache__/apps.cpython-38.pyc b/message/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..fc9fc53 Binary files /dev/null and b/message/__pycache__/apps.cpython-38.pyc differ diff --git a/message/__pycache__/forms.cpython-38.pyc b/message/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..a7d367b Binary files /dev/null and b/message/__pycache__/forms.cpython-38.pyc differ diff --git a/message/__pycache__/models.cpython-38.pyc b/message/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..886f0c2 Binary files /dev/null and b/message/__pycache__/models.cpython-38.pyc differ diff --git a/message/__pycache__/urls.cpython-38.pyc b/message/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..10871a3 Binary files /dev/null and b/message/__pycache__/urls.cpython-38.pyc differ diff --git a/message/__pycache__/views.cpython-38.pyc b/message/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..e4cbc38 Binary files /dev/null and b/message/__pycache__/views.cpython-38.pyc differ diff --git a/message/admin.py b/message/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/message/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/message/apps.py b/message/apps.py new file mode 100644 index 0000000..50e791e --- /dev/null +++ b/message/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MessageConfig(AppConfig): + name = 'message' diff --git a/message/forms.py b/message/forms.py new file mode 100644 index 0000000..44e6d42 --- /dev/null +++ b/message/forms.py @@ -0,0 +1,8 @@ +from django import forms +from users.models import UserFullName + +class MessageForm(forms.Form): + def __init__(self, user, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['target_user'] = forms.MultipleChoiceField(required=True, label="Mitarbeiter", choices=[(u.id, u) for u in UserFullName.objects.filter(profile__agency__pk=user.profile.agency.pk).exclude(pk=user.pk)], widget=forms.CheckboxSelectMultiple()) + self.fields['message_content'] = forms.CharField(required=True, widget=forms.Textarea, label="Mitteilung", max_length="5000") \ No newline at end of file diff --git a/message/migrations/0001_initial.py b/message/migrations/0001_initial.py new file mode 100644 index 0000000..07a647d --- /dev/null +++ b/message/migrations/0001_initial.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Message', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', models.TextField(blank=True, default='', verbose_name='Inhalt')), + ('created_date', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ], + ), + ] diff --git a/message/migrations/0002_auto_20200925_0713.py b/message/migrations/0002_auto_20200925_0713.py new file mode 100644 index 0000000..aada6b5 --- /dev/null +++ b/message/migrations/0002_auto_20200925_0713.py @@ -0,0 +1,34 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('message', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='message', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='message', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='createdbyuser', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='message', + name='target_user', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/message/migrations/0003_auto_20201026_0914.py b/message/migrations/0003_auto_20201026_0914.py new file mode 100644 index 0000000..321b412 --- /dev/null +++ b/message/migrations/0003_auto_20201026_0914.py @@ -0,0 +1,26 @@ +# Generated by Django 3.0 on 2020-10-26 09:14 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('message', '0002_auto_20200925_0713'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='created_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='createdbyuser', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='message', + name='target_user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/message/migrations/__init__.py b/message/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/message/migrations/__pycache__/0001_initial.cpython-38.pyc b/message/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..b705870 Binary files /dev/null and b/message/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/message/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc b/message/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc new file mode 100644 index 0000000..aa62c74 Binary files /dev/null and b/message/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc differ diff --git a/message/migrations/__pycache__/0003_auto_20201026_0914.cpython-38.pyc b/message/migrations/__pycache__/0003_auto_20201026_0914.cpython-38.pyc new file mode 100644 index 0000000..f512f67 Binary files /dev/null and b/message/migrations/__pycache__/0003_auto_20201026_0914.cpython-38.pyc differ diff --git a/message/migrations/__pycache__/__init__.cpython-38.pyc b/message/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..4180302 Binary files /dev/null and b/message/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/message/models.py b/message/models.py new file mode 100644 index 0000000..a051194 --- /dev/null +++ b/message/models.py @@ -0,0 +1,20 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency +from django.urls import reverse +from datetime import datetime, timedelta +from django.utils import timezone + +class Message(models.Model): + + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + target_user = models.ForeignKey(User, on_delete=models.CASCADE) + content = models.TextField(blank=True, verbose_name='Inhalt', default="") + + created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name="createdbyuser") + created_date = models.DateTimeField(default=timezone.now, blank=True) + + + # Hier Path für Templates des Models mit Parametern + def get_absolute_url(self): + return reverse('message-single', kwargs={'pk':self.pk}) \ No newline at end of file diff --git a/message/templates/message/message.html b/message/templates/message/message.html new file mode 100644 index 0000000..a72a506 --- /dev/null +++ b/message/templates/message/message.html @@ -0,0 +1,257 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_messages %} + +
+

Mitteilungen{% if request.user.profile.showtooltips %} {% endif %} + +

+
+ + + + + +
+ +
+
Mitteilung senden{% if request.user.profile.showtooltips %} {% endif %}
+
+
+ {% csrf_token %} + {{form|crispy}} + Übrige Zeichen: 4000 +

Ihrer Mitteilung wird eine Anrede und eine Verabscheidung hinzugefügt.

+
+   + Abbrechen +
+
+
+
+ +
+
Meine Mitteilungen{% if request.user.profile.showtooltips %} {% endif %}
+
+ {% if usermessages|length > 0 %} +
+ + + + + + + + + + + {% for item in usermessages %} + + + + + + + {% endfor %} + +
AbsenderDatumInhalt 
{{ item.created_by.first_name }} {{ item.created_by.last_name }}{{ item.created_date }}{{ item.content|truncatechars:30 }}
+
+
+ {% else %} + Sie haben aktuell keine Mitteilungen. + {% endif %} + + +
+
+ +
+ + + + +
+ + + + + +{% else %} +

Das Modul Mitteilungen wurde in ihrer Agentur deaktiviert.

+{% endif %} + + + + + + + + +{% endblock content %} \ No newline at end of file diff --git a/message/templates/message/message_single.html b/message/templates/message/message_single.html new file mode 100644 index 0000000..9483c63 --- /dev/null +++ b/message/templates/message/message_single.html @@ -0,0 +1,56 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_messages %} +
+ +

Mitteilung von {{mess.created_by.first_name}} {{mess.created_by.last_name}}

+ Versendet am {{mess.created_date}} +
+
+
+ Hallo {{request.user.first_name}} {{request.user.last_name}},

+ {{mess.content}} +

+ Mit freundlichen Grüßen

+ {{mess.created_by.first_name}} {{mess.created_by.last_name}} +
+ +
+ + + + + +{% else %} +

Das Modul Mitteilungen wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/message/tests.py b/message/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/message/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/message/urls.py b/message/urls.py new file mode 100644 index 0000000..c9d1f6f --- /dev/null +++ b/message/urls.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from django.urls import path, include +from django.contrib.auth import views as auth_views +from . import views +from django.contrib.auth.decorators import login_required + +urlpatterns = [ + path('', views.mainmessageview, name="messages"), + path('sl/', views.singelmessageview, name="message-single"), + path('delsingle/', views.delsinglemessage, name='delsinglemessage'), + path('delmessage/', views.delsinglemessagefromsingle, name='delsinglemessagefromsingle'), + + +] \ No newline at end of file diff --git a/message/views.py b/message/views.py new file mode 100644 index 0000000..816241f --- /dev/null +++ b/message/views.py @@ -0,0 +1,132 @@ +from django.shortcuts import render, redirect, reverse +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView +from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required +from .forms import MessageForm +from notificsys.models import UserNotification +from django.core.mail import send_mail +from django.template.loader import render_to_string +from .models import Message +from django.contrib import messages +from django.http import JsonResponse +from notificsys.models import UserNotification +from django.urls import reverse_lazy +import channels.layers +from asgiref.sync import async_to_sync + + +# ALLE STANDARDS EINER AGENTUR +@login_required +def mainmessageview(request): + if request.method == 'POST': + context = { + 'active_link' : 'messages' + } + + formtocheck = MessageForm(request.user, request.POST) + + if formtocheck.is_valid(): + + targetuser_ids = formtocheck.cleaned_data["target_user"] + for user in targetuser_ids: + targetuser = User.objects.get(pk=user) + messagecontent = formtocheck.cleaned_data["message_content"] + message = Message.objects.create(target_user=targetuser, agency=request.user.profile.agency, content=messagecontent, created_by=request.user) + + targeturl = request.build_absolute_uri() + "sl/" + str(message.id) + notificationtext = "Sie haben eine neue Mitteilung erhalten: " + message.content[:500] + + if(targetuser.usernotifications.message_received_mail): + username = targetuser.first_name + " " + targetuser.last_name + msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext, 'linktarget' : targeturl}) + send_mail( + 'Agentur-Benachrichtigung', + 'Hallo ' + targetuser.first_name + ' ' + targetuser.last_name + '! ' + notificationtext + " Klicken Sie hier.", + 'noreply@digitale-agentur.com', + [targetuser.email], + html_message=msg_html, + fail_silently=True + ) + + if(targetuser.usernotifications.message_received_push): + newnotification = UserNotification(touser=targetuser, elementid=message.id, notificationtext='Hallo ' + targetuser.first_name + ' ' + targetuser.last_name + '! ' + notificationtext, notificationtype="messagereceived") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(targetuser.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Mitteilung | Neue Mitteilung erhalten: " + message.content}) + + + else: + messages.warning(request, f'Bitte valide Daten eingeben!') + context = { + 'active_link' : 'messages', + 'form' : MessageForm(request.user), + 'usermessages' : Message.objects.filter(target_user=request.user, agency=request.user.profile.agency).order_by('-created_date') + } + return render (request, 'message/message.html', context) + + context = { + 'active_link' : 'messages', + 'form' : MessageForm(request.user), + 'usermessages' : Message.objects.filter(target_user=request.user, agency=request.user.profile.agency).order_by('-created_date') + } + + messages.success(request, f'Ihre Nachricht wurde verschickt!') + return render (request, 'message/message.html', context) + else: + context = { + 'active_link' : 'messages', + 'form' : MessageForm(request.user), + 'usermessages' : Message.objects.filter(target_user=request.user, agency=request.user.profile.agency).order_by('-created_date') + } + # Adding active_link + # Loading only user same agency + # Change context and return for template-data + # # Get all Users of the Same Agency as logged user + return render (request, 'message/message.html', context) + +@login_required +def singelmessageview(request, pk): + + + #Notification delete + unknownnotification = UserNotification.objects.filter(touser__pk=request.user.pk, elementid=pk).delete() + + context = { + 'active_link' : 'messages', + 'mess' : Message.objects.get(pk=pk) + } + + return render (request, 'message/message_single.html', context) + +@login_required +def delsinglemessage(request): + if request.method == 'GET': + if request.GET['action'] == 'delsingle': + Message.objects.get(pk=request.GET['todelid']).delete() + UserNotification.objects.filter(elementid=request.GET['todelid']).delete() + return JsonResponse({}) + + +@login_required +def delsinglemessagefromsingle(request, pk): + + todelmess = Message.objects.get(pk=pk) + + if(todelmess.agency == request.user.profile.agency and todelmess.target_user == request.user): + messages.success(request, f'Mitteilung gelöscht.') + Message.objects.get(pk=pk).delete() + UserNotification.objects.filter(elementid=pk).delete() + else: + messages.success(request, f'Sie dürfen diese Mitteilung nicht löschen.') + + + # Load Context! + context = { + 'active_link' : 'messages', + 'form' : MessageForm(request.user), + 'usermessages' : Message.objects.filter(target_user=request.user, agency=request.user.profile.agency).order_by('-created_date') + } + + return redirect ("messages") diff --git a/news/__init__.py b/news/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/news/__pycache__/__init__.cpython-38.pyc b/news/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..1870893 Binary files /dev/null and b/news/__pycache__/__init__.cpython-38.pyc differ diff --git a/news/__pycache__/admin.cpython-38.pyc b/news/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..df21cdb Binary files /dev/null and b/news/__pycache__/admin.cpython-38.pyc differ diff --git a/news/__pycache__/apps.cpython-38.pyc b/news/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..0f43c1a Binary files /dev/null and b/news/__pycache__/apps.cpython-38.pyc differ diff --git a/news/__pycache__/forms.cpython-38.pyc b/news/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..aa47e81 Binary files /dev/null and b/news/__pycache__/forms.cpython-38.pyc differ diff --git a/news/__pycache__/models.cpython-38.pyc b/news/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..e3635c8 Binary files /dev/null and b/news/__pycache__/models.cpython-38.pyc differ diff --git a/news/__pycache__/urls.cpython-38.pyc b/news/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..b9203e1 Binary files /dev/null and b/news/__pycache__/urls.cpython-38.pyc differ diff --git a/news/__pycache__/views.cpython-38.pyc b/news/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..0469504 Binary files /dev/null and b/news/__pycache__/views.cpython-38.pyc differ diff --git a/news/admin.py b/news/admin.py new file mode 100644 index 0000000..a0137d8 --- /dev/null +++ b/news/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from .models import News +# Register your models here. +admin.site.register(News) \ No newline at end of file diff --git a/news/apps.py b/news/apps.py new file mode 100644 index 0000000..5a7b92d --- /dev/null +++ b/news/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class NewsConfig(AppConfig): + name = 'news' diff --git a/news/forms.py b/news/forms.py new file mode 100644 index 0000000..974e52e --- /dev/null +++ b/news/forms.py @@ -0,0 +1,33 @@ +from bootstrap_datepicker_plus import DatePickerInput +from django import forms +from django.forms import ModelForm +from .models import News +#from ckeditor.widgets import CKEditorWidget + + +class NewsAddNews(forms.ModelForm): + + + class Meta: + model = News + labels = { + "name" : "Titel", + "go_online_on" : "Veröffentlichen", + "go_offline_on" : "Ins Archiv", + "content" : "Inhalt" + } + fields = ['name', 'go_online_on', 'go_offline_on', 'content'] + widgets = { + 'go_online_on': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + 'go_offline_on': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + } +''' +class NewsAddNewsEditor(forms.ModelForm): + + class Meta: + model = News + labels = { + "content" : "Inhalt" + } + fields = ['content'] +''' \ No newline at end of file diff --git a/news/migrations/0001_initial.py b/news/migrations/0001_initial.py new file mode 100644 index 0000000..ba36e45 --- /dev/null +++ b/news/migrations/0001_initial.py @@ -0,0 +1,28 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='News', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ('content', models.TextField(blank=True, default='', verbose_name='Inhalt')), + ('created_date', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('go_online_on', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('go_offline_on', models.DateTimeField(blank=True, default=None, null=True)), + ('last_modified_on', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('agnotify', models.BooleanField(default=True)), + ], + ), + ] diff --git a/news/migrations/0002_auto_20200925_0713.py b/news/migrations/0002_auto_20200925_0713.py new file mode 100644 index 0000000..15fb2aa --- /dev/null +++ b/news/migrations/0002_auto_20200925_0713.py @@ -0,0 +1,34 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('news', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='news', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='news', + name='created_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='news', + name='last_modified_by', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='news_mod_by', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/news/migrations/__init__.py b/news/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/news/migrations/__pycache__/0001_initial.cpython-38.pyc b/news/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..a376504 Binary files /dev/null and b/news/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/news/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc b/news/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc new file mode 100644 index 0000000..8859171 Binary files /dev/null and b/news/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc differ diff --git a/news/migrations/__pycache__/__init__.cpython-38.pyc b/news/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..bd65db1 Binary files /dev/null and b/news/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/news/models.py b/news/models.py new file mode 100644 index 0000000..c73ca76 --- /dev/null +++ b/news/models.py @@ -0,0 +1,34 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency +from django.urls import reverse +from datetime import datetime, timedelta +#from ckeditor_uploader.fields import RichTextUploadingField +from bootstrap_datepicker_plus import DatePickerInput +from django.utils import timezone + +class News(models.Model): + + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + name = models.CharField(max_length=200, blank=False, default="") + #content = RichTextUploadingField(blank=True, verbose_name='Inhalt') + content = models.TextField(blank=True, verbose_name='Inhalt', default="") + + created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + created_date = models.DateTimeField(default=timezone.now, blank=True) + + go_online_on = models.DateTimeField(default=timezone.now, blank=True) + # Default date plus two weeks + go_offline_on = models.DateTimeField(default=None, blank=True, null=True) + + last_modified_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='news_mod_by', default=None) + last_modified_on = models.DateTimeField(default=timezone.now, blank=True) + + agnotify = models.BooleanField(default=True) + + def __str__(self): + return f'{self.name}' + + # Hier Path für Templates des Models mit Parametern + def get_absolute_url(self): + return reverse('news-update', kwargs={'pk':self.pk}) diff --git a/news/templates/news/news_addnews.html b/news/templates/news/news_addnews.html new file mode 100644 index 0000000..4ff5271 --- /dev/null +++ b/news/templates/news/news_addnews.html @@ -0,0 +1,50 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load static %} +{% block content %} +{% if request.user.profile.agency.module_news %} +
+ +

News anlegen

+
+
+ {% csrf_token %} + {{normalForm.media}} + {{normalForm|crispy}} +
+   + Abbrechen +
+
+ +{% else %} +

Das Modul News wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/news/templates/news/news_confirm_delete.html b/news/templates/news/news_confirm_delete.html new file mode 100644 index 0000000..3925540 --- /dev/null +++ b/news/templates/news/news_confirm_delete.html @@ -0,0 +1,23 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_news %} +
+
+
+ +
+
+
+
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+ {% else %} +

Das Modul News wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/news/templates/news/news_management.html b/news/templates/news/news_management.html new file mode 100644 index 0000000..5063a66 --- /dev/null +++ b/news/templates/news/news_management.html @@ -0,0 +1,334 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_news %} +
+

News  + + {% if perms.users.modulenews %} +  News + {% endif %} + +

+
+ +
+
+ +
+
+
+ {% if perms.users.modulenews %} +
+
Aktuelle News
+
+
+
+ + + + + + + + + + + + {% for news_single in news %} + + + + + + + + {% endfor %} + +
TitelErstellt vonErstellt amSichtbar von/bis 
{{news_single.name }}{{ news_single.created_by.first_name }} {{ news_single.created_by.last_name }}{{ news_single.created_date }}{{ news_single.go_online_on|date:"d.m.Y, H:i"}} {% if news_single.go_offline_on != None %} bis {% endif %} {{ news_single.go_offline_on|date:"d.m.Y, H:i"}} + {% if news_single.created_by == request.user or perms.users.news_management %} + + + +   + + + +   + + + + {% endif %} + +
+
+
+
+ {% endif %} + {% if perms.users.modulenews %} +
+
Ausstehende News
+
+
+
+ + + + + + + + + + + + {% for news_single in news_coming %} + + + + + + + + {% endfor %} + +
TitelErstellt vonErstellt amSichtbar von/bis 
{{news_single.name }}{{ news_single.created_by.first_name }} {{ news_single.created_by.last_name }}{{ news_single.created_date }}{{ news_single.go_online_on|date:"d.m.Y, H:i"}} bis {{ news_single.go_offline_on|date:"d.m.Y, H:i"}} + {% if news_single.created_by == request.user or perms.users.news_management %} + + + +   + + + + {% endif %} +
+
+
+
+ {% endif %} + + + + + + +
+
Archivierte News
+
+
+
+ + + + + + + + + + + + {% for news_single in news_arch %} + + + + + + + + {% endfor %} + +
TitelErstellt vonErstellt amSichtbar von/bis 
{{news_single.name }}{{ news_single.created_by.first_name }} {{ news_single.created_by.last_name }}{{ news_single.created_date }}{{ news_single.go_online_on|date:"d.m.Y, H:i"}} bis {{ news_single.go_offline_on|date:"d.m.Y, H:i"}} + {% if news_single.created_by == request.user or perms.users.news_management %} + + + +   + + + + {% endif %} +
+
+
+
+
+
+ + + +{% else %} +

Das Modul News wurde in ihrer Agentur deaktiviert.

+{% endif %} + + + + + + + + + +{% endblock content %} diff --git a/news/templates/news/news_single.html b/news/templates/news/news_single.html new file mode 100644 index 0000000..8f8b1aa --- /dev/null +++ b/news/templates/news/news_single.html @@ -0,0 +1,36 @@ +{% extends "users/base.html" %} +{% block content %} + +{% if request.user.profile.agency.module_news %} +
+ +

{{news.name}} + + + {% if news.created_by == user or perms.users.modulenews %} + + + {% endif %} + +

+
+
+
+
+
+

+ {{news.media}} + {{news.content|safe}} +

+
+
+
+ + {% if news.created_by != None %}Erstellt durch {{news.created_by.first_name}} {{news.created_by.last_name}}{% else %} Erstellt {% endif %} am {{news.created_date}} | {% if news.last_modified_by != None %} Zuletzt bearbeitet von {{ news.last_modified_by.first_name}} {{ news.last_modified_by.last_name}} am {{ news.last_modified_on}} {% endif %} + +
+
+{% else %} +

Das Modul News wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/news/templates/news/news_update.html b/news/templates/news/news_update.html new file mode 100644 index 0000000..c423ab5 --- /dev/null +++ b/news/templates/news/news_update.html @@ -0,0 +1,43 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_news %} +
+

News bearbeiten

+
+
+ {% csrf_token %} + {{normalForm.media}} + {{normalForm|crispy}} +
+   + Abbrechen +
+
+ + +{% else %} +

Das Modul News wurde in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/news/tests.py b/news/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/news/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/news/urls.py b/news/urls.py new file mode 100644 index 0000000..13be753 --- /dev/null +++ b/news/urls.py @@ -0,0 +1,21 @@ +from django.urls import path +from .views import NewsManagement, NewsAdd, NewsDeleteView +from django.contrib.auth.decorators import login_required, permission_required +from . import views +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('', NewsManagement.as_view(template_name="news/news_management.html"), name='news-management'), + path('newsadd/', permission_required('users.modulenews')(views.NewsAdd), name='news-add'), + path('newsupdate//', permission_required('users.modulenews')(views.NewsUpdate), name='news-update'), + path('news//delete', permission_required('users.modulenews')(NewsDeleteView.as_view()), name='news-delete'), + #path('ajax/loadtasks/', views.load_tasks, name='ajax_loadtasks'), + #path('standard//changestat', views.StandardChangePublic, name="standard-status"), + path('news//single', views.NewsSingle, name="news-single"), + path('newsga/', permission_required('users.modulenews')(views.NewsGoToArchiv), name="news-gotoarchiv"), + + #path('standard//area', views.StandardArea, name="standard-area"), + #path('standard//task', views.StandardTask, name="standard-task") +] diff --git a/news/views.py b/news/views.py new file mode 100644 index 0000000..0835f29 --- /dev/null +++ b/news/views.py @@ -0,0 +1,141 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView +from django.contrib.auth.models import User +from .models import News +from .forms import NewsAddNews +from django.contrib.auth.decorators import login_required +from datetime import datetime +from django.contrib import messages +from django.utils.dateparse import parse_date +from django.utils import timezone +# Create your views here. +# ALLE STANDARDS EINER AGENTUR +class NewsManagement(LoginRequiredMixin, ListView): + model = News + # Adding active_link + # Loading only user same agency + # Change context and return for template-data + def get_context_data(self, **kwargs): + filterdate = timezone.now() + news = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_online_on__lt=filterdate).filter(go_offline_on__gt=filterdate).order_by('-created_date') | News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_online_on__lt=filterdate).filter(go_offline_on__isnull=True).order_by('-created_date') + + news_arch = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_offline_on__lt=filterdate).order_by('-created_date') + + news_coming = News.objects.filter(agency__pk=self.request.user.profile.agency.pk).filter(go_online_on__gt=filterdate).order_by('-created_date') + + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'dashboard', 'news' : news, 'news_arch' : news_arch, 'news_coming' : news_coming}) + return context +''' +class NewsAddNews(LoginRequiredMixin, CreateView): + model = News + fields = ['name', 'content','go_online_on', 'go_offline_on'] + success_url = '/dashboard/news/' +''' +@login_required +def NewsAdd(request): + if request.method == 'POST': + normalForm = NewsAddNews(request.POST, instance=request.user) + #editorForm = NewsAddNewsEditor(request.POST, instance=request.user) + + #if editorForm.is_valid() and normalForm.is_valid(): + if normalForm.is_valid(): + normalForm.agency = request.user.profile.agency + normalForm.created_by = request.user + normalForm.last_modified_by = request.user + normalForm.save() + #editorForm.save() + new_news = News() + new_news.agency = request.user.profile.agency + new_news.created_by = request.user + + new_news.last_modified_by = request.user + new_news.created_date = datetime.now() + new_news.last_modified_on = datetime.now() + + new_news.name = normalForm.cleaned_data['name'] + new_news.content = normalForm.cleaned_data['content'] + new_news.go_online_on = normalForm.cleaned_data['go_online_on'] + new_news.go_offline_on = normalForm.cleaned_data['go_offline_on'] + + new_news.save() + messages.success(request, f'News gespeichert!') + return redirect('users-dashboard') + + else: + normalForm = NewsAddNews(instance=request.user) + #editorForm = NewsAddNewsEditor(instance=request.user) + + + context = { + 'normalForm' : normalForm, + #'editorForm' : editorForm, + 'active_link' : 'dashboard' + } + return render(request, 'news/news_addnews.html', context) + +@login_required +def NewsGoToArchiv(request, pk): + + news = News.objects.get(pk=pk) + news.go_offline_on = timezone.now() + news.save() + + + return redirect("news-management") + +@login_required +def NewsUpdate(request, id): + news = News.objects.get(pk=id, agency=request.user.profile.agency) + if request.method == 'POST': + normalForm = NewsAddNews(request.POST, instance=news) + + if normalForm.is_valid(): + news = News.objects.get(pk=id, agency=request.user.profile.agency) + news.last_modified_by = request.user + news.last_modified_on = datetime.now() + news.go_online_on = normalForm.cleaned_data['go_online_on'] + news.go_offline_on = normalForm.cleaned_data['go_offline_on'] + news.name = normalForm.cleaned_data['name'] + news.content = normalForm.cleaned_data['content'] + news.save() + messages.success(request, f'News aktualisiert!') + return redirect('/news') + + else: + normalForm = NewsAddNews(instance=news) + + context = { + 'normalForm' : normalForm, + 'active_link' : 'dashboard', + 'news_id' : news.pk, + } + return render(request, 'news/news_update.html', context) + +class NewsDeleteView(LoginRequiredMixin, DeleteView): + model = News + success_url = '/news' + template_name = 'news/news_confirm_delete.html' + + def get_context_data(self, **kwargs): + context = super(NewsDeleteView, self).get_context_data(**kwargs) + context['active_link'] = 'newsmanagement' + return context + + +@login_required +def NewsSingle(request, pk): + news = News.objects.get(pk=pk, agency=request.user.profile.agency) + context = { + 'active_link':'dashboard', + 'news' : news + } + + return render(request, 'news/news_single.html', context) + + + + + + diff --git a/notificsys/__init__.py b/notificsys/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notificsys/__pycache__/__init__.cpython-38.pyc b/notificsys/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..887ad2e Binary files /dev/null and b/notificsys/__pycache__/__init__.cpython-38.pyc differ diff --git a/notificsys/__pycache__/admin.cpython-38.pyc b/notificsys/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..bb41a29 Binary files /dev/null and b/notificsys/__pycache__/admin.cpython-38.pyc differ diff --git a/notificsys/__pycache__/apps.cpython-38.pyc b/notificsys/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..50ae5e5 Binary files /dev/null and b/notificsys/__pycache__/apps.cpython-38.pyc differ diff --git a/notificsys/__pycache__/models.cpython-38.pyc b/notificsys/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..1aa3d07 Binary files /dev/null and b/notificsys/__pycache__/models.cpython-38.pyc differ diff --git a/notificsys/__pycache__/urls.cpython-38.pyc b/notificsys/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..a98c686 Binary files /dev/null and b/notificsys/__pycache__/urls.cpython-38.pyc differ diff --git a/notificsys/__pycache__/views.cpython-38.pyc b/notificsys/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..8e433bf Binary files /dev/null and b/notificsys/__pycache__/views.cpython-38.pyc differ diff --git a/notificsys/admin.py b/notificsys/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/notificsys/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/notificsys/apps.py b/notificsys/apps.py new file mode 100644 index 0000000..fbcb947 --- /dev/null +++ b/notificsys/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class NotificsysConfig(AppConfig): + name = 'notificsys' diff --git a/notificsys/migrations/0001_initial.py b/notificsys/migrations/0001_initial.py new file mode 100644 index 0000000..fbe752a --- /dev/null +++ b/notificsys/migrations/0001_initial.py @@ -0,0 +1,31 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserNotification', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('notificationtype', models.CharField(blank=True, max_length=60)), + ('wassend', models.BooleanField(default=False)), + ('wasviewed', models.BooleanField(default=False)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('elementid', models.IntegerField(blank=True, default=None, null=True)), + ('notificationtext', models.CharField(blank=True, max_length=200)), + ('touser', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/notificsys/migrations/0002_auto_20201025_1523.py b/notificsys/migrations/0002_auto_20201025_1523.py new file mode 100644 index 0000000..187d05b --- /dev/null +++ b/notificsys/migrations/0002_auto_20201025_1523.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-25 15:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notificsys', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='usernotification', + name='notificationtext', + field=models.CharField(blank=True, max_length=5000), + ), + ] diff --git a/notificsys/migrations/0003_auto_20201109_2007.py b/notificsys/migrations/0003_auto_20201109_2007.py new file mode 100644 index 0000000..08734a0 --- /dev/null +++ b/notificsys/migrations/0003_auto_20201109_2007.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-11-09 20:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notificsys', '0002_auto_20201025_1523'), + ] + + operations = [ + migrations.AlterField( + model_name='usernotification', + name='notificationtext', + field=models.CharField(blank=True, max_length=15000), + ), + ] diff --git a/notificsys/migrations/__init__.py b/notificsys/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/notificsys/migrations/__pycache__/0001_initial.cpython-38.pyc b/notificsys/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..8e127e7 Binary files /dev/null and b/notificsys/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/notificsys/migrations/__pycache__/0002_auto_20201025_1523.cpython-38.pyc b/notificsys/migrations/__pycache__/0002_auto_20201025_1523.cpython-38.pyc new file mode 100644 index 0000000..62b30e4 Binary files /dev/null and b/notificsys/migrations/__pycache__/0002_auto_20201025_1523.cpython-38.pyc differ diff --git a/notificsys/migrations/__pycache__/0003_auto_20201109_2007.cpython-38.pyc b/notificsys/migrations/__pycache__/0003_auto_20201109_2007.cpython-38.pyc new file mode 100644 index 0000000..ee0517c Binary files /dev/null and b/notificsys/migrations/__pycache__/0003_auto_20201109_2007.cpython-38.pyc differ diff --git a/notificsys/migrations/__pycache__/__init__.cpython-38.pyc b/notificsys/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..21e784d Binary files /dev/null and b/notificsys/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/notificsys/models.py b/notificsys/models.py new file mode 100644 index 0000000..61af06e --- /dev/null +++ b/notificsys/models.py @@ -0,0 +1,27 @@ +from django.db import models +from django.utils import timezone +from datetime import datetime, timedelta +from django.contrib.auth.models import User +# Create your models here. +''' + + class UserNotification + + Model für Benachrichtigungen + +''' +class UserNotification(models.Model): + + # Wenn der User gelöscht wird, wird auch die Notification entfernt + touser = models.ForeignKey(User, on_delete=models.CASCADE) + notificationtype = models.CharField(max_length=60, blank=True) + # Notifcaton was send or not (for sound-update at the client) + wassend = models.BooleanField(default=False) + # Wurde gesehen + wasviewed = models.BooleanField(default=False) + created = models.DateTimeField(default=timezone.now) + elementid = models.IntegerField(default=None, null=True, blank=True) + # Eventuell automatisches Lösch-Datum + #willdeleted = models.DateTimeField(default=timezone.now()+timedelta(days=30)) + # Textcontent + notificationtext = models.CharField(max_length=15000, blank=True) \ No newline at end of file diff --git a/notificsys/templates/notificsys/allnotifications.html b/notificsys/templates/notificsys/allnotifications.html new file mode 100644 index 0000000..1160d2b --- /dev/null +++ b/notificsys/templates/notificsys/allnotifications.html @@ -0,0 +1,95 @@ +{% extends "users/base.html" %} +{% block content %} +
+

Alle Benachrichtigungen

+
+ + {% for notification in usernotifications %} + +
+
+ +

+ {% if notification.notificationtype == "agencynews" %} + + {{notification.notificationtext}} +
+ {% elif notification.notificationtype == "newstandard" %} + + {{notification.notificationtext}} +
+ {% elif notification.notificationtype == "messagereceived" %} + + {{notification.notificationtext}} +
+ {% else %} + {{notification.notificationtext}}
+ {% endif %} + Am {{notification.created}} +

+
+ {% endfor %} +
+ + + + + +{% endblock content %} \ No newline at end of file diff --git a/notificsys/templates/notificsys/notification_mail.html b/notificsys/templates/notificsys/notification_mail.html new file mode 100644 index 0000000..299b991 --- /dev/null +++ b/notificsys/templates/notificsys/notification_mail.html @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ +
+ + + + + + + + + + + + + +
+

+ +
+
+

Digitale Agentur | Benachrichtigung

+
+
+
+

Hallo {{username}},

+

{{notificationtext}}

+ {% if linktarget|length > 0 %} +

Hier klicken!

+ {% endif %} +

Mit freundlichen Grüßen

+

Ihr Team von Digitale Agentur

+
+
+

+ +
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/notificsys/tests.py b/notificsys/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/notificsys/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/notificsys/urls.py b/notificsys/urls.py new file mode 100644 index 0000000..c195aac --- /dev/null +++ b/notificsys/urls.py @@ -0,0 +1,11 @@ +from django.urls import path +from .views import CheckNotifications, GetBasicNotifications, ShowAllNotifications, ChangeNotificationsToViewed, delAllNotification, delSingleNotification + +urlpatterns = [ + path('checknotifications/', CheckNotifications, name='checknotifications'), + path('getnotifications/', GetBasicNotifications, name='getnotifications'), + path('showallnotificaions/', ShowAllNotifications, name='showallnotificaions'), + path('newnotificationsviewed/', ChangeNotificationsToViewed, name='newnotificationsviewed'), + path('delsingle/', delSingleNotification, name='delsinglenotification'), + path('delall/', delAllNotification, name='delall'), +] diff --git a/notificsys/views.py b/notificsys/views.py new file mode 100644 index 0000000..15659ec --- /dev/null +++ b/notificsys/views.py @@ -0,0 +1,125 @@ +from django.shortcuts import render +from django.http import HttpResponseRedirect,HttpResponse, JsonResponse +from .models import UserNotification +from django.views import generic +from django.contrib.auth.decorators import login_required +# Create your views here. + +@login_required +def CheckNotifications(request): + if request.method == 'GET': + if request.GET['action'] == 'checknotifications': + #print("HERE WE ARE") + unknownnotification = UserNotification.objects.filter(touser__pk=request.user.pk, wassend=False).order_by('-created')[:5] + + data = {}; + i = 0 + for notify in unknownnotification: + + elelink = "" + if notify.notificationtype == "agencynews": + elelink = "news/news/" + str(notify.elementid) + "/single" + elif notify.notificationtype == "messagereceived": + elelink = "messages/sl/" + str(notify.elementid) + elif notify.notificationtype == "newstandard": + elelink = "standards/standard/" + str(notify.elementid) + "/single" + elif notify.notificationtype == "wantedag": + elelink = "dasettings/managnag/" + str(notify.elementid) + else: + elelink = "notifications/showallnotificaions/" + + + formatedDate = notify.created.strftime("%d.%m.20%y um %H:%M") + + data.update({ i : { + "not_id" : notify.pk, + "type": notify.notificationtype, + "date" : formatedDate, + "text" : notify.notificationtext, + "elelink" : elelink + }}) + i += 1 + notify.save() + + return JsonResponse({"unknownnotification" : data}) + +# Create your views here. +@login_required +def GetBasicNotifications(request): + if request.method == 'GET': + if request.GET['action'] == 'oldnotifications': + #print("HERE WE ARE") + oldnotifications = UserNotification.objects.filter(touser__pk=request.user.pk, wassend=True, wasviewed=False).order_by('-created')[:5] + + data = {}; + i = 0 + for notify in oldnotifications: + + elelink = "" + if notify.notificationtype == "agencynews": + elelink = "news/news/" + str(notify.elementid) + "/single" + elif notify.notificationtype == "messagereceived": + elelink = "messages/sl/" + str(notify.elementid) + elif notify.notificationtype == "newstandard": + elelink = "standards/standard/" + str(notify.elementid) + "/single" + elif notify.notificationtype == "wantedag": + elelink = "dasettings/managnag/" + str(notify.elementid) + else: + elelink = "notifications/showallnotificaions/" + + formatedDate = notify.created.strftime("%d.%m.20%y um %H:%M") + + data.update({ i : { + "not_id" : notify.pk, + "type": notify.notificationtype, + "date" : formatedDate, + "text" : notify.notificationtext, + "elelink" : elelink + }}) + i += 1 + notify.save() + + return JsonResponse({"oldnotifications" : data}) + +@login_required +def ShowAllNotifications(request): + context ={} + context["usernotifications"] = UserNotification.objects.filter(touser__pk=request.user.pk).order_by('-created') + return render(request, "notificsys/allnotifications.html", context) + +@login_required +def ChangeNotificationsToViewed(request): + if request.method == 'GET': + if request.GET['action'] == 'newnotificationsviewed': + oldnotifications = UserNotification.objects.filter(touser__pk=request.user.pk, wassend=False, wasviewed=False).order_by('-created')[:5] + data = {}; + i = 0 + for notify in oldnotifications: + formatedDate = notify.created.strftime("%d.%m.20%y um %H:%M") + data.update({ i : { + "not_id" : notify.pk, + "type": notify.notificationtype, + "date" : formatedDate, + "text" : notify.notificationtext + }}) + i += 1 + notify.wassend = True + notify.save() + return JsonResponse({}) + +@login_required +def delSingleNotification(request): + if request.method == 'GET': + if request.GET['action'] == 'delsingle': + todelnotification = UserNotification.objects.get(pk=request.GET['todelid']) + todelnotification.delete() + + return JsonResponse({}) + +@login_required +def delAllNotification(request): + if request.method == 'GET': + if request.GET['action'] == 'delall': + UserNotification.objects.filter(touser__pk=request.user.pk).delete() + + return JsonResponse({}) \ No newline at end of file diff --git a/orga/__init__.py b/orga/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/orga/__pycache__/__init__.cpython-38.pyc b/orga/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..752766b Binary files /dev/null and b/orga/__pycache__/__init__.cpython-38.pyc differ diff --git a/orga/__pycache__/admin.cpython-38.pyc b/orga/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..989f60c Binary files /dev/null and b/orga/__pycache__/admin.cpython-38.pyc differ diff --git a/orga/__pycache__/apps.cpython-38.pyc b/orga/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..49d4525 Binary files /dev/null and b/orga/__pycache__/apps.cpython-38.pyc differ diff --git a/orga/__pycache__/models.cpython-38.pyc b/orga/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..82cca05 Binary files /dev/null and b/orga/__pycache__/models.cpython-38.pyc differ diff --git a/orga/__pycache__/urls.cpython-38.pyc b/orga/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..48bdfc9 Binary files /dev/null and b/orga/__pycache__/urls.cpython-38.pyc differ diff --git a/orga/__pycache__/views.cpython-38.pyc b/orga/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..5c3a69a Binary files /dev/null and b/orga/__pycache__/views.cpython-38.pyc differ diff --git a/orga/admin.py b/orga/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/orga/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/orga/apps.py b/orga/apps.py new file mode 100644 index 0000000..52b3ebf --- /dev/null +++ b/orga/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class OrgaConfig(AppConfig): + name = 'orga' diff --git a/orga/models.py b/orga/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/orga/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/orga/templates/orga/orga_main.html b/orga/templates/orga/orga_main.html new file mode 100644 index 0000000..8e54023 --- /dev/null +++ b/orga/templates/orga/orga_main.html @@ -0,0 +1,224 @@ +{% extends "users/base.html" %} +{% load static %} +{% block content %} + + +
+

{{request.user.profile.agency.name}}

+
+

Organigramm  + +

+ {% if invisible_users > 0%} + + {% endif %} +
+
+
+
+
+ + + + + + + + + + + + + + + +{% endblock content %} \ No newline at end of file diff --git a/orga/templates/orga/orga_main_SAVE.html b/orga/templates/orga/orga_main_SAVE.html new file mode 100644 index 0000000..f7f5d53 --- /dev/null +++ b/orga/templates/orga/orga_main_SAVE.html @@ -0,0 +1,133 @@ +{% extends "users/base.html" %} +{% load static %} +{% block content %} + +
+

{{request.user.profile.agency.name}}

+
+

Organigramm

+ {% if invisible_users > 0%} + + {% endif %} +
+
+
+
+ + + + + + + + +{% endblock content %} \ No newline at end of file diff --git a/orga/templates/orga/orga_single.html b/orga/templates/orga/orga_single.html new file mode 100644 index 0000000..4724acc --- /dev/null +++ b/orga/templates/orga/orga_single.html @@ -0,0 +1,332 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% load static %} +{% block content %} + + + +
+

Bereiche und Tätigkeiten von {{user_first_name}} {{user_last_name}} + {% if user|usergperm:"usermanager" %} + + + {% endif %} + + {% if request.user.profile.agency.dynamicprofile %} + + {% endif %} + + + +

+
+
+ +
+
+
+
Name
+

+ {{ user_first_name }} {{ user_last_name }} +

+
Agenturfunktion
+

+ {{ userfunc }} +

+
E-Mail
+

+ {{ mail }} +

+
+
+
Tätigkeit
+

+ {{ compfunc }} +

+
Festnetz
+

+ {{ phoneland }} +

+
Mobil
+

+ {{ phonemobile }}{% if phone_public %} (nur Intern){% endif %} +

+
+
+
+
+
+ {% if request.user.profile.agency.dynamicprofile == False %} +

{{ user_first_name }} {{ user_last_name }} + + {% if request.user.profile.agency.dynamicprofile %} + + + + {% endif %} +

+ + + + {% for area in areas %} + + {% endfor %} + + + + + {% for area in areas %} + + {% endif %} + {% endfor %} + + +
{{area.name}}
+
+ {% if request.user.profile.agency.dynamicprofile %} + + {% for task in tasks %} + {% isUserInAuth task area user_id as checkIsUserAuth %} + {% if task.area.pk == area.pk and task.visible and checkIsUserAuth %} + + {% endif %} + + {% isUserInEx task area user_id as checkIsUserEx %} + {% if task.area.pk == area.pk and task.visible and checkIsUserEx %} + + {% endif %} + + {% isUserInRep task area user_id as checkIsUserRep %} + {% if task.area.pk == area.pk and task.visible and checkIsUserRep %} + + {% endif %} + + {% endfor %} + {% else %} + + {% for prio in prios %} + {% if prio.task.area.pk == area.pk and prio.task.visible %} + + {% endif %} + {% endfor %} +
+
+{% else %} +
+
+ + +{% endif %} + + + +
+{% if request.user.profile.agency.dynamicprofile %} + +{% else %} + +{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/orga/templates/orga/orga_single_aut.html b/orga/templates/orga/orga_single_aut.html new file mode 100644 index 0000000..0e04247 --- /dev/null +++ b/orga/templates/orga/orga_single_aut.html @@ -0,0 +1,163 @@ +{% load counter_tag %} +

{{ user_first_name }} {{ user_last_name }} + + verantwortet: +

+ + + + {% for area in areas %} + + {% endfor %} + + + + + {% for area in areas %} + + {% endif %} + {% endfor %} + + +
{{area.name}}
+
+ {% if request.user.profile.agency.dynamicprofile %} + + {% for task in tasks %} + {% isUserInAuth task area user_id as checkIsUserAuth %} + {% if task.area.pk == area.pk and task.visible and checkIsUserAuth %} + + {% endif %} + + {% endfor %} + {% else %} + + {% for prio in prios %} + {% if prio.task.area.pk == area.pk and prio.task.visible %} + + {% endif %} + {% endfor %} +
+
+ diff --git a/orga/templates/orga/orga_single_er.html b/orga/templates/orga/orga_single_er.html new file mode 100644 index 0000000..9bf87f0 --- /dev/null +++ b/orga/templates/orga/orga_single_er.html @@ -0,0 +1 @@ +

Fehler beim Laden der Tabelle!

\ No newline at end of file diff --git a/orga/templates/orga/orga_single_ex.html b/orga/templates/orga/orga_single_ex.html new file mode 100644 index 0000000..e04afd9 --- /dev/null +++ b/orga/templates/orga/orga_single_ex.html @@ -0,0 +1,163 @@ +{% load counter_tag %} +

{{ user_first_name }} {{ user_last_name }} + + führt aus: +

+ + + + {% for area in areas %} + + {% endfor %} + + + + + {% for area in areas %} + + {% endif %} + {% endfor %} + + +
{{area.name}}
+
+ {% if request.user.profile.agency.dynamicprofile %} + + {% for task in tasks %} + + {% isUserInEx task area user_id as checkIsUserEx %} + {% if task.area.pk == area.pk and task.visible and checkIsUserEx %} + + {% endif %} + {% endfor %} + {% else %} + + {% for prio in prios %} + {% if prio.task.area.pk == area.pk and prio.task.visible %} + + {% endif %} + {% endfor %} +
+
+ diff --git a/orga/templates/orga/orga_single_rep.html b/orga/templates/orga/orga_single_rep.html new file mode 100644 index 0000000..38d16f2 --- /dev/null +++ b/orga/templates/orga/orga_single_rep.html @@ -0,0 +1,164 @@ +{% load counter_tag %} +

{{ user_first_name }} {{ user_last_name }} + + vertritt: +

+ + + + {% for area in areas %} + + {% endfor %} + + + + + {% for area in areas %} + + {% endif %} + {% endfor %} + + +
{{area.name}}
+
+ {% if request.user.profile.agency.dynamicprofile %} + + {% for task in tasks %} + {% isUserInRep task area user_id as checkIsUserRep %} + {% if task.area.pk == area.pk and task.visible and checkIsUserRep %} + + {% endif %} + + {% endfor %} + {% else %} + + {% for prio in prios %} + {% if prio.task.area.pk == area.pk and prio.task.visible %} + + {% endif %} + {% endfor %} +
+
+ diff --git a/orga/tests.py b/orga/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/orga/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/orga/urls.py b/orga/urls.py new file mode 100644 index 0000000..1c2807b --- /dev/null +++ b/orga/urls.py @@ -0,0 +1,13 @@ +from django.urls import path +from . import views + +''' +''' + +urlpatterns = [ + path('', views.mainorga, name='orga-main'), + path('single/', views.singleorga, name='orga-single'), + path('orgaajax/', views.OrgaSingleAjax, name='orga-ajax'), +] + + diff --git a/orga/views.py b/orga/views.py new file mode 100644 index 0000000..5586399 --- /dev/null +++ b/orga/views.py @@ -0,0 +1,172 @@ +from django.shortcuts import render +from django.contrib.auth.decorators import login_required +from django.contrib.auth.models import User +from areas.models import Areas +from users.priomodel import Prio +from tasks.models import Tasks +from users.models import AgencyJob +import webcolors +from standards.models import Standards + +@login_required +def mainorga(request): + + agencyuser = list(User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).filter(profile__visible=True).order_by('-id')) + nonvisibleuser = list(User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).filter(profile__visible=False).order_by('-id')) + + invisible_users = 0; + # Check, if parented users are invisible. Remove them and give user an info! + for ele in nonvisibleuser: + for vis in agencyuser: + try: + if vis.profile.parent.profile.pk == ele.pk: + agencyuser.remove(vis) + invisible_users += 1 + except: + pass + + agjobs = AgencyJob.objects.filter(agency=request.user.profile.agency) + + context = { + 'active_link' : 'orga', + 'agencyuser' : agencyuser, + 'invisible_users' : invisible_users + } + + return render(request, 'orga/orga_main.html', context) + + +@login_required +def singleorga(request, pk): + user = User.objects.get(pk=pk, profile__agency=request.user.profile.agency) + ''' + VON GROß NACH KLEIN - SINNLOS + prios = Prio.objects.filter(user__pk=pk).order_by('-prio')[::-1] + ''' + + ''' + + Wenn eingelogger Nutzer nicht die gleiche Agency-ID hat, + gehts zum Dashboard + + ''' + if(user.profile.agency.pk==request.user.profile.agency.pk): + prios = Prio.objects.filter(user__pk=pk).order_by('prio') + areas = list(Areas.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('areaorder')) + alltasks = Tasks.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('name') + + ''' + Hier werden die Tasks entsprechend ihrer Prio gespeichert, anschließend werden noch die übrigen Tasks übertragen, die noch keinen Prio-Eintrag haben. Diese haben 0 und landen dementsprechend hinten. + ''' + + tasks = [] + for p in prios: + tasks.append(p.task) + + for at in alltasks: + if at not in tasks: + tasks.append(at) + + i = 0 + for area in areas: + areas[i].hex = areas[i].color + areas[i].color = list(webcolors.hex_to_rgb(areas[i].color)) + i += 1 + + user_first_name = user.first_name + user_last_name = user.last_name + user_id = user.pk + try: + userfuncname = AgencyJob.objects.get(pk=user.profile.func.pk).name + except: + userfuncname = "Nicht vergeben" + + context = { + 'active_link' : 'orga', + 'areas' : areas, + 'user_first_name' : user_first_name, + 'user_last_name' : user_last_name, + 'user_id' : user_id, + 'prios' : prios, + 'phone_public' : user.profile.phone_public, + 'mail' : user.email, + 'userfunc' : userfuncname, + 'imageurl' : user.profile.get_photo_url, + 'compfunc' : user.profile.compfunc, + 'phoneland' : user.profile.phoneland, + 'tasks' : tasks, + 'phonemobile' : user.profile.phonemobile + } + return render(request, 'orga/orga_single.html', context) + else: + return redirect('users-dashboard') + + +@login_required +def OrgaSingleAjax(request): + data = {} + if request.method == "GET": + if request.GET["action"] == "getrenderedview": + #try: + viewmode = int(request.GET["viewmode"]) + viewuser = User.objects.get(pk=request.GET["viewuser"]) + + prios = Prio.objects.filter(user__pk=viewuser.pk).order_by('prio') + areas = list(Areas.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('areaorder')) + alltasks = Tasks.objects.filter(agency__pk=request.user.profile.agency.pk).order_by('name') + + tasks = [] + for p in prios: + tasks.append(p.task) + + for at in alltasks: + if at not in tasks: + tasks.append(at) + + i = 0 + for area in areas: + areas[i].hex = areas[i].color + areas[i].color = list(webcolors.hex_to_rgb(areas[i].color)) + i += 1 + + user_first_name = viewuser.first_name + user_last_name = viewuser.last_name + user_id = viewuser.pk + try: + userfuncname = AgencyJob.objects.get(pk=viewuser.profile.func.pk).name + except: + userfuncname = "Nicht vergeben" + + if(viewuser.profile.agency == request.user.profile.agency): + context = { + "user_first_name" : viewuser.first_name, + "user_last_name" : viewuser.last_name, + 'areas' : areas, + 'user_first_name' : user_first_name, + 'user_last_name' : user_last_name, + 'user_id' : user_id, + 'prios' : prios, + 'tasks' : tasks + } + + # EX + if(viewmode == 0): + return render(request, "orga/orga_single_ex.html", context) + # AUT + elif(viewmode == 1): + return render(request, "orga/orga_single_aut.html", context) + # REP + elif(viewmode == 2): + return render(request, "orga/orga_single_rep.html", context) + #except: + # return render(request, "orga/orga_single_er.html") + else: + return render(request, "orga/orga_single_er.html") + + + else: + data = { + "success" : False + } + + return JsonResponse(data) \ No newline at end of file diff --git a/organizer/__init__.py b/organizer/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/organizer/__pycache__/__init__.cpython-38.pyc b/organizer/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..71a192a Binary files /dev/null and b/organizer/__pycache__/__init__.cpython-38.pyc differ diff --git a/organizer/__pycache__/admin.cpython-38.pyc b/organizer/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..95ba207 Binary files /dev/null and b/organizer/__pycache__/admin.cpython-38.pyc differ diff --git a/organizer/__pycache__/apps.cpython-38.pyc b/organizer/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..4677764 Binary files /dev/null and b/organizer/__pycache__/apps.cpython-38.pyc differ diff --git a/organizer/__pycache__/forms.cpython-38.pyc b/organizer/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..ff73df4 Binary files /dev/null and b/organizer/__pycache__/forms.cpython-38.pyc differ diff --git a/organizer/__pycache__/models.cpython-38.pyc b/organizer/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..1bbbcfa Binary files /dev/null and b/organizer/__pycache__/models.cpython-38.pyc differ diff --git a/organizer/__pycache__/urls.cpython-38.pyc b/organizer/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..13e88ad Binary files /dev/null and b/organizer/__pycache__/urls.cpython-38.pyc differ diff --git a/organizer/__pycache__/views.cpython-38.pyc b/organizer/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..dfbf847 Binary files /dev/null and b/organizer/__pycache__/views.cpython-38.pyc differ diff --git a/organizer/admin.py b/organizer/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/organizer/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/organizer/apps.py b/organizer/apps.py new file mode 100644 index 0000000..73820dc --- /dev/null +++ b/organizer/apps.py @@ -0,0 +1,4 @@ +from django.apps import AppConfig + +class OrganizerConfig(AppConfig): + name = 'organizer' diff --git a/organizer/forms.py b/organizer/forms.py new file mode 100644 index 0000000..d1f96ed --- /dev/null +++ b/organizer/forms.py @@ -0,0 +1,117 @@ +from django import forms +from django.forms import ModelForm +from .models import QuickLinks, AGContacts, AGPassword, AGContactsCagetory + + +class OrganizerAddQlForm(forms.ModelForm): + + class Meta: + model =QuickLinks + labels = { + "name" : "Name", + "link" : "Weblink", + #"logo" : "Logo", + } + #fields = ['name', 'link', 'logo'] + fields = ['name', 'link'] + +class OrganizerAddCategoryForm(forms.ModelForm): + class Meta: + model = AGContactsCagetory + + labels = { + "name" : "Name der Kategorie", + } + fields = ['name'] + + +# CONTACTS +class OrganizerAddContact(forms.ModelForm): + + class Meta: + model = AGContacts + labels = { + 'personname' : "Ansprechpartner", + 'function' : "Funktion", + 'name' : "Organisation", + 'mail' : "E-Mailadresse", + 'phone1' : "Telefon 1", + 'phone2' : "Telefon 2", + 'street' : "Straße und Hausnummer", + 'city' : "Stadt", + 'plz' : "PLZ", + 'category' : "Kategorie", + 'desc' : "Anmerkungen" + } + + fields = ['name', 'personname', 'function', 'mail', 'phone1', 'phone2', 'street', 'plz', 'city', "category", 'desc'] + + + def __init__(self, user, *args, **kwargs): + super(OrganizerAddContact, self).__init__(*args, **kwargs) + self.fields['name'].required = False + self.fields['function'].required = False + self.fields['personname'].required = False + self.fields['mail'].required = False + self.fields['phone1'].required = False + self.fields['phone2'].required = False + self.fields['category'].queryset = AGContactsCagetory.objects.filter(agency=user.profile.agency).order_by('name') + self.fields['category'].required = False + self.fields['desc'].widget.attrs['rows'] = 2 + + + +class OrganizerUpdateContact(forms.ModelForm): + + class Meta: + model = AGContacts + labels = { + 'personname' : "Ansprechpartner", + 'function' : "Funktion", + 'name' : "Organisation", + 'mail' : "E-Mailadresse", + 'phone1' : "Telefon 1", + 'phone2' : "Telefon 2", + 'street' : "Straße und Hausnummer", + 'city' : "Stadt", + 'plz' : "PLZ", + 'category' : "Kategorie", + 'desc' : "Anmerkungen" + } + + fields = ['name', 'personname', 'function', 'mail', 'phone1', 'phone2', 'street', 'plz', 'city', "category", 'desc'] + + def __init__(self, user, *args, **kwargs): + super(OrganizerUpdateContact, self).__init__(*args, **kwargs) + + self.fields['name'].required = False + self.fields['function'].required = False + self.fields['personname'].required = False + self.fields['mail'].required = False + self.fields['phone1'].required = False + self.fields['phone2'].required = False + self.fields['category'].queryset = AGContactsCagetory.objects.filter(agency=user.profile.agency).order_by('name') + self.fields['category'].required = False + self.fields['desc'].widget.attrs['rows'] = 2 + +# PASSWORDS +class AddAGPassword(forms.ModelForm): + + class Meta: + model = AGPassword + labels = { + 'name' : "Name der Anwendung", + 'agpass_username' : "Benutzername in der Anwendung", + 'compass' : "Passwort in der Anwendung", + 'link' : "Weblink zur Anwendung" + } + + fields = ['name', 'agpass_username', 'compass', 'link'] + #widgets = { + # 'compass': forms.PasswordInput() + # } + + def __init__(self, *args, **kwargs): + super(AddAGPassword, self).__init__(*args, **kwargs) + + self.fields['link'].required = False diff --git a/organizer/migrations/0001_initial.py b/organizer/migrations/0001_initial.py new file mode 100644 index 0000000..517b561 --- /dev/null +++ b/organizer/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AGContacts', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('personname', models.CharField(default='', max_length=200)), + ('name', models.CharField(default='', max_length=200)), + ('mail', models.CharField(default='', max_length=200)), + ('phone1', models.CharField(default='', max_length=200)), + ('phone2', models.CharField(default='', max_length=200)), + ('street', models.CharField(blank=True, default='', max_length=200)), + ('city', models.CharField(blank=True, default='', max_length=200)), + ('plz', models.CharField(blank=True, default='', max_length=5)), + ('desc', models.TextField(blank=True, max_length=3000)), + ], + ), + migrations.CreateModel( + name='AGContactsCagetory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ], + ), + migrations.CreateModel( + name='AGPassword', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ('agpass_username', models.CharField(default='', max_length=200)), + ('compass', models.CharField(default='', max_length=200)), + ('link', models.CharField(default='', max_length=200)), + ], + ), + migrations.CreateModel( + name='QuickLinks', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=200)), + ('link', models.CharField(max_length=200)), + ('logo', models.ImageField(blank=True, default='agencymain/linkdefault.png', upload_to='agencymain')), + ], + ), + ] diff --git a/organizer/migrations/0002_auto_20200925_0713.py b/organizer/migrations/0002_auto_20200925_0713.py new file mode 100644 index 0000000..b3df615 --- /dev/null +++ b/organizer/migrations/0002_auto_20200925_0713.py @@ -0,0 +1,47 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + ('organizer', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='quicklinks', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency'), + ), + migrations.AddField( + model_name='agpassword', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency'), + ), + migrations.AddField( + model_name='agpassword', + name='visibleby', + field=models.ManyToManyField(blank=True, to='users.AgencyGroup'), + ), + migrations.AddField( + model_name='agcontactscagetory', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency'), + ), + migrations.AddField( + model_name='agcontacts', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency'), + ), + migrations.AddField( + model_name='agcontacts', + name='category', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='organizer.AGContactsCagetory'), + ), + ] diff --git a/organizer/migrations/0003_auto_20201204_0927.py b/organizer/migrations/0003_auto_20201204_0927.py new file mode 100644 index 0000000..0f15214 --- /dev/null +++ b/organizer/migrations/0003_auto_20201204_0927.py @@ -0,0 +1,30 @@ +# Generated by Django 3.0 on 2020-12-04 09:27 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0031_auto_20201204_0927'), + ('organizer', '0002_auto_20200925_0713'), + ] + + operations = [ + migrations.AlterField( + model_name='agcontacts', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='agcontactscagetory', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='quicklinks', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/organizer/migrations/0004_auto_20210312_0923.py b/organizer/migrations/0004_auto_20210312_0923.py new file mode 100644 index 0000000..115bd6a --- /dev/null +++ b/organizer/migrations/0004_auto_20210312_0923.py @@ -0,0 +1,20 @@ +# Generated by Django 3.0 on 2021-03-12 09:23 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0039_auto_20210219_1130'), + ('organizer', '0003_auto_20201204_0927'), + ] + + operations = [ + migrations.AlterField( + model_name='agpassword', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/organizer/migrations/0005_agcontacts_function.py b/organizer/migrations/0005_agcontacts_function.py new file mode 100644 index 0000000..56509ae --- /dev/null +++ b/organizer/migrations/0005_agcontacts_function.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2021-03-26 10:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('organizer', '0004_auto_20210312_0923'), + ] + + operations = [ + migrations.AddField( + model_name='agcontacts', + name='function', + field=models.CharField(default='', max_length=200), + ), + ] diff --git a/organizer/migrations/__init__.py b/organizer/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/organizer/migrations/__pycache__/0001_initial.cpython-38.pyc b/organizer/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..92c020c Binary files /dev/null and b/organizer/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/organizer/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc b/organizer/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc new file mode 100644 index 0000000..b84a1e9 Binary files /dev/null and b/organizer/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc differ diff --git a/organizer/migrations/__pycache__/0003_auto_20201204_0927.cpython-38.pyc b/organizer/migrations/__pycache__/0003_auto_20201204_0927.cpython-38.pyc new file mode 100644 index 0000000..9e0a9d7 Binary files /dev/null and b/organizer/migrations/__pycache__/0003_auto_20201204_0927.cpython-38.pyc differ diff --git a/organizer/migrations/__pycache__/0004_auto_20210312_0923.cpython-38.pyc b/organizer/migrations/__pycache__/0004_auto_20210312_0923.cpython-38.pyc new file mode 100644 index 0000000..94a074e Binary files /dev/null and b/organizer/migrations/__pycache__/0004_auto_20210312_0923.cpython-38.pyc differ diff --git a/organizer/migrations/__pycache__/0005_agcontacts_function.cpython-38.pyc b/organizer/migrations/__pycache__/0005_agcontacts_function.cpython-38.pyc new file mode 100644 index 0000000..41a6222 Binary files /dev/null and b/organizer/migrations/__pycache__/0005_agcontacts_function.cpython-38.pyc differ diff --git a/organizer/migrations/__pycache__/__init__.cpython-38.pyc b/organizer/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..c02712e Binary files /dev/null and b/organizer/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/organizer/models.py b/organizer/models.py new file mode 100644 index 0000000..a7432d3 --- /dev/null +++ b/organizer/models.py @@ -0,0 +1,80 @@ +from django.db import models +from users.models import Agency, AgencyGroup +from django.urls import reverse +from colorful.fields import RGBColorField +from django.contrib.auth.models import User +import datetime + +''' + +Model Quicklinks + +Verwaltet alle gespeicherten Bereiche für die Agentur. Wird eine neue erstellt, +wird dieser die Agency zugewiesen. Das Farb-Feld ist für später, damit im +Ogranigramm eine Farbe für den jeweiligen Bereich festgelegt wird. + +users speichert alle primary-Keys der User, welche diesem Bereich zugeordnet sind! + +''' +class QuickLinks(models.Model): + + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + name = models.CharField(max_length=200, blank=False) + link = models.CharField(max_length=200, blank=False) + logo = models.ImageField(default='agencymain/linkdefault.png', upload_to='agencymain', blank=True) + + def __str__(self): + return f'{self.name}' + + def get_absolute_url(self): + return reverse('ql-update', kwargs={'pk':self.pk}) + + @property + def get_photo_url(self): + if self.logo and hasattr(self.logo, 'url'): + return self.logo.url + else: + return "/media/agencymain/linkdefault.png" + +class AGContactsCagetory(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + name = models.CharField(default="", max_length=200, blank=False) + + def __str__(self): + return f'{self.name}' + +class AGContacts(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + personname = models.CharField(default="", max_length=200, blank=False) + function = models.CharField(default="", max_length=200, blank=False) + name = models.CharField(default="", max_length=200, blank=False) + mail = models.CharField(default="", max_length=200, blank=False) + phone1 = models.CharField(default="", max_length=200, blank=False) + phone2 = models.CharField(default="", max_length=200, blank=False) + street = models.CharField(default="", max_length=200, blank=True) + city = models.CharField(default="", max_length=200, blank=True) + plz = models.CharField(default="", max_length=5, blank=True) + desc = models.TextField(max_length=3000, blank=True) + + category = models.ForeignKey("AGContactsCagetory", default=None, on_delete=models.SET_DEFAULT, null=True, blank=True) + + def __str__(self): + return f'{self.name}' + + def get_absolute_url(self): + return reverse('cont-update', kwargs={'pk':self.pk}) + +class AGPassword(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + name = models.CharField(default="", max_length=200, blank=False) + agpass_username = models.CharField(default="", max_length=200, blank=False) + compass = models.CharField(default="", max_length=200, blank=False) + link = models.CharField(default="", max_length=200, blank=False) + visibleby = models.ManyToManyField(AgencyGroup, blank=True) + + def __str__(self): + return f'{self.name}' + + def get_absolute_url(self): + return reverse('aggpass-update', kwargs={'pk':self.pk}) + diff --git a/organizer/templates/organizer/agpass_add.html b/organizer/templates/organizer/agpass_add.html new file mode 100644 index 0000000..593aa0f --- /dev/null +++ b/organizer/templates/organizer/agpass_add.html @@ -0,0 +1,19 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+

Passwort anlegen

+
+
+ {% csrf_token %} + {{form|crispy}} +
+   + Abbrechen +
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/organizer/templates/organizer/agpass_delete.html b/organizer/templates/organizer/agpass_delete.html new file mode 100644 index 0000000..e53297b --- /dev/null +++ b/organizer/templates/organizer/agpass_delete.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+
+
+ +
+
+
+ +
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/organizer/templates/organizer/agpass_update.html b/organizer/templates/organizer/agpass_update.html new file mode 100644 index 0000000..a20030c --- /dev/null +++ b/organizer/templates/organizer/agpass_update.html @@ -0,0 +1,21 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+

Passwort aktualisieren

+
+
+ {% csrf_token %} +
+ {{form|crispy}} +
+ +   + Abbrechen + +
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/organizer/templates/organizer/cat_confirm_delete.html b/organizer/templates/organizer/cat_confirm_delete.html new file mode 100644 index 0000000..82211d4 --- /dev/null +++ b/organizer/templates/organizer/cat_confirm_delete.html @@ -0,0 +1,25 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+
+
+ + Achtung! Alle Kontakte mit dieser Kategorie erhalten keine Kategorie mehr! +
+
+
+ +
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/organizer/templates/organizer/cat_update.html b/organizer/templates/organizer/cat_update.html new file mode 100644 index 0000000..7519f58 --- /dev/null +++ b/organizer/templates/organizer/cat_update.html @@ -0,0 +1,19 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+

Kategorie aktualisieren

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+   + Abbrechen +
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/organizer/templates/organizer/contact_add.html b/organizer/templates/organizer/contact_add.html new file mode 100644 index 0000000..3d11e34 --- /dev/null +++ b/organizer/templates/organizer/contact_add.html @@ -0,0 +1,29 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} + +
+

Kontakt anlegen

+
+
+ {% csrf_token %} +
+ {% for field in form %} + {% if forloop.counter|divisibleby:6 %} +
+ {{field|as_crispy_field }} + {% else %} + {{field|as_crispy_field }} + {% endif %} + {% endfor %} +
+
+   + Abbrechen +
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/organizer/templates/organizer/contact_delete.html b/organizer/templates/organizer/contact_delete.html new file mode 100644 index 0000000..e0b4b50 --- /dev/null +++ b/organizer/templates/organizer/contact_delete.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+
+
+ +
+
+
+ +
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/organizer/templates/organizer/contact_update.html b/organizer/templates/organizer/contact_update.html new file mode 100644 index 0000000..f755087 --- /dev/null +++ b/organizer/templates/organizer/contact_update.html @@ -0,0 +1,29 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+

Kontakt aktualisieren

+
+
+ {% csrf_token %} +
+ {% for field in form %} + {% if forloop.counter|divisibleby:6 %} +
+ {{field|as_crispy_field }} + {% else %} + {{field|as_crispy_field }} + {% endif %} + {% endfor %} +
+
+ +   + Abbrechen +
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/organizer/templates/organizer/contacts_content.html b/organizer/templates/organizer/contacts_content.html new file mode 100644 index 0000000..d06c444 --- /dev/null +++ b/organizer/templates/organizer/contacts_content.html @@ -0,0 +1,320 @@ +{% load counter_tag %} + +
+
+
+ {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + +
+
+ + + + + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + + + {% for agc in contacts %} + + + + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + {% endfor %} + +
FirmaAnsprechpartnerE-MailTelefonKategorie 
+ {{agc.name}} + + {{agc.personname}} + + {% if agc.mail|length > 0 %} + {{agc.mail}}
+ {% endif %} +
+ {% if agc.phone1|length > 0 %} + {{agc.phone1}} + {% endif %} + + {% if agc.category != None%} {{agc.category}} {% endif%} + + {% if user|usergperm:"moduleorganizer" %} + + + + + + + + + {% endif %} +
+
+ +
+
+{% for agc in contacts %} + +{% endfor %} + + + + + + + + + + + + diff --git a/organizer/templates/organizer/contacts_content_OLD.html b/organizer/templates/organizer/contacts_content_OLD.html new file mode 100644 index 0000000..8416b4a --- /dev/null +++ b/organizer/templates/organizer/contacts_content_OLD.html @@ -0,0 +1,180 @@ +{% load counter_tag %} + +
+
+
+ {% if user|usergperm:"moduleorganizer" %} +  Kontakt +  Kategorien + {% endif %} +
+
+ +
+ +
+
+ +
+ +
+ + + + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + + + {% for agc in contacts %} + + + + + + + {% endfor %} + +
FirmaE-MailTelefon 
+ {{agc.name}} + + {% if agc.mail|length > 0 %} + {{agc.mail}}
+ {% endif %} +
+ {% if agc.phone1|length > 0 %} + {{agc.phone1}} + {% endif %} + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} +
+
+
+
+ +
+
+{% for agc in contacts %} + +{% endfor %} + + + diff --git a/organizer/templates/organizer/organizer_management.html b/organizer/templates/organizer/organizer_management.html new file mode 100644 index 0000000..905cccf --- /dev/null +++ b/organizer/templates/organizer/organizer_management.html @@ -0,0 +1,181 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+

Organizer{% if request.user.profile.showtooltips %} {% endif %} + +

+
+ + + + +
+ + +
+
Kontakte{% if request.user.profile.showtooltips %} {% endif %} + {% if user|usergperm:"moduleorganizer" %} + + +  Kontakt + {% endif %} +
+ {% if user|usergperm:"moduleorganizer" %}
{% endif %} + {% block contacts_content %} + {% include "organizer/contacts_content.html" %} + {% endblock %} +
+ +
+
Passwörter{% if request.user.profile.showtooltips %} {% endif %} + {% if user|usergperm:"moduleorganizer" %} +  Passwort + {% endif %} +
+ {% if user|usergperm:"moduleorganizer" %}
{% endif %} + {% block passwords_content %} + {% include "organizer/passwords_content.html" %} + {% endblock %} +
+
+ + + +
+ +{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} + + + + + + + + + + +{% endblock content %} diff --git a/organizer/templates/organizer/passwords_content.html b/organizer/templates/organizer/passwords_content.html new file mode 100644 index 0000000..d5a9096 --- /dev/null +++ b/organizer/templates/organizer/passwords_content.html @@ -0,0 +1,242 @@ +{% load counter_tag %} + +
+
+
+ {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + +
+ +
+ + + + + + + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + + + {% for ap in agpass %} + + + {% setbool False %} + + {% for passgrous in ap.visibleby.all %} + {% if user|has_group:passgrous.group.name %} + {% setbool True %} + {% endif %} + {% endfor %} + + {% if ap.visibleby.all|length == 0 %} + {% setbool True %} + {% endif %} + + {% getbool as groupchecker %} + + {% if groupchecker %} + + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + {% else %} + {% if user|usergperm:"moduleorganizer" %} {% endif %} + + {% endif %} + {% endfor %} + +
NameLinkBenutzernamePasswort 
{{ap.name }}{{ap.link}} + {{ap.agpass_username }} + + + + ********* + +     + + + + + +
+  {{ap.name}}
+
+ + +
+
+ + + + + + + + \ No newline at end of file diff --git a/organizer/templates/organizer/ql_add.html b/organizer/templates/organizer/ql_add.html new file mode 100644 index 0000000..4e22f95 --- /dev/null +++ b/organizer/templates/organizer/ql_add.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+

Quicklink anlegen

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+

Hinweis zum Weblink: Bitte setzen Sie den vollständigen Link in das Formular!
Z.B. https://app.digitale-agentur.com

+   + Abbrechen +
+
+{% else %} +

Das Modul Quicklinks wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/organizer/templates/organizer/ql_confirm_delete.html b/organizer/templates/organizer/ql_confirm_delete.html new file mode 100644 index 0000000..2dd2165 --- /dev/null +++ b/organizer/templates/organizer/ql_confirm_delete.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+
+
+ +
+
+
+ +
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/organizer/templates/organizer/ql_update.html b/organizer/templates/organizer/ql_update.html new file mode 100644 index 0000000..7820710 --- /dev/null +++ b/organizer/templates/organizer/ql_update.html @@ -0,0 +1,22 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_organizer %} +
+

Quicklink aktualisieren

+
+
+ {% csrf_token %} + {{ form|crispy }} +
+

Hinweis zum Weblink: Bitte setzen Sie den vollständigen Link in das Formular!
Z.B. https://app.digitale-agentur.com +

+ +   + Abbrechen +
+
+{% else %} +

Das Modul Organizer wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/organizer/templates/organizer/quicklinks_content.html b/organizer/templates/organizer/quicklinks_content.html new file mode 100644 index 0000000..c16898e --- /dev/null +++ b/organizer/templates/organizer/quicklinks_content.html @@ -0,0 +1,103 @@ + {% load counter_tag %} + {% if user|usergperm:"moduleorganizer" %} +
+
+ +
+
+ {% endif %} + +
+
+ + + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + + + {% for ql in quicklinks %} + + + + + {% if user|usergperm:"moduleorganizer" %} + + {% endif %} + + {% endfor %} + +
NameLink 
{{ql.name }}{{ ql.link }} + {% if user|usergperm:"moduleorganizer" %} + + + + + + + + + {% endif %} +
+ +
+
+ + + diff --git a/organizer/tests.py b/organizer/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/organizer/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/organizer/urls.py b/organizer/urls.py new file mode 100644 index 0000000..2195c16 --- /dev/null +++ b/organizer/urls.py @@ -0,0 +1,23 @@ +from django.urls import path +from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required, permission_required +from .views import OrganizerManagement, OrganizerAdd, OrganizerDeleteView, OrganizerUpdateView, OrganizerAddContact, OrganizerDelContact, OrganizerUpdateContact, OrganizerAddPassword, OrganizerDelPassword, OrganizerUpdatePassword +from . import views +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' +urlpatterns = [ + path('', OrganizerManagement.as_view(template_name="organizer/organizer_management.html"), name='organizer-management'), + path('addql/', permission_required('users.moduleorganizer')(OrganizerAdd.as_view(template_name="organizer/ql_add.html")), name='ql-addql'), + path('addcontact/', permission_required('users.moduleorganizer')(OrganizerAddContact.as_view(template_name="organizer/contact_add.html")), name='addcontact'), + path('addql//delete', permission_required('users.moduleorganizer')(OrganizerDeleteView.as_view()), name='ql-delete'), + path('remco//delete', permission_required('users.moduleorganizer')(OrganizerDelContact.as_view()), name='cont-delete'), + path('rempa//delete', permission_required('users.moduleorganizer')(OrganizerDelPassword.as_view()), name='pass-delete'), + path('addql//', permission_required('users.moduleorganizer')(OrganizerUpdateView.as_view()), name='ql-update'), + path('upco//', permission_required('users.moduleorganizer')(OrganizerUpdateContact.as_view()), name='cont-update'), + path('uppass//', permission_required('users.moduleorganizer')(OrganizerUpdatePassword.as_view()), name='aggpass-update'), + path('addpass/', permission_required('users.moduleorganizer')(OrganizerAddPassword.as_view(template_name="organizer/agpass_add.html")), name='add-agpass'), + path('lerg/', views.loaddefaultql, name="ql-ajaxloaddef"), + path('ajo/', views.ajaxorganizer, name="ajaxorganizer"), + +] diff --git a/organizer/views.py b/organizer/views.py new file mode 100644 index 0000000..423b8b5 --- /dev/null +++ b/organizer/views.py @@ -0,0 +1,273 @@ +from django.shortcuts import render +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView +from .models import QuickLinks, AGContacts, AGPassword, AGContactsCagetory +from .forms import OrganizerAddQlForm, OrganizerAddContact, OrganizerUpdateContact, AddAGPassword, OrganizerAddCategoryForm +from django.contrib import messages +from django.shortcuts import redirect +from django.http import HttpResponse, HttpResponseRedirect, JsonResponse +from django.contrib.auth.decorators import login_required +from django.urls import reverse_lazy +from users.models import AgencyGroup + + + +class OrganizerManagement(LoginRequiredMixin, ListView): + model = QuickLinks + # Adding active_link + # Loading only user same agency + # Change context and return for template-data + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + quicklinks = QuickLinks.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name') + context.update({'active_link' : 'organizer', 'quicklinks' : quicklinks, 'contacts' : AGContacts.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('personname'), 'agpass' : AGPassword.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name'), 'agencygroups' : AgencyGroup.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('agencygroupname'), 'categorys' : AGContactsCagetory.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by('name')}) + return context + +class OrganizerAdd(LoginRequiredMixin, CreateView): + model = QuickLinks + success_url = reverse_lazy('organizer-management') + form_class = OrganizerAddQlForm + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'organizer'}) + return context + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Quicklink angelegt!') + # SAVE OBJECTS TO SIGNALE! + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + +class OrganizerDeleteView(LoginRequiredMixin, DeleteView): + model = QuickLinks + success_url = reverse_lazy('organizer-management') + template_name = 'organizer/ql_confirm_delete.html' + + def delete(self, request, *args, **kwargs): + response = super(OrganizerDeleteView, self).delete(request, *args, **kwargs) + messages.success(request, f'Quicklink wurde gelöscht!') + return response + + def get_context_data(self, **kwargs): + context = super(OrganizerDeleteView, self).get_context_data(**kwargs) + context['active_link'] = 'organizer' + return context + +class OrganizerUpdateView(LoginRequiredMixin, UpdateView): + model = QuickLinks + template_name = 'organizer/ql_update.html' + success_url = reverse_lazy('organizer-management') + form_class = OrganizerAddQlForm + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Quicklink aktualisiert!') + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super(OrganizerUpdateView, self).get_context_data(**kwargs) + context['active_link'] = 'organizer' + return context + + + + +# CONTACTS +class OrganizerAddContact(LoginRequiredMixin, CreateView): + model = AGContacts + success_url = reverse_lazy('organizer-management') + form_class = OrganizerAddContact + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'organizer'}) + return context + + # Pass User to Form to get only categorys from agency + def get_form_kwargs(self): + kwargs = super(OrganizerAddContact, self).get_form_kwargs() + kwargs.update({'user': self.request.user}) + return kwargs + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Kontakt angelegt!') + # SAVE OBJECTS TO SIGNALE! + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + +class OrganizerDelContact(LoginRequiredMixin, DeleteView): + model = AGContacts + success_url = reverse_lazy('organizer-management') + template_name = 'organizer/contact_delete.html' + + def delete(self, request, *args, **kwargs): + response = super(OrganizerDelContact, self).delete(request, *args, **kwargs) + messages.success(request, f'Kontakt wurde gelöscht!') + return response + + def get_context_data(self, **kwargs): + context = super(OrganizerDelContact, self).get_context_data(**kwargs) + context['active_link'] = 'organizer' + return context + + +class OrganizerUpdateContact(LoginRequiredMixin, UpdateView): + model = AGContacts + template_name = 'organizer/contact_update.html' + success_url = reverse_lazy('organizer-management') + form_class = OrganizerUpdateContact + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Kontakt aktualisiert!') + return super().form_valid(form) + + # Pass User to Form to get only categorys from agency + def get_form_kwargs(self): + kwargs = super(OrganizerUpdateContact, self).get_form_kwargs() + kwargs.update({'user': self.request.user}) + return kwargs + + def get_context_data(self, **kwargs): + context = super(OrganizerUpdateContact, self).get_context_data(**kwargs) + context['active_link'] = 'organizer' + return context + + + +# PASSWORDS +class OrganizerAddPassword(LoginRequiredMixin, CreateView): + model = AGPassword + success_url = reverse_lazy('organizer-management') + form_class = AddAGPassword + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'organizer'}) + return context + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Passwort angelegt!') + # SAVE OBJECTS TO SIGNALE! + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + +class OrganizerDelPassword(LoginRequiredMixin, DeleteView): + model = AGPassword + success_url = reverse_lazy('organizer-management') + template_name = 'organizer/agpass_delete.html' + + def delete(self, request, *args, **kwargs): + response = super(OrganizerDelPassword, self).delete(request, *args, **kwargs) + messages.success(request, f'Passwort wurde gelöscht!') + return response + + def get_context_data(self, **kwargs): + context = super(OrganizerDelPassword, self).get_context_data(**kwargs) + context['active_link'] = 'organizer' + return context + + +class OrganizerUpdatePassword(LoginRequiredMixin, UpdateView): + model = AGPassword + template_name = 'organizer/agpass_update.html' + success_url = reverse_lazy('organizer-management') + form_class = AddAGPassword + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Kontakt aktualisiert!') + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super(OrganizerUpdatePassword, self).get_context_data(**kwargs) + context['active_link'] = 'organizer' + return context + +@login_required +def loaddefaultql(request): + if request.method == 'GET': + if request.GET['action'] == 'adddefql': + defaultlinks = [ + ["EASY", "https://easy.ergo.com "], + ["ERGO Ansprechpartner Navigator", "http://ansprechpartner-navigator.de/ "], + ["ERGO Lokales Marketing", "https://ergo.ergo-mein-lokales-marketing.de/marcapo_platform/WelcomePre.cms "], + ["ERGO Meine Druckstücke", "https://www.ergo-meine-druckstuecke.de/?client-check=2 "], + ["ERGO Vertriebsportal", "https://vertriebsportal.ergo.com/"], + ["myVVE", "https://www.myvve.de/"], + ["Wiki", "https://digitale-agentur.com/"] + ] + for ele in defaultlinks: + print(ele[0] + " " + ele[1]) + tempql = QuickLinks(agency=request.user.profile.agency, name=ele[0], link=ele[1]) + tempql.save() + return redirect("ql-addql") + elif request.GET["action"] == "loadpassg": + data = {} + agpass = list(AGPassword.objects.filter(pk=request.GET["passid"], agency=request.user.profile.agency)) + if(len(agpass) == 1): + agpass_ele = agpass[0] + groupsid = [] + for ag in agpass_ele.visibleby.all(): + groupsid.append({"id" : ag.pk}) + data = {'success' : True, 'passgroups' : groupsid} + else: + data = {'success' : False} + return JsonResponse(data) + elif request.GET["action"] == "changepassg": + groupid = request.GET.get('groupid') + workingpass = request.GET.get('workingpass') + value = request.GET.get('value') + if(value == "true"): + AGPassword.objects.get(pk=workingpass, agency=request.user.profile.agency).visibleby.add(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency)) + else: + AGPassword.objects.get(pk=workingpass, agency=request.user.profile.agency).visibleby.remove(AgencyGroup.objects.get(pk=groupid, agency=request.user.profile.agency)) + + data = {'success' : False} + return JsonResponse(data) + return redirect("ql-addql") + +@login_required +def ajaxorganizer(request): + data = {'success' : False} + + if request.method == 'GET': + #UPDATE CATEGORYNAME + if request.GET['action'] == 'update_category': + workingcat = AGContactsCagetory.objects.get(pk=request.GET['id']) + if(request.user.profile.agency == workingcat.agency): + workingcat.name = request.GET["newvalue"] + workingcat.save() + data["success"] = True + else: + data["success"] = False + return JsonResponse(data) + # GET CATEGORY NAME + elif request.GET['action'] == 'get_catname': + workingcat = AGContactsCagetory.objects.get(pk=request.GET['id']) + data["catname"] = workingcat.name + return JsonResponse(data) + # DELETE A CATEGORY + elif request.GET['action'] == 'delete_category': + workingcat = AGContactsCagetory.objects.get(pk=request.GET['id']) + if(request.user.profile.agency == workingcat.agency): + workingcat.delete() + data["success"] = True + else: + data["success"] = False + return JsonResponse(data) + # ADD CATEGORY + elif request.GET['action'] == 'add_category': + workingcat = AGContactsCagetory(name="", agency=request.user.profile.agency) + workingcat.save() + data["new_id"] = workingcat.pk + return JsonResponse(data) + + + else: + return JsonResponse(data) \ No newline at end of file diff --git a/recoverdir/__init__.py b/recoverdir/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/recoverdir/__pycache__/__init__.cpython-38.pyc b/recoverdir/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..54fb3d6 Binary files /dev/null and b/recoverdir/__pycache__/__init__.cpython-38.pyc differ diff --git a/recoverdir/__pycache__/admin.cpython-38.pyc b/recoverdir/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..d56012c Binary files /dev/null and b/recoverdir/__pycache__/admin.cpython-38.pyc differ diff --git a/recoverdir/__pycache__/apps.cpython-38.pyc b/recoverdir/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..3187a3a Binary files /dev/null and b/recoverdir/__pycache__/apps.cpython-38.pyc differ diff --git a/recoverdir/__pycache__/forms.cpython-38.pyc b/recoverdir/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..13c9ec2 Binary files /dev/null and b/recoverdir/__pycache__/forms.cpython-38.pyc differ diff --git a/recoverdir/__pycache__/models.cpython-38.pyc b/recoverdir/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..a137c98 Binary files /dev/null and b/recoverdir/__pycache__/models.cpython-38.pyc differ diff --git a/recoverdir/__pycache__/signals.cpython-38.pyc b/recoverdir/__pycache__/signals.cpython-38.pyc new file mode 100644 index 0000000..bab710c Binary files /dev/null and b/recoverdir/__pycache__/signals.cpython-38.pyc differ diff --git a/recoverdir/__pycache__/urls.cpython-38.pyc b/recoverdir/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..b9061e1 Binary files /dev/null and b/recoverdir/__pycache__/urls.cpython-38.pyc differ diff --git a/recoverdir/__pycache__/views.cpython-38.pyc b/recoverdir/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..45ff757 Binary files /dev/null and b/recoverdir/__pycache__/views.cpython-38.pyc differ diff --git a/recoverdir/admin.py b/recoverdir/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/recoverdir/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/recoverdir/apps.py b/recoverdir/apps.py new file mode 100644 index 0000000..8c55a3d --- /dev/null +++ b/recoverdir/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + +class RecoverdirConfig(AppConfig): + name = 'recoverdir' + + def ready(self): + import recoverdir.signals diff --git a/recoverdir/forms.py b/recoverdir/forms.py new file mode 100644 index 0000000..0f924bc --- /dev/null +++ b/recoverdir/forms.py @@ -0,0 +1,314 @@ +from django import forms +from django.forms import ModelForm +from .models import * +from bootstrap_datepicker_plus import DatePickerInput +from django.contrib.auth.password_validation import validate_password +from django.core import validators +from passwords.validators import * +from captcha.fields import CaptchaField + +class PersLetterForm(forms.ModelForm): + + class Meta: + model = PersLetter + fields = ['text'] + + labels = { + 'text' : "Ihr persönlicher Text" + } + + def __init__(self, *args, **kwargs): + super(PersLetterForm, self).__init__(*args, **kwargs) + self.fields['text'] = forms.CharField(label="Ihr persönlicher Text", widget=forms.Textarea(attrs={"rows":15, "cols":35})) + +class LoginRDForm(forms.Form): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['pass'] = forms.CharField(widget=forms.PasswordInput, label="Passwort", required=True) + + +class LoginRDExternalForm(forms.Form): + + captcha = CaptchaField() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['key'] = forms.CharField(label="Sicherheitssschlüssel", required=True) + self.fields['pass'] = forms.CharField(widget=forms.PasswordInput, label="Passwort", required=True) + self.fields['captcha'] = CaptchaField(required=True, label="Bitte geben Sie die Symbole ein.") + +class RecoverDirSettingForm(forms.ModelForm): + + class Meta: + model = RecoverDirSetting + fields = ['logpass'] + + def __init__(self, *args, **kwargs): + super(RecoverDirSettingForm, self).__init__(*args, **kwargs) + self.fields['logpass'] = forms.CharField(widget=forms.PasswordInput, label="Passwort", required=True, validators=[dictionary_words, complexity, validate_length]) + self.fields['logpass_check'] = forms.CharField(widget=forms.PasswordInput, label="Passwort wiederholen", required=True,validators=[dictionary_words, complexity, validate_length]) + + +# Notfallhilfe FORMS +# 1 Handlungsleitfaden +class HLForm(forms.ModelForm): + + class Meta: + model = Handlungsleitfaden + fields = ['rd_main','rd_name','rd_adresse','rd_tel','rd_mail','bvk_number','rv_name','rv_number','rv_tel_1','rv_tel_2'] + #fields = '__all__' + labels = { + 'rd_main' : "Zuständige RD", + 'rd_name': "Vor- und Nachname RD Leiter", + #'rd_prename': "Vorname RD Leiter", + #'rd_postname' : "Nachname RD Leiter", + 'rd_adresse' : "RD Adresse", + #'rd_plz' : "RD PLZ", + #'rd_city' : "RD Stadt", + 'rd_tel' : "RD Telefon", + 'rd_mail' : "RD E-Mail", + 'bvk_number' : "BVK Nummer", + 'rv_name' : "Rechtsschutzversicherer", + 'rv_number' : "Versicherungsnummer", + 'rv_tel_1' : "Telefon 1", + 'rv_tel_2' : "Telefon 2" + } +# Handlungsleitfaden Vorsorge und Finanzen +class HLFVForm(forms.ModelForm): + + class Meta: + model = HandlungsleitfadenVF + fields = ['vf_ver_company','vf_ver_name','vf_ver_adresse','vf_ver_tel','vf_ver_mail','vf_fb_company','vf_fb_name','vf_fb_adresse','vf_fb_tel','vf_fb_mail','vf_rv_name','vf_rv_number','vf_rv_tel_1','vf_rv_tel_2'] + #fields = '__all__' + + + labels = { + 'vf_ver_company' : "Firma", + 'vf_ver_name' : 'Name', + 'vf_ver_adresse' : 'Adresse', + #'vf_ver_street' : "Straße und Hausnummer", + #'vf_ver_plzcity' : "PLZ und Ort", + 'vf_ver_tel' : "Telefon", + 'vf_ver_mail' : "E-Mail", + 'vf_fb_company' : "Firma", + 'vf_fb_name' : "Name", + 'vf_fb_adresse' : "Adresse", + #'vf_fb_street' : "Straße und Hausnummer", + #'vf_fb_plzcity': "PLZ und Ort", + 'vf_fb_tel' : "Telefon", + 'vf_fb_mail' : "E-Mail", + 'vf_rv_name' : "Name", + 'vf_rv_number' : "Versicherungsnummer", + 'vf_rv_tel_1' : "Telefon 1", + 'vf_rv_tel_2' : "Telefon 2" + } + + + + + + def __init__(self, *args, **kwargs): + super(HLFVForm, self).__init__(*args, **kwargs) + +# RDContract +class RDContractF(forms.ModelForm): + + class Meta: + model = RDContract + fields = ['contract_typ','contract_owner','license','info1','info2','adresse','tel','mail'] + labels = { + 'contract_typ' : "Vertragstyp (Leasing, Immobilie etc.)", + 'contract_owner' : "Eigentümer/Firma/Vertragsparnter", + 'license' : "Lizenz/Kennzeichen/Nummer etc.", + 'info1' : "Freifeld für Informationen 1", + 'info2' : "Freifeld für Informationen 2", + 'adresse' : "Adresse", + 'tel' : "Telefon", + 'mail' : "E-Mail" + } + +# Streamingabo +class StreamingAboF(forms.ModelForm): + + class Meta: + model = StreamingAbo + fields = ['name','username','password','accountactivity','vollmacht_doc'] + labels = { + 'name': 'Name des Streamingdienstes', + 'username' : 'Benutzername', + 'password' : 'Passwort', + 'accountactivity' : 'Was mit dem Account geschehen soll', + 'vollmacht_doc' : 'Vollmacht' + } + + def __init__(self, *args, **kwargs): + super(StreamingAboF, self).__init__(*args, **kwargs) + self.fields['password'] = forms.CharField(widget=forms.PasswordInput, label="Passwort", required=False) + +# DigitalAccountsF +class DigitalAccountsF(forms.ModelForm): + + class Meta: + model = DigitalAccounts + fields = ['name','link','mail','username','password','accountactivity','vollmacht_doc'] + labels = { + 'name':"Name des Online-Dienstes", + 'link':"Webseite", + 'username':"Benutzername", + 'password':"Passwort", + 'mail':"E-Mailadresse zur Anmeldung/im Account", + 'accountactivity':"Was soll mit diesem Account geschehen (weiterleiten, löschen, sichern etc.)?", + 'vollmacht_doc' : "Vollmacht" + } + def __init__(self, *args, **kwargs): + super(DigitalAccountsF, self).__init__(*args, **kwargs) + self.fields['password'] = forms.CharField(widget=forms.PasswordInput, label="Passwort", required=False) + + +class PersonalF(forms.ModelForm): + + class Meta: + model = Personal + fields = ['name','function','inorex','mail','pnr','onr','adresse','tel'] + labels = { + 'name':"Name", + 'function':"Funktion", + 'inorex':"Intern/Extern", + 'pnr':"Personalnummer", + 'onr': "ONR-Nummer", + 'adresse':"Adresse", + 'tel':"Telefon", + 'mail':"E-Mailadresse" + } + + + +# Familienkontakte +class RDContactF(forms.ModelForm): + + class Meta: + model = RDContact + + fields = ['rd_name','rd_rel','rd_adresse','rd_tel', 'rd_mail'] + #fields = ['rd_name','rd_rel','rd_adresse','rd_tel'] + #fields = '__all__' + + labels = { + 'rd_name' : "Vor- und Nachname", + 'rd_rel' : "Beziehung", + 'rd_adresse' : "Adresse", + 'rd_mail' : "E-Mailadresse", + 'rd_tel' : "Telefon" + } + + +# ERgo Digitaler Versicherungsordern +class ErgoVerDirF(forms.ModelForm): + + class Meta: + model = ErgoVerDir + + fields = ['ergo_username','ergo_password'] + + labels = { + 'ergo_username' : "Benutzername", + 'ergo_password' : "Passwort" + } + def __init__(self, *args, **kwargs): + super(ErgoVerDirF, self).__init__(*args, **kwargs) + self.fields['ergo_password'] = forms.CharField(widget=forms.PasswordInput, label="Passwort", required=False) + + +class OnlineBankF(forms.ModelForm): + class Meta: + model = OnlineBank + + fields = ['web_address','web_username', 'web_password', 'bic', 'iban', 'accountactivity', 'vollmacht_doc', 'area'] + + labels = { + 'web_address':"Internetadresse/Bankname", + 'web_username':"Benutzername", + 'web_password':"Passwort", + 'bic' : "BIC", + 'iban' : "IBAN", + 'accountactivity':"Was soll mit dem Account geschehen?", + 'vollmacht_doc':"Vollmacht als Dokument" + } + def __init__(self, *args, **kwargs): + super(OnlineBankF, self).__init__(*args, **kwargs) + self.fields['web_password'] = forms.CharField(widget=forms.PasswordInput, label="Passwort", required=False) + self.fields['area'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + +# RDELSE +class RDElseF(forms.ModelForm): + + class Meta: + model = RDElse + + fields = ['name','desc'] + labels = { + 'name' : "Name/Titel/Info", + 'desc' : "Beschreibung/Informationen etc." + } + +# Vertrauensperson +class RDTrustPersonF(forms.ModelForm): + + class Meta: + model = RDTrustPerson + + #fields = '__all__' + fields = ['rd_name','rd_company','rd_adresse','rd_tel', 'rd_mail'] + + labels = { + 'rd_name' : "Vor- und Nachname", + 'rd_company' : "Firma", + 'rd_adresse' : "Adresse", + 'rd_mail' : "E-Mailadresse", + 'rd_tel' : "Telefon" + } + + + +# Banken usw. +class DepositVollmachtF(forms.ModelForm): + + class Meta: + model = DepositVollmacht + fields = ['geber_name','geber_adresse','geber_bank','nehmer_name','nehmer_adresse','nehmer_geb','nehmer_tel','vollmacht_doc'] + + labels = { + 'geber_name': "Name, Vorname", + 'geber_adresse' : "Anschrift", + 'geber_bank' : "Name, Anschrift Bank", + 'nehmer_name' : "Name, Vorname", + 'nehmer_adresse': "Anschrift", + 'nehmer_geb' : "Geburtsdatum", + 'nehmer_tel' : "Telefon-Nr.", + 'vollmacht_doc' : "Vollmacht als Dokument" + } + +# DOCUMENTS +class DocumentForm(forms.ModelForm): + + class Meta: + model = Documents + fields = ['document_desc', 'document_date', 'document', 'document_name','area'] + labels = { + 'document_desc' : "Dokumentbeschreibung", + 'document_date' : "Datum", + "document_name" : "Dateiname", + 'document' : "Dokument" + } + widgets = { + 'document_date': DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}) + } + def __init__(self, *args, **kwargs): + super(DocumentForm, self).__init__(*args, **kwargs) + self.fields['area'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + + + + + diff --git a/recoverdir/migrations/0001_initial.py b/recoverdir/migrations/0001_initial.py new file mode 100644 index 0000000..d49641f --- /dev/null +++ b/recoverdir/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 3.0 on 2020-10-02 22:55 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Updates', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('updatedate', models.DateField(default=django.utils.timezone.now)), + ('updatetype', models.CharField(blank=True, default='', max_length=200, null=True)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ('byuser', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='PersLetter', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.TextField(blank=True, default='', max_length=100.0, null=True)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/recoverdir/migrations/0002_auto_20201002_2257.py b/recoverdir/migrations/0002_auto_20201002_2257.py new file mode 100644 index 0000000..e8ab1e1 --- /dev/null +++ b/recoverdir/migrations/0002_auto_20201002_2257.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0 on 2020-10-02 22:57 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='persletter', + name='text', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=100000, null=True)), + ), + ] diff --git a/recoverdir/migrations/0003_auto_20201003_1532.py b/recoverdir/migrations/0003_auto_20201003_1532.py new file mode 100644 index 0000000..923d9ee --- /dev/null +++ b/recoverdir/migrations/0003_auto_20201003_1532.py @@ -0,0 +1,42 @@ +# Generated by Django 3.0 on 2020-10-03 15:32 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('recoverdir', '0002_auto_20201002_2257'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalPersLetter', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('text', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=100000, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical pers letter', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.DeleteModel( + name='Updates', + ), + ] diff --git a/recoverdir/migrations/0004_handlungsleitfaden_rdcontact_rdtrustperson.py b/recoverdir/migrations/0004_handlungsleitfaden_rdcontact_rdtrustperson.py new file mode 100644 index 0000000..f6ed4e1 --- /dev/null +++ b/recoverdir/migrations/0004_handlungsleitfaden_rdcontact_rdtrustperson.py @@ -0,0 +1,53 @@ +# Generated by Django 3.0 on 2020-10-05 10:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0003_auto_20201003_1532'), + ] + + operations = [ + migrations.CreateModel( + name='Handlungsleitfaden', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rd_prename', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_postname', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_street', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_plz', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_city', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_tel', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_mail', models.EmailField(blank=True, default='', max_length=500, null=True)), + ('bvk_number', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rv_name', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rv_number', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rv_tel_1', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rv_tel_2', models.CharField(blank=True, default='', max_length=500, null=True)), + ], + ), + migrations.CreateModel( + name='RDContact', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rd_prename', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_postname', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_rel', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_adresse', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_tel', models.CharField(blank=True, default='', max_length=500, null=True)), + ], + ), + migrations.CreateModel( + name='RDTrustPerson', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rd_prename', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_postname', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_rel', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_adresse', models.CharField(blank=True, default='', max_length=500, null=True)), + ('rd_tel', models.CharField(blank=True, default='', max_length=500, null=True)), + ], + ), + ] diff --git a/recoverdir/migrations/0005_area1_documents.py b/recoverdir/migrations/0005_area1_documents.py new file mode 100644 index 0000000..02d3b2d --- /dev/null +++ b/recoverdir/migrations/0005_area1_documents.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0 on 2020-10-05 10:44 + +from django.db import migrations, models +import django.utils.timezone +import django_encrypted_filefield.fields +import recoverdir.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0004_handlungsleitfaden_rdcontact_rdtrustperson'), + ] + + operations = [ + migrations.CreateModel( + name='Area1_Documents', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('document_desc', models.CharField(blank=True, default='', max_length=500, null=True)), + ('document_date', models.DateField(blank=True, default=django.utils.timezone.now, null=True)), + ('document', django_encrypted_filefield.fields.EncryptedFileField(blank=True, upload_to=recoverdir.models.rd_path_agency)), + ], + ), + ] diff --git a/recoverdir/migrations/0006_auto_20201005_1112.py b/recoverdir/migrations/0006_auto_20201005_1112.py new file mode 100644 index 0000000..d67d228 --- /dev/null +++ b/recoverdir/migrations/0006_auto_20201005_1112.py @@ -0,0 +1,35 @@ +# Generated by Django 3.0 on 2020-10-05 11:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + ('recoverdir', '0005_area1_documents'), + ] + + operations = [ + migrations.AddField( + model_name='area1_documents', + name='agency', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='handlungsleitfaden', + name='agency', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='rdcontact', + name='agency', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='rdtrustperson', + name='agency', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/recoverdir/migrations/0007_auto_20201005_1122.py b/recoverdir/migrations/0007_auto_20201005_1122.py new file mode 100644 index 0000000..6ece82e --- /dev/null +++ b/recoverdir/migrations/0007_auto_20201005_1122.py @@ -0,0 +1,237 @@ +# Generated by Django 3.0 on 2020-10-05 11:22 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import django_cryptography.fields +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0023_auto_20201002_2036'), + ('recoverdir', '0006_auto_20201005_1112'), + ] + + operations = [ + migrations.AlterField( + model_name='area1_documents', + name='document_date', + field=django_cryptography.fields.encrypt(models.DateField(blank=True, default=django.utils.timezone.now, null=True)), + ), + migrations.AlterField( + model_name='area1_documents', + name='document_desc', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='bvk_number', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rd_city', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rd_mail', + field=django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rd_plz', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rd_postname', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rd_prename', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rd_street', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rd_tel', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rv_name', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rv_number', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rv_tel_1', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='handlungsleitfaden', + name='rv_tel_2', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdcontact', + name='rd_adresse', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdcontact', + name='rd_postname', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdcontact', + name='rd_prename', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdcontact', + name='rd_rel', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdcontact', + name='rd_tel', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdtrustperson', + name='rd_adresse', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdtrustperson', + name='rd_postname', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdtrustperson', + name='rd_prename', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdtrustperson', + name='rd_rel', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AlterField( + model_name='rdtrustperson', + name='rd_tel', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.CreateModel( + name='HistoricalRDTrustPerson', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('rd_prename', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_postname', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_rel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical rd trust person', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='HistoricalRDContact', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('rd_prename', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_postname', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_rel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical rd contact', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='HistoricalHandlungsleitfaden', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('rd_prename', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_postname', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_street', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_plz', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_city', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rd_mail', django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True))), + ('bvk_number', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rv_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rv_number', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rv_tel_1', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('rv_tel_2', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical handlungsleitfaden', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='HistoricalArea1_Documents', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('document_desc', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('document_date', django_cryptography.fields.encrypt(models.DateField(blank=True, default=django.utils.timezone.now, null=True))), + ('document', models.TextField(blank=True, max_length=100)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical area1_ documents', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/recoverdir/migrations/0008_auto_20201005_1512.py b/recoverdir/migrations/0008_auto_20201005_1512.py new file mode 100644 index 0000000..bec88b6 --- /dev/null +++ b/recoverdir/migrations/0008_auto_20201005_1512.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0 on 2020-10-05 15:12 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0007_auto_20201005_1122'), + ] + + operations = [ + migrations.AddField( + model_name='area1_documents', + name='document_name', + field=django_cryptography.fields.encrypt(models.CharField(default='', max_length=500)), + ), + migrations.AddField( + model_name='historicalarea1_documents', + name='document_name', + field=django_cryptography.fields.encrypt(models.CharField(default='', max_length=500)), + ), + ] diff --git a/recoverdir/migrations/0009_auto_20201005_1527.py b/recoverdir/migrations/0009_auto_20201005_1527.py new file mode 100644 index 0000000..2ca1ba3 --- /dev/null +++ b/recoverdir/migrations/0009_auto_20201005_1527.py @@ -0,0 +1,71 @@ +# Generated by Django 3.0 on 2020-10-05 15:27 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import django_cryptography.fields +import django_encrypted_filefield.fields +import recoverdir.models +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('recoverdir', '0008_auto_20201005_1512'), + ] + + operations = [ + migrations.CreateModel( + name='Documents', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('area', models.IntegerField(default=0)), + ('document_desc', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('document_name', django_cryptography.fields.encrypt(models.CharField(default='', max_length=500))), + ('document_date', django_cryptography.fields.encrypt(models.DateField(blank=True, default=django.utils.timezone.now, null=True))), + ('document', django_encrypted_filefield.fields.EncryptedFileField(blank=True, upload_to=recoverdir.models.rd_path_agency)), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='HistoricalDocuments', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('area', models.IntegerField(default=0)), + ('document_desc', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('document_name', django_cryptography.fields.encrypt(models.CharField(default='', max_length=500))), + ('document_date', django_cryptography.fields.encrypt(models.DateField(blank=True, default=django.utils.timezone.now, null=True))), + ('document', models.TextField(blank=True, max_length=100)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical documents', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.RemoveField( + model_name='historicalarea1_documents', + name='agency', + ), + migrations.RemoveField( + model_name='historicalarea1_documents', + name='history_user', + ), + migrations.DeleteModel( + name='Area1_Documents', + ), + migrations.DeleteModel( + name='HistoricalArea1_Documents', + ), + ] diff --git a/recoverdir/migrations/0010_auto_20201005_1555.py b/recoverdir/migrations/0010_auto_20201005_1555.py new file mode 100644 index 0000000..7b33e9d --- /dev/null +++ b/recoverdir/migrations/0010_auto_20201005_1555.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0 on 2020-10-05 15:55 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0009_auto_20201005_1527'), + ] + + operations = [ + migrations.AddField( + model_name='handlungsleitfaden', + name='rd_main', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalhandlungsleitfaden', + name='rd_main', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + ] diff --git a/recoverdir/migrations/0011_auto_20201005_1648.py b/recoverdir/migrations/0011_auto_20201005_1648.py new file mode 100644 index 0000000..3c75a04 --- /dev/null +++ b/recoverdir/migrations/0011_auto_20201005_1648.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-10-05 16:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0010_auto_20201005_1555'), + ] + + operations = [ + migrations.RenameField( + model_name='historicalrdtrustperson', + old_name='rd_rel', + new_name='rd_company', + ), + migrations.RenameField( + model_name='rdtrustperson', + old_name='rd_rel', + new_name='rd_company', + ), + ] diff --git a/recoverdir/migrations/0012_delete_historicaldocuments.py b/recoverdir/migrations/0012_delete_historicaldocuments.py new file mode 100644 index 0000000..9652b4a --- /dev/null +++ b/recoverdir/migrations/0012_delete_historicaldocuments.py @@ -0,0 +1,16 @@ +# Generated by Django 3.0 on 2020-10-06 09:51 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0011_auto_20201005_1648'), + ] + + operations = [ + migrations.DeleteModel( + name='HistoricalDocuments', + ), + ] diff --git a/recoverdir/migrations/0013_depositvollmacht_ergoverdir_handlungsleitfadenvf_historicalhandlungsleitfadenvf_onlinebank.py b/recoverdir/migrations/0013_depositvollmacht_ergoverdir_handlungsleitfadenvf_historicalhandlungsleitfadenvf_onlinebank.py new file mode 100644 index 0000000..763611b --- /dev/null +++ b/recoverdir/migrations/0013_depositvollmacht_ergoverdir_handlungsleitfadenvf_historicalhandlungsleitfadenvf_onlinebank.py @@ -0,0 +1,114 @@ +# Generated by Django 3.0 on 2020-10-06 10:04 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import django_encrypted_filefield.fields +import recoverdir.models +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('recoverdir', '0012_delete_historicaldocuments'), + ] + + operations = [ + migrations.CreateModel( + name='OnlineBank', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('web_address', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('web_username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('web_password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('accountactivity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=5000, null=True))), + ('vollmacht_doc', django_encrypted_filefield.fields.EncryptedFileField(blank=True, upload_to=recoverdir.models.rd_path_agency)), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='HistoricalHandlungsleitfadenVF', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('vf_ver_company', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_street', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_plzcity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_mail', django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_company', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_street', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_plzcity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_mail', django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_number', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_tel_1', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_tel_2', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical handlungsleitfaden vf', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='HandlungsleitfadenVF', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('vf_ver_company', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_street', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_plzcity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_ver_mail', django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_company', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_street', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_plzcity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_fb_mail', django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_number', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_tel_1', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vf_rv_tel_2', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='ErgoVerDir', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('ergo_username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('ergo_password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='DepositVollmacht', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('geber_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('geber_adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('geber_bank', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_geb', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vollmacht_doc', django_encrypted_filefield.fields.EncryptedFileField(blank=True, upload_to=recoverdir.models.rd_path_agency)), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + ] diff --git a/recoverdir/migrations/0014_historicaldepositvollmacht_historicalergoverdir_historicalonlinebank.py b/recoverdir/migrations/0014_historicaldepositvollmacht_historicalergoverdir_historicalonlinebank.py new file mode 100644 index 0000000..52d6a8f --- /dev/null +++ b/recoverdir/migrations/0014_historicaldepositvollmacht_historicalergoverdir_historicalonlinebank.py @@ -0,0 +1,88 @@ +# Generated by Django 3.0 on 2020-10-06 14:36 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('recoverdir', '0013_depositvollmacht_ergoverdir_handlungsleitfadenvf_historicalhandlungsleitfadenvf_onlinebank'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalOnlineBank', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('web_address', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('web_username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('web_password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('accountactivity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=5000, null=True))), + ('vollmacht_doc', models.TextField(blank=True, max_length=100)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical online bank', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='HistoricalErgoVerDir', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('ergo_username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('ergo_password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical ergo ver dir', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='HistoricalDepositVollmacht', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('geber_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('geber_adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('geber_bank', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_geb', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('nehmer_tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vollmacht_doc', models.TextField(blank=True, max_length=100)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical deposit vollmacht', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/recoverdir/migrations/0015_historicalstreamingabo_streamingabo.py b/recoverdir/migrations/0015_historicalstreamingabo_streamingabo.py new file mode 100644 index 0000000..ca8e92c --- /dev/null +++ b/recoverdir/migrations/0015_historicalstreamingabo_streamingabo.py @@ -0,0 +1,56 @@ +# Generated by Django 3.0 on 2020-10-06 16:22 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import django_encrypted_filefield.fields +import recoverdir.models +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0023_auto_20201002_2036'), + ('recoverdir', '0014_historicaldepositvollmacht_historicalergoverdir_historicalonlinebank'), + ] + + operations = [ + migrations.CreateModel( + name='StreamingAbo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('accountactivity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=5000, null=True))), + ('vollmacht_doc', django_encrypted_filefield.fields.EncryptedFileField(blank=True, upload_to=recoverdir.models.rd_path_agency)), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='HistoricalStreamingAbo', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('accountactivity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=5000, null=True))), + ('vollmacht_doc', models.TextField(blank=True, max_length=100)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical streaming abo', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/recoverdir/migrations/0016_digitalaccounts_historicaldigitalaccounts.py b/recoverdir/migrations/0016_digitalaccounts_historicaldigitalaccounts.py new file mode 100644 index 0000000..a70447e --- /dev/null +++ b/recoverdir/migrations/0016_digitalaccounts_historicaldigitalaccounts.py @@ -0,0 +1,60 @@ +# Generated by Django 3.0 on 2020-10-06 18:51 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import django_encrypted_filefield.fields +import recoverdir.models +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('recoverdir', '0015_historicalstreamingabo_streamingabo'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalDigitalAccounts', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('link', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('accountactivity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=5000, null=True))), + ('mail', django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True))), + ('vollmacht_doc', models.TextField(blank=True, max_length=100)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical digital accounts', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='DigitalAccounts', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('link', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('username', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('password', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('accountactivity', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=5000, null=True))), + ('mail', django_cryptography.fields.encrypt(models.EmailField(blank=True, default='', max_length=500, null=True))), + ('vollmacht_doc', django_encrypted_filefield.fields.EncryptedFileField(blank=True, upload_to=recoverdir.models.rd_path_agency)), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + ] diff --git a/recoverdir/migrations/0017_historicalpersonal_personal.py b/recoverdir/migrations/0017_historicalpersonal_personal.py new file mode 100644 index 0000000..6f4bf85 --- /dev/null +++ b/recoverdir/migrations/0017_historicalpersonal_personal.py @@ -0,0 +1,64 @@ +# Generated by Django 3.0 on 2020-10-06 19:58 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import django_encrypted_filefield.fields +import recoverdir.models +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('recoverdir', '0016_digitalaccounts_historicaldigitalaccounts'), + ] + + operations = [ + migrations.CreateModel( + name='Personal', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('function', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('inorex', django_cryptography.fields.encrypt(models.CharField(blank=True, choices=[(1, 'Intern'), (2, 'Extern')], default=1, max_length=500, null=True))), + ('pnr', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('onr', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('mail', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vollmacht_doc', django_encrypted_filefield.fields.EncryptedFileField(blank=True, upload_to=recoverdir.models.rd_path_agency)), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='HistoricalPersonal', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('function', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('inorex', django_cryptography.fields.encrypt(models.CharField(blank=True, choices=[(1, 'Intern'), (2, 'Extern')], default=1, max_length=500, null=True))), + ('pnr', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('onr', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('mail', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('vollmacht_doc', models.TextField(blank=True, max_length=100)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical personal', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/recoverdir/migrations/0018_auto_20201006_2018.py b/recoverdir/migrations/0018_auto_20201006_2018.py new file mode 100644 index 0000000..5a070c5 --- /dev/null +++ b/recoverdir/migrations/0018_auto_20201006_2018.py @@ -0,0 +1,32 @@ +# Generated by Django 3.0 on 2020-10-06 20:18 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0017_historicalpersonal_personal'), + ] + + operations = [ + migrations.RemoveField( + model_name='historicalpersonal', + name='vollmacht_doc', + ), + migrations.RemoveField( + model_name='personal', + name='vollmacht_doc', + ), + migrations.AlterField( + model_name='historicalpersonal', + name='inorex', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, choices=[('ex', 'Intern'), ('in', 'Extern')], default=1, max_length=500, null=True)), + ), + migrations.AlterField( + model_name='personal', + name='inorex', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, choices=[('ex', 'Intern'), ('in', 'Extern')], default=1, max_length=500, null=True)), + ), + ] diff --git a/recoverdir/migrations/0019_auto_20201006_2029.py b/recoverdir/migrations/0019_auto_20201006_2029.py new file mode 100644 index 0000000..2bf13c8 --- /dev/null +++ b/recoverdir/migrations/0019_auto_20201006_2029.py @@ -0,0 +1,44 @@ +# Generated by Django 3.0 on 2020-10-06 20:29 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0018_auto_20201006_2018'), + ] + + operations = [ + migrations.AddField( + model_name='historicalonlinebank', + name='area', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='historicalonlinebank', + name='bic', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalonlinebank', + name='iban', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='onlinebank', + name='area', + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name='onlinebank', + name='bic', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='onlinebank', + name='iban', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + ] diff --git a/recoverdir/migrations/0020_historicalrdelse_rdelse.py b/recoverdir/migrations/0020_historicalrdelse_rdelse.py new file mode 100644 index 0000000..94c10a6 --- /dev/null +++ b/recoverdir/migrations/0020_historicalrdelse_rdelse.py @@ -0,0 +1,48 @@ +# Generated by Django 3.0 on 2020-10-06 21:02 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('recoverdir', '0019_auto_20201006_2029'), + ] + + operations = [ + migrations.CreateModel( + name='RDElse', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('desc', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=10000, null=True))), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='HistoricalRDElse', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('name', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('desc', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=10000, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical rd else', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/recoverdir/migrations/0021_recoverdirsetting.py b/recoverdir/migrations/0021_recoverdirsetting.py new file mode 100644 index 0000000..580716c --- /dev/null +++ b/recoverdir/migrations/0021_recoverdirsetting.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0 on 2020-10-07 08:00 + +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + ('recoverdir', '0020_historicalrdelse_rdelse'), + ] + + operations = [ + migrations.CreateModel( + name='RecoverDirSetting', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('logpass', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('recoverkey', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + ] diff --git a/recoverdir/migrations/0022_historicalrdcontract_rdcontract.py b/recoverdir/migrations/0022_historicalrdcontract_rdcontract.py new file mode 100644 index 0000000..431c1ea --- /dev/null +++ b/recoverdir/migrations/0022_historicalrdcontract_rdcontract.py @@ -0,0 +1,60 @@ +# Generated by Django 3.0 on 2020-10-08 09:00 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django_cryptography.fields +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0024_profile_rd_login'), + ('recoverdir', '0021_recoverdirsetting'), + ] + + operations = [ + migrations.CreateModel( + name='RDContract', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('contract_typ', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('contract_owner', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('license', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('info1', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('info2', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('mail', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('agency', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='HistoricalRDContract', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('contract_typ', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('contract_owner', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('license', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('info1', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('info2', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('adresse', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('tel', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('mail', django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True))), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical rd contract', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/recoverdir/migrations/0023_auto_20201008_0926.py b/recoverdir/migrations/0023_auto_20201008_0926.py new file mode 100644 index 0000000..d50ff19 --- /dev/null +++ b/recoverdir/migrations/0023_auto_20201008_0926.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-10-08 09:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0022_historicalrdcontract_rdcontract'), + ] + + operations = [ + migrations.AddField( + model_name='digitalaccounts', + name='area', + field=models.IntegerField(default=2), + ), + migrations.AddField( + model_name='historicaldigitalaccounts', + name='area', + field=models.IntegerField(default=2), + ), + ] diff --git a/recoverdir/migrations/0024_recoverdirsetting_lastlogg.py b/recoverdir/migrations/0024_recoverdirsetting_lastlogg.py new file mode 100644 index 0000000..534747a --- /dev/null +++ b/recoverdir/migrations/0024_recoverdirsetting_lastlogg.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-08 10:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0023_auto_20201008_0926'), + ] + + operations = [ + migrations.AddField( + model_name='recoverdirsetting', + name='lastlogg', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + ] diff --git a/recoverdir/migrations/0025_auto_20201021_1653.py b/recoverdir/migrations/0025_auto_20201021_1653.py new file mode 100644 index 0000000..d46cf48 --- /dev/null +++ b/recoverdir/migrations/0025_auto_20201021_1653.py @@ -0,0 +1,124 @@ +# Generated by Django 3.0 on 2020-10-21 16:53 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0024_recoverdirsetting_lastlogg'), + ] + + operations = [ + migrations.RenameField( + model_name='handlungsleitfaden', + old_name='rd_city', + new_name='rd_adresse', + ), + migrations.RenameField( + model_name='handlungsleitfaden', + old_name='rd_plz', + new_name='rd_name', + ), + migrations.RenameField( + model_name='handlungsleitfadenvf', + old_name='vf_fb_plzcity', + new_name='vf_fb_adresse', + ), + migrations.RenameField( + model_name='handlungsleitfadenvf', + old_name='vf_fb_street', + new_name='vf_ver_adresse', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfaden', + old_name='rd_city', + new_name='rd_adresse', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfaden', + old_name='rd_plz', + new_name='rd_name', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfadenvf', + old_name='vf_fb_plzcity', + new_name='vf_fb_adresse', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfadenvf', + old_name='vf_fb_street', + new_name='vf_ver_adresse', + ), + migrations.RenameField( + model_name='historicalrdcontact', + old_name='rd_postname', + new_name='rd_mail', + ), + migrations.RenameField( + model_name='historicalrdcontact', + old_name='rd_prename', + new_name='rd_name', + ), + migrations.RenameField( + model_name='rdcontact', + old_name='rd_postname', + new_name='rd_mail', + ), + migrations.RenameField( + model_name='rdcontact', + old_name='rd_prename', + new_name='rd_name', + ), + migrations.RemoveField( + model_name='handlungsleitfaden', + name='rd_postname', + ), + migrations.RemoveField( + model_name='handlungsleitfaden', + name='rd_prename', + ), + migrations.RemoveField( + model_name='handlungsleitfaden', + name='rd_street', + ), + migrations.RemoveField( + model_name='handlungsleitfadenvf', + name='vf_ver_plzcity', + ), + migrations.RemoveField( + model_name='handlungsleitfadenvf', + name='vf_ver_street', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfaden', + name='rd_postname', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfaden', + name='rd_prename', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfaden', + name='rd_street', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_plzcity', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_street', + ), + migrations.AddField( + model_name='historicalrdtrustperson', + name='rd_mail', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='rdtrustperson', + name='rd_mail', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + ] diff --git a/recoverdir/migrations/0026_auto_20201021_1655.py b/recoverdir/migrations/0026_auto_20201021_1655.py new file mode 100644 index 0000000..6c3783b --- /dev/null +++ b/recoverdir/migrations/0026_auto_20201021_1655.py @@ -0,0 +1,31 @@ +# Generated by Django 3.0 on 2020-10-21 16:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0025_auto_20201021_1653'), + ] + + operations = [ + migrations.RenameField( + model_name='historicalrdtrustperson', + old_name='rd_postname', + new_name='rd_name', + ), + migrations.RenameField( + model_name='rdtrustperson', + old_name='rd_postname', + new_name='rd_name', + ), + migrations.RemoveField( + model_name='historicalrdtrustperson', + name='rd_prename', + ), + migrations.RemoveField( + model_name='rdtrustperson', + name='rd_prename', + ), + ] diff --git a/recoverdir/migrations/0027_auto_20201025_1523.py b/recoverdir/migrations/0027_auto_20201025_1523.py new file mode 100644 index 0000000..9dfd37c --- /dev/null +++ b/recoverdir/migrations/0027_auto_20201025_1523.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0 on 2020-10-25 15:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0026_auto_20201021_1655'), + ] + + operations = [ + migrations.RemoveField( + model_name='handlungsleitfadenvf', + name='vf_ver_adresse', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_adresse', + ), + ] diff --git a/recoverdir/migrations/0028_auto_20201025_1525.py b/recoverdir/migrations/0028_auto_20201025_1525.py new file mode 100644 index 0000000..72ddc3a --- /dev/null +++ b/recoverdir/migrations/0028_auto_20201025_1525.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0 on 2020-10-25 15:25 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0027_auto_20201025_1523'), + ] + + operations = [ + migrations.AddField( + model_name='handlungsleitfadenvf', + name='vf_ver_adresse', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_adresse', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + ] diff --git a/recoverdir/migrations/0029_auto_20201025_1658.py b/recoverdir/migrations/0029_auto_20201025_1658.py new file mode 100644 index 0000000..17e98ec --- /dev/null +++ b/recoverdir/migrations/0029_auto_20201025_1658.py @@ -0,0 +1,134 @@ +# Generated by Django 3.0 on 2020-10-25 16:58 + +from django.db import migrations, models +import django_cryptography.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0028_auto_20201025_1525'), + ] + + operations = [ + migrations.RenameField( + model_name='handlungsleitfaden', + old_name='rd_adresse', + new_name='rd_city', + ), + migrations.RenameField( + model_name='handlungsleitfaden', + old_name='rd_name', + new_name='rd_plz', + ), + migrations.RenameField( + model_name='handlungsleitfadenvf', + old_name='vf_fb_adresse', + new_name='vf_fb_plzcity', + ), + migrations.RenameField( + model_name='handlungsleitfadenvf', + old_name='vf_ver_adresse', + new_name='vf_fb_street', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfaden', + old_name='rd_adresse', + new_name='rd_city', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfaden', + old_name='rd_name', + new_name='rd_plz', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfadenvf', + old_name='vf_fb_adresse', + new_name='vf_fb_plzcity', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfadenvf', + old_name='vf_ver_adresse', + new_name='vf_fb_street', + ), + migrations.RenameField( + model_name='historicalrdcontact', + old_name='rd_name', + new_name='rd_postname', + ), + migrations.RenameField( + model_name='rdcontact', + old_name='rd_name', + new_name='rd_postname', + ), + migrations.AddField( + model_name='handlungsleitfaden', + name='rd_postname', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='handlungsleitfaden', + name='rd_prename', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='handlungsleitfaden', + name='rd_street', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='handlungsleitfadenvf', + name='vf_ver_plzcity', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='handlungsleitfadenvf', + name='vf_ver_street', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalhandlungsleitfaden', + name='rd_postname', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalhandlungsleitfaden', + name='rd_prename', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalhandlungsleitfaden', + name='rd_street', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_plzcity', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_street', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalrdcontact', + name='rd_prename', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='historicalrdtrustperson', + name='rd_postname', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='rdcontact', + name='rd_prename', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + migrations.AddField( + model_name='rdtrustperson', + name='rd_postname', + field=django_cryptography.fields.encrypt(models.CharField(blank=True, default='', max_length=500, null=True)), + ), + ] diff --git a/recoverdir/migrations/0030_auto_20201025_1709.py b/recoverdir/migrations/0030_auto_20201025_1709.py new file mode 100644 index 0000000..0a91568 --- /dev/null +++ b/recoverdir/migrations/0030_auto_20201025_1709.py @@ -0,0 +1,119 @@ +# Generated by Django 3.0 on 2020-10-25 17:09 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('recoverdir', '0029_auto_20201025_1658'), + ] + + operations = [ + migrations.RenameField( + model_name='handlungsleitfaden', + old_name='rd_city', + new_name='rd_adresse', + ), + migrations.RenameField( + model_name='handlungsleitfaden', + old_name='rd_plz', + new_name='rd_name', + ), + migrations.RenameField( + model_name='handlungsleitfadenvf', + old_name='vf_fb_plzcity', + new_name='vf_fb_adresse', + ), + migrations.RenameField( + model_name='handlungsleitfadenvf', + old_name='vf_fb_street', + new_name='vf_ver_adresse', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfaden', + old_name='rd_city', + new_name='rd_adresse', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfaden', + old_name='rd_plz', + new_name='rd_name', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfadenvf', + old_name='vf_fb_plzcity', + new_name='vf_fb_adresse', + ), + migrations.RenameField( + model_name='historicalhandlungsleitfadenvf', + old_name='vf_fb_street', + new_name='vf_ver_adresse', + ), + migrations.RenameField( + model_name='historicalrdcontact', + old_name='rd_postname', + new_name='rd_name', + ), + migrations.RenameField( + model_name='rdcontact', + old_name='rd_postname', + new_name='rd_name', + ), + migrations.RemoveField( + model_name='handlungsleitfaden', + name='rd_postname', + ), + migrations.RemoveField( + model_name='handlungsleitfaden', + name='rd_prename', + ), + migrations.RemoveField( + model_name='handlungsleitfaden', + name='rd_street', + ), + migrations.RemoveField( + model_name='handlungsleitfadenvf', + name='vf_ver_plzcity', + ), + migrations.RemoveField( + model_name='handlungsleitfadenvf', + name='vf_ver_street', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfaden', + name='rd_postname', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfaden', + name='rd_prename', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfaden', + name='rd_street', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_plzcity', + ), + migrations.RemoveField( + model_name='historicalhandlungsleitfadenvf', + name='vf_ver_street', + ), + migrations.RemoveField( + model_name='historicalrdcontact', + name='rd_prename', + ), + migrations.RemoveField( + model_name='historicalrdtrustperson', + name='rd_postname', + ), + migrations.RemoveField( + model_name='rdcontact', + name='rd_prename', + ), + migrations.RemoveField( + model_name='rdtrustperson', + name='rd_postname', + ), + ] diff --git a/recoverdir/migrations/__init__.py b/recoverdir/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/recoverdir/migrations/__pycache__/0001_initial.cpython-38.pyc b/recoverdir/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..61318cf Binary files /dev/null and b/recoverdir/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0002_auto_20201002_2257.cpython-38.pyc b/recoverdir/migrations/__pycache__/0002_auto_20201002_2257.cpython-38.pyc new file mode 100644 index 0000000..15310aa Binary files /dev/null and b/recoverdir/migrations/__pycache__/0002_auto_20201002_2257.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0003_auto_20201003_1532.cpython-38.pyc b/recoverdir/migrations/__pycache__/0003_auto_20201003_1532.cpython-38.pyc new file mode 100644 index 0000000..95fb1fc Binary files /dev/null and b/recoverdir/migrations/__pycache__/0003_auto_20201003_1532.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0004_handlungsleitfaden_rdcontact_rdtrustperson.cpython-38.pyc b/recoverdir/migrations/__pycache__/0004_handlungsleitfaden_rdcontact_rdtrustperson.cpython-38.pyc new file mode 100644 index 0000000..8e94342 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0004_handlungsleitfaden_rdcontact_rdtrustperson.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0005_area1_documents.cpython-38.pyc b/recoverdir/migrations/__pycache__/0005_area1_documents.cpython-38.pyc new file mode 100644 index 0000000..1453b17 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0005_area1_documents.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0006_auto_20201005_1112.cpython-38.pyc b/recoverdir/migrations/__pycache__/0006_auto_20201005_1112.cpython-38.pyc new file mode 100644 index 0000000..c1a274d Binary files /dev/null and b/recoverdir/migrations/__pycache__/0006_auto_20201005_1112.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0007_auto_20201005_1122.cpython-38.pyc b/recoverdir/migrations/__pycache__/0007_auto_20201005_1122.cpython-38.pyc new file mode 100644 index 0000000..7586486 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0007_auto_20201005_1122.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0008_auto_20201005_1512.cpython-38.pyc b/recoverdir/migrations/__pycache__/0008_auto_20201005_1512.cpython-38.pyc new file mode 100644 index 0000000..2688b97 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0008_auto_20201005_1512.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0009_auto_20201005_1527.cpython-38.pyc b/recoverdir/migrations/__pycache__/0009_auto_20201005_1527.cpython-38.pyc new file mode 100644 index 0000000..c8bfcf0 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0009_auto_20201005_1527.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0010_auto_20201005_1555.cpython-38.pyc b/recoverdir/migrations/__pycache__/0010_auto_20201005_1555.cpython-38.pyc new file mode 100644 index 0000000..92975d9 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0010_auto_20201005_1555.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0011_auto_20201005_1648.cpython-38.pyc b/recoverdir/migrations/__pycache__/0011_auto_20201005_1648.cpython-38.pyc new file mode 100644 index 0000000..a486ef7 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0011_auto_20201005_1648.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0012_delete_historicaldocuments.cpython-38.pyc b/recoverdir/migrations/__pycache__/0012_delete_historicaldocuments.cpython-38.pyc new file mode 100644 index 0000000..f8c6cc4 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0012_delete_historicaldocuments.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0013_depositvollmacht_ergoverdir_handlungsleitfadenvf_historicalhandlungsleitfadenvf_onlinebank.cpython-38.pyc b/recoverdir/migrations/__pycache__/0013_depositvollmacht_ergoverdir_handlungsleitfadenvf_historicalhandlungsleitfadenvf_onlinebank.cpython-38.pyc new file mode 100644 index 0000000..59a6ef8 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0013_depositvollmacht_ergoverdir_handlungsleitfadenvf_historicalhandlungsleitfadenvf_onlinebank.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0014_historicaldepositvollmacht_historicalergoverdir_historicalonlinebank.cpython-38.pyc b/recoverdir/migrations/__pycache__/0014_historicaldepositvollmacht_historicalergoverdir_historicalonlinebank.cpython-38.pyc new file mode 100644 index 0000000..9c73fda Binary files /dev/null and b/recoverdir/migrations/__pycache__/0014_historicaldepositvollmacht_historicalergoverdir_historicalonlinebank.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0015_historicalstreamingabo_streamingabo.cpython-38.pyc b/recoverdir/migrations/__pycache__/0015_historicalstreamingabo_streamingabo.cpython-38.pyc new file mode 100644 index 0000000..1e9707c Binary files /dev/null and b/recoverdir/migrations/__pycache__/0015_historicalstreamingabo_streamingabo.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0016_digitalaccounts_historicaldigitalaccounts.cpython-38.pyc b/recoverdir/migrations/__pycache__/0016_digitalaccounts_historicaldigitalaccounts.cpython-38.pyc new file mode 100644 index 0000000..df0a4a6 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0016_digitalaccounts_historicaldigitalaccounts.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0017_historicalpersonal_personal.cpython-38.pyc b/recoverdir/migrations/__pycache__/0017_historicalpersonal_personal.cpython-38.pyc new file mode 100644 index 0000000..fe36274 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0017_historicalpersonal_personal.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0018_auto_20201006_2018.cpython-38.pyc b/recoverdir/migrations/__pycache__/0018_auto_20201006_2018.cpython-38.pyc new file mode 100644 index 0000000..26baef3 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0018_auto_20201006_2018.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0019_auto_20201006_2029.cpython-38.pyc b/recoverdir/migrations/__pycache__/0019_auto_20201006_2029.cpython-38.pyc new file mode 100644 index 0000000..f5da0ee Binary files /dev/null and b/recoverdir/migrations/__pycache__/0019_auto_20201006_2029.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0020_historicalrdelse_rdelse.cpython-38.pyc b/recoverdir/migrations/__pycache__/0020_historicalrdelse_rdelse.cpython-38.pyc new file mode 100644 index 0000000..b6e261f Binary files /dev/null and b/recoverdir/migrations/__pycache__/0020_historicalrdelse_rdelse.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0021_recoverdirsetting.cpython-38.pyc b/recoverdir/migrations/__pycache__/0021_recoverdirsetting.cpython-38.pyc new file mode 100644 index 0000000..b862105 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0021_recoverdirsetting.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0022_historicalrdcontract_rdcontract.cpython-38.pyc b/recoverdir/migrations/__pycache__/0022_historicalrdcontract_rdcontract.cpython-38.pyc new file mode 100644 index 0000000..51592e8 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0022_historicalrdcontract_rdcontract.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0023_auto_20201008_0926.cpython-38.pyc b/recoverdir/migrations/__pycache__/0023_auto_20201008_0926.cpython-38.pyc new file mode 100644 index 0000000..0965aec Binary files /dev/null and b/recoverdir/migrations/__pycache__/0023_auto_20201008_0926.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0024_recoverdirsetting_lastlogg.cpython-38.pyc b/recoverdir/migrations/__pycache__/0024_recoverdirsetting_lastlogg.cpython-38.pyc new file mode 100644 index 0000000..853cb12 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0024_recoverdirsetting_lastlogg.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0025_auto_20201021_1653.cpython-38.pyc b/recoverdir/migrations/__pycache__/0025_auto_20201021_1653.cpython-38.pyc new file mode 100644 index 0000000..589805f Binary files /dev/null and b/recoverdir/migrations/__pycache__/0025_auto_20201021_1653.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0026_auto_20201021_1655.cpython-38.pyc b/recoverdir/migrations/__pycache__/0026_auto_20201021_1655.cpython-38.pyc new file mode 100644 index 0000000..8b46501 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0026_auto_20201021_1655.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0027_auto_20201025_1523.cpython-38.pyc b/recoverdir/migrations/__pycache__/0027_auto_20201025_1523.cpython-38.pyc new file mode 100644 index 0000000..2180ea1 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0027_auto_20201025_1523.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0028_auto_20201025_1525.cpython-38.pyc b/recoverdir/migrations/__pycache__/0028_auto_20201025_1525.cpython-38.pyc new file mode 100644 index 0000000..0900947 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0028_auto_20201025_1525.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0029_auto_20201025_1658.cpython-38.pyc b/recoverdir/migrations/__pycache__/0029_auto_20201025_1658.cpython-38.pyc new file mode 100644 index 0000000..0cf5c49 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0029_auto_20201025_1658.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/0030_auto_20201025_1709.cpython-38.pyc b/recoverdir/migrations/__pycache__/0030_auto_20201025_1709.cpython-38.pyc new file mode 100644 index 0000000..5b7de75 Binary files /dev/null and b/recoverdir/migrations/__pycache__/0030_auto_20201025_1709.cpython-38.pyc differ diff --git a/recoverdir/migrations/__pycache__/__init__.cpython-38.pyc b/recoverdir/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..289ed9c Binary files /dev/null and b/recoverdir/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/recoverdir/models.py b/recoverdir/models.py new file mode 100644 index 0000000..1342022 --- /dev/null +++ b/recoverdir/models.py @@ -0,0 +1,258 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency +from django.utils import timezone +from django_cryptography.fields import encrypt + +# HISTORY +from simple_history.models import HistoricalRecords + +from django_encrypted_filefield.fields import ( + EncryptedFileField, + EncryptedImageField +) + +# PATH FOR AGENCYPIC +def rd_path_agency(instance, filename): + # file will be uploaded to MEDIA_URL/agency_// + return 'agencydata/agency_{0}/rd/{1}'.format(instance.agency.pk, filename) + + +# MAIN RECOVERDIR PASSWORD AND CONFIG +class RecoverDirSetting(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + logpass = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + recoverkey = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + lastlogg = models.DateTimeField(null=True, blank=True, default=None) + +# Create your models here. +class PersLetter(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True) + text = encrypt(models.CharField(max_length=100000, blank=True, default="", null=True)) + history = HistoricalRecords() + +# Notfallhilfe Datenfelder + +# AREA 1 +# Handlungsleitfaden +class Handlungsleitfaden(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + rd_main = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + + # REIN + rd_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # ENDE + + # RAUS + #rd_plz = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #rd_city = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #rd_street = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #rd_prename = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #rd_postname = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + + # ENDE + rd_tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_mail = encrypt(models.EmailField(max_length=500, blank=True, default="", null=True)) + bvk_number = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rv_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rv_number = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rv_tel_1 = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rv_tel_2 = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + history = HistoricalRecords() + +# Contacts +class RDContact(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + # REIN + #rd_prename = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #rd_postname = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # RAUS + + # REIN + rd_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # ENDE + + rd_rel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_mail = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + history = HistoricalRecords() + +# Vertrauensperson +class RDTrustPerson(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + + # REIN + rd_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # ENDE + # RAUS + #rd_postname = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # ENDE + rd_company = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + rd_mail = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + history = HistoricalRecords() + +# DOKUMENTE ALLGEMEIN +class Documents(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + area = models.IntegerField(default=0) + document_desc = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + document_name = encrypt(models.CharField(max_length=500, blank=False, default="", null=False)) + document_date = encrypt(models.DateField(default=timezone.now, blank=True, null=True)) + document = EncryptedFileField(upload_to=rd_path_agency, blank=True) + #history = HistoricalRecords() + + +# AREA 2 +# Handlungsleitfaden Vorsorge und Finanzen +class HandlungsleitfadenVF(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + vf_ver_company = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vf_ver_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + + # RAUS + #vf_ver_street = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #vf_ver_plzcity = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #vf_fb_street = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + #vf_fb_plzcity = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # ENDE + + # REIN + vf_ver_adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # ENDE + + vf_ver_tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vf_ver_mail = encrypt(models.EmailField(max_length=500, blank=True, default="", null=True)) + + vf_fb_company = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vf_fb_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + + # REIN + vf_fb_adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + # ENDE + + vf_fb_tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vf_fb_mail = encrypt(models.EmailField(max_length=500, blank=True, default="", null=True)) + + vf_rv_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vf_rv_number = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vf_rv_tel_1 = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vf_rv_tel_2 = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + + history = HistoricalRecords() + +# Bankvollmacht +class DepositVollmacht(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + geber_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + geber_adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + geber_bank = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + nehmer_name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + nehmer_adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + nehmer_geb = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + nehmer_tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + vollmacht_doc = EncryptedFileField(upload_to=rd_path_agency, blank=True) + history = HistoricalRecords() + +class ErgoVerDir(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + ergo_username = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + ergo_password = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + history = HistoricalRecords() + +class OnlineBank(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + web_address = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + area = models.IntegerField(default=0) + bic = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + iban = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + web_username = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + web_password = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + accountactivity = encrypt(models.CharField(max_length=5000, blank=True, default="", null=True)) + vollmacht_doc = EncryptedFileField(upload_to=rd_path_agency, blank=True) + history = HistoricalRecords() + +class StreamingAbo(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + username = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + password = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + accountactivity = encrypt(models.CharField(max_length=5000, blank=True, default="", null=True)) + vollmacht_doc = EncryptedFileField(upload_to=rd_path_agency, blank=True) + history = HistoricalRecords() + +class DigitalAccounts(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + area = models.IntegerField(default=2) + link = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + username = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + password = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + accountactivity = encrypt(models.CharField(max_length=5000, blank=True, default="", null=True)) + mail = encrypt(models.EmailField(max_length=500, blank=True, default="", null=True)) + vollmacht_doc = EncryptedFileField(upload_to=rd_path_agency, blank=True) + history = HistoricalRecords() + + + +PERS_CHOICE = ( + ("ex", "Intern"), + ("in", "Extern"), + ) +class Personal(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + function = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + inorex = encrypt(models.CharField(max_length=500, blank=True, default=1, choices =PERS_CHOICE, null=True)) + pnr = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + onr = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + mail = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + history = HistoricalRecords() + + +class RDContract(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + contract_typ = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + contract_owner = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + license = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + info1 = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + info2 = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + adresse = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + tel = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + mail = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + history = HistoricalRecords() + + +class RDElse(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, null=True) + name = encrypt(models.CharField(max_length=500, blank=True, default="", null=True)) + desc = encrypt(models.CharField(max_length=10000, blank=True, default="", null=True)) + history = HistoricalRecords() + + + + + + + + + + + + + + + + + + + + + + diff --git a/recoverdir/signals.py b/recoverdir/signals.py new file mode 100644 index 0000000..6577e65 --- /dev/null +++ b/recoverdir/signals.py @@ -0,0 +1,4 @@ +from django.contrib.auth.models import User +from django.db.models.signals import post_save +from django.dispatch import receiver + diff --git a/recoverdir/templates/.DS_Store b/recoverdir/templates/.DS_Store new file mode 100644 index 0000000..1c04afc Binary files /dev/null and b/recoverdir/templates/.DS_Store differ diff --git a/recoverdir/templates/recoverdir/.DS_Store b/recoverdir/templates/recoverdir/.DS_Store new file mode 100644 index 0000000..e8154f3 Binary files /dev/null and b/recoverdir/templates/recoverdir/.DS_Store differ diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_1.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_1.html new file mode 100644 index 0000000..30b4427 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_1.html @@ -0,0 +1,167 @@ + +{% if area_1_hl == None %} + Handlungsleitfaden +{% else %} +
Handlungsleitfaden bearbeiten
+{% endif %} + +
+

Familie & Freunde {% if request.user.profile.showtooltips %} {% endif %} + Kontakt +

+ + + + + + + + + + + + + {% for familyc in area_1_fc %} + + + + + + + + + {% endfor %} + +
NameBeziehungAdresseTelefonE-Mail 
{{familyc.rd_name|default:""}}{{familyc.rd_rel|default:""}}{{familyc.rd_adresse|default:""}}{{familyc.rd_tel|default:""}}{{familyc.rd_mail|default:""}} +   +   + +
+ +
+

Vertrauensperson {% if request.user.profile.showtooltips %} {% endif %} + Vertrauensperson +

+ + + + + + + + + + + + {% for trust in area_1_trust %} + + + + + + + + {% endfor %} + +
NameFirmaAdresseTelefon 
{{trust.rd_prename|default:""}} {{trust.rd_postname|default:""}}{{trust.rd_company|default:""}}{{trust.rd_adresse|default:""}}{{trust.rd_tel|default:""}} +   +   + +
+ +
+

Vorsorgedokumente {% if request.user.profile.showtooltips %} {% endif %} + Vorsorgedokument +

+ + + + + + + + + + + {% for doc in area_1_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_2.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_2.html new file mode 100644 index 0000000..3c340c4 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_2.html @@ -0,0 +1,203 @@ +{% if area_2_hlfv == None %} + Handlungsleitfaden Vorsorge & Finanzen +{% else %} +
Handlungsleitfaden für Vorsorge & Finanzen bearbeiten
+{% endif %} + +
+

Bank-, Konto- & Depot-Vollmachten{% if request.user.profile.showtooltips %} {% endif %} + Vollmacht +

+ + + + + + + + + + + {% for ele in area_2_deposit %} + + + + + + + {% endfor %} + +
NameAnschriftBank 
{{ele.geber_name|default:""}}{{ele.geber_adresse|default:""}}{{ele.geber_bank|default:""}} +   +   + +
+ +
+

Digitaler Versicherungsordner{% if request.user.profile.showtooltips %} {% endif %} + Zugangsdaten +

+ + + + + + + + + {% for ele in area_2_ergo %} + + + + + {% endfor %} + +
Benutzername 
{{ele.ergo_username}} +   +   + +
+ + +
+

Online-Banking{% if request.user.profile.showtooltips %} {% endif %} + Online-Banking +

+ + + + + + + + + {% for ele in area_2_onlinebank %} + + + + + {% endfor %} + +
Internetadresse/Bankname 
{{ele.web_address}} +   +   + +
+ + +
+

Wertpapiere, Versicherungsscheine & Altersvorsorge{% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_2_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_3.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_3.html new file mode 100644 index 0000000..afddb05 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_3.html @@ -0,0 +1,103 @@ +

Streaming Abonnements{% if request.user.profile.showtooltips %} {% endif %} + Streaming-Abo +

+ + + + + + + + + + {% for ele in area_3_abos %} + + + + + + {% endfor %} + +
NameBenutzername 
{{ele.name|default:""}}{{ele.username|default:""}} +   +   + +
+
+

Verträge{% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_3_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_4.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_4.html new file mode 100644 index 0000000..9807552 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_4.html @@ -0,0 +1,103 @@ +

Online-Accounts{% if request.user.profile.showtooltips %} {% endif %} + Online-Account +

+ + + + + + + + + + + {% for ele in area_4_digitalaccount %} + + + + + + + {% endfor %} + +
NameLinkBenutzername 
{{ele.name|default:""}}{{ele.link|default:""}}{{ele.username|default:""}} +   +   + +
+
+

Dokumente {% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_4_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_5.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_5.html new file mode 100644 index 0000000..cbd72ee --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_5.html @@ -0,0 +1,119 @@ +

Personal, interne & externe Partner inkl. Funktionen usw.{% if request.user.profile.showtooltips %} {% endif %} + Personal +

+
+ + + + + + + + + + + {% for ele in area_5_personal %} + + + + + + + {% endfor %} + {% for us in users_of_agency %} + + + + + + + {% endfor %} + +
NameFunktionIntern/Extern 
{{ele.name|default:""}}{{ele.function|default:""}} + {% if ele.inorex == "in" %} Intern + {% elif ele.inorex == "ex" %} Extern + {% else %} {% endif %} + +   +   + +
{{us.get_full_name}}{{us.profile.func|default:""}} + Intern + +
+
+

Dokumente, Vertretungsregeln & Zugriffsberechtigungen {% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_5_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_6.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_6.html new file mode 100644 index 0000000..bbc0e2b --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_6.html @@ -0,0 +1,97 @@ +

Bankkonten & Online-Bankzugänge{% if request.user.profile.showtooltips %} {% endif %} + Online-Banking +

+ + + + + + + + + {% for ele in area_6_onlinebank %} + + + + + {% endfor %} + +
Internetadresse/Bankname 
{{ele.web_address}} +   +   + +
+
+

Dokumente {% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_6_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_7.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_7.html new file mode 100644 index 0000000..38ce011 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_7.html @@ -0,0 +1,101 @@ +

Verträge {% if request.user.profile.showtooltips %} {% endif %} + Vertrag +

+ + + + + + + + + + {% for contract in area_7_contract %} + + + + + + {% endfor %} + +
Vertrags-TypEigentümer etc. 
{{contract.contract_typ|default:""}}{{contract.contract_owner|default:""}} +   +   + +
+

Dokumente {% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_7_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_8.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_8.html new file mode 100644 index 0000000..861b312 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_8.html @@ -0,0 +1,102 @@ +

Digitale Accounts{% if request.user.profile.showtooltips %} {% endif %} + Account +

+ + + + + + + + + + + {% for ele in area_8_digitalaccount %} + + + + + + + {% endfor %} + +
NameLinkBenutzername 
{{ele.name|default:""}}{{ele.link|default:""}}{{ele.username|default:""}} +   +   + +
+
+

Dokumente{% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_8_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_areas/rd_area_9.html b/recoverdir/templates/recoverdir/rd_areas/rd_area_9.html new file mode 100644 index 0000000..faa5734 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_areas/rd_area_9.html @@ -0,0 +1,101 @@ +

Sonstige Datenelemente{% if request.user.profile.showtooltips %} {% endif %} + Information +

+ + + + + + + + + + {% for ele in area_9_else %} + + + + + + {% endfor %} + +
Name/Titel etc.Beschreibung 
{{ele.name}}{{ele.desc}} +   +   + +
+
+

Dokumente {% if request.user.profile.showtooltips %} {% endif %} + Dokument +

+ + + + + + + + + + + {% for doc in area_9_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}} +   +   + +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_doc_del.html b/recoverdir/templates/recoverdir/rd_doc_del.html new file mode 100644 index 0000000..6cd505e --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_doc_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Dokument löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie {{document.document_name}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_doc_single.html b/recoverdir/templates/recoverdir/rd_doc_single.html new file mode 100644 index 0000000..aa79eb0 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_doc_single.html @@ -0,0 +1,22 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Dokumentenansicht {% if history == True %} - Version vom {{document.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Beschreibung

+

{{document.document_name}}

+

{{document.document_desc}}

+

Datum: {{document.document_date}}

+
+ Datei herunterladen +
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_adddoc.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_adddoc.html new file mode 100644 index 0000000..faef1af --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_adddoc.html @@ -0,0 +1,28 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Dokument bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{ form|crispy }} +
+ Abbrechen +   +
+
+ +{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addfc.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addfc.html new file mode 100644 index 0000000..31f8738 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addfc.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Familien & Freundekontakt bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addhl.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addhl.html new file mode 100644 index 0000000..c288c52 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addhl.html @@ -0,0 +1,35 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Handlungsleitfaden bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + +

Daten der Regionaldirektion

+ {{form.rd_main|as_crispy_field}} + {{form.rd_name|as_crispy_field}} + {{form.rd_adresse|as_crispy_field}} + {{form.rd_tel|as_crispy_field}} + {{form.rd_mail|as_crispy_field}} +
+

BVK Mitgliedsnummer

+ {{form.bvk_number|as_crispy_field}} +
+

Rechtsschutzversicherungsdaten

+ {{form.rv_name|as_crispy_field}} + {{form.rv_number|as_crispy_field}} + {{form.rv_tel_1|as_crispy_field}} + {{form.rv_tel_2|as_crispy_field}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addtrust.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addtrust.html new file mode 100644 index 0000000..de29c4b --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_addtrust.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Vertrauensperson bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_contact_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_contact_del.html new file mode 100644 index 0000000..f926bbe --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_contact_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Familien- & Freundekontakt löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie den Kontakt {{contact.rd_name}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_contact_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_contact_single.html new file mode 100644 index 0000000..c5f6926 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_contact_single.html @@ -0,0 +1,40 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Familien- & Freundekontakt {% if history == True %} - Version vom {{contact.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Kontaktdaten

+ + + + + + + + + + + + + + + + + + + + + + +
Name:{{contact.rd_name}}
Beziehung:{{contact.rd_rel}}
Adresse:{{contact.rd_adresse}}
Telefonnummer:{{contact.rd_tel}}
E-Mail:{{contact.rd_mail}}
+
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_hl_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_hl_single.html new file mode 100644 index 0000000..0492c96 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_hl_single.html @@ -0,0 +1,78 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Handlungsleitfaden {% if history == True %} - Version vom {{hl.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

1. Bitte die zuständigen Regionaldirektion (RD) kontaktieren und um Hilfe bitten.

+ + + + + + + + + + + + + + + + + + + + + +
Zuständige RD{{hl.rd_main|default:""}}
Name des RD-Leiters{{hl.rd_name|default:""}}
Adresse RD{{hl.rd_adresse|default:""}}
Telefon{{hl.rd_tel|default:""}}
E-Mail{{hl.rd_mail|default:""}}
+
+

2. Kontaktiere bitte den Interessenverband VVE e.V. und bitte ihn um Hilfe.

+
+ Geschäftstelle des VVE e.V.
+ Verband der selbständigen Verischerungskaufleute er ERGO Gesellschaften e.V.
+ Frankenthaler Str. 2
+ 68519 Viernheim

+ Telefon: 06204/964060
+ E-Mail: geschaeftsstelle@myvve.de
+
+

3. Bitte beachte die nachfolgenden Unterlagen und Informationen innerhalb dieser Notfallhilfe. Hierbei handelt es sich um wichtige Unterlagen für den Notfall.

+
+

4. Ich bin BVK Mitglied (Bundersverband Deutscher Versicherungskaufleute e.V.).

+
+

Mitgliedsnummer: {{hl.bvk_number|default:""}}

+ Bundesverband Deutscher Versicherungskaufleute e.V.
+ Kekuléstraße 12
+ 53115 Bonn

+ Telefon: 0228/22805-0
+ E-Mail: bvk@bvk.de
+
+

5. Bei nachgelagerten Rechtsfragen wende Dich bitte an meinen Rechschutzversicherer.

+ + + + + + + + + + + + + + + + + +
Rechtsschutzversicherer{{hl.rv_name|default:""}}
Versicherungsnummer{{hl.rv_number|default:""}}
Telefon 1{{hlvf.rv_tel_1|default:""}}
Telefon 2{{hlvf.rv_tel_2|default:""}}
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_trust_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_trust_del.html new file mode 100644 index 0000000..a4aa0d5 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_trust_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Vertrauensperson löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie die Vertrauensperson {{contact.rd_name}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_trust_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_trust_single.html new file mode 100644 index 0000000..9f05a45 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_1_trust_single.html @@ -0,0 +1,40 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Vertrauensperson {% if history == True %} - Version vom {{contact.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Kontaktdaten

+ + + + + + + + + + + + + + + + + + + + + + +
Name:{{contact.rd_name}}
Firma:{{contact.rd_company}}
Adresse:{{contact.rd_adresse}}
Telefonnummer:{{contact.rd_tel}}
Telefonnummer:{{contact.rd_mail}}
+
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_adddeposit.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_adddeposit.html new file mode 100644 index 0000000..18da666 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_adddeposit.html @@ -0,0 +1,32 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Bank-, Konto- & Depot-Vollmacht bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} +

Kont-/Depot-/Schrankfachinhaber/Vollmachtgeber

+ {{form.geber_name|as_crispy_field}} + {{form.geber_adresse|as_crispy_field}} + {{form.geber_bank|as_crispy_field}} +
+

Bevollmächtige Person

+ {{form.nehmer_name|as_crispy_field}} + {{form.nehmer_adresse|as_crispy_field}} + {{form.nehmer_geb|as_crispy_field}} + {{form.nehmer_tel|as_crispy_field}} +
+

Vollmacht als Dokument (empfohlen als PDF)

+ {{form.vollmacht_doc|as_crispy_field}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addergo.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addergo.html new file mode 100644 index 0000000..6d4ff2e --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addergo.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Zugang Digitaler Versicherungsordner bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addhlvf.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addhlvf.html new file mode 100644 index 0000000..6ffa611 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addhlvf.html @@ -0,0 +1,39 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Handlungsleitfaden Vorsorge & Finanzen bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + +

1. Daten des zuständigen Versicherungsberaters

+ {{form.vf_ver_company|as_crispy_field}} + {{form.vf_ver_name|as_crispy_field}} + {{form.vf_ver_adresse|as_crispy_field}} + {{form.vf_ver_tel|as_crispy_field}} + {{form.vf_ver_mail|as_crispy_field}} +
+

2. Daten des zuständigen Finanzberaters

+ {{form.vf_fb_company|as_crispy_field}} + {{form.vf_fb_name|as_crispy_field}} + {{form.vf_fb_adresse|as_crispy_field}} + {{form.vf_fb_tel|as_crispy_field}} + {{form.vf_fb_mail|as_crispy_field}} +
+

3. Rechtsschutzversicherer

+ {{form.vf_rv_name|as_crispy_field}} + {{form.vf_rv_number|as_crispy_field}} + {{form.vf_rv_tel_1|as_crispy_field}} + {{form.vf_rv_tel_2|as_crispy_field}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addonlinebank.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addonlinebank.html new file mode 100644 index 0000000..b89e2bc --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_addonlinebank.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Zugang zur Bank/Online-Bankaccount bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_deposit_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_deposit_del.html new file mode 100644 index 0000000..aea7a4c --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_deposit_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Vollmacht löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie die Vollmacht für {{deposit.geber_name}} für die Bank {{deposit.geber_bank}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_deposit_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_deposit_single.html new file mode 100644 index 0000000..5538af0 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_deposit_single.html @@ -0,0 +1,62 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Bank-, Konto- & Depot-Vollmacht {% if history == True %} - Version vom {{deposit.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Konto-/Depot-/Schrankfachinhaber/Vollmachtgeber

+ + + + + + + + + + + + + +
Name{{deposit.geber_name|default:""}}
Anschrift{{deposit.geber_adresse|default:""}}
Name, Anschrift Bank{{deposit.geber_bank|default:""}}
+
+

Bevollmächtigte Person

+ + + + + + + + + + + + + + + + + +
Name{{deposit.nehmer_name|default:""}}
Anschrift{{deposit.nehmer_adresse|default:""}}
Geburtsdatum{{deposit.nehmer_geb|default:""}}
Telefon-Nr.{{deposit.nehmer_tel|default:""}}
+
+ {% if deposit.vollmacht_doc %} +

Vollmachtsdokument anschauen

+ {% endif %} +
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} + + + + + + + + diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_ergo_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_ergo_del.html new file mode 100644 index 0000000..96f1d81 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_ergo_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Zugang zu digitalem Versicherungsordner löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie die Zugangsdaten zum digitalen Versicherungsordner mit dem Benuzternamen {{ergo.ergo_username}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_ergo_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_ergo_single.html new file mode 100644 index 0000000..31e9a61 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_ergo_single.html @@ -0,0 +1,28 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Ergo Digitaler Versicherungsordner {% if history == True %} - Version vom {{ergo.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Meine Versicherungen sind im ERGO-Kundenportal hinterlegt. Mit folgenden Zugangsdaten erhälst Du alle Informationen zu bestehenden Versicherungen, Versicherungsnummern und Kontaktmöglichkeiten. +

Applikation: ERGO meine Versicherung

+ + + + + + + + + +
Benutzername:{{ergo.ergo_username}}
Passwort:{{ergo.ergo_password}}
+
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_hl_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_hl_single.html new file mode 100644 index 0000000..20d7f94 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_hl_single.html @@ -0,0 +1,82 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Handlungsleitfaden Vorsorge & Finanzen {% if history == True %} - Version vom {{hlvf.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

1. Bitte meinen zuständigen Versicherungsberater kontaktieren.

+ + + + + + + + + + + + + + + + + + + + + +
Unternehmen{{hlvf.vf_ver_company|default:""}}
Name{{hlvf.vf_ver_name|default:""}}
Adresse{{hlvf.vf_ver_adresse|default:""}}
Telefon{{hlvf.vf_ver_tel|default:""}}
E-Mail{{hlvf.vf_ver_mail|default:""}}
+
+

2. Bitte meinen zuständigen Finanzberater kontaktieren.

+ + + + + + + + + + + + + + + + + + + + + +
Unternehmen{{hlvf.vf_fb_company|default:""}}
Name{{hlvf.vf_fb_name|default:""}}
Adresse{{hlvf.vf_fb_adresse|default:""}}
Telefon{{hlvf.vf_fb_tel|default:""}}
PE-Mail{{hlvf.vf_fb_mail|default:""}}
+
+

3. Eventuell ist es nötig, meinen Rechtsschutzversicherer zu kontaktieren.

+ + + + + + + + + + + + + + + + + +
Rechtsschutzversicherer{{hlvf.vf_rv_name|default:""}}
Versicherungsnummer{{hlvf.vf_rv_number|default:""}}
Telefon 1{{hlvf.vf_rv_tel_1|default:""}}
Telefon 2{{hlvf.vf_rv_tel_2|default:""}}
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_onlinebank_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_onlinebank_del.html new file mode 100644 index 0000000..ac4f310 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_onlinebank_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Zugang zu Onine-Bank löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie die Zugangsdaten zur Online-Banke {{onlinebank.web_address}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_onlinebank_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_onlinebank_single.html new file mode 100644 index 0000000..dfa2990 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_2_onlinebank_single.html @@ -0,0 +1,46 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Online-Bank {% if history == True %} - Version vom {{onlinebank.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Bankdaten

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Internetadresse:{{onlinebank.web_address}}
Benutzername:{{onlinebank.web_username|default:""}}
Passwort:{{onlinebank.web_password|default:""}}
BIC:{{onlinebank.bic|default:""}}
IBAN:{{onlinebank.iban|default:""}}
Mit meinem Account soll Folgendes passieren:{{onlinebank.accountactivity|default:""}}
+
+ {% if onlinebank.vollmacht_doc %} +

Vollmachtsdokument anschauen

+ {% endif %} +
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_addstreamingabo.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_addstreamingabo.html new file mode 100644 index 0000000..2d0b708 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_addstreamingabo.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Streaming-Account bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_streamingabo_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_streamingabo_del.html new file mode 100644 index 0000000..2b41e07 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_streamingabo_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Streaming-Account löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie die Daten für den Streamingdienst {{streaming.name}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_streamingabo_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_streamingabo_single.html new file mode 100644 index 0000000..64916be --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_3_streamingabo_single.html @@ -0,0 +1,38 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Streaming-Dienst {% if history == True %} - Version vom {{streaming.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Streaming-Dienst

+ + + + + + + + + + + + + + + + + +
Name:{{streaming.name}}
Benutzername:{{streaming.username|default:""}}
Passwort:{{streaming.password|default:""}}
Mit meinem Account soll Folgendes passieren:{{streaming.accountactivity|default:""}}
+
+ {% if streaming.vollmacht_doc %} +

Vollmachtsdokument anschauen

+ {% endif %} +
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_adddigitalaccount.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_adddigitalaccount.html new file mode 100644 index 0000000..7ea923e --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_adddigitalaccount.html @@ -0,0 +1,21 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Online-Account bearbeiten

+
+
+

Nutzen Sie die Maske zur Speicherung von E-Mail, Messenger, Geräteanmeldung und PINs, Internetdomains usw..

+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_digitalaccount_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_digitalaccount_del.html new file mode 100644 index 0000000..d2df4d1 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_digitalaccount_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Online-Account löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie die Daten für den Online-Account {{account.name}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_digitalaccount_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_digitalaccount_single.html new file mode 100644 index 0000000..fb3021d --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_4_digitalaccount_single.html @@ -0,0 +1,47 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Online-Account {% if history == True %} - Version vom {{account.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Online-Account

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Name:{{account.name|default:""}}
Link:{{account.link|default:""}}
Benutzername:{{account.username|default:""}}
Passwort:{{account.password|default:""}}
E-Mail:{{account.mail|default:""}}
Mit meinem Account soll Folgendes passieren:{{account.accountactivity|default:""}}
+
+ {% if account.vollmacht_doc %} +

Vollmachtsdokument anschauen

+ {% endif %} +
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} + diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_addpersonal.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_addpersonal.html new file mode 100644 index 0000000..e4c1788 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_addpersonal.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Personal-Account bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_personal_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_personal_del.html new file mode 100644 index 0000000..f323e63 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_personal_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Personal-Partner-Account löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie den Personal/Partner-Account von {{account.name}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_personal_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_personal_single.html new file mode 100644 index 0000000..ef28649 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_5_personal_single.html @@ -0,0 +1,55 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Personalaccount {% if history == True %} - Version vom {{personal.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Personal und Partner

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:{{personal.name}}
Function:{{personal.function|default:""}}
Intern/Extern: + {% if personal.inorex == "in" %} Intern + {% elif personal.inorex == "ex" %} Extern + {% else %} {% endif %} +
PNR:{{personal.pnr|default:""}}
ONR:{{personal.onr|default:""}}
Email-Adresse:{{personal.mail|default:""}}
Telefon:{{personal.tel|default:""}}
Adresse:{{personal.adresse|default:""}}
+
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_addcontract.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_addcontract.html new file mode 100644 index 0000000..7122b82 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_addcontract.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Vertrag bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_contract_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_contract_del.html new file mode 100644 index 0000000..5a42338 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_contract_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Vertrag löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie den Vertrag {{contact.typ}} Eigentümer {{contact.contract_owner}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_contract_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_contract_single.html new file mode 100644 index 0000000..e41a732 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_7_contract_single.html @@ -0,0 +1,51 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Vertrag {% if history == True %} - Version vom {{contract.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Vertragsinformationen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Typ{{contract.contract_typ|default:""}}
Eigentümer/Immobilie/etc.{{contract.contract_owner|default:""}}
Lizenz{{contract.license|default:""}}
Info 1{{contract.info1|default:""}}
Info 2{{contract.info2|default:""}}
Adresse{{contract.ad|default:""}}
Telefon{{contract.tel|default:""}}
E-Mail{{contract.mail|default:""}}
+
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_addelse.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_addelse.html new file mode 100644 index 0000000..c7320f3 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_addelse.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Sonstige Information bearbeiten

+
+
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_else_del.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_else_del.html new file mode 100644 index 0000000..b6e1a07 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_else_del.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Datenelement unter Sonstiges löschen

+
+
+ {% csrf_token %} + {{ form|crispy }} + Möchten Sie die Information {{ele.name}} wirklich endgültig löschen? +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_else_single.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_else_single.html new file mode 100644 index 0000000..f6a307e --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_area_9_else_single.html @@ -0,0 +1,27 @@ +{% extends "users/base.html" %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Sonstiges Datenelement {% if history == True %} - Version vom {{else.history_date|date:"d.m.Y"}}{% endif %} + + + +

+
+

Informationen

+ + + + + + + + + +
Name{{else.name|default:""}}
Beschreibung:{{else.desc|default:""}}
+
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_elements_forms/rd_mainlogin.html b/recoverdir/templates/recoverdir/rd_elements_forms/rd_mainlogin.html new file mode 100644 index 0000000..6b14e59 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_elements_forms/rd_mainlogin.html @@ -0,0 +1,26 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Notfallhilfe {% if request.user.profile.showtooltips %} {% endif %} + +

+
+
+ Bitte melden Sie sich mit dem Passwort für die Notfallhilfe an! +
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} +
+   +
+
+
+ +{% else %} +Sie haben keinen Zugriff auf das Modul Notfallhilfe. Bitte wenden Sie sich an den Support! +{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_external.html b/recoverdir/templates/recoverdir/rd_external.html new file mode 100644 index 0000000..f2e02a6 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_external.html @@ -0,0 +1,2002 @@ +{% extends "users/publicbase.html" %} +{% load crispy_forms_tags %} +{% block content %} + + + +
+
+

Notfallhilfe für die Agentur {{agencydata.name}} + +

+
+

Private Unterlagen

+ +
+ +
+
+
+ + +

1

+
+
+
+ +
+
+ + +

Handlungsleitfaden betrachten

+
+
+ + + + +

Familie und Freunde +

+ + + + + + + + + + + + {% for familyc in area_1_fc %} + + + + + + + + {% endfor %} + +
NameBeziehungAdresseTelefonE-Mail
{{familyc.rd_name|default:""}}{{familyc.rd_rel|default:""}}{{familyc.rd_adresse|default:""}}{{familyc.rd_tel|default:""}}{{familyc.rd_mail|default:""}}
+ +
+

Vertrauensperson +

+ + + + + + + + + + + + {% for trust in area_1_trust %} + + + + + + + + {% endfor %} + +
NameFirmaAdresseTelefonE-Mail
{{trust.rd_name|default:""}}{{trust.rd_company|default:""}}{{trust.rd_adresse|default:""}}{{trust.rd_tel|default:""}}{{trust.rd_mail|default:""}}
+ + +
+

Vorsorgedokumente +

+ + + + + + + + + + + {% for doc in area_1_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+
+
+
+ +{% for familyc in area_1_fc %} + + +{% endfor %} + + +{% for trust in area_1_trust %} + +{% endfor %} + + +
+
+
+ + +

2

+
+
+
+ +
+
+ + +

Handlungsleitfaden für Vorsoroge & Finanzen betrachten

+
+
+ +

Bank-, Konto- & Depot-Vollmachten +

+ + + + + + + + + + {% for ele in area_2_deposit %} + + + + + + {% endfor %} + +
NameAnschriftBank
{{ele.geber_name|default:""}}{{ele.geber_adresse|default:""}}{{ele.geber_bank|default:""}}
+
+

Digitaler Versicherungsordner +  Zugangsdaten +

+ + + + + + + + {% for ele in area_2_ergo %} + + + + {% endfor %} + +
Benutzername
{{ele.ergo_username}}
+
+ +

Online-Banking +

+ + + + + + + + {% for ele in area_2_onlinebank %} + + + + {% endfor %} + +
Internetadresse/Bankname
{{ele.web_address}}
+ +
+

Wertpapiere, Versicherungsscheine & Altersvorsorge +

+ + + + + + + + + + + {% for doc in area_2_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+ + + + + +
+
+
+ +{% for deposit in area_2_deposit %} + + +{% endfor %} + +{% for ergo in area_2_ergo %} + + +{% endfor %} + +{% for onlinebank in area_2_onlinebank %} + + +{% endfor %} + + +
+
+
+ + +

3

+
+
+
+ +
+
+ +

Streaming Abonnements +  Streaming-Abo +

+ + + + + + + + + {% for ele in area_3_abos %} + + + + + {% endfor %} + +
NameBenutzername
{{ele.name|default:""}}{{ele.username|default:""}}
+
+

Verträge +

+ + + + + + + + + + + {% for doc in area_3_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+
+
+
+ +{% for streaming in area_3_abos %} + + +{% endfor %} + + +
+
+
+ + +

4

+
+
+
+ +
+
+ + +

Online-Accounts (Messenger, E-Mail-Accounts, Social-Media etc.) +

+ + + + + + + + + + {% for ele in area_4_digitalaccount %} + + + + + + {% endfor %} + +
NameLinkBenutzername
{{ele.name|default:""}}{{ele.link|default:""}}{{ele.username|default:""}}
+ +
+

Dokumente +

+ + + + + + + + + + + {% for doc in area_4_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+ +
+
+
+ +{% for account in area_4_digitalaccount %} + + +{% endfor %} +
+

Gewerbliche Unterlagen

+ + +
+
+
+ + +

5

+
+
+
+ +
+
+ + +

Personal, interne und externe Partner inkl. Funktionen usw. +

+
+ + + + + + + + + + {% for ele in area_5_personal %} + + + + + + {% endfor %} + {% for us in users_of_agency %} + + + + + + + {% endfor %} + +
NameFunktionIntern/Extern
{{ele.name|default:""}}{{ele.function|default:""}} + {% if ele.inorex == "in" %} Intern + {% elif ele.inorex == "ex" %} Extern + {% else %} {% endif %} +
{{us.get_full_name}}{{us.profile.func|default:""}} + Intern + +
+
+ +

Dokumente +

+ + + + + + + + + + + {% for doc in area_5_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+ + + +
+
+
+ +{% for personal in area_5_personal %} + + +{% endfor %} + +{% for personal in users_of_agency %} + + +{% endfor %} + + +
+
+
+ + +

6

+
+
+
+ +
+
+ +

Bankkonten und Online-Bankzugänge +

+ + + + + + + + {% for ele in area_6_onlinebank %} + + + + {% endfor %} + +
Internetadresse/Bankname
{{ele.web_address}}
+
+ +

Dokumente +

+ + + + + + + + + + + {% for doc in area_6_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+
+
+
+ +{% for onlinebank in area_6_onlinebank %} + + +{% endfor %} + + +
+
+
+ + +

7

+
+
+
+ +
+
+ + + +

Verträge +

+ + + + + + + + + {% for contract in area_7_contract %} + + + + + {% endfor %} + +
Vertrags-TypEigentümer etc.
{{contract.contract_typ|default:""}}{{contract.contract_owner|default:""}}
+
+ + + + +

Dokumente +

+ + + + + + + + + + + {% for doc in area_7_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+ + + +
+
+
+ + {% for contract in area_7_contract %} + + +{% endfor %} + + +
+
+
+ + +

8

+
+
+
+ +
+
+ + +

Digitale Accounts (Webseiten, E-Mail etc.) +

+ + + + + + + + + + {% for ele in area_8_digitalaccount %} + + + + + + {% endfor %} + +
NameLinkBenutzername
{{ele.name|default:""}}{{ele.link|default:""}}{{ele.username|default:""}}
+
+ + +

Dokumente +

+ + + + + + + + + + + {% for doc in area_8_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+ + + +
+
+
+ +{% for account in area_8_digitalaccount %} + + +{% endfor %} + + +
+
+
+ + +

9

+
+
+
+ +
+
+ + + +

Sonstige Datenelemente +

+ + + + + + + + + {% for ele in area_9_else %} + + + + + {% endfor %} + +
Name/Titel etc.Beschreibung
{{ele.name}}{{ele.desc}}
+
+ + + +

Dokumente +

+ + + + + + + + + + + {% for doc in area_9_doc %} + + + + + + + {% endfor %} + +
NameDatumBeschreibung 
{{doc.document_name|default:""}}{{doc.document_date|date:"d.m.Y"|default:""}}{{doc.document_desc|default:""}}Download
+ + + +
+
+
+ +{% for else in area_9_else %} + + +{% endfor %} + +
+
+
+ +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_external_login.html b/recoverdir/templates/recoverdir/rd_external_login.html new file mode 100644 index 0000000..8398e88 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_external_login.html @@ -0,0 +1,44 @@ +{% extends "users/publicbase.html" %} + +{% load crispy_forms_tags %} +{% block content %} + +
+
+ {% if messages %} + {% for message in messages %} + + {% endfor %} + {% endif %} +
+ {% csrf_token %} +
+ + +

Digitale Agentur - Recover

+
+

Bitte geben Sie Passwort und Sicherheitsschlüssel ein! Es wird empfohlen, diese Seite nur im Inkognito-Modus aufzurufen! So verhinden Sie, dass Daten im Browser Zwischengespeichert werden!

+ {{ form|crispy }} +
+
+ + + +
+
+
+
+ +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_infos.html b/recoverdir/templates/recoverdir/rd_infos.html new file mode 100644 index 0000000..673c9da --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_infos.html @@ -0,0 +1,242 @@ +
+
+

+

Wichtige Informationen bei Betriebsaufgabe

+ +

+Die nachfolgenden Hinweise sollen Ihnen und/oder Ihren Angehörigen/Bevollmächtigten als erster Überblick dienen, was bei Aufgabe Ihres Betriebes zu beachten ist. Diese Hinweise können bei diversen Gründen für eine Betriebsaufgabe Anwendung (z. B. Berufsunfähigkeit, Todesfall, Ruhestand, etc.) finden. Allerdings weisen wir darauf hin, dass diese Übersicht unverbindlich ist und keinen Anspruch auf Vollständigkeit erhebt. Zudem ersetzt sie in keinem Fall eine einzelfallbezogene Rechtsberatung. Trotz sorgfältiger Bearbeitung und den sich durch Gesetzgebung und Rechtsprechung ständig ergebenden Änderungen können wir zudem keine Gewähr und keine Haftung für den Inhalt übernehmen. Aufgrund der Komplexität der Steuermaterie empfehlen wir Ihnen, zu Steuerfragen immer einen Steuerberater hinzuzuziehen. +

+ +

I. Allgemeine Hinweise

+

+Welche Benachrichtigungen, Vertragskündigungen und Organisationsaufgaben sind zu erledigen? +Wichtig: Erstellen Sie rechtzeitig eine Liste bestehender Verträge mit den entsprechenden Kündigungsfristen. Halten Sie die vertraglichen oder gesetzlichen Kündigungsfristen ein. Beachten Sie die vorgeschriebene oder vereinbarte Form (z. B. schriftlich, per Einschreiben). +

+ +

1. Finanzen/ Steuern Steuerberater:

+
    +
  • Steuerliche Folgen der Betriebsaufgabe klären
  • +
  • Finanzamt: Mitteilung, in Absprache mit Steuerberater
  • +
  • Erstellung Schlussbilanzen und Steuererklärung
  • +
  • Einreichung Abschlussbilanz
  • +
  • Aufbewahrung Geschäfts- / Steuerunterlagen organisieren (Buchhaltung / Rechnungen, Jahresabschlüsse, Inventuren)
  • +
  • Ermittlung eines Aufgabe- oder Liquidationsgewinns zusätzlich zu regulären Abschlussarbeiten
  • +
+
Erläuterung
+

Bei der Betriebsaufgabe muss der Unternehmer sowohl den Gewinn aus laufendem Geschäftsverkehr als auch den Aufgabegewinn der Einkommenssteuer unterwerfen. Neben dem laufenden Gewinn gehört auch der Gewinn aus der Aufgabe Ihres Betriebes grundsätzlich zu den steuerpflichtigen Einkünften. Die Aufgabe des Betriebes führt zur Realisierung der noch vorhandenen stillen Reserven. Die Summe der stillen Reserven entspricht dem Aufgabegewinn. Haben Sie das 55. Lebensjahr vollendet oder sind Sie dauernd berufsunfähig, so steht Ihnen ein Freibetrag in Höhe von 45.000 € auf den Aufgabegewinn zu. Dieser Aufgabegewinn stellt ein außerordentliches Einkommen dar und wird der Einkommenssteuer unterworfen. Ermitteln Sie den Aufgabegewinn mit Ihrem Steuerberater.

+
Betriebsaufgabe mit Verlust
+

Ergibt sich bei der Aufgabe des Betriebes ein Verlust, können Sie diesen Verlust mit dem laufenden Gewinn ausgleichen (horizontaler Verlustausgleich) oder/ und mit positiven Einkünften aus anderen Einkunftsarten (vertikaler Verlustausgleich) nach den allgemeinen Grundsätzen verrechnen. Entsteht im Jahr der Aufgabe ein Veräußerungsgewinn, während für den laufenden Betrieb ein Verlust anfällt, wird nur der um den Freibetrag (s.o.) gekürzte Veräußerungsgewinn mit dem laufenden Ergebnis verrechnet.

+ +

2. Mitarbeiter

+
    +
  • Arbeitsvertragskündigung
  • +
  • Berufsgenossenschaft: Abmeldung
  • +
+

+ Zunächst ist zu klären, ob es sich bei der Betriebsaufgabe um eine endgültige, dauerhafte Stilllegung des Betriebes oder um eine Betriebsübernahme handelt. Diese beiden Fallkonstellationen sind rechtlich unterschiedlich zu behandeln. Sofern der Betrieb übernommen wird, bestimmen sich die arbeitsrechtlichen Folgen nach §613 a BGB. Dabei ist insbesondere zu beachten, dass im Vorfeld zu einer Betriebsübernahme Mitteilungspflichten bestehen, dass darüber hinaus bei einer Betriebsübernahme eine Kündigung wegen Betriebsübernahme nicht möglich ist und der neue Inhaber des Betriebes in die Rechte und Pflichten aus den bestehenden Arbeitsverträgen eintritt. Davon zu unterscheiden ist eine endgültige, dauerhafte Betriebsstilllegung; bei dieser kann grundsätzlich unter Beachtung der allgemeinen Voraussetzungen für eine wirksame Kündigung eine ordentliche Kündigung erfolgen. Dabei müssen Sie sich jedoch insbesondere hinsichtlich der Kündigungsfristen frühzeitig beraten lassen. Bei langjährigen Arbeitsverhältnissen können sehr lange Kündigungsfristen maßgeblich sein. Sofern gesetzliche Kündigungsfristen im jeweiligen Arbeitsverhältnis anzuwenden sind, kann diese Kündigungsfrist bis zu sieben Monate zum Ende eines Kalendermonats betragen; es können aber auch noch längere Kündigungsfristen auf Grund von arbeitsvertraglichen Regelungen oder Tarifverträgen einzuhalten sein. Daher müssen Sie in jedem Fall im Vorfeld abklären, welche Kündigungsfristen für die einzelnen Arbeitsverhältnisse anzuwenden sind. Eventuell ist es gerade bei sehr langen Kündigungsfristen möglich, Aufhebungsverträge zu schließen. Eine Betriebsstilllegung ist per se kein Grund für ein außerordentliches Kündigungsrecht. Im Übrigen sind die allgemeinen Voraussetzungen für eine wirksame Kündigung zu beachten, in diesem Zusammenhang sollten Sie sich daher frühzeitig, vor Ausspruch einer Kündigung, rechtlich beraten lassen. Bei Mitarbeitern mit besonderem Kündigungsschutz (Elternzeit, Schwangere, Schwerbehinderte) muss vor Aussprache der Kündigung die Zustimmung des Regierungspräsidiums bzw. des Integrationsamtes eingeholt werden. Bei Kündigungen von Auszubildenden im Rahmen der Betriebsaufgabe sind Sie als Ausbilder gegebenenfalls (aufgrund des Ausbildungsvertrages) verpflichtet, sich mit Hilfe der zuständigen Bundesagentur für Arbeit rechtzeitig um eine Fortsetzung der Ausbildung im bisherigen Ausbildungsberuf in einer anderen geeigneten Ausbildungsstätte zu bemühen. Im Hinblick auf Abfindungen ist grundsätzlich festzustellen, dass die Zahlung einer Abfindung außerhalb eines Arbeitsgerichtsprozesses einer Rechtsgrundlage bedarf. Diese kann sich aus Vertrag, Betriebsvereinbarung oder Tarifvertag ergeben. Darüber hinaus kann im Rahmen eines Arbeitsgerichtsprozesses bei Anwendbarkeit des Kündigungsschutzgesetzes ein Abfindungsanspruch bestehen. +

+ +

Tipp: Achten Sie schon vor der eigentlichen Betriebsaufgabe auf die Kündigungsfristen hinsichtlich der jeweiligen Arbeitsverhältnisse. Zwar kann die Betriebsaufgabe in Einzelfällen ein wichtiger Grund im Rahmen einer außerordentlichen Kündigung darstellen. Jedoch ist es rechtssicher, eine ordentliche Kündigung innerhalb der Kündigungsfrist zu erteilen, da die Wirksamkeit dieser Kündigungsart, im Gegensatz zu der außerordentlichen Kündigung, nicht durch das Vorliegen besonderer Umstände beeinflusst wird. Achten Sie darauf, dass die Kündigungen schriftlich erfolgen. Eine frühzeitige rechtliche Beratung ist empfehlenswert. +

+ + + +

3. Langfristige Verträge

+
    +
  • Kündigungsfristen von z. B. Miet- und Pachtverträge, Leasingverträge, Darlehensverträge und Wartungsverträge in den Vertragsunterlagen nachlesen (evtl. gibt es ein außerordentliches Kündigungsrecht)
  • +
  • Telekommunikation (Telefon, Fax, Mail, Domain) kündigen
  • +
  • Telefonbuch, Branchenbücher, Werbung kündigen
  • +
  • Lieferanten/ Kunden: Liefer- oder Rahmenverträge kündigen
  • +
  • Leasingverträge kündigen oder überleiten
  • +
  • Vermieter: fristgemäße Kündigung des Gewerberaummietvertrages / Pachtvertrages
  • +
  • Energielieferant: Abmelden und Schlussabrechnung
  • +
  • Wasserlieferant: Abmelden und Schlussabrechnung
  • +
  • Müll/ Entsorgung: Kündigung
  • +
  • Bank +
      +
    • Geschäftskonto auflösen
    • +
    • Kreditkartenverträge
    • +
    • Daueraufträge kündigen
    • +
    • Einzugsermächtigungen widerrufen
    • +
    +
  • +
  • Wartungsverträge
  • +
  • Werbeverträge
  • +
  • GEMA/ GEZ
  • +
  • Kündigung von eventuellen Mitgliedschaften in Verbänden
  • +
  • Post benachrichtigen (Nachsendeauftrag bei Standortwechsel)
  • +
  • Homepage anpassen/löschen
  • +
+

Tipp: Lesen Sie in den Vertragsunterlagen nach, welche Kündigungsfristen Sie beachten müssen und ob Sie im Falle der Betriebsaufgabe ein außerordentliches Kündigungsrecht haben. Besonders wichtig ist es hier die Formalien einzuhalten. Tipps hierzu finden Sie im Wirtschaftsforum 05/2013 S. 62. +

+ +

4. Versicherungen

+
    +
  • Die Betriebsaufgabe ist bei der Krankenkasse anzuzeigen. Die Krankenkasse leitet die Meldung automatisch an die Rentenversicherungsträger weiter.
  • +
  • Mitteilung an eventuell bestehende Zusatzversorgungskasse.
  • +
  • Die Berufsgenossenschaft schriftlich über die Betriebsaufgabe informieren (binnen zwei Wochen nach der Betriebsaufgabe).
  • +
  • Ihre Rentenversicherung informieren und im Falle der Altersrente diese rechtzeitig beantragen.
  • +
  • Betriebsversicherungen, wie Feuerversicherung, Sturmversicherung, Betriebsunterbrechungsversicherung kündigen.
  • +
  • Betriebshaftpflichtversicherung: Wenn die Gefahr besteht, dass Schäden mit erheblicher zeitlicher Verzögerung (nach dem Zeitpunkt der Betriebsaufgabe) eintreten, sollten Sie die Versicherung nicht einfach ohne Angabe von Gründen zum nächst möglichen Termin kündigen. Teilen Sie der Versicherungsgesellschaft den eigentlichen Grund zur Beendigung des Versicherungsvertrages mit. Dann ist der Versicherer gehalten, eine Nachversicherung über einen gewissen Zeitraum anzubieten. Diese gewährleistet, dass für noch eventuell eintretende Schadensereignisse Versicherungsschutz besteht.
  • +
+

Tipp: Teilen Sie der Versicherung unbedingt den Grund für die Beendigung des Versicherungsvertrages mit und fragen Sie direkt nach einer Nachversicherung. Diese deckt diejenigen Schadensfälle ab, die nach der Betriebsaufgabe anfallen. Kümmern Sie sich rechtzeitig um die oben genannten Belange. Ihre gesetzliche Rente erhalten Sie nicht automatisch. Sie müssen spätestens drei Monate vor dem gewünschten Starttermin einen Antrag stellen, um nicht in finanzielle Engpässe zu geraten. +

+ +

5. Abmeldungen, Löschungen, Änderungen und Sonstiges

+
    +
  • Ordnungsamt +
      +
    • Gewerbeabmeldung
    • +
    • ggf. Erlaubnisrückgabe
    • +
    +
  • +
  • + Handelsregister +
      +
    • Wenn Ihr Betrieb im Handelsregister eingetragen ist: Beim Handelsregister die Löschung des Betriebes beantragen.
    • +
    • Alle Änderungen und Eintragungen im Handelsregister können nur über einen Notar erfolgen
    • +
    +
  • +
  • Betriebsfahrzeuge ummelden oder verkaufen
  • +
  • Zulassungsstelle: PKW abmelden
  • +
  • Kunden/ Geschäftspartner / Lieferanten informieren
  • +
  • Evtl. Räumungsverkauf, Gutscheine einlösen
  • +
  • Entsorgung/ Verkauf der Betriebs- und Geschäftsausstattung (Mobiliar / Maschinen/ Fahrzeuge)
  • +
  • Nachhaftung bei Gewährleistung beachten
  • +
  • Wiederherstellung der gemieteten Räume; eventuell Renovierung
  • +
+ + +

6. Aufbewahrungsfristen

+
    +
  • 10 Jahre: Bücher und Aufzeichnungen, Inventare und Jahresabschlüsse
  • +
  • 6 Jahre: Andere steuerlich bedeutsame Unterlagen
  • +
+

Fazit: Bei einer Betriebsaufgabe werden Sie mit einer Vielzahl von Aufgaben und rechtlichen Anforderungen konfrontiert. Mit dieser Checkliste behalten Sie dabei den Überblick. Halten Sie sich an die Vorgaben dieser Liste, so dass Sie einen Leitfaden für eine strukturierte Betriebsaufgabe an die Hand bekommen. Befassen Sie sich möglichst früh mit dem Thema Betriebsaufgabe. Es sind lange Fristen und Wartezeiten denkbar, die Ihnen und/oder Ihren Angehörigen/Bevollmächtigten die Betriebsaufgabe erschweren. Kümmern Sie sich schnell und gezielt um über die aufgeführten Punkte. Generell ist Ihnen bei einer Betriebsaufgabe die Hinzuziehung eines Steuerberaters und eines Rechtsanwalts zu empfehlen. +

+ +
+ +

Besondere Hinweise zur Beendigung Ihres Vertriebspartnervertrages mit der ERGO Beratung und Vertrieb AG

+ +

1. Was passiert mit der, während meiner Tätigkeit für die EBV, aufgebauten Alters- und Hinterbliebenenversorgung?

+

+ Sie erhalten hierzu eine schriftliche Information der Longial GmbH, aus der Sie entnehmen können, was nach der Beendigung Ihrer Tätigkeit für die EBV mit Ihrer Alters- und Hinterbliebenenversorgung konkret geschieht. +

+ +

2. Was passiert mit meinen eigenen Versicherungen, zu denen Sonderkonditionen bzw. Beitragsnachlässe (Vergünstigungen) gewährt werden?

+ +

Hierzu bitten wir Sie, das beigefügte Informationsblatt des ERGO Beratungscenters zu beachten: http://ergoweb-teams/sites/Beratungscenter/PB/MAKonditionen/Mitarbeitervergünstigungen_01_2018.pdHinweise dazu, was nach Ihrem Ausscheiden mit gewährten Vergünstigungen geschieht, können Sie der letzten Seite (rechte Spalte) des Informationsblattes entnehmen. +

+ +

3. Abrechnung

+

+ Mit der Beendigung des Vertriebspartnervertrages ist zu beachten, dass auch in der Zukunft noch Abrechnungen erfolgen können. Diese können zum Beispiel aus nachlaufenden Provisionen oder Storno in der Haftungszeit resultieren. Daher ist zu empfehlen, sich vor Beendigung einen Gesamtüberblick über die Provisionsflüsse / sonstige Ansprüche / Verbindlichkeiten zu verschaffen. Dies auch vor dem Hintergrund, dass die vertraglichen Regelungen je Abrechnungssystem unterschiedlich sind und daher hier nicht detailliert dargestellt werden können. Sollte bereits bei Austritt ein Debetsaldo bestehen, klären Sie bitte mit Ihrem Ansprechpartner der zuständigen Regionaldirektion die Rückzahlungsmodalitäten. Über die Entwicklung Ihres Provisionskontos werden Sie regelmäßig mit Abrechnungsunterlagen informiert. Bitte prüfen Sie diese und sofern Klärungsbedarf besteht, senden Sie Ihre Anfrage unter Bezugnahme auf die Vertragsnummer und die konkrete Fragestellung, schriftlich an Ihren zuständigen Ansprechpartner in Personal Vertrieb (PV). Für Angehörige/Bevollmächtigte: Nach dem Tod des Agenturinhabers/Vertriebspartners können noch so lange Provisionen aus stornierten Verträgen seitens der ERGO Beratung und Vertrieb AG zurückgefordert werden, wie die Stornohaftungszeit aus den vermittelten Verträgen besteht (bis zu fünf Jahren). Wir empfehlen Ihnen dringend, sich vor Annahme eines evtl. Erbes zur Klärung von ggf. bestehenden Provisionssalden und bzgl. des Stornoreservekontos mit den im Leitfaden stehenden Ansprechpartnern in Verbindung zu setzen. +

+ +

4. Wie erfolgt die Rückgabe des mir von der EBV überlassenen Arbeits- und Werbematerials?

+

Bitte setzen Sie sich hinsichtlich der Rückgabe des Ihnen von der EBV überlassenen Arbeitsund Werbematerials mit Ihrer zuständigen Regionaldirektion in Verbindung. +

+

5. Ausgleichsanspruch

+

Die VVE-Geschäftsstelle erhält immer wieder Anfragen und Anrufe von Mitgliedern, die in den wohlverdienten Ruhestand gehen möchten und unseren Beistand suchen, oder aufgrund einer durch die EBV/ERGO ausgesprochenen Kündigung bzw. einer bevorstehenden Eigenkündigung verunsichert sind. Wir möchten an dieser Stelle einen Überblick über die aktuellen rechtlichen Grundlagen geben und unseren betroffenen Mitgliedern erste Hilfestellung leisten. +

+

Vorweg: Wir empfehlen allen Mitgliedern grundsätzlich erst einmal das Gespräch mit den verantwortlichen RD-Leitern zu suchen. Ein persönliches Gespräch ist meist hilfreich. +

+

Hinweis: Der VVE e.V. darf keine Rechtsberatung betreiben. Für eine Rechtsberatung müsste der BVK oder alternativ ein freier Anwalt hinzugezogen werden. Über den Handelsvertreter- Rechtsschutz (VVE-Rahmenvertrag mit ÖRAG) wäre eine Deckungszusage für eine rechtliche Auseinandersetzung einzuholen. Dieser Text soll grundlegende Fragen aufgreifen und Basiswissen vermitteln. Für weitergehende Fragen und Empfehlungen sind wir natürlich gerne auch persönlich für unsere Mitglieder da. +

+ + +
Wann besteht ein Rechtsanspruch auf eine Ausgleichszahlung?
+

+Den rechtlichen Anspruch auf eine Ausgleichszahlung bei einer Vertragsbeendigung begründet §89b des Handelsgesetzbuches (HGB). Der Anspruch ist demnach an zwei Voraussetzungen geknüpft: +

+
    +
  1. Der Unternehmer hat auch nach der Beendigung des Vertragsverhältnisses aus der Geschäftsverbindung mit neuen Kunden, die der Handelsvertreter geworben hat, erhebliche Vorteile und
  2. +
  3. die Zahlung eines Ausgleichs ist unter Berücksichtigung aller Umstände (insbesondere der dem Handelsvertreter aus Geschäften mit diesen Kunden entgehenden Provisionen) angemessen und gerechtfertigt (Wortlaut des HGB: „der Billigkeit entspricht.“)
  4. +
+
Wann entfällt der Anspruch auf eine Ausgleichszahlung?
+

+Dies ist ebenfalls in §89b HGB geregelt. Es besteht kein Anspruch, wenn +

+
    +
  1. der Handelsvertreter das Vertragsverhältnis gekündigt hat (Eigenkündigung). Allerdings bleibt der Anspruch bestehen, wenn ein Verhalten des Unternehmers dem Handelsvertreter begründeten Anlass zur Kündigung gegeben hat oder wenn der Handelsvertreter kündigt, da eine Fortsetzung seiner Tätigkeit wegen dessen Alters oder Krankheit nicht zumutbar ist (das Ausscheiden wegen Alters regelt der Agenturvertrag, es bedarf keiner gesonderten Kündigung).
  2. +
  3. der Unternehmer das Vertragsverhältnis gekündigt hat und für die Kündigung ein wichtiger Grund wegen schuldhaften Verhaltens des Handelsvertreters vorlag.
  4. +
  5. aufgrund einer Vereinbarung zwischen dem Unternehmer und dem Handelsvertreter ein Dritter anstelle des Handelsvertreters in das Vertragsverhältnis eintritt.
  6. +
+ +
Besteht ein Ausgleichsanspruch, wenn der Agenturvertrag in ggs. Einvernehmen beendet wird?
+

Grundsätzlich ja - eine Vertragsaufhebung im gegenseitigen Einvernehmen muss aber unter Anerkennung des Ausgleichsanspruches erfolgen. Andernfalls entfällt der Anspruch. +

+ +
Bis wann muss der Ausgleichsanspruch geltend gemacht werden?
+

Der Ausgleichsanspruch wird mit Vertragsbeendigung fällig und muss innerhalb eines Jahres nach Vertragsende vom Handelsvertreter geltend gemacht werden, da er sonst verfällt (Ausschlussfrist). Selbstverständlich kann der Ausgleichsanspruch schon vor dem eigentlichen Beendigungstermin beantragt werden. +

+ +
In welcher Form muss der Ausgleichsanspruch geltend gemacht werden?
+ +

Die Form, wie der Ausgleichsanspruch geltend gemacht wird, ist nicht vorgeschrieben. Aus Beweisgründen sollte die Geltendmachung aber unbedingt immer schriftlich erfolgen, da der Vermittler auch für die Rechtzeitigkeit und Wahrung der Ausschlussfrist bei einem Rechtsstreit beweispflichtig ist. Der Anspruch ist bei der zuständigen RD geltend zu machen. +

+ +
Wann verjährt der Rechtsanspruch auf eine Ausgleichszahlung?
+

Der Anspruch verjährt gemäß §195 BGB nach drei Jahren, beginnend mit dem Schluss des Jahres, in dem das Vertragsverhältnis beendet wurde und der Vermittler von den anspruchsbegründenden Umständen Kenntnis erlangt hat. +

+ +
Wie hoch ist der Ausgleichsanspruch maximal?
+ +

Die Höhe ist nach §89b HGB für Versicherungsvermittler auf maximal 3 Jahresprovisionen (Bestandspflegeprovisionen) begrenzt. Im Rahmen der Billigkeitskontrolle wird nach der Rechtsprechung zudem eine von der EBV/ERGO finanzierte Altersversorgung mit dem Ausgleichsanspruch verrechnet (nur das Deckungskapital, das auf den von der EBV/ERGO gezahlten Beiträgen beruht). +

+ +
Wie und wann wird die Ausgleichszahlung bei der EBV/ERGO berechnet?
+ +

Bei Fälligkeit errechnet sich der Ausgleichsanspruch laut Agenturvertrag gemäß den „Grundsätzen zur Errechnung der Höhe des Ausgleichsanspruchs (§ 89b HGB)“. Bei Vertragsbeendigung wird der Ausgleichsanspruch durch die EBV/ ERGO berechnet. Eine Frist, in welcher das Unternehmen die Berechnung durchführen muss, gibt es allerdings nicht. +

+ +
Habe ich einen Anspruch, die Höhe meines Ausgleichsanspruches während der Laufzeit meines Agenturvertrages errechnen zu lassen?
+ +

Ein rechtlicher Anspruch, sich den Ausgleichsanspruch während der Vertragslaufzeit errechnen zu lassen, existiert nicht. Diesen Anspruch hat man erst bei Beendigung des Agenturvertrages. +

+ +
Wie wird der Ausgleichsanspruch versteuert?
+ + +

Der Bundesfinanzhof (BFH) hat entschieden, dass der Ausgleichsanspruch eines Handelsvertreters auch im Zusammenhang mit der Betriebsaufgabe nach der Fünftel-Regelung ermäßigt besteuert werden kann, jedoch nicht als einkommensteuerbegünstigter Veräußerungsgewinn. Die Erfahrungen in der Praxis haben gezeigt, dass sich die Fünftel-Regelung häufig nicht steuermindernd auswirkt, so zum Beispiel, wenn es sich um einen hohen Ausgleichsanspruch handelt oder, wenn die laufenden Einkünfte des Jahres, in dem der Ausgleichsanspruch gezahlt wird, ebenfalls sehr hoch sind. Im eigenen Interesse sollten die Möglichkeiten in jedem Fall von einem Steuerberater geprüft werden. Der VVE führt keine steuerliche Beratung durch! +

+ +
Was sind die Grundsätze zur Errechnung des Ausgleichsanspruches?
+

Die beteiligten Verbände (GDV, VGA, BVK), haben sich zur Vereinfachung der Ausgleichsberechnung auf die so genannten „Grundsätze zur Errechnung der Höhe des Ausgleichsanspruchs“ verständigt. Auch der Ausgleichsanspruch bei der EBV/ERGO wird nach diesem Prinzip berechnet. Ein entsprechendes Rechentool und der Wortlaut der Grundsätze befinden sich auf unserer Homepage (www.myvve.de) im Download- Bereich. Mit dem Tool kann der Ausgleichsanspruch näherungsweise selbst ermittelt werden. +

+ +
Was passiert mit meinem Ausgleichsanspruch, wenn ich versterbe?
+

Beim Tod des Vertreters steht der Ausgleichsanspruch grundsätzlich nur seiner Witwe und seinen Verwandten in gerader Linie, in Härtefällen auch seinen sonstigen Erben zu.

+ + + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/recoverdir/templates/recoverdir/rd_management.html b/recoverdir/templates/recoverdir/rd_management.html new file mode 100644 index 0000000..dc1247f --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_management.html @@ -0,0 +1,178 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Notfallhilfe{% if request.user.profile.showtooltips %} {% endif %} + + +

+
+
+
Hinterlegter Datenbestand {{rd_level}}/100
+
+
+
+ + +
+
+
+
Notfallhilfe{% if request.user.profile.showtooltips %} {% endif %}
+
+ {% block rd_content %} + {% include "recoverdir/rd_rd.html" %} + {% endblock %} +
+ +
+
Wichtige Informationen{% if request.user.profile.showtooltips %} {% endif %}
+
+ {% block infos_content %} + {% include "recoverdir/rd_infos.html" %} + {% endblock %} +
+ +
+
Aktualisierungen{% if request.user.profile.showtooltips %} {% endif %}
+
+ {% block notifications_content %} + {% include "recoverdir/rd_updates.html" %} + {% endblock %} +
+ +
+ {% block pers_content %} + {% include "recoverdir/rd_pers.html" %} + {% endblock %} +
+ +
+
Sicherheit{% if request.user.profile.showtooltips %} {% endif %}
+ {% block settings_content %} + {% include "recoverdir/rd_viewsettings.html" %} + {% endblock %} +
+ +
+
Hilfe & Kontakt{% if request.user.profile.showtooltips %} {% endif %}
+
+
+
+

+ Melden Sie sich bei der VVE-Geschäftsstelle, um weitere Unterstützung und Hilfe zu erhalten. +
+ Geschäftstelle des VVE e.V.
+ Verband der selbständigen Verischerungskaufleute er ERGO Gesellschaften e.V.
+ Frankenthaler Str. 2
+ 68519 Viernheim

+ Telefon: 06204/964060
+ E-Mail: geschaeftsstelle@myvve.de
+

+
+
+
+
+
+

+ Bei rechtlichen Fragen melden Sie sich bitte bei dem BVK. +
+ Bundesverband Deutscher Versicherungskaufleute e.V.
+ Kikuléstraße 12
+ 53115 Bonn

+ Telefon: 0228/228050
+ E-Mail: bvk@bvk.de
+

+
+
+
+
+
+

+ Bei technischen Fragen nutzen Sie bitte das Supportformular. +

+
+
+
+
+
+ + + +
+ + + +{% else %} +Sie haben keinen Zugriff auf das Modul Notfallhilfe. Bitte wenden Sie sich an den Support! +{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_pers.html b/recoverdir/templates/recoverdir/rd_pers.html new file mode 100644 index 0000000..d411adb --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_pers.html @@ -0,0 +1,25 @@ + +
Persönliches Schreiben{% if request.user.profile.showtooltips %} {% endif %} + +{% if persletter == None %} + +{% else %} + + + +{% endif %} +
+
+{% if persletter == None %} +Erstellen Sie hier Ihr persönliches Schreiben. +{% else %} +
+
+

+ {{persletter.text.media}} + {{persletter.text|safe}} +

+
+
+
+{% endif %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_pers_add.html b/recoverdir/templates/recoverdir/rd_pers_add.html new file mode 100644 index 0000000..e57de03 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_pers_add.html @@ -0,0 +1,39 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Persönlichen Brief erstellen

+
+
+ {% csrf_token %} + {{normalForm.media}} + {{ form|crispy }} +
+ Abbrechen +   +
+
+ +{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_pers_update.html b/recoverdir/templates/recoverdir/rd_pers_update.html new file mode 100644 index 0000000..c51b9f0 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_pers_update.html @@ -0,0 +1,40 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Persönlichen Brief aktualisieren

+
+
+ {% csrf_token %} + {{normalForm.media}} + {{ form|crispy }} +
+ Abbrechen +   +
+
+ +{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/recoverdir/templates/recoverdir/rd_persletter_single.html b/recoverdir/templates/recoverdir/rd_persletter_single.html new file mode 100644 index 0000000..c839f27 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_persletter_single.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% block content %} + +{% if request.user.profile.agency.module_recoverdir %} +
+

Persönliches Schreiben - Version vom {{historyelement.history_date|date:"d.m.Y"}} + + + +

+
+
+

+ {{historyelement.text.media}} + {{historyelement.text|safe}} +

+
+
+
+
+{% else %} +

Auf dieses Modul haben Sie keinen Zugriff!

+{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_rd.html b/recoverdir/templates/recoverdir/rd_rd.html new file mode 100644 index 0000000..83f98b4 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_rd.html @@ -0,0 +1,274 @@ + +

Private Unterlagen

+
+ +
+
+
+ + +

1

+
+
+
+ +
+
+ {% block rd_area_1 %} + {% include "recoverdir/rd_areas/rd_area_1.html" %} + {% endblock %} +
+
+
+ + + +
+
+
+ + +

2

+
+
+
+ +
+
+ {% block rd_area_2 %} + {% include "recoverdir/rd_areas/rd_area_2.html" %} + {% endblock %} +
+
+
+ + +
+
+
+ + +

3

+
+
+
+ +
+
+ {% block rd_area_3 %} + {% include "recoverdir/rd_areas/rd_area_3.html" %} + {% endblock %} +
+
+
+ + +
+
+
+ + +

4

+
+
+
+ +
+
+ {% block rd_area_4 %} + {% include "recoverdir/rd_areas/rd_area_4.html" %} + {% endblock %} +
+
+
+
+

Gewerbliche Unterlagen

+ + + +
+
+
+ + +

5

+
+
+
+ +
+
+ {% block rd_area_5 %} + {% include "recoverdir/rd_areas/rd_area_5.html" %} + {% endblock %} +
+
+
+ + +
+
+
+ + +

6

+
+
+
+ +
+
+ {% block rd_area_6 %} + {% include "recoverdir/rd_areas/rd_area_6.html" %} + {% endblock %} +
+
+
+ + +
+
+
+ + +

7

+
+
+
+ +
+
+ {% block rd_area_7 %} + {% include "recoverdir/rd_areas/rd_area_7.html" %} + {% endblock %} +
+
+
+ + +
+
+
+ + +

8

+
+
+
+ +
+
+ {% block rd_area_8 %} + {% include "recoverdir/rd_areas/rd_area_8.html" %} + {% endblock %} +
+
+
+ + +
+
+
+ + +

9

+
+
+
+ +
+
+ {% block rd_area_9 %} + {% include "recoverdir/rd_areas/rd_area_9.html" %} + {% endblock %} +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/recoverdir/templates/recoverdir/rd_settings.html b/recoverdir/templates/recoverdir/rd_settings.html new file mode 100644 index 0000000..10ccac7 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_settings.html @@ -0,0 +1,26 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +{% if request.user.profile.agency.module_recoverdir %} +
+

Sicherheit

+
+
+ Beachten Sie bitte, dass dieses Passwort allen Personen sicher zugänglich gemacht werden muss, die auf die Notfallhilfe zugreifen können! Zusätzlich benötigen diese Personen den Sicherheitssschlüssel. Dieser wird automatisch generiert und kann nicht geändert werden. Sie finden den Sicherheitsschlüssel unter Notfallhilfe, Einstellungen. + {% csrf_token %} + {{normalForm.media}} + {{ form|crispy }} +
+ Abbrechen +   +
+
+{% else %} +

Das Modul Notfallhilfe wurden in ihrer Agentur deaktiviert.

+{% endif %} +{% endblock content %} + diff --git a/recoverdir/templates/recoverdir/rd_updates.html b/recoverdir/templates/recoverdir/rd_updates.html new file mode 100644 index 0000000..00dcad4 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_updates.html @@ -0,0 +1,115 @@ +{% load counter_tag %} + + + + + + + + + + + + {% for ele in history %} + {% for rdele in ele.history.all %} + + + + + + {% endfor %} + {% endfor %} + +
ElementVersionMitarbeiterHandlung
+ {% getHistoryClassOfObject rdele as hisotryelementinfo %} + {% if hisotryelementinfo.1 == 1 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 2 %} + + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 3 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 4 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 5 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 6 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 7 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 8 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 9 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 10 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 11 %} + {{hisotryelementinfo.0}} + + {% elif hisotryelementinfo.1 == 12 %} + {{hisotryelementinfo.0}} + + + {% elif hisotryelementinfo.1 == 20 %} + {{hisotryelementinfo.0}} + + {% endif %} + {{rdele.history_date|date:"d.m.Y H:i"}} + {% gethistoryuser rdele.history_user_id as history_user %} + {% if history_user != None %} + {{history_user.get_full_name}} + {% else %} + Gelöschter Nutzer + {% endif %} + {% if rdele.history_type == "~" %} Geändert {% elif rdele.history_type == "+" %} Erstellt {% elif rdele.history_type == "-"%} Gelöscht {% endif %} +
+ + \ No newline at end of file diff --git a/recoverdir/templates/recoverdir/rd_viewsettings.html b/recoverdir/templates/recoverdir/rd_viewsettings.html new file mode 100644 index 0000000..d889953 --- /dev/null +++ b/recoverdir/templates/recoverdir/rd_viewsettings.html @@ -0,0 +1,30 @@ +
+
+
+

+

Zugangsdaten

+ + + + + + + + + +
Sicherheitsschlüssel (nicht veränderbar):{{rd_settings.recoverkey}}
Passwort für die Notfallhilfe:*************** +   +   +
+
+

Externer Zugang

+

Um die Notfallhilfe Außenstehenden zur Verfügung zu stellen, leiten Sie diesen Link weiter: https://app.digitale-agentur.com/rd/recover. Geben Sie dort den Sicherheitsschlüssel und das Passwort ein! Stellen Sie sicher, dass diese Daten an einem sicheren Ort in Kopie vorliegen!

+

+
+
+ \ No newline at end of file diff --git a/recoverdir/tests.py b/recoverdir/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/recoverdir/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/recoverdir/urls.py b/recoverdir/urls.py new file mode 100644 index 0000000..e1d111b --- /dev/null +++ b/recoverdir/urls.py @@ -0,0 +1,160 @@ +from django.urls import path +from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required, permission_required + +from django_encrypted_filefield.constants import FETCH_URL_NAME + +from .views import * +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('', permission_required('users.recoverdirmanager')(RecoverDirManagement.as_view(template_name="recoverdir/rd_management.html")), name='recoverdir'), + # RECOVER LINK EXTERN + path('recover/', LoadExternalDataLogin.as_view(), name="load-rd-external"), + path('recover/lg/', LoadExternalData.as_view(), name="load-rd-external-logged"), + path('recover/close/', CloseExternalData.as_view(), name='closeexternalrecoverdir'), + # SETTINGS + path('rdsettings/', permission_required('users.recoverdirmanager')(RecoverDirAddSettings.as_view()), name='recoverdir-addsettings'), + path('rdsettings/update/', permission_required('users.recoverdirmanager')(RecoverDirUpdateSettings.as_view()), name='recoverdir-updatesettings'), + path('rdlogin/', permission_required('users.recoverdirmanager')(RecoverDirLog.as_view()), name='recoverdir-login'), + path('close/', permission_required('users.recoverdirmanager')(CloseRecoverDir), name='closerecoverdir'), + + # Persönliches Schreiben + path('addpl/', permission_required('users.recoverdirmanager')(RecoverDirAddPL.as_view(template_name="recoverdir/rd_pers_add.html")), name='recoverdir-addpl'), + path('updatepl/', permission_required('users.recoverdirmanager')(RecoverDirUpdatePL.as_view(template_name="recoverdir/rd_pers_update.html")), name='recoverdir-updatepl'), + + # Handlungsleitfaden + path('aone/hl/add', permission_required('users.recoverdirmanager')(RDAoneAddHL.as_view()), name='rd-a1-hl'), + path('aone/hl/update/', permission_required('users.recoverdirmanager')(RDAoneUpdateHL.as_view()), name='rd-a1-hl-update'), + + # FAMILIEN/FREUNDEKONTAKT + path('aone/fc/add', permission_required('users.recoverdirmanager')(RDAoneAddFC.as_view()), name='rd-a1-addfamily'), + path('aone/fc/', permission_required('users.recoverdirmanager')(RDAoneViewContact.as_view()), name='rd-a1-viewcontact'), + path('aone/fc/del/', permission_required('users.recoverdirmanager')(RDAoneDelContact.as_view()), name='rd-a1-delcontact'), + path('aone/fc/update/', permission_required('users.recoverdirmanager')(RDAoneUpdateContact.as_view()), name='rd-a1-updatecontact'), + + # VERTRAUENSPERSON + path('aone/trust/add', permission_required('users.recoverdirmanager')(RDAoneAddTrust.as_view()), name='rd-a1-addtrust'), + path('aone/trust/', permission_required('users.recoverdirmanager')(RDAoneViewTrust.as_view()), name='rd-a1-viewtrust'), + path('aone/trust/del/', permission_required('users.recoverdirmanager')(RDAoneDelTrust.as_view()), name='rd-a1-deltrust'), + path('aone/trust/update/', permission_required('users.recoverdirmanager')(RDAoneUpdateTrust.as_view()), name='rd-a1-updatetrust'), + + #DOCUMENTS URLS + path('aone/doc/add/', permission_required('users.recoverdirmanager')(RDAoneAddDoc.as_view()), name='rd-a1-adddoc'), + path('aone/doc/', permission_required('users.recoverdirmanager')(RDAoneViewDoc.as_view()), name='rd-a1-viewdoc'), + path('aone/doc/del/', permission_required('users.recoverdirmanager')(RDAoneDelDoc.as_view()), name='rd-a1-deldoc'), + path('aone/doc/update/', permission_required('users.recoverdirmanager')(RDAoneUpdateDoc.as_view()), name='rd-a1-updatedoc'), + + # Handlungsleitfaden Vorsroge und Finanzen + path('atwo/hlfv/add', permission_required('users.recoverdirmanager')(RDAtwoAddHLFV.as_view()), name='rd-a2-hlfv'), + path('atwo/hlfv/update/', permission_required('users.recoverdirmanager')(RDAtwoUpdateFV.as_view()), name='rd-a2-hlfv-update'), + + + # BEREICH 2 + # Banken usw. + path('two/deposit/add', permission_required('users.recoverdirmanager')(RDAtwoAdddeposit.as_view()), name='rd-a2-adddeposit'), + path('two/deposit/', permission_required('users.recoverdirmanager')(RDAtwoViewdeposit.as_view()), name='rd-a2-viewdeposit'), + path('two/deposit/del/', permission_required('users.recoverdirmanager')(RDAtwoDeldeposit.as_view()), name='rd-a2-deldeposit'), + path('two/deposit/update/', permission_required('users.recoverdirmanager')(RDAtwoUpdatedeposit.as_view()), name='rd-a2-updatedeposit'), + + # ERGO Digitaler Versicherungsordner + path('two/ergo/add', permission_required('users.recoverdirmanager')(RDAtwoAddergo.as_view()), name='rd-a2-addergo'), + path('two/ergo/', permission_required('users.recoverdirmanager')(RDAtwoViewergo.as_view()), name='rd-a2-viewergo'), + path('two/ergo/del/', permission_required('users.recoverdirmanager')(RDAtwoDelergo.as_view()), name='rd-a2-delergo'), + path('two/ergo/update/', permission_required('users.recoverdirmanager')(RDAtwoUpdateergo.as_view()), name='rd-a2-updateergo'), + + # OnlineBank + path('two/onlinebank/add/', permission_required('users.recoverdirmanager')(RDAtwoAddonlinebank.as_view()), name='rd-a2-addonlinebank'), + path('two/onlinebank/', permission_required('users.recoverdirmanager')(RDAtwoViewonlinebank.as_view()), name='rd-a2-viewonlinebank'), + path('two/onlinebank/del/', permission_required('users.recoverdirmanager')(RDAtwoDelonlinebank.as_view()), name='rd-a2-delonlinebank'), + path('two/onlinebank/update/', permission_required('users.recoverdirmanager')(RDAtwoUpdateonlinebank.as_view()), name='rd-a2-updateonlinebank'), + + # BEREICH 3 + # Streamingdienste + path('three/streaming/add', permission_required('users.recoverdirmanager')(RDAthreeAddstreaming.as_view()), name='rd-a3-addstreaming'), + path('three/streaming/', permission_required('users.recoverdirmanager')(RDAthreeViewstreaming.as_view()), name='rd-a3-viewstreaming'), + path('three/streaming/del/', permission_required('users.recoverdirmanager')(RDAthreeDelstreaming.as_view()), name='rd-a3-delstreaming'), + path('three/streaming/update/', permission_required('users.recoverdirmanager')(RDAthreeUpdatestreaming.as_view()), name='rd-a3-updatestreaming'), + + # Bereich 4 + # Digitale Accounts + path('four/digitalaccount/add/', permission_required('users.recoverdirmanager')(RDAfourAdddigitalaccount.as_view()), name='rd-a4-adddigitalaccount'), + path('four/digitalaccount/', permission_required('users.recoverdirmanager')(RDAfourViewdigitalaccount.as_view()), name='rd-a4-viewdigitalaccount'), + path('four/digitalaccount/del/', permission_required('users.recoverdirmanager')(RDAfourDeldigitalaccount.as_view()), name='rd-a4-deldigitalaccount'), + path('four/digitalaccount/update/', permission_required('users.recoverdirmanager')(RDAfourUpdatedigitalaccount.as_view()), name='rd-a4-updatedigitalaccount'), + + # Bereich 5 + # Personaldaten + path('five/personal/add', permission_required('users.recoverdirmanager')(RDAfiveAddpersonal.as_view()), name='rd-a5-addpersonal'), + path('five/personal/', permission_required('users.recoverdirmanager')(RDAfiveViewpersonal.as_view()), name='rd-a5-viewpersonal'), + path('five/personal/del/', permission_required('users.recoverdirmanager')(RDAfiveDelpersonal.as_view()), name='rd-a5-delpersonal'), + path('five/personal/update/', permission_required('users.recoverdirmanager')(RDAfiveUpdatepersonal.as_view()), name='rd-a5-updatepersonal'), + + # Bereich 6 übernimmt Datenfelder aus Bereich 2 + + # Bereich 7 TASK: Hier weiter + # VERTRÄGE + path('seven/contract/add', permission_required('users.recoverdirmanager')(RDAsevenAddcontract.as_view()), name='rd-a7-addcontract'), + path('seven/contract/', permission_required('users.recoverdirmanager')(RDAsevenViewcontract.as_view()), name='rd-a7-viewcontract'), + path('seven/contract/del/', permission_required('users.recoverdirmanager')(RDAsevenDelcontract.as_view()), name='rd-a7-delcontract'), + path('seven/contract/update/', permission_required('users.recoverdirmanager')(RDAsevenUpdatecontract.as_view()), name='rd-a7-updatecontract'), + + # Bereich 8 TASK: Hier weiter + + # Bereich 9 + path('nine/else/add', permission_required('users.recoverdirmanager')(RDAnineAddelse.as_view()), name='rd-a9-addelse'), + path('nine/else/', permission_required('users.recoverdirmanager')(RDAnineViewelse.as_view()), name='rd-a9-viewelse'), + path('nine/else/del/', permission_required('users.recoverdirmanager')(RDAnineDelelse.as_view()), name='rd-a9-delelse'), + path('nine/else/update/', permission_required('users.recoverdirmanager')(RDAnineUpdateelse.as_view()), name='rd-a9-updateelse'), + + + # HISTORY VIEWS + # Persönliches Schreiben + path('pl/ver//', permission_required('users.recoverdirmanager')(PLSingleHistory.as_view()), name='recoverdir-plsingle'), + # Familien Freundekontakt + path('contact/ver//', permission_required('users.recoverdirmanager')(ContactSingleHistory.as_view()), name='recoverdir-contact-historysingle'), + # Vertrauensperson + path('trust/ver//', permission_required('users.recoverdirmanager')(TrustSingleHistory.as_view()), name='recoverdir-trust-historysingle'), + # Dokument + #path('doc/ver//', permission_required('users.recoverdirmanager')(DocumentSingleHistory.as_view()), name='recoverdir-document-historysingle'), + # Handlungsleitfaden Finanzen und Vorsorge + path('hlfv/ver//', permission_required('users.recoverdirmanager')(HLVFSingleHistory.as_view()), name='recoverdir-hlvf-single'), + # Handlungsleitfaden + path('hl/ver//', permission_required('users.recoverdirmanager')(HLSingleHistory.as_view()), name='recoverdir-hl-single'), + # Bankenvollmacht usw. + path('deposit/ver//', permission_required('users.recoverdirmanager')(DepositSingleHistory.as_view()), name='recoverdir-deposithistory-single'), + # Ergo Digitale Versicherungen + path('ergo/ver//', permission_required('users.recoverdirmanager')(ErgoSingleHistory.as_view()), name='recoverdir-ergohistory-single'), + # Online Bank + path('onlinebank/ver//', permission_required('users.recoverdirmanager')(OnlinebankSingleHistory.as_view()), name='recoverdir-onlinebankhistory-single'), + # STREAMINGABO + path('streaming/ver//', permission_required('users.recoverdirmanager')(StreamingSingleHistory.as_view()), name='recoverdir-streaminghistory-single'), + # Digitale Accounts + path('digitalaccount/ver//', permission_required('users.recoverdirmanager')(DigitalAccountSingleHistory.as_view()), name='recoverdir-digitalaccounthistory-single'), + # Personal Intern/Extern + path('personal/ver//', permission_required('users.recoverdirmanager')(PersonalSingleHistory.as_view()), name='recoverdir-personalhistory-single'), + # VERTRAG + path('contract/ver//', permission_required('users.recoverdirmanager')(ContractSingleHistory.as_view()), name='recoverdir-contracthistory-single'), + # ELSE + path('else/ver//', permission_required('users.recoverdirmanager')(ElseSingleHistory.as_view()), name='recoverdir-elsehistory-single'), + + +] + + + + + + + + + + + + + + + + diff --git a/recoverdir/views.py b/recoverdir/views.py new file mode 100644 index 0000000..7cdcc4d --- /dev/null +++ b/recoverdir/views.py @@ -0,0 +1,1853 @@ +from django.shortcuts import render +from django.contrib.auth.mixins import LoginRequiredMixin +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView, FormView, TemplateView +from .models import * +from .forms import * +from django.urls import reverse_lazy +from django.shortcuts import redirect +from django.contrib import messages +from django.contrib.auth.decorators import login_required +import os +import sys +from django.conf import settings +from django.http import JsonResponse, HttpResponse, Http404 +from django_encrypted_filefield.views import FetchView +import string, random +from itertools import chain +from django.contrib.auth.password_validation import * +from datetime import datetime +from django.contrib.auth.models import User +from django.core.exceptions import ObjectDoesNotExist +from django.contrib import messages + +######## HELPER FUNCTIONS +def randomString(stringLength=40): + """Generate a random string of fixed length """ + letters = string.ascii_lowercase + return ''.join(random.choice(letters) for i in range(stringLength)) + +def randomStringRecoverKey(): + letters = string.ascii_uppercase + numbers = string.digits + letters_l = string.ascii_lowercase + key = "" + + for run in range(10): + key += ''.join(random.choice(letters + numbers + letters_l) for i in range(5)) + if(run < 9): + key += "-" + + return key + +''' + + Prüft, ob der User länger als 30 Minuten ausgeloggt war oder generell ausgeloggt war bzw. kein rd_login hat. + +''' +def checkForLogin(self): + # Acutal Timestamp + now = datetime.now() + userloginrdtime = self.request.user.profile.rd_login + time_delta = (now-userloginrdtime) + total_seconds = time_delta.total_seconds() + minutes = total_seconds/60 + + if(self.request.user.profile.rd_login == None or minutes > 30): + self.request.user.profile.rd_login = None + self.request.user.profile.save() + messages.warning(self.request, f'Bitte login Sie sich erneut ein.') + return False + else: + self.request.user.profile.rd_login = now + self.request.user.profile.save() + return True + +############################################# EXTERNAL ACCESS ############################################ +class LoadExternalDataLogin(FormView): + template_name = "recoverdir/rd_external_login.html" + form_class = LoginRDExternalForm + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + return context + + def form_valid(self, form): + key = form.cleaned_data.get("key") + password = form.cleaned_data.get("pass") + settings = RecoverDirSetting.objects.all() + + # LOGIN IN DIE NOTFALLHILFE + for ele in settings: + if(ele.recoverkey == key and ele.logpass == password and form.is_valid()): + ele.lastlogg = datetime.now() + ele.save() + return redirect('load-rd-external-logged', agpk=ele.agency.pk) + else: + messages.warning(self.request, f'Die eingegebenen Daten sind nicht korrekt!') + return redirect('load-rd-external') + + return super().form_valid(form) + +class CloseExternalData(TemplateView): + template_name = "" + def dispatch(self, *arg, **kwargs): + try: + settings = RecoverDirSetting.objects.filter(agency_id=kwargs['agpk'])[0] + except IndexError: + messages.warning(self.request, f'Diese Agentur hat keine Notfallhilfe.') + return redirect('load-rd-external') + + settings.lastlogg = None + settings.save() + messages.warning(self.request, f'Externer Zugang erfolgreich geschlossen.') + return redirect('load-rd-external') + +class LoadExternalData(TemplateView): + template_name = "recoverdir/rd_external.html" + context_object_name = 'agencydata' + + def dispatch(self, *args, **kwargs): + try: + settings = RecoverDirSetting.objects.filter(agency_id=kwargs['agpk'])[0] + except IndexError: + messages.warning(self.request, f'Diese Agentur hat keine Notfallhilfe.') + return redirect('load-rd-external') + + if settings.lastlogg == None: + messages.warning(self.request, f'Bitte loggen Sie sich erneut ein.') + return redirect('load-rd-external') + else: + now = datetime.now() + time_delta = (now-settings.lastlogg) + total_seconds = time_delta.total_seconds() + minutes = total_seconds/60 + if(settings.lastlogg != None and minutes < 10): + # LOGIN OK AND LOGIN EARLIER THAN 10 MINUTES + settings.lastlogg = datetime.now() + settings.save() + return super().dispatch(*args, **kwargs) + else: + # LOGIN TO OLD - SET LASTLOGG TO NONE AND SEND MESSAGE + settings.lastlogg = None + settings.save() + messages.warning(self.request, f'Bitte loggen Sie sich erneut ein.') + return redirect('load-rd-external') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + agency = Agency.objects.get(pk=kwargs['agpk']) + + persletters = PersLetter.objects.filter(agency=agency) + handlungsleitfaden = Handlungsleitfaden.objects.filter(agency=agency) + contactfc = RDContact.objects.filter(agency=agency) + contactstrust = RDTrustPerson.objects.filter(agency=agency) + depistvollmacht = DepositVollmacht.objects.filter(agency=agency) + + # LOAD DATA + ergodigi = ErgoVerDir.objects.filter(agency=agency) + context.update({"area_2_ergo" : ergodigi}) + + onlinebank = OnlineBank.objects.filter(agency=agency, area=2) + context.update({"area_2_onlinebank" : onlinebank}) + + onlinebank6 = OnlineBank.objects.filter(agency=agency, area=6) + context.update({"area_6_onlinebank" : onlinebank6}) + + streamingabo = StreamingAbo.objects.filter(agency=agency) + context.update({"area_3_abos" : streamingabo}) + + digitalaccount = DigitalAccounts.objects.filter(agency=agency, area=4) + context.update({"area_4_digitalaccount" : digitalaccount}) + + digitalaccount8 = DigitalAccounts.objects.filter(agency=agency, area=8) + context.update({"area_8_digitalaccount" : digitalaccount8}) + + personal = Personal.objects.filter(agency=agency) + context.update({"area_5_personal" : personal}) + + rdcontract = RDContract.objects.filter(agency=agency) + context.update({"area_7_contract" : rdcontract}) + + elseele = RDElse.objects.filter(agency=agency) + context.update({"area_9_else" : elseele}) + + users_of_agency = User.objects.filter(profile__agency=agency) + context.update({"users_of_agency" : users_of_agency}) + + # Bereich 2 - Handlungsleitfaden FV ########## ########## ########## ########## ########## ########## + hlfv = HandlungsleitfadenVF.objects.filter(agency=agency) + if(len(hlfv) == 1): + hlfv = HandlungsleitfadenVF.objects.filter(agency=agency)[0] + else: + hlfv = None + context.update({'hlvf' : hlfv}) + + #Bankenvollmachten usw. + context.update({'area_2_deposit' : depistvollmacht}) + + # Bereich 1 - Handlungsleitfaden ########## ########## ########## ########## ########## ########## + # Handlungsleitfaden + hl = Handlungsleitfaden.objects.filter(agency=agency) + if(len(hl) == 1): + hl = Handlungsleitfaden.objects.filter(agency=agency)[0] + else: + hl = None + + context.update({'hl' : hl}) + + # Familien-Freunde + context.update({'area_1_fc' : RDContact.objects.filter(agency=agency)}) + + # Vertrauensperson + context.update({'area_1_trust' : RDTrustPerson.objects.filter(agency=agency)}) + + # Dokumente + # A1 + context.update({'area_1_doc' : Documents.objects.filter(agency=agency, area=1).order_by('-document_date')}) + # A2 + context.update({'area_2_doc' : Documents.objects.filter(agency=agency, area=2).order_by('-document_date')}) + # A3 + context.update({'area_3_doc' : Documents.objects.filter(agency=agency, area=3).order_by('-document_date')}) + + # A4 + context.update({'area_4_doc' : Documents.objects.filter(agency=agency, area=4).order_by('-document_date')}) + + # A5 + context.update({'area_5_doc' : Documents.objects.filter(agency=agency, area=5).order_by('-document_date')}) + + # A6 + context.update({'area_6_doc' : Documents.objects.filter(agency=agency, area=6).order_by('-document_date')}) + + # A7 + context.update({'area_7_doc' : Documents.objects.filter(agency=agency, area=7).order_by('-document_date')}) + + # A8 + context.update({'area_8_doc' : Documents.objects.filter(agency=agency, area=8).order_by('-document_date')}) + + # A9 + context.update({'area_9_doc' : Documents.objects.filter(agency=agency, area=9).order_by('-document_date')}) + + context.update({ + 'agencydata' : agency, + }) + return context + +############# VIEWS +class RecoverDirManagement(LoginRequiredMixin, ListView): + model = PersLetter + + # First Method! + def dispatch(self, request, *args, **kwargs): + # Check, if initial config exist and user has rights + if(len(RecoverDirSetting.objects.filter(agency=self.request.user.profile.agency)) == 0 and self.request.user.has_perm('users.recoverdirmanager')): + # Settings not found + return redirect('recoverdir-addsettings') + # TASK: Hier noch einstellen, dass der Nutzer weniger als 30 Minuten nicht inaktiv war! + elif(self.request.user.profile.rd_login == None and self.request.user.has_perm('users.recoverdirmanager') or (self.request.user.has_perm('users.recoverdirmanager') and checkForLogin(self) == False)): + return redirect('recoverdir-login') + else: + return super(RecoverDirManagement, self).get(request) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + # PERSÖNLICHER BRIEF + persletter = None + if(len(PersLetter.objects.filter(agency=self.request.user.profile.agency)) == 1): + persletter = PersLetter.objects.filter(agency=self.request.user.profile.agency)[0] + context.update({'persletter' : persletter}) + + # Load Update-Historys + # AREAs + persletters = PersLetter.objects.filter(agency=self.request.user.profile.agency) + handlungsleitfaden = Handlungsleitfaden.objects.filter(agency=self.request.user.profile.agency) + contactfc = RDContact.objects.filter(agency=self.request.user.profile.agency) + contactstrust = RDTrustPerson.objects.filter(agency=self.request.user.profile.agency) + depistvollmacht = DepositVollmacht.objects.filter(agency=self.request.user.profile.agency) + + ergodigi = ErgoVerDir.objects.filter(agency=self.request.user.profile.agency) + context.update({"area_2_ergo" : ergodigi}) + + onlinebank = OnlineBank.objects.filter(agency=self.request.user.profile.agency, area=2) + context.update({"area_2_onlinebank" : onlinebank}) + + onlinebank6 = OnlineBank.objects.filter(agency=self.request.user.profile.agency, area=6) + context.update({"area_6_onlinebank" : onlinebank6}) + + streamingabo = StreamingAbo.objects.filter(agency=self.request.user.profile.agency) + context.update({"area_3_abos" : streamingabo}) + + digitalaccount = DigitalAccounts.objects.filter(agency=self.request.user.profile.agency, area=4) + context.update({"area_4_digitalaccount" : digitalaccount}) + + digitalaccount8 = DigitalAccounts.objects.filter(agency=self.request.user.profile.agency, area=8) + context.update({"area_8_digitalaccount" : digitalaccount8}) + + personal = Personal.objects.filter(agency=self.request.user.profile.agency) + context.update({"area_5_personal" : personal}) + + rdcontract = RDContract.objects.filter(agency=self.request.user.profile.agency) + context.update({"area_7_contract" : rdcontract}) + + elseele = RDElse.objects.filter(agency=self.request.user.profile.agency) + context.update({"area_9_else" : elseele}) + + handlungsleitfadenvf = HandlungsleitfadenVF.objects.filter(agency=self.request.user.profile.agency) + + finalupdatelist = chain(persletters, handlungsleitfaden, contactfc, contactstrust, handlungsleitfadenvf, depistvollmacht, ergodigi, onlinebank, streamingabo, digitalaccount, personal, onlinebank6, elseele, rdcontract) + context.update({"history" : finalupdatelist}) + + users_of_agency = User.objects.filter(profile__agency=self.request.user.profile.agency) + context.update({"users_of_agency" : users_of_agency}) + # DOCUMENTS NOT WORKING Weil das "alte" nicht gespeichert wird sondern lediglich der Datensatz + #documents = Documents.objects.filter(agency=self.request.user.profile.agency, area=1) + + # Bereich 2 - Handlungsleitfaden FV ########## ########## ########## ########## ########## ########## + hlfv = HandlungsleitfadenVF.objects.filter(agency=self.request.user.profile.agency) + if(len(hlfv) == 1): + hlfv = HandlungsleitfadenVF.objects.filter(agency=self.request.user.profile.agency)[0] + else: + hlfv = None + context.update({'area_2_hlfv' : hlfv}) + + #Bankenvollmachten usw. + context.update({'area_2_deposit' : depistvollmacht}) + + # Bereich 1 - Handlungsleitfaden ########## ########## ########## ########## ########## ########## + # Handlungsleitfaden + hl = Handlungsleitfaden.objects.filter(agency=self.request.user.profile.agency) + if(len(hl) == 1): + hl = Handlungsleitfaden.objects.filter(agency=self.request.user.profile.agency)[0] + else: + hl = None + + context.update({'area_1_hl' : hl}) + + # Familien-Freunde + context.update({'area_1_fc' : RDContact.objects.filter(agency=self.request.user.profile.agency)}) + + # Vertrauensperson + context.update({'area_1_trust' : RDTrustPerson.objects.filter(agency=self.request.user.profile.agency)}) + + # Dokumente + # A1 + context.update({'area_1_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=1).order_by('-document_date')}) + # A2 + context.update({'area_2_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=2).order_by('-document_date')}) + # A3 + context.update({'area_3_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=3).order_by('-document_date')}) + + # A4 + context.update({'area_4_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=4).order_by('-document_date')}) + + # A5 + context.update({'area_5_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=5).order_by('-document_date')}) + + # A6 + context.update({'area_6_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=6).order_by('-document_date')}) + + # A7 + context.update({'area_7_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=7).order_by('-document_date')}) + + # A8 + context.update({'area_8_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=8).order_by('-document_date')}) + + # A9 + context.update({'area_9_doc' : Documents.objects.filter(agency=self.request.user.profile.agency, area=9).order_by('-document_date')}) + + + # Load Settings + context.update({'rd_settings' : RecoverDirSetting.objects.filter(agency=self.request.user.profile.agency)[0]}) + + + # PROGRESS + summe_prog = len(persletters) + len(handlungsleitfaden) + len(contactfc) + len(contactstrust) + len(depistvollmacht) + len(ergodigi) + len(onlinebank) + len(onlinebank6) + len(streamingabo) + len(digitalaccount) + len(digitalaccount8) + len(personal) + len(rdcontract) + len(handlungsleitfadenvf) + final_prog_stat = 0 + + if summe_prog > 20: + final_prog_stat = 100 + else: + final_prog_stat = (int)(100/20) * summe_prog + context.update({'rd_level' : final_prog_stat}) + + return context + +def CloseRecoverDir(request): + request.user.profile.rd_login = None + request.user.profile.save() + return redirect('recoverdir') + +class RecoverDirLog(FormView): + template_name = "recoverdir/rd_elements_forms/rd_mainlogin.html" + form_class = LoginRDForm + success_url = reverse_lazy('recoverdir') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({ + 'active_link' : 'recoverdir', + 'form' : LoginRDForm() + }) + return context + + def form_valid(self, form): + # Load Settings-Data + settings = RecoverDirSetting.objects.filter(agency=self.request.user.profile.agency)[0] + + if form.cleaned_data.get("pass") == settings.logpass and self.request.user.has_perm("users.recoverdirmanager") and settings.agency == self.request.user.profile.agency: + self.request.user.profile.rd_login = datetime.now() + self.request.user.profile.save() + else: + messages.warning(self.request, f'Passwort nicht korrekt!') + return super().form_valid(form) + +class RecoverDirAddSettings(CreateView): + model = RecoverDirSetting + success_url = reverse_lazy('recoverdir') + form_class = RecoverDirSettingForm + template_name = "recoverdir/rd_settings.html" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({ + 'active_link' : 'recoverdir', + }) + return context + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + # Initial Recover-Key + if(len(RecoverDirSetting.objects.filter(agency=self.request.user.profile.agency)) == 0 and self.request.user.has_perm('users.recoverdirmanager')): + form.instance.recoverkey = randomStringRecoverKey() + + if(form.cleaned_data.get('logpass') == form.cleaned_data.get('logpass_check')): + messages.warning(self.request, f'Daten gespeichert!') + else: + messages.warning(self.request, f'Die Passwörter stimmen nicht überein. Bitte neu eingeben.') + return redirect('recoverdir-addsettings') + + return super().form_valid(form) + +class RecoverDirUpdateSettings(UpdateView): + model = RecoverDirSetting + success_url = reverse_lazy('recoverdir') + form_class = RecoverDirSettingForm + template_name = "recoverdir/rd_settings.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self)): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({ + 'active_link' : 'recoverdir', + }) + return context + + def form_valid(self, form): + # Initial Recover-Key + if(form.cleaned_data.get('logpass') == form.cleaned_data.get('logpass_check')): + messages.warning(self.request, f'Daten gespeichert!') + else: + messages.warning(self.request, f'Die Passwörter stimmen nicht überein. Bitte neu eingeben.') + return redirect('recoverdir-addsettings') + return super().form_valid(form) + +class RecoverDirAddPL(CreateView): + model = PersLetter + success_url = reverse_lazy('recoverdir') + form_class = PersLetterForm + template_name = "recoverdir/rd_pers_add.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({ + 'active_link' : 'recoverdir', + }) + return context + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + form.instance.user = self.request.user + return super().form_valid(form) + +class RecoverDirUpdatePL(UpdateView): + model = PersLetter + success_url = reverse_lazy('recoverdir') + form_class = PersLetterForm + template_name = "recoverdir/rd_pers_update.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + + def form_valid(self, form): + # TASK: Hier Aktualisierung hinzufügen! + return super().form_valid(form) + +# Notfallhilfe ELEMENTE + +# ABNSCHNITT 1 +class RDAoneAddDoc(CreateView): + model = Documents + success_url = reverse_lazy('recoverdir') + form_class = DocumentForm + template_name = "recoverdir/rd_elements_forms/rd_area_1_adddoc.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + form.instance.area = self.kwargs["area"] + + # Randomize File-Name keeping extension + file = self.request.FILES['document'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.document = file + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# Einzeldokumentenanzeige +class RDAoneViewDoc(DetailView): + model = Documents + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_doc_single.html' + context_object_name = 'document' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAoneDelDoc(DeleteView): + model = Documents + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_doc_del.html' + context_object_name = 'document' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAoneUpdateDoc(UpdateView): + model = Documents + success_url = reverse_lazy('recoverdir') + form_class = DocumentForm + template_name = "recoverdir/rd_elements_forms/rd_area_1_adddoc.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + + if(self.request.FILES and self.request.FILES['document']): + # Randomize File-Name keeping extension + file = self.request.FILES['document'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.document = file + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# Handlungsleitfaden +# ABNSCHNITT 1 +class RDAoneAddHL(CreateView): + model = Handlungsleitfaden + success_url = reverse_lazy('recoverdir') + form_class = HLForm + template_name = "recoverdir/rd_elements_forms/rd_area_1_addhl.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAoneUpdateHL(UpdateView): + model = Handlungsleitfaden + success_url = reverse_lazy('recoverdir') + form_class = HLForm + template_name = "recoverdir/rd_elements_forms/rd_area_1_addhl.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# FAMILIEN +class RDAoneAddFC(CreateView): + model = RDContact + success_url = reverse_lazy('recoverdir') + form_class = RDContactF + template_name = "recoverdir/rd_elements_forms/rd_area_1_addfc.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAoneUpdateContact(UpdateView): + model = RDContact + success_url = reverse_lazy('recoverdir') + form_class = RDContactF + template_name = "recoverdir/rd_elements_forms/rd_area_1_addfc.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAoneViewContact(DetailView): + model = RDContact + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_1_contact_single.html' + context_object_name = 'contact' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAoneDelContact(DeleteView): + model = RDContact + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_1_contact_del.html' + context_object_name = 'contact' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# VERTRAUENSPERSON +class RDAoneViewTrust(DetailView): + model = RDTrustPerson + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_1_trust_single.html' + context_object_name = 'contact' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAoneDelTrust(DeleteView): + model = RDTrustPerson + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_1_trust_del.html' + context_object_name = 'contact' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAoneAddTrust(CreateView): + model = RDTrustPerson + success_url = reverse_lazy('recoverdir') + form_class = RDTrustPersonF + template_name = "recoverdir/rd_elements_forms/rd_area_1_addtrust.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAoneUpdateTrust(UpdateView): + model = RDTrustPerson + success_url = reverse_lazy('recoverdir') + form_class = RDTrustPersonF + template_name = "recoverdir/rd_elements_forms/rd_area_1_addtrust.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +########################## ABSCHNITT 2 ################################## +# Handlungsleitfaden Finanzen und Vorsorge +class RDAtwoAddHLFV(CreateView): + model = HandlungsleitfadenVF + success_url = reverse_lazy('recoverdir') + form_class = HLFVForm + template_name = "recoverdir/rd_elements_forms/rd_area_2_addhlvf.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAtwoUpdateFV(UpdateView): + model = HandlungsleitfadenVF + success_url = reverse_lazy('recoverdir') + form_class = HLFVForm + template_name = "recoverdir/rd_elements_forms/rd_area_2_addhlvf.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# Banken usw. +class RDAtwoViewdeposit(DetailView): + model = DepositVollmacht + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_2_deposit_single.html' + context_object_name = 'deposit' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAtwoDeldeposit(DeleteView): + model = DepositVollmacht + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_2_deposit_del.html' + context_object_name = 'deposit' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAtwoAdddeposit(CreateView): + model = DepositVollmacht + success_url = reverse_lazy('recoverdir') + form_class = DepositVollmachtF + template_name = "recoverdir/rd_elements_forms/rd_area_2_adddeposit.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + if(self.request.FILES and self.request.FILES['vollmacht_doc']): + # Randomize File-Name keeping extension + file = self.request.FILES['vollmacht_doc'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.vollmacht_doc = file + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAtwoUpdatedeposit(UpdateView): + model = DepositVollmacht + success_url = reverse_lazy('recoverdir') + form_class = DepositVollmachtF + template_name = "recoverdir/rd_elements_forms/rd_area_2_adddeposit.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# ERGO Digitaler Versicherungsordner +class RDAtwoViewergo(DetailView): + model = ErgoVerDir + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_2_ergo_single.html' + context_object_name = 'ergo' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAtwoDelergo(DeleteView): + model = ErgoVerDir + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_2_ergo_del.html' + context_object_name = 'ergo' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAtwoAddergo(CreateView): + model = ErgoVerDir + success_url = reverse_lazy('recoverdir') + form_class = ErgoVerDirF + template_name = "recoverdir/rd_elements_forms/rd_area_2_addergo.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAtwoUpdateergo(UpdateView): + model = ErgoVerDir + success_url = reverse_lazy('recoverdir') + form_class = ErgoVerDirF + template_name = "recoverdir/rd_elements_forms/rd_area_2_addergo.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# Online Banking +class RDAtwoViewonlinebank(DetailView): + model = OnlineBank + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_2_onlinebank_single.html' + context_object_name = 'onlinebank' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAtwoDelonlinebank(DeleteView): + model = OnlineBank + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_2_onlinebank_del.html' + context_object_name = 'onlinebank' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAtwoAddonlinebank(CreateView): + model = OnlineBank + success_url = reverse_lazy('recoverdir') + form_class = OnlineBankF + template_name = "recoverdir/rd_elements_forms/rd_area_2_addonlinebank.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + form.instance.area = self.kwargs["area"] + if(self.request.FILES and self.request.FILES['vollmacht_doc']): + # Randomize File-Name keeping extension + file = self.request.FILES['vollmacht_doc'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.vollmacht_doc = file + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAtwoUpdateonlinebank(UpdateView): + model = OnlineBank + success_url = reverse_lazy('recoverdir') + form_class = OnlineBankF + template_name = "recoverdir/rd_elements_forms/rd_area_2_addonlinebank.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + if(self.request.FILES and self.request.FILES['vollmacht_doc']): + # Randomize File-Name keeping extension + file = self.request.FILES['vollmacht_doc'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.vollmacht_doc = file + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# Streaming Abo +class RDAthreeViewstreaming(DetailView): + model = StreamingAbo + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_3_streamingabo_single.html' + context_object_name = 'streaming' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAthreeDelstreaming(DeleteView): + model = StreamingAbo + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_3_streamingabo_del.html' + context_object_name = 'streaming' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAthreeAddstreaming(CreateView): + model = StreamingAbo + success_url = reverse_lazy('recoverdir') + form_class = StreamingAboF + template_name = "recoverdir/rd_elements_forms/rd_area_3_addstreamingabo.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + if(self.request.FILES and self.request.FILES['vollmacht_doc']): + # Randomize File-Name keeping extension + file = self.request.FILES['vollmacht_doc'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.vollmacht_doc = file + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAthreeUpdatestreaming(UpdateView): + model = StreamingAbo + success_url = reverse_lazy('recoverdir') + form_class = StreamingAboF + template_name = "recoverdir/rd_elements_forms/rd_area_3_addstreamingabo.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + if(self.request.FILES and self.request.FILES['vollmacht_doc']): + # Randomize File-Name keeping extension + file = self.request.FILES['vollmacht_doc'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.vollmacht_doc = file + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# Digitaler Account +class RDAfourViewdigitalaccount(DetailView): + model = DigitalAccounts + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_4_digitalaccount_single.html' + context_object_name = 'account' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAfourDeldigitalaccount(DeleteView): + model = DigitalAccounts + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_4_digitalaccount_del.html' + context_object_name = 'account' + + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAfourAdddigitalaccount(CreateView): + model = DigitalAccounts + success_url = reverse_lazy('recoverdir') + form_class = DigitalAccountsF + template_name = "recoverdir/rd_elements_forms/rd_area_4_adddigitalaccount.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + form.instance.area = self.kwargs["area"] + if(self.request.FILES and self.request.FILES['vollmacht_doc']): + # Randomize File-Name keeping extension + file = self.request.FILES['vollmacht_doc'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.vollmacht_doc = file + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAfourUpdatedigitalaccount(UpdateView): + model = DigitalAccounts + success_url = reverse_lazy('recoverdir') + form_class = DigitalAccountsF + template_name = "recoverdir/rd_elements_forms/rd_area_4_adddigitalaccount.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + if(self.request.FILES and self.request.FILES['vollmacht_doc']): + # Randomize File-Name keeping extension + file = self.request.FILES['vollmacht_doc'] + file_ext_arr = file.name.split(".") + file_ext = file_ext_arr[len(file_ext_arr)-1] + file.name = randomString() + "." + file_ext + form.instance.vollmacht_doc = file + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# Personalaccount +class RDAfiveViewpersonal(DetailView): + model = Personal + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_5_personal_single.html' + context_object_name = 'personal' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAfiveDelpersonal(DeleteView): + model = Personal + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_5_personal_del.html' + context_object_name = 'personal' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAfiveAddpersonal(CreateView): + model = Personal + success_url = reverse_lazy('recoverdir') + form_class = PersonalF + template_name = "recoverdir/rd_elements_forms/rd_area_5_addpersonal.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAfiveUpdatepersonal(UpdateView): + model = Personal + success_url = reverse_lazy('recoverdir') + form_class = PersonalF + template_name = "recoverdir/rd_elements_forms/rd_area_5_addpersonal.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# RDElse +class RDAnineViewelse(DetailView): + model = RDElse + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_9_else_single.html' + context_object_name = 'else' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAnineDelelse(DeleteView): + model = RDElse + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_9_else_del.html' + context_object_name = 'ele' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAnineAddelse(CreateView): + model = RDElse + success_url = reverse_lazy('recoverdir') + form_class = RDElseF + template_name = "recoverdir/rd_elements_forms/rd_area_9_addelse.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAnineUpdateelse(UpdateView): + model = RDElse + success_url = reverse_lazy('recoverdir') + form_class = RDElseF + template_name = "recoverdir/rd_elements_forms/rd_area_9_addelse.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +# RDContract +class RDAsevenViewcontract(DetailView): + model = RDContract + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_7_contract_single.html' + context_object_name = 'contract' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + +class RDAsevenDelcontract(DeleteView): + model = RDContract + success_url = reverse_lazy('recoverdir') + template_name = 'recoverdir/rd_elements_forms/rd_area_7_contract_del.html' + context_object_name = 'ele' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAsevenAddcontract(CreateView): + model = RDContract + success_url = reverse_lazy('recoverdir') + form_class = RDContractF + template_name = "recoverdir/rd_elements_forms/rd_area_7_addcontract.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +class RDAsevenUpdatecontract(UpdateView): + model = RDContract + success_url = reverse_lazy('recoverdir') + form_class = RDContractF + template_name = "recoverdir/rd_elements_forms/rd_area_7_addcontract.html" + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + def form_valid(self, form): + form.instance.agency = self.request.user.profile.agency + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + return context + +################################################## HISTORY ELEMENT VIEW ########################################## + +# Persönliches Schreiben +class PLSingleHistory(DetailView): + model = PersLetter + template_name = 'recoverdir/rd_persletter_single.html' + context_object_name = 'persletter' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = PersLetter.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'historyelement' : shown_element, + }) + return context + +class HLSingleHistory(DetailView): + model = Handlungsleitfaden + template_name = 'recoverdir/rd_elements_forms/rd_area_1_hl_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = Handlungsleitfaden.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'hl' : shown_element, + 'history' : True + }) + return context + +# Handlungsleitfaden 2 +class HLVFSingleHistory(DetailView): + model = HandlungsleitfadenVF + template_name = 'recoverdir/rd_elements_forms/rd_area_2_hl_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = HandlungsleitfadenVF.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'hlvf' : shown_element, + 'history' : True + }) + return context + +# CONTACT +class ContactSingleHistory(DetailView): + model = RDContact + template_name = 'recoverdir/rd_elements_forms/rd_area_1_contact_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = RDContact.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'contact' : shown_element, + 'history' : True + }) + return context + +# CONTACT +class TrustSingleHistory(DetailView): + model = RDTrustPerson + template_name = 'recoverdir/rd_elements_forms/rd_area_1_trust_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = RDTrustPerson.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'contact' : shown_element, + 'history' : True + }) + return context + +# Bankenvollmacht +class DepositSingleHistory(DetailView): + model = DepositVollmacht + template_name = 'recoverdir/rd_elements_forms/rd_area_2_deposit_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = DepositVollmacht.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'deposit' : shown_element, + 'history' : True + }) + return context + +# DOCUMENT +class DocumentSingleHistory(DetailView): + model = Documents + template_name = 'recoverdir/rd_doc_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = Documents.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'document' : shown_element, + 'history' : True + }) + return context + +# Ergo Versicherungsordner +class ErgoSingleHistory(DetailView): + model = ErgoVerDir + template_name = 'recoverdir/rd_elements_forms/rd_area_2_ergo_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = ErgoVerDir.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'ergo' : shown_element, + 'history' : True + }) + return context + +# Online-Bank +class OnlinebankSingleHistory(DetailView): + model = OnlineBank + template_name = 'recoverdir/rd_elements_forms/rd_area_2_onlinebank_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = OnlineBank.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'onlinebank' : shown_element, + 'history' : True + }) + return context + +# StreamingAbo +class StreamingSingleHistory(DetailView): + model = StreamingAbo + template_name = 'recoverdir/rd_elements_forms/rd_area_3_streamingabo_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = StreamingAbo.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'streaming' : shown_element, + 'history' : True + }) + return context + +# Digitaler Account +class DigitalAccountSingleHistory(DetailView): + model = DigitalAccounts + template_name = 'recoverdir/rd_elements_forms/rd_area_4_digitalaccount_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = DigitalAccounts.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'account' : shown_element, + 'history' : True + }) + return context + +# Personal +class PersonalSingleHistory(DetailView): + model = Personal + template_name = 'recoverdir/rd_elements_forms/rd_area_5_personal_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = Personal.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'personal' : shown_element, + 'history' : True + }) + return context + +# VETRTRAG +class ContractSingleHistory(DetailView): + model = RDContract + template_name = 'recoverdir/rd_elements_forms/rd_area_7_contract_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = RDContract.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'contract' : shown_element, + 'history' : True + }) + return context + +# ELSE +class ElseSingleHistory(DetailView): + model = RDElse + template_name = 'recoverdir/rd_elements_forms/rd_area_9_else_single.html' + + def dispatch(self, *args, **kwargs): + if(checkForLogin(self) and self.instance.agency == self.request.user.profile.agency): + return super().dispatch(*args, **kwargs) + else: + return redirect('recoverdir-login') + + # Gewünschte Revision aufrufen + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'recoverdir'}) + + historyelements = RDElse.objects.get(pk=self.kwargs['pk']).history.all() + + shown_element = None + for he in historyelements: + if he.pk == self.kwargs["rev"]: + shown_element = he + + context.update({ + 'else' : shown_element, + 'history' : True + }) + return context diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..684c26e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,38 @@ +channels==2.4.0 +channels-redis==3.0.1 +Django==3.0 +django-bootstrap-datepicker-plus==3.0.5 +django-channels-presence==1.0.0 +django-cleanup==5.0.0 +django-colorful==1.3 +django-crispy-forms==1.8.1 +django-cryptography==1.0 +django-encrypted-filefield==0.2.2 +django-ical==1.7.1 +django-js-asset==1.2.2 +django-jsonfield==1.3.1 +django-mathfilters==1.0.0 +django-passwords==0.3.12 +django-ranged-response==0.2.0 +django-simple-history==2.11.0 +django-six==1.0.4 +django-summernote==0.8.11.6 +django-user-agents==0.4.0 +django-utils-six==2.0 +djangorestframework==3.11.0 +djradicale==0.0.14 +ics==0.7 +mysqlclient==2.0.1 +Pillow==6.2.1 +pycparser==2.20 +python-bidi==0.4.2 +python-magic==0.4.18 +python-dateutil==2.6.0 +pytz==2019.3 +requests==2.22.0 +requests-oauthlib==1.3.0 +webcolors==1.10 +xhtml2pdf==0.2.5 +django-simple-captcha==0.5.13 +auditlog3==1.0.1 +filetype==1.0.7 diff --git a/standards/__init__.py b/standards/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/standards/__pycache__/__init__.cpython-38.pyc b/standards/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..898070d Binary files /dev/null and b/standards/__pycache__/__init__.cpython-38.pyc differ diff --git a/standards/__pycache__/admin.cpython-38.pyc b/standards/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..5e6386e Binary files /dev/null and b/standards/__pycache__/admin.cpython-38.pyc differ diff --git a/standards/__pycache__/apps.cpython-38.pyc b/standards/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..27eaa47 Binary files /dev/null and b/standards/__pycache__/apps.cpython-38.pyc differ diff --git a/standards/__pycache__/forms.cpython-38.pyc b/standards/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..d5cb9bc Binary files /dev/null and b/standards/__pycache__/forms.cpython-38.pyc differ diff --git a/standards/__pycache__/models.cpython-38.pyc b/standards/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..26b689d Binary files /dev/null and b/standards/__pycache__/models.cpython-38.pyc differ diff --git a/standards/__pycache__/urls.cpython-38.pyc b/standards/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..d499e0d Binary files /dev/null and b/standards/__pycache__/urls.cpython-38.pyc differ diff --git a/standards/__pycache__/views.cpython-38.pyc b/standards/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..af8cd08 Binary files /dev/null and b/standards/__pycache__/views.cpython-38.pyc differ diff --git a/standards/admin.py b/standards/admin.py new file mode 100644 index 0000000..35b08d8 --- /dev/null +++ b/standards/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import Standards +# Register your models here. +admin.site.register(Standards) +# Register your models here. diff --git a/standards/apps.py b/standards/apps.py new file mode 100644 index 0000000..7a64276 --- /dev/null +++ b/standards/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class StandardsConfig(AppConfig): + name = 'standards' diff --git a/standards/forms.py b/standards/forms.py new file mode 100644 index 0000000..936d0c9 --- /dev/null +++ b/standards/forms.py @@ -0,0 +1,187 @@ +from django import forms +from django.forms import ModelForm +from .models import Standards +from areas.models import Areas +from tasks.models import Tasks +from django.contrib.auth.models import User +from users.models import Profile, UserFullName +from django_summernote.widgets import SummernoteInplaceWidget + + + +class StandardAddStandard(forms.ModelForm): + + class Meta: + model =Standards + widgets = { + 'content': SummernoteInplaceWidget() + } + labels = { + "name" : "Titel", + "area" : "Bereich", + "task" : "Tätigkeit", + "content": "Inhalt", + "public" : "Direkt veröffentlichen?", + "freefield_title" : "Titel und Text", + "freefield_content" : "", + } + fields = ['name', 'area', 'task', 'content', 'public',"freefield_title", "freefield_content"] + + ''' + + Hier werden die Elemente für die DropDowns erstellt, damit + ein Standard nur einem Aufgabenbereich aus einem Bereich zugewiesen wird. + + Damit nach der Auswahl des Bereichs auch eine valide Aufgabe ankommt, wird diese + hier manuel validiert und das Query-Set mit der Bereichsauswahl geladen. + + ''' + + def __init__(self, *args, **kwargs): + super(StandardAddStandard, self).__init__(*args, **kwargs) + self.fields['area'].queryset = Areas.objects.filter(agency__pk=kwargs['instance'].profile.agency.pk) + self.fields['task'].queryset = Tasks.objects.none() + if 'area' in self.data: + try: + areaid = int(self.data.get('area')) + self.fields['task'].queryset = Tasks.objects.filter(area__id=areaid).order_by('name') + except (ValueError, TypeError): + pass + elif self.instance.pk: + self.fields['task'].queryset = Tasks.objects.none() + + self.fields['area'].required = True + self.fields['task'].required = True + + self.fields['freefield_title'].required = False + self.fields['freefield_content'].required = False + self.fields['freefield_content'].widget.attrs['rows'] = 2 + + #self.fields['representative'].queryset = UserFullName.objects.filter(profile__agency__pk=kwargs['instance'].profile.agency.pk) + #self.fields['executor'].queryset = UserFullName.objects.filter(profile__agency__pk=kwargs['instance'].profile.agency.pk) + #self.fields['authority'].queryset = UserFullName.objects.filter(profile__agency__pk=kwargs['instance'].profile.agency.pk) + + self.fields['checked_groups'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_files'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_standards'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + self.fields['added_quicklinks'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_contacts'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_passwords'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + #USERS + self.fields['us_verant'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['us_ex'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['us_ver'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + #GROUPS + self.fields['group_verant'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['group_ex'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['group_ver'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + + + + +class StandardAddStandardEditor(forms.ModelForm): + + class Meta: + model = Standards + widgets = { + 'content': SummernoteInplaceWidget(), + } + labels = { + "content" : "Inhalt" + } + fields = ['content'] + +class StandardUpdateStandard(forms.ModelForm): + + class Meta: + model =Standards + widgets = { + 'content': SummernoteInplaceWidget() + } + labels = { + "name" : "Titel", + "area" : "Bereich", + "task" : "Tätigkeit", + "content": "Inhalt", + "freefield_title" : "Titel und Text", + "freefield_content" : "", + 'public' : "Veröffentlichen" + } + fields = ['name', 'area', 'task', 'content',"freefield_title", "freefield_content", 'public'] + ''' + + Hier werden die Elemente für die DropDowns erstellt, damit + ein Standard nur einem Aufgabenbereich aus einem Bereich zugewiesen wird. + + Damit nach der Auswahl des Bereichs auch eine valide Aufgabe ankommt, wird diese + hier manuel validiert und das Query-Set mit der Bereichsauswahl geladen. + + ''' + + def __init__(self, *args, **kwargs): + loggeduser = kwargs['instance'].created_standard_by + standard = kwargs['instance'] + super(StandardUpdateStandard, self).__init__(*args, **kwargs) + + try: + self.fields['area'].queryset = Areas.objects.filter(agency__pk=loggeduser.profile.agency.pk) + # Dummy PK + self.fields['task'].queryset = Tasks.objects.filter(area__pk=standard.area.pk) + except: + pass + + if 'area' in self.data: + try: + areaid = int(self.data.get('area')) + self.fields['task'].queryset = Tasks.objects.filter(area__id=areaid).order_by('name') + except (ValueError, TypeError): + pass + elif loggeduser != None and standard.area != None: + self.fields['task'].queryset = Tasks.objects.filter(area__pk=standard.area.pk) + + self.fields['area'].required = True + self.fields['task'].required = True + + self.fields['freefield_title'].required = False + self.fields['freefield_content'].required = False + self.fields['freefield_content'].widget.attrs['rows'] = 2 + #self.fields['representative'].queryset = UserFullName.objects.filter(profile__agency__pk=loggeduser.profile.agency.pk) + #self.fields['executor'].queryset = UserFullName.objects.filter(profile__agency__pk=loggeduser.profile.agency.pk) + #self.fields['authority'].queryset = UserFullName.objects.filter(profile__agency__pk=loggeduser.profile.agency.pk) + + self.fields['checked_groups'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_files'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_standards'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + self.fields['added_quicklinks'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_contacts'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['added_passwords'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + self.fields['us_verant'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['us_ex'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['us_ver'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + #GROUPS + self.fields['group_verant'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['group_ex'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['group_ver'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + self.fields['checked_networks'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + self.fields['public'] = forms.BooleanField(initial=standard.public, required=False) + +class StandardUpdateStandardEditor(forms.ModelForm): + + class Meta: + model = Standards + widgets = { + 'content': SummernoteInplaceWidget() + } + labels = { + "content" : "Inhalt" + } + fields = ['content'] \ No newline at end of file diff --git a/standards/migrations/0001_initial.py b/standards/migrations/0001_initial.py new file mode 100644 index 0000000..7d6e793 --- /dev/null +++ b/standards/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('organizer', '0001_initial'), + ('cloud', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='StandardCommentRate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rate_stats', models.IntegerField(default=0)), + ], + ), + migrations.CreateModel( + name='StandardComments', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', models.CharField(default='', max_length=200)), + ('comment_on', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('last_modified_on', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ], + ), + migrations.CreateModel( + name='Standards', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ('content', models.TextField(blank=True, default='', verbose_name='Inhalt')), + ('created_standard_date', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('published_on', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('last_modified_on', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('public', models.BooleanField(default=False)), + ('freefield_title', models.CharField(default='', max_length=200, null=True)), + ('freefield_content', models.TextField(default='', max_length=500, null=True)), + ('delflag', models.BooleanField(default=False)), + ('deldate', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('shared_on', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('agencynetworkcounter', models.IntegerField(default=0)), + ('addedcontacts', models.ManyToManyField(blank=True, to='organizer.AGContacts')), + ('addedfiles', models.ManyToManyField(blank=True, to='cloud.DataFile')), + ('addedpasswords', models.ManyToManyField(blank=True, to='organizer.AGPassword')), + ('addedquicklinks', models.ManyToManyField(blank=True, related_name='standard_quicklinks', to='organizer.QuickLinks')), + ], + ), + ] diff --git a/standards/migrations/0002_auto_20200925_0713.py b/standards/migrations/0002_auto_20200925_0713.py new file mode 100644 index 0000000..c8386f2 --- /dev/null +++ b/standards/migrations/0002_auto_20200925_0713.py @@ -0,0 +1,111 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('tasks', '0001_initial'), + ('standards', '0001_initial'), + ('areas', '0002_auto_20200925_0713'), + ] + + operations = [ + migrations.AddField( + model_name='standards', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='standards', + name='area', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='areas.Areas'), + ), + migrations.AddField( + model_name='standards', + name='authority', + field=models.ManyToManyField(blank=True, related_name='user_aut', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standards', + name='comments', + field=models.ManyToManyField(blank=True, related_name='comments', to='standards.StandardComments'), + ), + migrations.AddField( + model_name='standards', + name='created_standard_by', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standards', + name='executor', + field=models.ManyToManyField(blank=True, related_name='user_ex', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standards', + name='favoritfrom', + field=models.ManyToManyField(blank=True, related_name='FavoritFrom', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standards', + name='last_modified_by', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user_modified_standard', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standards', + name='linked_standards', + field=models.ManyToManyField(blank=True, to='standards.Standards'), + ), + migrations.AddField( + model_name='standards', + name='parent_standard', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='partentedstandard', to='standards.Standards'), + ), + migrations.AddField( + model_name='standards', + name='published_by', + field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user_published_standard', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standards', + name='representative', + field=models.ManyToManyField(blank=True, related_name='user_rep', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standards', + name='task', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='tasks.Tasks'), + ), + migrations.AddField( + model_name='standards', + name='visibleby', + field=models.ManyToManyField(blank=True, to='users.AgencyGroup'), + ), + migrations.AddField( + model_name='standardcomments', + name='comment_by', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='standardcomments', + name='standard', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='standards.Standards'), + ), + migrations.AddField( + model_name='standardcommentrate', + name='oncomment', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='standards.StandardComments'), + ), + migrations.AddField( + model_name='standardcommentrate', + name='rated_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/standards/migrations/0003_auto_20201026_0914.py b/standards/migrations/0003_auto_20201026_0914.py new file mode 100644 index 0000000..93eeab4 --- /dev/null +++ b/standards/migrations/0003_auto_20201026_0914.py @@ -0,0 +1,29 @@ +# Generated by Django 3.0 on 2020-10-26 09:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0029_regnotfallhilfe_orderdate'), + ('standards', '0002_auto_20200925_0713'), + ] + + operations = [ + migrations.AddField( + model_name='standards', + name='authority_group', + field=models.ManyToManyField(blank=True, related_name='group_aut', to='users.AgencyGroup'), + ), + migrations.AddField( + model_name='standards', + name='executor_group', + field=models.ManyToManyField(blank=True, related_name='group_ex', to='users.AgencyGroup'), + ), + migrations.AddField( + model_name='standards', + name='representative_group', + field=models.ManyToManyField(blank=True, related_name='group_rep', to='users.AgencyGroup'), + ), + ] diff --git a/standards/migrations/__init__.py b/standards/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/standards/migrations/__pycache__/0001_initial.cpython-38.pyc b/standards/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..c25e5ea Binary files /dev/null and b/standards/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/standards/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc b/standards/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc new file mode 100644 index 0000000..f09f98e Binary files /dev/null and b/standards/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc differ diff --git a/standards/migrations/__pycache__/0003_auto_20201026_0914.cpython-38.pyc b/standards/migrations/__pycache__/0003_auto_20201026_0914.cpython-38.pyc new file mode 100644 index 0000000..02055bf Binary files /dev/null and b/standards/migrations/__pycache__/0003_auto_20201026_0914.cpython-38.pyc differ diff --git a/standards/migrations/__pycache__/__init__.cpython-38.pyc b/standards/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..075c255 Binary files /dev/null and b/standards/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/standards/models.py b/standards/models.py new file mode 100644 index 0000000..13dcfeb --- /dev/null +++ b/standards/models.py @@ -0,0 +1,96 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency +from django.urls import reverse +from areas.models import Areas +from tasks.models import Tasks +from cloud.models import DataFile +from users.models import AgencyGroup +from organizer.models import AGPassword, AGContacts, QuickLinks +import datetime +from django.utils import timezone + +class StandardCommentRate(models.Model): + #standard = models.ForeignKey("Standards", on_delete=models.CASCADE) + rated_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + rate_stats = models.IntegerField(default=0) + oncomment = models.ForeignKey("StandardComments", on_delete=models.CASCADE) + +class StandardComments(models.Model): + standard = models.ForeignKey("Standards", on_delete=models.CASCADE) + content = models.CharField(max_length=200, blank=False, default="") + comment_by = models.ForeignKey(User, on_delete=models.CASCADE) + comment_on = models.DateTimeField(default=timezone.now, blank=True) + last_modified_on = models.DateTimeField(default=timezone.now, blank=True) + +class Standards(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + area = models.ForeignKey(Areas, on_delete=models.SET_NULL, blank=True, null=True) + task = models.ForeignKey(Tasks, on_delete=models.SET_NULL, blank=True, null=True) + name = models.CharField(max_length=200, blank=False, default="") + content = models.TextField(blank=True, verbose_name='Inhalt', default="") + + created_standard_by = models.ForeignKey(User, default=None, null=True, on_delete=models.SET_NULL) + created_standard_date = models.DateTimeField(default=timezone.now, blank=True) + + published_by = models.ForeignKey(User, on_delete=models.SET_NULL, related_name='user_published_standard', default=None, null=True) + published_on = models.DateTimeField(default=timezone.now, blank=True) + + last_modified_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='user_modified_standard', default=None) + last_modified_on = models.DateTimeField(default=timezone.now, blank=True) + + public = models.BooleanField(default=False) + + freefield_title = models.CharField(max_length=200, blank=False, null=True, default="") + freefield_content = models.TextField(max_length=500, blank=False, null=True, default="") + + delflag = models.BooleanField(default=False) + deldate = models.DateTimeField(default=timezone.now, blank=True) + + + # USER + # VERTRETER + #representative = models.ForeignKey(User, on_delete=models.PROTECT, related_name="user_repr", blank=True, null=True) + representative = models.ManyToManyField(User, blank=True, related_name='user_rep') + # AUSFÜHRENDER + #executor = models.ForeignKey(User, on_delete=models.PROTECT, related_name="user_executor", blank=True, null=True) + executor = models.ManyToManyField(User, blank=True, related_name='user_ex') + # VERANTWORTLICHER + #authority = models.ForeignKey(User, on_delete=models.PROTECT, related_name="user_authority", blank=True, null=True) + authority = models.ManyToManyField(User, blank=True, related_name='user_aut') + + # GRUPPEN + representative_group = models.ManyToManyField(AgencyGroup, blank=True, related_name="group_rep") + executor_group = models.ManyToManyField(AgencyGroup, blank=True, related_name="group_ex") + authority_group = models.ManyToManyField(AgencyGroup, blank=True, related_name="group_aut") + + # FILES + addedfiles = models.ManyToManyField(DataFile, blank=True) + # VERLINKTE STANDARDS + linked_standards = models.ManyToManyField('Standards', blank=True) + # GORUPS + visibleby = models.ManyToManyField(AgencyGroup, blank=True) + # Contacts + addedcontacts = models.ManyToManyField(AGContacts, blank=True) + # Passwords + addedpasswords = models.ManyToManyField(AGPassword, blank=True) + # Quicklinks + addedquicklinks = models.ManyToManyField(QuickLinks, blank=True, related_name="standard_quicklinks") + + # FIELD FOR AGENCYNETWORK + comments = models.ManyToManyField("StandardComments", blank=True, related_name='comments') + parent_standard = models.ForeignKey("Standards", related_name='partentedstandard', on_delete=models.SET_NULL, blank=True, null=True, default=None) + shared_on = models.DateTimeField(default=timezone.now, blank=True) + + favoritfrom = models.ManyToManyField(User, blank=True, related_name="FavoritFrom") + + + #Counter, wie oft dieser Standard in eine andere Agentur kopiert wird + agencynetworkcounter = models.IntegerField(default=0) + + def __str__(self): + return f'{self.name}' + + # Hier Path für Templates des Models mit Parametern + def get_absolute_url(self): + return reverse('standards-add', kwargs={'pk':self.pk}) diff --git a/standards/templates/standards/agencynetwork_content.html b/standards/templates/standards/agencynetwork_content.html new file mode 100644 index 0000000..ceca38e --- /dev/null +++ b/standards/templates/standards/agencynetwork_content.html @@ -0,0 +1,136 @@ + {% load counter_tag %} +
+
+
+
+

+ + +

+ + + + + + + + + + + + {% for agn in agencynetworks %} + {% getsumofallag agn.pk as agsum %} + {% getoutstandinginvites agn.pk as outstanding %} + {% ifaginadminagn agn.pk request.user.profile.agency.pk as is_adminag %} + + + + + + + + {% endfor %} + +
NameErstelleragenturLetzte Aktivität amAgenturenStandards
{{agn.name}} + {% if agn.creator_agency == None %} + Agentur gelöscht + {% endif %} + {{agn.creator_agency.name }} {{agn.lastactivity}}{{agsum}}{{agn.standards.all|length}}
+
+

+
+
+
+ + +
+
+
Beliebte Standards
+

+ {% for s in famestandards %} + {% if forloop.counter < 10 %} + {{s.name|truncatechars:30}} ({{s.agencynetworkcounter}})
+ {% endif %} + {% endfor %} +

+
+
+
+
+ +{% for agn in agencynetworks %} + +{% endfor %} + + + + diff --git a/standards/templates/standards/agencynetwork_content.html_SAVE.html b/standards/templates/standards/agencynetwork_content.html_SAVE.html new file mode 100644 index 0000000..c7e3a6d --- /dev/null +++ b/standards/templates/standards/agencynetwork_content.html_SAVE.html @@ -0,0 +1,221 @@ +
+
+
+
+

+ +

+
+
+
+ + +
+
+
Beliebte Standards
+

+ Keine +

+
+
+
+
+ \ No newline at end of file diff --git a/standards/templates/standards/standard_area.html b/standards/templates/standards/standard_area.html new file mode 100644 index 0000000..0028d69 --- /dev/null +++ b/standards/templates/standards/standard_area.html @@ -0,0 +1,87 @@ +{% extends "users/base.html" %} +{% block content %} +
+ +

Standards aus dem Bereich {{areaname}}

+
+
+ + + + + + + + + + + + + {% for item in standards_of_agency_area %} + {% if item.public or item.created_standard_by == user or perms.users.standardmanager %} + + + + + + + + + + {% endif %} + {% endfor %} +
TitelErstellt vonErstellt amGeändert vonGeändert amÖffentlichkeitsstatus 
{{item.name}}{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}}{{ item.created_standard_date|date:"d.m.Y, H:i"}}{{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }}{{ item.last_modified_on|date:"d.m.Y, H:i"}}{{item.public|yesno:"Öffentlich,Nicht öffentlich"}} + {% if item.created_standard_by == user or perms.users.standardmanager %} + + + + + + + + + {% endif %} +
+
+
+ + + +{% endblock content %} diff --git a/standards/templates/standards/standard_confirm_delete.html b/standards/templates/standards/standard_confirm_delete.html new file mode 100644 index 0000000..14604fe --- /dev/null +++ b/standards/templates/standards/standard_confirm_delete.html @@ -0,0 +1,20 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+
+ +
+
+
+ +
+ {% csrf_token %} +
+   + Abbrechen +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/standards/templates/standards/standard_task.html b/standards/templates/standards/standard_task.html new file mode 100644 index 0000000..3fd82a2 --- /dev/null +++ b/standards/templates/standards/standard_task.html @@ -0,0 +1,102 @@ +{% extends "users/base.html" %} +{% block content %} +
+ +

Standards aus dem Tätigkeitsbereich {{taskname}} des Bereichs {{areaname}} +  Standard +

+
+
+ + + + + + + + + + + + + {% for item in standards_of_agency_task %} + {% if item.public or item.created_standard_by == user or perms.users.standardmanager %} + + + + + + + + + + {% endif %} + {% endfor %} +
TitelErstellt vonErstellt amGeändert vonGeändert amÖffentlichkeitsstatus 
{{item.name}}{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}}{{ item.created_standard_date|date:"d.m.Y, H:i"}}{{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }}{{ item.last_modified_on|date:"d.m.Y, H:i"}}{{item.public|yesno:"Öffentlich,Nicht öffentlich"}} + {% if item.created_standard_by == user or perms.users.standardmanager %} + + + + + + + + + {% endif %} +
+
+
+ + +{% endblock content %} diff --git a/standards/templates/standards/standard_task_user.html b/standards/templates/standards/standard_task_user.html new file mode 100644 index 0000000..79a08dd --- /dev/null +++ b/standards/templates/standards/standard_task_user.html @@ -0,0 +1,102 @@ +{% extends "users/base.html" %} +{% block content %} +
+ +

Standards aus dem Tätigkeitsbereich {{taskname}} des Bereichs {{areaname}} von {{vieweduser.get_full_name}} +  Standard +

+
+
+ + + + + + + + + + + + + {% for item in standards_of_agency_task %} + {% if item.public or item.created_standard_by == user or perms.users.standardmanager %} + + + + + + + + + + {% endif %} + {% endfor %} +
TitelErstellt vonErstellt amGeändert vonGeändert amÖffentlichkeitsstatus 
{{item.name}}{{item.created_standard_by.first_name}} {{item.created_standard_by.last_name}}{{ item.created_standard_date|date:"d.m.Y, H:i"}}{{ item.last_modified_by.first_name }} {{ item.last_modified_by.last_name }}{{ item.last_modified_on|date:"d.m.Y, H:i"}}{{item.public|yesno:"Öffentlich,Nicht öffentlich"}} + {% if item.created_standard_by == user or perms.users.standardmanager %} + + + + + + + + + {% endif %} +
+
+
+ + +{% endblock content %} diff --git a/standards/templates/standards/standards_add.html b/standards/templates/standards/standards_add.html new file mode 100644 index 0000000..264876e --- /dev/null +++ b/standards/templates/standards/standards_add.html @@ -0,0 +1,1369 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% block content %} +
+ + {% if update == True %} +

Standard Bearbeiten{% if request.user.profile.showtooltips %} {% endif %}

+ {% else %} +

Neuen Standard anlegen{% if request.user.profile.showtooltips %} {% endif %}

+ {% endif %} +
+
+ {% csrf_token %} +
+ {% for field in normalForm %} + {% if field.is_hidden == False %} + {% if forloop.counter|divisibleby:6 %} +
+ {% if field.name != 'freefield_content' and field.name != 'freefield_title' and field.name != 'public' %} + {{field|as_crispy_field }} + {% endif %} + {% else %} + {% if field.name != 'freefield_content' and field.name != 'freefield_title' and field.name != 'public' %} + {{field|as_crispy_field }} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + + {% for field in normalForm %} + {% if field.is_hidden %} + {{field}} + {% endif %} + {% endfor %} + + +
+ +
+
+
+ +
+
+
+
+ {{ normalForm.freefield_title|as_crispy_field }} + {{ normalForm.freefield_content|as_crispy_field }} +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+ + {% if update == True %} + {% for s in standard_possible %} + + {% endfor %} + {% else %} + {% for s in standards %} + + {% endfor %} + {% endif %} + +
+ Verlinkte Standards: + + {% if update == True %} + {% for s in standard.linked_standards.all %} + + {% endfor %} + {% endif %} +
{{s.name}}
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ + {% if request.user.profile.agency.module_files %} +
+
+
+ +
+
+
+
+
+ +
+ +
+ + {% for f in files %} + + {% endfor %} + +
+ Verlinkte Dateien: + + {% if update == True %} + {% for f in standard.addedfiles.all %} + + {% endfor %} + {% endif %} +
{{f.name}}
+ + + {% if user|usergperm:"filesmanager" %} + + {% endif %} +
+
+
+ {% endif %} + +
+ + +
+
+
+ +
+
+ +
+
+ {% for g in agencygroups %} + {% if g.agencygroupname == "Notfallhilfe" %} + {% if request.user.profile.agency.module_recoverdir %} +
+ + +
+ {% endif %} + {% else %} +
+ + +
+ {% endif %} + {% endfor %} +
+
+
+ + +
+
+
+ +
+
+
+
+ {% if update == True %} + + {% if not standard.public %} + Nur veröffentlichte Standards können geteilt werden. + {% else %} + {% for agn in agencynetworks %} + {% ifaginadminagn agn.pk request.user.profile.agency.pk as is_admin %} + {% ifsharemember agn.pk request.user.profile.agency.pk as is_sharemember %} + {% ifstandardinagn agn.pk standard.pk as standard_in_agn %} + + {% if is_admin or is_sharemember %} +
+ + +
+ {% else %} +  {{agn.name}} + {% endif %} + {% endfor %} + {% endif %} + + {% else %} + Das Zuweisen zu einem Agenturverbund ist erst nach dem Anlegen eines neuen Standards möglich. + {% endif %} +
+
+
+ +
+ + {% if perms.users.standardgopublic %} +

{{ normalForm.public }} Veröffentlichen

+ {% else %} +

Wenn ein Standard erstellt/bearbeitet wurde, kann er nur von einer Person mit dem Recht Standards freischalten veröffentlicht werden.

+ + {% endif %} + +
+   + Abbrechen +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{% if not perms.users.standardmanager %} + + + +{% endif %} + +{% endblock content %} diff --git a/standards/templates/standards/standards_add_SAVE.html b/standards/templates/standards/standards_add_SAVE.html new file mode 100644 index 0000000..d57014b --- /dev/null +++ b/standards/templates/standards/standards_add_SAVE.html @@ -0,0 +1,702 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% block content %} +
+

Neuen Standard anlegen{% if request.user.profile.showtooltips %} {% endif %}

+
+
+ {% csrf_token %} +
+ {% for field in normalForm %} + {% if field.is_hidden == False %} + {% if forloop.counter|divisibleby:6 %} +
+ {% if field.name != 'freefield_content' and field.name != 'freefield_title' %} + {{field|as_crispy_field }} + {% endif %} + {% else %} + {% if field.name != 'freefield_content' and field.name != 'freefield_title' %} + {{field|as_crispy_field }} + {% endif %} + {% endif %} + {% endif %} + {% endfor %} + + {% for field in normalForm %} + {% if field.is_hidden %} + {{field}} + {% endif %} + {% endfor %} + + +
+ +
+
+
+ +
+
+
+
+ {{ normalForm.freefield_title|as_crispy_field }} + {{ normalForm.freefield_content|as_crispy_field }} +
+
+
+ + + +
+
+
+ +
+
+
+
+ +
+
+
+ + + + + +
+
+
+ +
+
+ +
+
+ {% for g in agencygroups %} +
+ + +
+ {% endfor %} +
+
+
+ {% if request.user.profile.agency.module_files %} +
+
+
+ +
+
+
+
+
+ +
+ +
+ + {% for f in files %} + + {% endfor %} + +
+ Verlinkte Dateien: + +
+ + + {% if user|usergperm:"filesmanager" %} + + {% endif %} + +
+
+
+ {% endif %} +
+
+
+ +
+
+
+
+
+ +
+ +
+ + {% for s in standards %} + + {% endfor %} + +
+ Verlinkte Standards: + +
+
+
+
+
+ +
+
+
+ +
+
+
+
+ Das Zuweisen zu einem Agenturverbund ist erst nach dem Anlegen eines neuen Standards möglich. +
+
+
+ +
+

Wenn ein Standard erstellt wurde, kann er nur von einer Person mit dem Recht Standards bearbeiten und freischalten veröffentlicht werden.

+
+   + Abbrechen +
+
+ + + + + + + + + + + + + + + + + + +{% if not perms.users.standard_management %} + + + +{% endif %} + +{% endblock content %} diff --git a/standards/templates/standards/standards_from_agn.html b/standards/templates/standards/standards_from_agn.html new file mode 100644 index 0000000..4fceab6 --- /dev/null +++ b/standards/templates/standards/standards_from_agn.html @@ -0,0 +1,135 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} + +
+

Standards aus Agenturverbund {{agn.name}} + +

+ Sie sehen nur veröffentlichte Standards innerhalb des Verbunds und Standards, die nicht von Ihrer Agentur geteilt worden sind. +
+ + +

+ +
+ + + + + + + + + + + + {% for standard in standards_of_agency_network %} + {% checkifsharedstandardinagency request.user.profile.agency standard as isshared %} + {% if standard.public %} + + + + + + + + {% endif %} + {% endfor %} + +
TitelAgenturZuletzt geändert amGeteiltStatus
+ {% setbool False %} + {% for ag in standard.visibleby.all %} + {% if request.user|has_group:ag.group.name %} + {% setbool True %} + {% endif %} + {% endfor %} + {% if standard.visibleby.all|length == 0 %} + {% setbool True %} + {% endif %} + {% getbool as groupchecker %} + + {% if groupchecker %} + {{standard.name|truncatechars:28}} + {% else %} +

 {{standard.name|truncatechars:28}}

+ {% endif %} +
{{standard.agency.name}} {{standard.last_modified_on|date:"d.m.Y, H:i"}}{{standard.agencynetworkcounter}}{% if isshared %}Übernommen {% elif request.user in standard.favoritfrom.all %}Favorit {% endif %}
+
+
+
+
+ + + +{% for agn in standards_of_agency_network %} + +{% endfor %} + + + + + + +{% endblock content %} diff --git a/standards/templates/standards/standards_management.html b/standards/templates/standards/standards_management.html new file mode 100644 index 0000000..d456044 --- /dev/null +++ b/standards/templates/standards/standards_management.html @@ -0,0 +1,394 @@ +{% extends "users/base.html" %} +{% load counter_tag %} + +{% block content %} + +
+

Standards{% if request.user.profile.showtooltips %} {% endif %} + +  Standard +

+ Sichtbar sind alle veröffentlichten und von {{ user.first_name }} {{ user.last_name}} erstellten Standards. +
+
+
+
+ + + +
+
+ {% for area in areas %} +
+
Standards aus dem Bereich {{area.name}}
+
+ + {% for ele in standardcontent %} + {% if ele.area == area %} + + {% for task in ele.tasks %} +
+
+
+ {{task.task.name}} ({{task.standards.count}}) +
+ + {% for s in task.standards %} + + {% setbool False %} + + {% for ag in s.visibleby.all %} + + {% if request.user|has_group:ag.group.name %} + + {% setbool True %} + {% endif %} + {% endfor %} + {% if s.visibleby.all|length == 0 %} + {% setbool True %} + {% endif %} + {% getbool as groupchecker %} + {% if forloop.counter0 < 3 %} + {% if groupchecker %} +

{{s.name|truncatechars:28}}

+ {% else %} +

 {{s.name|truncatechars:28}}

+ {% endif %} + {% endif %} + {% endfor %} +
+
+ {% endfor %} + {% endif %} + {% endfor %} + +
+ {% endfor %} + {% if agencynetworks|length > 0 %} +
+

Agenturverbünde + +

+ {% block agnet %} + {% include "standards/agencynetwork_content.html" %} + {% endblock %} +
+ {% endif %} + + +
+

Eigene Standards

+ +
+ + + + + + + + + + + + + {% for standard in standards_of_user %} + + + + + + + + + {% endfor %} + +
TitelErstellt amGeändert vonGeändert amÖffentlichkeitsstatus 
+ {% if standard.area != None and standard.task != None %} + {{standard.name}} + {% else %} + {% if standard.created_standard_by == request.user or perms.users.standardmanager %} + {{standard.name}}  + {% else %} + {{standard.name}}  + {% endif %} + {% endif %} + {{standard.created_standard_date|date:"d.m.Y, H:i"}}{{standard.last_modified_by.first_name}} {{standard.last_modified_by.last_name}}{{standard.last_modified_on|date:"d.m.Y, H:i"}}{{standard.public|yesno:"Öffentlich,Nicht öffentlich"}} + +
+ +
+
+ + +
+

Unveröffentlichte Standards

+ +
+ + + + + + + + + + + + + {% for standard in unpubstandards_of_user %} + + + + + + + + + {% endfor %} + +
TitelErstellt amGeändert vonGeändert amÖffentlichkeitsstatus 
+ {% if standard.area != None and standard.task != None %} + {{standard.name}} + {% else %} + {% if standard.created_standard_by == request.user or perms.users.standardmanager %} + {{standard.name}}  + {% else %} + {{standard.name}}  + {% endif %} + {% endif %} + {{standard.created_standard_date|date:"d.m.Y, H:i"}}{{standard.last_modified_by.first_name}} {{standard.last_modified_by.last_name}}{{standard.last_modified_on|date:"d.m.Y, H:i"}}{{standard.public|yesno:"Öffentlich,Nicht öffentlich"}} + +
+ +
+
+
+
+
+ + + + + + + + + + + + + + +{% endblock content %} diff --git a/standards/templates/standards/standards_management_SAVE.html b/standards/templates/standards/standards_management_SAVE.html new file mode 100644 index 0000000..80308c2 --- /dev/null +++ b/standards/templates/standards/standards_management_SAVE.html @@ -0,0 +1,224 @@ +{% extends "users/base.html" %} +{% load counter_tag %} + +{% block content %} +
+

Standards 

+ Sichtbar sind alle veröffentlichten und von {{ user.first_name }} {{ user.last_name}} erstellten Standards. +
+
+ +
+
+
+
+ +
+
+
+ {% for area in areas %} +
+
Standards aus dem Bereich {{area.name}}
+
+ {% for task in tasks %} + + {% if task.area == area %} +
+
+ {% setvar 0 %} + {% for standard in standards_of_agency %} + {% getvar as varcounter %} + {% if standard.task == task and standard.area == area%} + {% incvar %} + {% endif %} + {% endfor %} + {% getvar as varcounter %} +
+ {{task.name}} ({{varcounter}}) +
+ {% setvar 0 %} + {% for standard in standards_of_agency %} + + {% setbool False %} + {% for ag in standard.visibleby.all %} + {% if request.user|has_group:ag.group.name %} + {% setbool True %} + {% endif %} + {% endfor %} + + {% if standard.visibleby.all|length == 0 %} + {% setbool True %} + {% endif %} + {% getbool as groupchecker %} + + {% getvar as varcounter %} + {% if standard.task == task and standard.area == area and varcounter < 3 %} + {% incvar %} + {% if groupchecker %} +

{{standard.name|truncatechars:28}}

+ {% else %} +

 {{standard.name|truncatechars:28}}

+ {% endif %} + {% endif %} + {% endfor %} +
+
+ {% endif %} + {% endfor %} +
+ {% endfor %} +
+

Ihre Standards

+
+ +
+
+ + + + + + + + + + + + + {% for standard in standards_of_user %} + + + + + + + + + {% endfor %} + +
TitelErstellt amGeändert vonGeändert amÖffentlichkeitsstatus 
{{standard.name}}{{standard.created_standard_date|date:"d.m.Y, H:i"}}{{standard.last_modified_by.first_name}} {{standard.last_modified_by.last_name}}{{standard.last_modified_on|date:"d.m.Y, H:i"}}{{standard.public|yesno:"Öffentlich,Nicht öffentlich"}} + +
+ +
+
+
+

Unveröffentlichte Standards

+
+ +
+
+ + + + + + + + + + + + + {% for standard in unpubstandards_of_user %} + + + + + + + + + {% endfor %} + +
TitelErstellt amGeändert vonGeändert amÖffentlichkeitsstatus 
{{standard.name}}{{standard.created_standard_date|date:"d.m.Y, H:i"}}{{standard.last_modified_by.first_name}} {{standard.last_modified_by.last_name}}{{standard.last_modified_on|date:"d.m.Y, H:i"}}{{standard.public|yesno:"Öffentlich,Nicht öffentlich"}} + +
+ +
+
+
+
+
+ +{% endblock content %} \ No newline at end of file diff --git a/standards/templates/standards/standards_noentrie.html b/standards/templates/standards/standards_noentrie.html new file mode 100644 index 0000000..45453ac --- /dev/null +++ b/standards/templates/standards/standards_noentrie.html @@ -0,0 +1,7 @@ +{% extends "users/base.html" %} +{% block content %} +
+

Auf diesen Standard haben Sie keinen Zugriff!

+
+
+{% endblock %} \ No newline at end of file diff --git a/standards/templates/standards/standards_single.html b/standards/templates/standards/standards_single.html new file mode 100644 index 0000000..d5ffc01 --- /dev/null +++ b/standards/templates/standards/standards_single.html @@ -0,0 +1,409 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} +
+ + +

{{standard.name}} + + + + + + {% if standard.created_standard_by != null and standard.created_standard_by == user or perms.users.standardmanager %} + + + {% endif %} + +

+ +
+
+ + {% if standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.authority.count > 0 or standard.executor.count > 0 or standard.representative.count > 0 or standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.freefield_title|length > 0 or standard.addedcontacts.all|length > 0 or standard.addedpasswords.all|length > 0 or standard.addedquicklinks.all|length > 0 or standard.authority_group.count > 0 or standard.executor_group.count > 0 or standard.representative_group.count > 0 %} +
+ {% else %} +
+ {% endif %} +
+
+

+ {{standard.media}} + {{standard.content|safe}} +

+
+
+ + + {% if standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.authority.count > 0 or standard.executor.count > 0 or standard.representative.count > 0 or standard.addedfiles.all|length > 0 or standard.linked_standards.all|length > 0 or standard.freefield_title|length > 0 or standard.addedcontacts.all|length > 0 or standard.addedpasswords.all|length > 0 or standard.addedquicklinks.all|length > 0 or standard.authority_group.count > 0 or standard.executor_group.count > 0 or standard.representative_group.count > 0 %} +
+ + + {% if standard.freefield_title|length > 0 %} +
+
+
{{standard.freefield_title}}
+

+ {{standard.freefield_content}} +

+
+
+ {% endif %} + + + {% if standard.authority.count > 0 or standard.executor.count > 0 or standard.representative.count > 0 %} +
+
+
Personen
+

+ + {% if standard.executor.count > 0 %} + Ausführende
+ {% for u in standard.executor.all %} + {{u.first_name}} {{u.last_name}}{% if forloop.counter < standard.executor.count%} | {% endif %} + {% endfor %} +
+ {% endif %} + + {% if standard.representative.count > 0 %} + Vertreter
+ {% for u in standard.representative.all %} + {{u.first_name}} {{u.last_name}}{% if forloop.counter < standard.representative.count%} | {% endif %} + {% endfor %} +
+ {% endif %} + + + {% if standard.authority.count > 0 %} + Verantwortliche
+ {% for u in standard.authority.all %} + {{u.first_name}} {{u.last_name}}{% if forloop.counter < standard.authority.count%} | {% endif %} + {% endfor %} +
+ {% endif %} +

+
+
+ {% endif %} + + + {% if standard.authority_group.count > 0 or standard.executor_group.count > 0 or standard.representative_group.count > 0 %} +
+
+
Gruppen
+

+ + {% if standard.executor_group.count > 0 %} + Ausführende
+ {% for g in standard.executor_group.all %} + {{g.agencygroupname}}{% if forloop.counter < standard.executor_group.count%} | {% endif %} + {% endfor %} +
+ {% endif %} + + {% if standard.representative_group.count > 0 %} + Vertretende
+ {% for g in standard.representative_group.all %} + {{g.agencygroupname}}{% if forloop.counter < standard.representative_group.count%} | {% endif %} + {% endfor %} +
+ {% endif %} + + + {% if standard.authority_group.count > 0 %} + Verantwortliche
+ {% for g in standard.authority_group.all %} + {{g.agencygroupname}}{% if forloop.counter < standard.authority_group.count%} | {% endif %} + {% endfor %} +
+ {% endif %} +

+
+
+ {% endif %} + + + + {% if standard.addedfiles.all|length > 0 %} +
+
+
Dateien
+

+ {% for files in standard.addedfiles.all %} + {{files.name|truncatechars:30}}
+ {% endfor %} +

+
+
+ {% endif %} + + + {% if standard.addedquicklinks.all|length > 0 %} +
+
+
Quicklinks
+

+ {% for ql in standard.addedquicklinks.all %} + {{ ql.name|truncatechars:30 }}
+ {% endfor %} +

+
+
+ {% endif %} + + + + {% if standard.addedcontacts.all|length > 0 %} +
+
+
Kontakte
+

+ {% for agc in standard.addedcontacts.all %} + {{agc.name}}
+ {% endfor %} +

+
+
+ {% endif %} + + + {% if standard.addedpasswords.all|length > 0 %} +
+
+
Passwörter
+

+ {% for s in standard.addedpasswords.all %} + {{s.name}}
+ {% endfor %} +

+
+
+ {% endif %} + + + + + + {% if standard.linked_standards.all|length > 0 %} +
+
+
Verwandte Standards
+

+ {% for standard in standard.linked_standards.all %} + {% setbool False %} + {% for ag in standard.visibleby.all %} + {% if request.user|has_group:ag.group.name %} + {% setbool True %} + {% endif %} + {% endfor %} + + {% if standard.visibleby.all|length == 0 %} + {% setbool True %} + {% endif %} + + {% getbool as groupchecker %} + + {% if groupchecker %} + {{standard.name|truncatechars:30}}
+ {% else %} +  {{standard.name|truncatechars:30}}

+ {% endif %} + + {% endfor %} +

+
+
+ {% endif %} +
+ {% endif %} +
+
+ + {% if not standard.created_standard_by %} Erstellt von gelöschtem Mitarbeiter {% else %} Erstellt durch {{standard.created_standard_by.first_name}} {{standard.created_standard_by.last_name}} {% endif %} am {{standard.created_standard_date}} | {% if not standard.last_modified_by %} Zuletzt bearbeitet von gelöschtem Benutzer {% else %} Zuletzt bearbeitet von {{ standard.last_modified_by.first_name}} {{ standard.last_modified_by.last_name}}{% endif %} am {{ standard.last_modified_on}} + + + + +
+
+ + +{% for pass in standard.addedpasswords.all %} + +{% endfor %} + + + +{% for agc in standard.addedcontacts.all %} + +{% endfor %} + + + + + + + + + + + +{% endblock content %} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/standards/templates/standards/standards_single_SAVE.html b/standards/templates/standards/standards_single_SAVE.html new file mode 100644 index 0000000..b127ac2 --- /dev/null +++ b/standards/templates/standards/standards_single_SAVE.html @@ -0,0 +1,106 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} +
+ + +

{{standard.name}}

+ Erstellt durch {{standard.created_standard_by.first_name}} {{standard.created_standard_by.last_name}} am {{standard.created_standard_date}} | Zuletzt bearbeitet von {{ standard.last_modified_by.first_name}} {{ standard.last_modified_by.last_name}} am {{ standard.last_modified_on}} + {% if standard.created_standard_by == user or perms.users.standard_management %} +  | Löschen +  | Bearbeiten + {% endif%} +
+
+ Ansprechpartner: + {% for taskuser in standard.task.usersfield.all %} +  {{taskuser.first_name}} {{taskuser.last_name}} + {% endfor %} + + {% if standard.authority %} + Verantwortlicher:  {{standard.authority.first_name}} {{standard.authority.last_name}} |  + {% endif %} + + {% if standard.executor %} + Ausführende Person: {{standard.executor.first_name}} {{standard.executor.last_name}} |  + {% endif %} + + {% if standard.representative %} + Vertreter: {{standard.representative.first_name}} {{standard.representative.last_name}} |  + {% endif %} + + +
+
+
+ + {% if standard.addedfiles.all|length == 0 and standard.linked_standards.all|length == 0 %} +
+ {% else %} +
+ {% endif %} +
+
+

+ {{standard.media}} + {{standard.content|safe}} +

+
+
+ +
+ {% if standard.addedfiles.all|length > 0 %} +
+
+
Dateien
+

+ {% for files in standard.addedfiles.all %} + {{files.name|truncatechars:30}}
+ {% endfor %} +

+
+
+ {% endif %} + + {% if standard.linked_standards.all|length > 0 %} +
+
+
Verwandte Standards
+

+ {% for standard in standard.linked_standards.all %} + + + {% setbool False %} + {% for ag in standard.visibleby.all %} + {% if request.user|has_group:ag.group.name %} + {% setbool True %} + {% endif %} + {% endfor %} + + {% if standard.visibleby.all|length == 0 %} + {% setbool True %} + {% endif %} + + {% getbool as groupchecker %} + + {% if groupchecker %} + {{standard.name|truncatechars:30}}
+ {% else %} +  {{standard.name|truncatechars:30}}

+ {% endif %} + + {% endfor %} +

+
+
+ {% endif %} +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/standards/templates/standards/standards_single_agn.html b/standards/templates/standards/standards_single_agn.html new file mode 100644 index 0000000..016cb57 --- /dev/null +++ b/standards/templates/standards/standards_single_agn.html @@ -0,0 +1,278 @@ +{% extends "users/base.html" %} +{% load counter_tag %} +{% block content %} +
+

{{standard.name}} + {% checkifsharedstandardinagency request.user.profile.agency standard as isshared %} + {% if isshared == False and standard.agency != request.user.profile.agency %} + + + + + + + {% elif standard.agency == request.user.profile.agency %} + + Standard ist aus ihrer Agentur + + + {% else %} + + Standard übernommen + + + {% endif %} +

+
+
+
+
+
+

+ {{standard.media}} + {{standard.content|safe}} +

+
+
+
+
+
+
Struktur
+

+

Dieser Standard könnte wie folgt eingeordnet werden:

+ + + + + + + + + +
Bereich:{{standard.area.name}}
Tätigkeit:  {{standard.task.name}}
+

+
+
+ + + {% if standard.freefield_title|length > 0 %} +
+
+
{{standard.freefield_title}}
+

+ {{standard.freefield_content}} +

+
+
+ {% endif %} + + + + + + + + {% if standard.addedfiles.all|length > 0 %} +
+
+
Dateien
+

+ {% for files in standard.addedfiles.all %} + {{files.name|truncatechars:30}}
+ {% endfor %} +

+
+
+ {% endif %} + +
+
+
+ + Erstellt in Agentur {{standard.agency.name}} und zuletzt bearbeitet am {{ standard.last_modified_on}}. Der Standard wurde bereits {{standard.agencynetworkcounter}} mal übernommen. + +
+
+
+ +
+
+

{{comments|length}} {% if comments|length == 1 %} Kommentar {% elif comments|length == 0 %} Kommentare {% else %} Kommentare {% endif %}

+
+ {% getifuserdidcomment standard request.user as userdidcomment%} + + {% if userdidcomment == False %} + + {% else %} + Sie haben diesen Standard bereits kommentiert. + {% endif %} +
+ {% if userdidcomment == False %} + + {% endif %} +
+
+
+ + {% for comment in comments %} + {% getcommentstat_user comment.pk request.user as cstat %} + +
+ + + {{comment.comment_by.first_name}} {{comment.comment_by.last_name}} am {{comment.last_modified_on|date:"d.m.Y H:i"}}
+ {{comment.content}}
+
+   + {% getcommentsdown comment.pk as cdown %} + {% if cdown > 0 %}{{cdown}}   {% endif %} + + +   + {% getcommentsup comment.pk as cup %} + {% if cup > 0 %}{{cup}}{% endif %} + + {% if comment.comment_by == request.user or standard.last_modified_by == request.user or standard.created_standard_by != none and standard.created_standard_by == request.user %} + + + + {% endif %} +
+ +
+
+ {% endfor %} +
+ + + + + + + + + +{% endblock content %} diff --git a/standards/templates/standards/standards_single_pdf.html b/standards/templates/standards/standards_single_pdf.html new file mode 100644 index 0000000..50671f4 --- /dev/null +++ b/standards/templates/standards/standards_single_pdf.html @@ -0,0 +1,6 @@ +
+

{{standard_name}} +

+
+ {{standard_content}} +
diff --git a/standards/templates/standards/standards_tasklist.html b/standards/templates/standards/standards_tasklist.html new file mode 100644 index 0000000..2d2e6c4 --- /dev/null +++ b/standards/templates/standards/standards_tasklist.html @@ -0,0 +1,4 @@ + +{% for task in tasks %} + +{% endfor %} \ No newline at end of file diff --git a/standards/templates/standards/standards_update.html b/standards/templates/standards/standards_update.html new file mode 100644 index 0000000..80c6460 --- /dev/null +++ b/standards/templates/standards/standards_update.html @@ -0,0 +1,850 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% block content %} +
+

Standard bearbeiten{% if request.user.profile.showtooltips %} {% endif %}

+
+
+ {% csrf_token %} + +
+ {% for field in normalForm %} + {% if forloop.counter|divisibleby:5 %} +
+ {% if field.name != 'freefield_content' and field.name != 'freefield_title' %} + {{field|as_crispy_field }} + {% endif %} + {% else %} + {% if field.name != 'freefield_content' and field.name != 'freefield_title' %} + {{field|as_crispy_field }} + {% endif %} + {% endif %} + {% endfor %} + +
+ +
+
+
+ +
+
+
+
+ {{ normalForm.freefield_title|as_crispy_field }} + {{ normalForm.freefield_content|as_crispy_field }} +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+
+ + + + + + + +
+
+
+ +
+
+
+
+ {% for g in agencygroups %} +
+ {% if g in standard.visibleby.all %} + + {% else %} + + {% endif %} + + +
+ {% endfor %} +
+
+
+ + {% if request.user.profile.agency.module_files %} +
+
+
+ +
+
+
+
+
+ +
+ +
+ + {% for f in possibleFilesByVisible %} + + {% endfor %} + +
+ Verlinkte Dateien: + + {% for f in standard.addedfiles.all %} + + {% endfor %} +
{{f.name|truncatechars:30}}
+ + {% if user|usergperm:"filesmanager" %} + + {% endif %} + +
+
+
+ {% endif %} +
+
+
+ +
+
+
+
+
+ +
+ +
+ + {% for s in possiblestandards %} + {% if s.pk != standard.pk %} + + {% endif %} + {% endfor %} + +
+ Verlinkte Standards: + + {% for s in standard.linked_standards.all %} + + {% endfor %} +
{{s.name|truncatechars:30}}
+
+
+
+
+ + + +
+
+
+ +
+
+
+
+ {% if not standard.public %} + Nur veröffentlichte Standards können geteilt werden. + {% else %} + {% for agn in agencynetworks %} + {% ifaginadminagn agn.pk request.user.profile.agency.pk as is_admin %} + {% ifsharemember agn.pk request.user.profile.agency.pk as is_sharemember %} + {% ifstandardinagn agn.pk standard.pk as standard_in_agn %} + + {% if is_admin or is_sharemember %} +
+ + +
+ {% else %} +  {{agn.name}} + {% endif %} + {% endfor %} + {% endif %} + + +
+
+
+
+ + +
+ +

Wenn ein Standard bearbeitet wurde, kann er nur von einer Person mit dem Recht Standards bearbeiten und freischalten wieder veröffentlicht werden. Ein Standard wird nach Bearbeitung als Nicht veröffentlicht gesetzt.

+
+ +   + + {% if perms.users.standard_management %} + {% if standard_status == False %} + Standard veröffentlichen  + {% else %} + Veröffentlichung aufheben  + {% endif %} + {% endif %} + Abbrechen + + +
+
+ + + + + + + + + + + + + + + + + + + +{% endblock content %} diff --git a/standards/templatetags/__init__.py b/standards/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/standards/templatetags/__pycache__/__init__.cpython-37.pyc b/standards/templatetags/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..a064049 Binary files /dev/null and b/standards/templatetags/__pycache__/__init__.cpython-37.pyc differ diff --git a/standards/templatetags/__pycache__/__init__.cpython-38.pyc b/standards/templatetags/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..6c0f6eb Binary files /dev/null and b/standards/templatetags/__pycache__/__init__.cpython-38.pyc differ diff --git a/standards/templatetags/__pycache__/counter_tag.cpython-37.pyc b/standards/templatetags/__pycache__/counter_tag.cpython-37.pyc new file mode 100644 index 0000000..4b158e2 Binary files /dev/null and b/standards/templatetags/__pycache__/counter_tag.cpython-37.pyc differ diff --git a/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc b/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc new file mode 100644 index 0000000..65a3815 Binary files /dev/null and b/standards/templatetags/__pycache__/counter_tag.cpython-38.pyc differ diff --git a/standards/templatetags/counter_tag.py b/standards/templatetags/counter_tag.py new file mode 100644 index 0000000..7ecf0b6 --- /dev/null +++ b/standards/templatetags/counter_tag.py @@ -0,0 +1,1112 @@ +from django import template +from django.contrib.auth.models import Group, User +from users.models import AgencyGroup, Agency, AgencyNetwork, AgencyNetworkPreperation, UserTime, UserYearAbsenceInfo, AgencyBills +from standards.models import Standards, StandardCommentRate, StandardComments +from timemanagement.models import Workday, FreeDays, Absence +from message.models import Message +import os +from django.conf import settings +from django.utils import timezone +from datetime import date +import datetime +register = template.Library() + +b = 0 + +groupbool = False + +@register.simple_tag +def setvar(value): + global b + b = value + return '' + +@register.simple_tag +def getvar(): + global b + return b + +@register.simple_tag +def incvar(): + global b + b += 1 + return '' + +@register.filter(name="has_group_byname") +def has_group_byname(user, groupname): + in_group = False + #if(user.profile.agency.module_recoverdir): + agroup = AgencyGroup.objects.filter(agency=user.profile.agency, agencygroupname=groupname)[0] + for g in user.groups.all(): + if g.name == agroup.group.name: + in_group = True + + return in_group + + +@register.filter(name='has_group') +def has_group(user, group_name): + group = Group.objects.get(name=group_name) + in_group = False + for g in user.groups.all(): + if g.name == group_name: + in_group = True + return in_group + +@register.simple_tag +def setbool(value): + global groupbool + groupbool = value + return '' + +@register.simple_tag +def getbool(): + global groupbool + return groupbool + +# Zähler ungelesener Nachrichten +@register.simple_tag +def getmesscounter(user): + return len(Message.objects.filter(target_user=user)) + +# Zähler unveröffentlichter Standards +@register.simple_tag +def getUnpubStandards(user): + unpubstandards = 0 + if user.has_perm("users.standardgopublic"): + unpubstandards = len(Standards.objects.filter(agency=user.profile.agency, public=False)) + + return unpubstandards + +@register.simple_tag +def getAbsenceAsks(user): + unconfirmedab = len(Absence.objects.filter(agency=user.profile.agency, confirm_status=1)) + return unconfirmedab + +# WORKDAY HISTORY +@register.simple_tag +def getWorkDayHistory(workday): + workday = Workday.objects.get(pk=workday.pk) + + if workday.history.first().user != workday.user: + return workday.history.first() + else: + return None + + #return workday.history.first() + +# Last Absence +@register.simple_tag +def getLastEditedAbsence(absence): + return Absence.objects.get(pk=absence.pk).history.first() + +# usergperm +''' + + Gibt TRUE zurück, wenn der User über eine Gruppe das gewünschte Recht hat. + Gibt FALSE zurück, wenn der User über eine Gruppe das gewünschte Recht NICHT hat. + + @param: + user - einglogger Nutzer + perm - recht + +''' +@register.filter(name="usergperm") +def usergperm(user, perm): + stat = False + if user.has_perm('users.'+perm): + stat = True + return stat + + +@register.filter(name="useringroupbyid") +def is_member(id, groupname): + usertocheck = User.objects.get(pk=id) + return usertocheck.groups.filter(name=groupname).exists() + + +# Gibt eine zeitabhängige Nachricht zurück (Guten Morgen, Guten Tag, Guten Abend) + +@register.simple_tag(name="gettimemessage") +def getTimeMessage(): + + hour = datetime.datetime.now().hour + returnstring = "" + + if hour >= 5 and hour < 11: + returnstring = "Guten Morgen" + elif hour >= 11 and hour < 18: + returnstring = "Guten Tag" + elif hour >= 18 and hour <= 23: + returnstring = "Guten Abend" + elif hour >= 0 and hour < 5: + returnstring = "Guten Abend" + return returnstring + +import requests + +# Gibt Wetterdaten zurück als String +@register.simple_tag(name="getlocalweather") +def getLocalWeather(user): + weatherinfodata = [] + + agency = user.profile.agency + if len(agency.city) > 0: + # Try to request Weather-Info. If request failed, no weatherinfo is showing + try: + r = requests.get('http://api.openweathermap.org/data/2.5/weather?q='+agency.city+'&lang=de&units=metric&APPID=e37ac762a3c233f5fbc434c72df7961f') + weatherinfo = r.json() + weatherinfodata.append("| " + weatherinfo['weather'][0]['description']) + weatherinfodata.append(weatherinfo['weather'][0]['icon']) + weatherinfodata.append(str(weatherinfo['main']['temp']).split(".")[0] + " °C") + except: + weatherinfodata = "" + else: + weatherinfodata = "" + + return weatherinfodata + + + +# Return a Filename splitted to only see the LAST element! +@register.filter(name="splitdirstyle") +def split_dir_style(dirtosplit): + tempsplit = dirtosplit.split("\\") + return tempsplit[len(tempsplit)-1] + +@register.filter(name="filename") +def filename(value): + return os.path.basename(value.file.name) + +# Gibt die Summe aller Agenturen eines Agentuverbundes zurück +@register.simple_tag +def getsumofallag(agn_id): + return len(AgencyNetwork.objects.get(pk=agn_id).adminagencys.all()) + len(AgencyNetwork.objects.get(pk=agn_id).members.all()) + len(AgencyNetwork.objects.get(pk=agn_id).sharemembers.all()) + +# Gibt die Summe aller Standards in einem Agenturverband zurück +@register.simple_tag +def getsumofallstandards(agn_id): + agn = AgencyNetwork.objects.get(pk=agn_id) + final_standard_count = 0 + for a in agn.adminagencys.all(): + final_standard_count += len(Standards.objects.filter(agency=a)) + + for a in agn.members.all(): + final_standard_count += len(Standards.objects.filter(agency=a)) + + for a in agn.sharemembers.all(): + final_standard_count += len(Standards.objects.filter(agency=a)) + + return final_standard_count + +@register.simple_tag +def ifaginadminagn(agn_id, agencyid): + agn = AgencyNetwork.objects.get(pk=agn_id) + ag = Agency.objects.get(pk=agencyid) + + agency_is_admin = False + if ag in agn.adminagencys.all(): + agency_is_admin = True + + return agency_is_admin + + +@register.simple_tag +def ifmember(agn_id, agencyid): + agn = AgencyNetwork.objects.get(pk=agn_id) + ag = Agency.objects.get(pk=agencyid) + + ismember = False + if ag in agn.members.all(): + ismember = True + + return ismember + +@register.simple_tag +def ifsharemember(agn_id, agencyid): + agn = AgencyNetwork.objects.get(pk=agn_id) + ag = Agency.objects.get(pk=agencyid) + + sharemember = False + if ag in agn.sharemembers.all(): + sharemember = True + + return sharemember + +@register.simple_tag +def ifstandardinagn(agn_id, standardid): + agn = AgencyNetwork.objects.get(pk=agn_id) + s = Standards.objects.get(pk=standardid) + + isin = False + if s in agn.standards.all(): + isin = True + return isin + +@register.simple_tag +def getoutstandinginvites(agnetwork): + outstanding = False + + if len(AgencyNetworkPreperation.objects.filter(target_network=agnetwork)) > 0: + outstanding = True + return outstanding + +@register.simple_tag +def checkifsharedstandardinagency(agency, standard): + + checkstandard = Standards.objects.filter(agency=agency, parent_standard=standard) + + in_agency = False + + if len(checkstandard) > 0: + in_agency = True + return in_agency + + +@register.simple_tag +def getcommentsdown(comment): + + + comment_ratings = StandardCommentRate.objects.filter(oncomment_id=comment) + counter_down = len(StandardCommentRate.objects.filter(oncomment=comment, rate_stats=0)) + + return counter_down + +@register.simple_tag +def getcommentsup(comment): + comment_ratings = StandardCommentRate.objects.filter(oncomment_id=comment) + counter_up = len(StandardCommentRate.objects.filter(oncomment=comment, rate_stats=1)) + + return counter_up + + +@register.simple_tag +def getcommentstat_user(comment, user): + + + comment_rating = list(StandardCommentRate.objects.filter(oncomment_id=comment, rated_by=user)) + + stat = "nostat" + + if len(comment_rating) == 1: + stat = comment_rating[0].rate_stats + + return stat + +@register.simple_tag +def getifuserdidcomment(standard, user): + comment = list(StandardComments.objects.filter(standard=standard, comment_by=user)) + + didcomment = False + + if len(comment) > 0: + didcomment = True + + return didcomment + +''' + + Hier wird der dynamische Steckbrief generiert. Es wird geprüft, ob Nutzer in Standards verlinkt sind bzw. in Gruppen + + +representative_group = models.ManyToManyField(AgencyGroup, blank=True, related_name="group_rep") +executor_group = models.ManyToManyField(AgencyGroup, blank=True, related_name="group_ex") +authority_group = models.ManyToManyField(AgencyGroup, blank=True, related_name="group_aut") + +''' + +@register.simple_tag +def isUserInAuth(task, area, user_id): + + user = User.objects.get(pk=user_id) + + #st_auth = Standards.objects.filter(agency=user.profile.agency, task=task, area=area) + st_auth = Standards.objects.filter(agency=user.profile.agency, task=task, area=area, authority__in=[user]) + found = False + user_to_check = User.objects.get(pk=user_id) + if len(st_auth) > 0: + found = True + + # Wenn der User noch nicht gefunden wurde, werden die Gruppen der Standards durchgearbeitet + if found == False: + standards_to_check = Standards.objects.filter(agency=user.profile.agency, task=task, area=area) + for s in standards_to_check: + for group in s.authority_group.all(): + if user.groups.filter(name = group.group.name).exists(): + found = True + + + return found + +@register.simple_tag +def isUserInEx(task, area, user_id): + + user = User.objects.get(pk=user_id) + + + #st_auth = Standards.objects.filter(agency=user.profile.agency, task=task, area=area) + st_auth = Standards.objects.filter(agency=user.profile.agency, task=task, area=area, executor__in=[user]) + + found = False + + if len(st_auth) > 0: + found = True + + # Wenn der User noch nicht gefunden wurde, werden die Gruppen der Standards durchgearbeitet + if found == False: + standards_to_check = Standards.objects.filter(agency=user.profile.agency, task=task, area=area) + for s in standards_to_check: + for group in s.executor_group.all(): + if user.groups.filter(name = group.group.name).exists(): + found = True + + return found + + +@register.simple_tag +def isUserInRep(task, area, user_id): + + user = User.objects.get(pk=user_id) + + #st_auth = Standards.objects.filter(agency=user.profile.agency, task=task, area=area) + st_auth = Standards.objects.filter(agency=user.profile.agency, task=task, area=area, representative__in=[user]) + found = False + + if len(st_auth) > 0: + found = True + + # Wenn der User noch nicht gefunden wurde, werden die Gruppen der Standards durchgearbeitet + if found == False: + standards_to_check = Standards.objects.filter(agency=user.profile.agency, task=task, area=area) + for s in standards_to_check: + for group in s.representative_group.all(): + if user.groups.filter(name = group.group.name).exists(): + found = True + + return found + +# REALTIME +# Check for active WorkDay +@register.simple_tag +def getactualworkingday(user): + wd = Workday.objects.filter(user=user, agency=user.profile.agency, end=None, delflag = False) + returnstat = 0 + + if(len(wd) > 0): + returnstat = list(wd)[0].start + return returnstat + +#TASK: Hier checken, was los ist - so sollte kein Fehler passieren +@register.simple_tag +def getIsUserStartTime(user): + + today = date.today() + starttime = False + if user.usertime.usetime_start != None and today >= user.usertime.usetime_start: + starttime = True + + return starttime + +# Berechnet die gesamte Arbeitszeit im Monat und gibt diese zurück +@register.simple_tag +def loadmonthwork(nextmonth, user): + nextmonth = int(nextmonth) + month = nextmonth - 1 + + if month == 0: + month = 12 + + workdays = Workday.objects.filter(user=user, agency=user.profile.agency, start__month=month, delflag = False) + + finalsum = 0 + + for ele in workdays.all(): + if ele.end != None: + finalsum += (ele.end - ele.start).seconds + + breaksum = 0 + for ele in workdays.all(): + for b in ele.breaks.all(): + if(b.end != None): + breaksum += (b.end - b.start).seconds + + finalsum -= breaksum + + mon, sec = divmod(finalsum, 60) + hr, mon = divmod(mon, 60) + #return ("%d Stunden und %02d:%02d" % (hr, mon, sec)) + return ("%d:%02d" % (hr, mon)) + + +# Return formatted Time-String +@register.simple_tag +def getformatedstarttime(user): + wd = list(Workday.objects.filter(user=user, agency=user.profile.agency, end=None, delflag = False))[0] + return wd.start.strftime("%H:%M:%S") + +@register.simple_tag +def getformattetstarttime_last_start(user): + today = date.today() + wd = Workday.objects.filter(user=user, agency=user.profile.agency, start__day=today.day, delflag = False).order_by("start") + + if(len(wd) == 0): + return ("00:00:00") + else: + return list(wd)[0].start.strftime("%H:%M:%S") + +@register.simple_tag +def getformattetstarttime_last_end(user): + today = date.today() + wd = Workday.objects.filter(user=user, agency=user.profile.agency, end__day=today.day, delflag = False).order_by("end") + + if(len(wd) == 0): + return ("00:00:00") + else: + return list(wd)[0].end.strftime("%H:%M:%S") + +@register.simple_tag +def getactualbreak(user): + wd = Workday.objects.filter(user=user, agency=user.profile.agency, end=None, delflag = False) + returnstat = 0 + # ACTIVE WORKING DAY + if(len(wd) > 0): + wd = list(wd)[0] + + # BREAK FOUND + if(len(wd.breaks.all()) > 0): + # Check if all Breaks ended + wdbreak = wd.breaks.filter(end=None) + if(len(wdbreak) > 0): + returnstat = True + + else: + returnstat = False + return returnstat + +@register.simple_tag +def getactualbreakcounter(user): + wd = Workday.objects.filter(user=user, agency=user.profile.agency, end=None, delflag = False) + returnstat = False + # ACTIVE WORKING DAY + if(len(wd) > 0): + wd = list(wd)[0] + + if(len(wd.breaks.all()) > 0): + wdbreak = wd.breaks.filter(end=None) + if(len(wdbreak) > 0): + now = timezone.now() + breakstart = list(wdbreak)[0].start + returnstat = (now - breakstart).seconds * 1000 + return returnstat + +# GET ALL BREAK AS MILLISECOND-RESULT +@register.simple_tag +def getdailybreaktime(user): + wd = list(Workday.objects.filter(user=user, agency=user.profile.agency, end=None, delflag = False))[0] + breaksum = 0 + for b in wd.breaks.all(): + if(b.end != None): + breaksum += (b.end - b.start).seconds + return breaksum*1000 + +@register.simple_tag +def getdailybreaktimetoday(user): + today = date.today() + wd = list(Workday.objects.filter(user=user, agency=user.profile.agency, delflag = False).order_by("start").exclude(end=None))[0] + breaksum = 0 + for b in wd.breaks.all(): + if(b.end != None): + breaksum += (b.end - b.start).seconds + return breaksum*1000 + +@register.simple_tag +def getsumworkday(workday): + + sum_break = 0 + + if(len(workday.breaks.all()) > 0): + + for ele in workday.breaks.all(): + if ele.end != None: + sum_break += (ele.end - ele.start).seconds + + finalsum = ((workday.end - workday.start).seconds - sum_break) + + mon, sec = divmod(finalsum, 60) + hr, mon = divmod(mon, 60) + #return ("%d Stunden und %02d:%02d" % (hr, mon, sec)) + return ("%d:%02d" % (hr, mon)) + +@register.simple_tag +def getsumworkdayexcludebreak(workday): + finalsum = ((workday.end - workday.start).seconds) + + mon, sec = divmod(finalsum, 60) + hr, mon = divmod(mon, 60) + #return ("%d Stunden und %02d:%02d" % (hr, mon, sec)) + return ("%d:%02d" % (hr, mon)) + +@register.simple_tag +def getsumbreak(workday): + sum_break = 0 + + if(len(workday.breaks.all()) > 0): + + for ele in workday.breaks.all(): + if ele.end != None: + sum_break += (ele.end - ele.start).seconds + + return int(sum_break/60) + +# DATE TIME HELPTER + +act_forloop_date_counter = ""; + +@register.simple_tag +def setdateforloopcounter(newcounter): + global act_forloop_date_counter + act_forloop_date_counter = newcounter + return "" + +@register.simple_tag +def getactdateforloopcounter(): + return act_forloop_date_counter + +@register.simple_tag +def isfreeday(user, daytocheck): + returnstat = False + fd = FreeDays.objects.filter(agency=user.profile.agency, day=daytocheck) + if len(fd) > 0: + returnstat = True + return returnstat + +@register.simple_tag +def isfreedayname(user, daytocheck): + returnstat = False + fd = FreeDays.objects.filter(agency=user.profile.agency, day=daytocheck) + if len(fd) > 0: + returnstat = True + returnstat = fd[0].name + return returnstat + +# RETURN ALL ABSENCE ELEMENTS FOR THAT DAY +@register.simple_tag +def getabscenceday(loggeduser, user, daytocheck): + returnstat = False + if(loggeduser.has_perm("users.absencemanager")): + absencedays = Absence.objects.filter(confirm_status=0, agency=user.profile.agency, user=user, start=daytocheck) | (Absence.objects.filter(confirm_status=0, agency=user.profile.agency, user=user, start__lt=daytocheck) & Absence.objects.filter(confirm_status=0, agency=user.profile.agency, user=user, end__gt=daytocheck)) | Absence.objects.filter(confirm_status=0, agency=user.profile.agency, user=user, end=daytocheck) + else: + absencedays = (Absence.objects.filter(agency=user.profile.agency, user=loggeduser, confirm_status=1) | Absence.objects.filter(agency=user.profile.agency, user=user, confirm_status=0)) & (Absence.objects.filter(agency=user.profile.agency, user=user, start=daytocheck) | (Absence.objects.filter(agency=user.profile.agency, user=user, start__lt=daytocheck, confirm_status=0) & Absence.objects.filter(agency=user.profile.agency, user=user, end__gt=daytocheck)) | Absence.objects.filter(agency=user.profile.agency, user=user, end=daytocheck, confirm_status=0)) | ((Absence.objects.filter(agency=user.profile.agency, user=user, start__lt=daytocheck, confirm_status=1) & Absence.objects.filter(agency=user.profile.agency, user=user, end__gt=daytocheck)) | Absence.objects.filter(agency=user.profile.agency, user=user, end=daytocheck, confirm_status=1)) + if(len(absencedays) > 0): + returnstat = list(absencedays)[0] + + return returnstat + +@register.simple_tag +def getsomeyears(start): + years = [] + start_int = int(start) + years = [start_int-4, start_int-3,start_int-2,start_int-1,start_int, start_int+1, start_int+2, start_int+3, start_int+4] + return years + +@register.simple_tag +def getsomemonths(): + return ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"] + +@register.simple_tag +def getonlinestatuscolor(user): + maincolor = "red" + + if(user.profile.onlinestatus == 0): + maincolor = "green" + elif(user.profile.onlinestatus == 1): + maincolor = "red" + elif(user.profile.onlinestatus == 2): + maincolor = "orange" + elif(user.profile.onlinestatus == 3): + maincolor = "grey" + + return maincolor + +tempday = False + +@register.simple_tag +def setMessageDayInfo(info): + global tempday + tempday = info.sendtime.day + return "" + +@register.simple_tag +def getMessageDayInfo(info): + global tempday + + if info.sendtime.day > tempday: + tempday = info.sendtime.day + return True + else: + return False + +@register.simple_tag +def getUserIsRep(user): + # REPRESENTATOR + today = date.today() + absence = Absence.objects.filter(agency=user.profile.agency, representator=user, start__lte=today, end__gte=today, confirm_status=0) + repstring = False + + if(len(absence) > 0): + ab_counter = 0 + repstring = "Sie vertreten " + for ab in absence: + repstring += ab.user.first_name + " " + ab.user.last_name + " bis zum " + ab.end.strftime("%d.%m.%Y") + "." + if(ab_counter + 1 < len(absence)): + repstring += " Sie vertreten zudem " + ab_counter += 1 + + # IN HOLIDAY? + absence_holiday = Absence.objects.filter(agency=user.profile.agency, user=user, start__lte=today, end__gte=today, reason__is_holiday=True, confirm_status=0) + + if(len(absence_holiday) > 0): + repstring = "Wir wünschen Ihnen noch bis zum " + absence_holiday[0].end.strftime("%d.%m.%Y") + " einen schönen Urlaub!" + + return repstring + +# Check, if a user is behind a day in agency (working startdate) +@register.simple_tag +def startdatecheck(usertocheck, day): + usertime = list(UserTime.objects.filter(user=usertocheck))[0] + + if usertime.startdate != None and usertime.startdate < day: + return True + else: + return False + +# Gibt Minus/Null/Plus Gleitzeit für einen Arbeitstag +@register.simple_tag +def gettimeoveralldiff(workday, user): + sum_break = 0 + + if(len(workday.breaks.all()) > 0): + + for ele in workday.breaks.all(): + if ele.end != None: + sum_break += (ele.end - ele.start).seconds + + finalsum = ((workday.end - workday.start).seconds - sum_break) + hastowork = datetime.timedelta(hours=workday.target) + + # Finale Summe Arbeitszeit inkl. Pausen und Arbeitszeit an diesem Tag + final_info = (int(finalsum) - int(hastowork.total_seconds()))/60 + + status = 0 + # NEGATIVE GLEITZEIT + if(final_info < 0): + final_info = final_info * -1 + status = 2 + # Positive Gleitzeit + elif (final_info == 0): + status = 1 + else: + status = 0 + + final_timeinfo = str(datetime.timedelta(minutes=final_info)) + final_info_data = final_timeinfo.split(":") + final_info = str(final_info_data[0]) + ":" + str(final_info_data[1]) + + return [final_info, status] + + +# Ladet das aktuelle Gleitzeitkonto +''' + + Es werden nur Tage berücksichtigt, die in der Vergangenheit liegen! + +''' +def format_timedelta(td): + hours, remainder = divmod(td.total_seconds(), 3600) + minutes, seconds = divmod(remainder, 60) + hours, minutes, seconds = int(hours), int(minutes), int(seconds) + if hours < 10: + hours = '0%s' % int(hours) + if minutes < 10: + minutes = '0%s' % minutes + if seconds < 10: + seconds = '0%s' % seconds + return '%s:%s:%s' % (hours, minutes, seconds) + + +@register.simple_tag +def loadaccounttime(user): + status = 0 + today = date.today() + workdays = Workday.objects.filter(user=user, start__lt=today, delflag = False).exclude(end=None) + + finalaccounttimesum = datetime.timedelta(minutes=0) + datetime.timedelta(hours=UserTime.objects.get(user=user).startcount) + + + for workday in workdays: + # Zeit, die der Mitarbeiter gearbeitet haben MUSS + + sum_break = 0 + + if(len(workday.breaks.all()) > 0): + + for ele in workday.breaks.all(): + if ele.end != None and ele.start != None: + sum_break += (ele.end - ele.start).seconds + + finalsum = ((workday.end - workday.start).seconds - sum_break) + hastowork = datetime.timedelta(hours=workday.target) + final_info = (int(finalsum) - int(hastowork.total_seconds()))/60 + + if(final_info >= 0.0): + finalaccounttimesum += datetime.timedelta(minutes=final_info) + else: + final_info = final_info * -1 + finalaccounttimesum -= datetime.timedelta(minutes=final_info) + + # Gesamtgleitzeit einmal schick darstellen mit rot und grün + # Wenn GLeitzeit NEGATIV ist + if(finalaccounttimesum.total_seconds() < 0): + status = 1 + final_info_data = format_timedelta(datetime.timedelta(seconds=finalaccounttimesum.total_seconds()*(-1))) + else: + status = 0 + final_info_data = format_timedelta(datetime.timedelta(seconds=finalaccounttimesum.total_seconds())) + + final_info_data_neu = final_info_data.split(":")[0] + ":" + final_info_data.split(":")[1] + + #final_info = str(final_info_data[0]) + ":" + str(final_info_data[1]) + return [final_info_data_neu, status] + +''' + + Gibt True zurück, wenn ein Mitarbeiter an diesem Tag laut Vertragsdaten NICHT arbeitet. + + Gibt False zurück, wenn er an diesem Tag mindestens 0.1 Stunden arbeitet + +''' +@register.simple_tag +def getthisdaynotworking(user, day): + stat = False + if(day.isoweekday() == 1): + if user.usertime.wd_mo == 0.0: + stat = True + elif(day.isoweekday() == 2): + if user.usertime.wd_tu == 0.0: + stat = True + elif(day.isoweekday() == 3): + if user.usertime.wd_we == 0.0: + stat = True + elif(day.isoweekday() == 4): + if user.usertime.wd_th == 0.0: + stat = True + elif(day.isoweekday() == 5): + if user.usertime.wd_fr == 0.0: + stat = True + elif(day.isoweekday() == 6): + if user.usertime.wd_sa == 0.0: + stat = True + elif(day.isoweekday() == 7): + if user.usertime.wd_so == 0.0: + stat = True + return stat + +''' + +Gibt das verfügbare Urlaubskontingent eines Mitarbeiters zurück + +''' +@register.simple_tag +def kontingent(user): + kon = 0.0 + restdays = 0.0 + try: + yearinfo = list(UserYearAbsenceInfo.objects.filter(year=date.today().year, user=user))[0] + inuse = yearinfo.days_inuse + + usertime = UserTime.objects.get(user=user) + loosedate = usertime.loose_holidedate.split(".") + today = date.today() + today_month = today.month + today_day = today.day + + loosedata_date = datetime.date(today.year, int(loosedate[1]), int(loosedate[0])) + + if today < loosedata_date: + restdays = yearinfo.restdays + + kon = yearinfo.days - inuse + restdays + except: + pass + + return kon + +''' + +Zählt ausgegebene Arbeitstage mit für den Zeilenumbruch in der Arbeitstage-Übersicht + +''' +workdaycounter = 0 + +@register.simple_tag +def counterWDUp(): + global workdaycounter + workdaycounter += 1 + return '' + +@register.simple_tag +def counterWDreset(): + global workdaycounter + workdaycounter = 0 + return '' + +@register.simple_tag +def getCounterWD(): + global workdaycounter + return workdaycounter + + +from dateutil.relativedelta import * +@register.simple_tag +def getNextMonth(agency): + month = agency.registerdate + next_month = month + relativedelta(months=1) + return next_month + +@register.simple_tag +def loadUserCount(user): + usercount = len(User.objects.filter(profile__agency=user.profile.agency)) + + if(usercount < 4): + usercount = 0 + else: + usercount = usercount - 3 + return usercount + +@register.simple_tag +def loadMWST(user): + mwst = 0.0 + + usercount = len(User.objects.filter(profile__agency=user.profile.agency)) + + if(usercount < 4): + usercount = 0 + else: + usercount = usercount - 3 + + mwst = (21.0 + usercount*3)/100 * 19 + + return mwst + +@register.simple_tag +def loadFinalMoney(user): + usercount = len(User.objects.filter(profile__agency=user.profile.agency)) + + if(usercount < 4): + usercount = 0 + else: + usercount = usercount - 3 + + finalMoney = (21.0 + usercount*3) * 1.19 + return finalMoney + +@register.simple_tag +def loadFinalMoneyByAgency(agency): + usercount = len(User.objects.filter(profile__agency=agency)) + + if(usercount < 4): + usercount = 0 + else: + usercount = usercount - 3 + + finalMoney = (21.0 + usercount*3) * 1.19 + return finalMoney + + +@register.simple_tag +def loadUserCountMoney(user): + usercount = len(User.objects.filter(profile__agency=user.profile.agency)) + + if(usercount < 4): + usercount = 0 + else: + usercount = usercount - 3 + + return usercount*3 + + +@register.simple_tag +def gethistoryuser(userid): + last_user = None + try: + last_user = User.objects.get(pk=userid) + except: + last_user = None + return last_user + +''' + + Gibt den Klassentyp als String für den Bereich Notfallhilfe, Aktualisierung als Array zurück. Der zweite Parameter definiert, welche Historical-View aufgerufen wird + + 0 = Dokument + 1 = Familien/Freundekontakt + 2 = Vertrauensperson + 3 = Handlungsleitfaden + 4 = Persönliches Schreiben + +''' +@register.simple_tag +def getHistoryClassOfObject(value): + finalclass = [0,1] + finalclass[0] = "" + finalclass[1] = "" + objectClass = value.__class__.__name__ + + #print(objectClass) + + if(objectClass == 'HistoricalDocuments'): + finalclass[0] = "Dokument" + finalclass[1] = 0 + elif(objectClass == 'HistoricalRDContact'): + finalclass[0] = "Familien-/Freundekontakt" + finalclass[1] = 1 + elif(objectClass == 'HistoricalRDTrustPerson'): + finalclass[0] = "Vertrauensperson" + finalclass[1] = 2 + elif(objectClass == 'HistoricalHandlungsleitfaden'): + finalclass[0] = "Handlungsleitfaden" + finalclass[1] = 3 + elif(objectClass == 'HistoricalPersLetter'): + finalclass[0] = "Persönliches Schreiben" + finalclass[1] = 4 + elif(objectClass == 'HistoricalHandlungsleitfadenVF'): + finalclass[0] = "Handlungsleitfaden Vorsorge und Finanzen" + finalclass[1] = 5 + elif(objectClass == 'HistoricalDepositVollmacht'): + finalclass[0] = "Vollmacht für Banken etc." + finalclass[1] = 6 + elif(objectClass == 'HistoricalErgoVerDir'): + finalclass[0] = "Ergo Digitaler Versicherungsordner" + finalclass[1] = 7 + elif(objectClass == 'HistoricalOnlineBank'): + finalclass[0] = "Online Bank" + finalclass[1] = 8 + elif(objectClass == 'HistoricalStreamingAbo'): + finalclass[0] = "Streaming-Abo" + finalclass[1] = 9 + elif(objectClass == 'HistoricalDigitalAccounts'): + finalclass[0] = "Online-Account" + finalclass[1] = 10 + elif(objectClass == 'HistoricalPersonal'): + finalclass[0] = "Personal und Partner" + finalclass[1] = 11 + elif(objectClass == 'HistoricalRDContract'): + finalclass[0] = "Vertrag" + finalclass[1] = 12 + # ELSE + elif(objectClass == 'HistoricalRDElse'): + finalclass[0] = "Sonstiges" + finalclass[1] = 20 + + return finalclass + + +# BILLCHECK +''' + + Rückgabewerte zur Kontrolle des aktuellen Rechnungsstatus: + 0 - Keine Rechnung, kein Plan, aber noch im Freien Zeitraum + 1 - Keine Rechnung, keinen Plan, Freiraum um max. 14 Tage überschritten + 2 - Keine Rechnung, keinen Plan, Freiraum um mehr als 14 Tage überschritten + 3 - Keine Rechnung, keinen Plan, Freiraum um mehr als 30 Tage überschritten - AGENTUR SPERREN! + 10 - Plan erstellt! + 11 - Plan erstellt und Rechungen für den aktuellen Zeitraum vorhanden + 20 - KOSTENLOS + +''' +@register.simple_tag +def getAgencyBillStatus(agency): + returnvalue = 0 + regdate = agency.registerdate + + # Agentur normal, prüfen, was bezahlt werden muss + if agency.paymentstatus == 1: + returnvalue = 20 + else: + today = date.today() + bills = AgencyBills.objects.filter(agency=agency) + + activeBill = False + + for bill in bills: + if bill.end >= today: + activeBill = True + # TASK: Unbezahlte Rechnungen prüfen? + # Check, ob die aktuelle Rechnung innerhalb von zwei Wochen bezahlt ist + #billend = bill.start.relativedelta(days=14) + #if billend <= today and bill.billstatus == "open": + # activeBill = False + + + + # Tage, die zwischen Registrierung und heute liegen + daysbetween = (today - regdate).days + + if agency.paymentplan == 0 and daysbetween <= 30: + returnvalue = 0 + elif agency.paymentplan == 0 and daysbetween > 30 and daysbetween <= 45: + returnvalue = 1 + elif agency.paymentplan == 0 and daysbetween > 45 and daysbetween <= 60: + returnvalue = 2 + elif agency.paymentplan == 0 and daysbetween > 60: + returnvalue = 3 + elif agency.paymentplan == 1 and activeBill == True: + returnvalue = 10 + elif agency.paymentplan == 1 and activeBill == False: + returnvalue = 11 + + return returnvalue + + +@register.simple_tag +def getBaseURLIcsLink(agency): + return settings.BASE_URL + "ics/" + str(agency.pk) + + +@register.simple_tag +def getBaseURLIcsLinkAll(agency): + return settings.BASE_URL + "icsall/" + str(agency.pk) + +@register.simple_tag +def getBaseURLIcsEx(agency): + return settings.BASE_URL + "icspublic/" + str(agency.agencycalurl) + "/" + str(agency.pk) + +@register.simple_tag +def getBaseURLIcsExAll(agency): + return settings.BASE_URL + "icspublicall/" + str(agency.agencycalurl_all) + "/" + str(agency.pk) + + + +@register.simple_tag +def getTrialDays(agency): + today = date.today() + regdate = agency.registerdate + + remainingdays = regdate - today + finaldays = 0 + print(regdate) + print(today) + print(remainingdays.days) + + if remainingdays.days > 0: + finaldays = remainingdays.days + elif today == regdate: + finaldays = 30 + + return finaldays + +@register.simple_tag +def getAbsenceLastHistory(absence): + return absence.history.first() + + diff --git a/standards/tests.py b/standards/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/standards/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/standards/urls.py b/standards/urls.py new file mode 100644 index 0000000..041839c --- /dev/null +++ b/standards/urls.py @@ -0,0 +1,31 @@ +from django.urls import path +from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required, permission_required +from .views import StandardsManagement, StandardDeleteView +from . import views +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('', StandardsManagement.as_view(template_name="standards/standards_management.html"), name='standards'), + path('standardadd/', views.StandardAdd, name='standard-add'), + path('standardadd/', views.StandardAdd, name='standard-add'), + #path('standardupdate/', views.StandardUpdate, name='standard-update'), + path('ajax/loadtasks/', views.load_tasks, name='ajax_loadtasks'), + path('pdf/', views.getStandardPDF, name="ajax-standardpdf"), + path('ajups/', views.updatesbyajax, name='update_standard_by_ajax'), + path('ajupsagn/', views.updatesbyajax_agn, name='update_standard_by_ajax_agn'), + path('standards//delete', StandardDeleteView.as_view(), name='standard-delete'), + path('standard//changestat', views.StandardChangePublic, name="standard-status"), + path('standard//single', views.StandardSingle, name="standard-single"), + path('standard///singleagn', views.StandardSingleAgn, name="standard-single-agn"), + path('standard//area', views.StandardArea, name="standard-area"), + path('standard//task', views.StandardTask, name="standard-task"), + path('standard//task/', views.StandardTaskUser, name="standard-task-user"), + path('standardsagn/', views.StandardFromAgn, name="standard-agn"), + path('standardcopy/', views.CopyStandard, name="standard-copyagn"), + path('loadaggroupm/', views.LoadAGGroupMembers, name="standard-loadaggroupmembers"), + path('standard/update/', views.UpdateStandardBeforeUserDel, name="standard-update-before-user-del") + +] \ No newline at end of file diff --git a/standards/views.py b/standards/views.py new file mode 100644 index 0000000..9394383 --- /dev/null +++ b/standards/views.py @@ -0,0 +1,1117 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.models import User +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView, View +from .models import Standards, StandardComments, StandardCommentRate +from django.contrib import messages +from django.http import HttpResponse, JsonResponse +from .forms import StandardAddStandard, StandardAddStandardEditor, StandardUpdateStandard, StandardUpdateStandardEditor +from django.contrib.auth.decorators import login_required +from tasks.models import Tasks +from areas.models import Areas +from datetime import datetime +from users.models import AgencyGroup, AgencyNetwork +from cloud.models import DataFile, DataDir +from django.contrib.auth.decorators import login_required +import re +from django.template import defaultfilters +from organizer.models import QuickLinks, AGContacts, AGPassword +import channels.layers +from asgiref.sync import async_to_sync +from django.template.loader import render_to_string +from notificsys.models import UserNotification +from django.core.mail import send_mail + +# ALLE STANDARDS EINER AGENTUR +class StandardsManagement(LoginRequiredMixin, ListView): + model = Standards + # Adding active_link + # Loading only user same agency + # Change context and return for template-data + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + # # Get all Users of the Same Agency as logged user + areas = Areas.objects.filter(agency__pk=self.request.user.profile.agency.pk).order_by("areaorder") + standards_of_user = Standards.objects.filter(agency__pk=self.request.user.profile.agency.pk, created_standard_by=self.request.user.pk) + #standards_of_agency = Standards.objects.filter(agency__pk=self.request.user.profile.agency.pk, public=True) + unpubstandards_of_user = Standards.objects.filter(agency__pk=self.request.user.profile.agency.pk, public=False) + #tasks = Tasks.objects.filter(agency__pk=self.request.user.profile.agency.pk) + standardcontent = [] + for a in areas: + standardcontent.append({"area" : a, "tasks" : []}) + tasks_in_area = Tasks.objects.filter(agency__pk=self.request.user.profile.agency.pk, area__pk=a.pk).order_by("name") + + for t in tasks_in_area: + standardcontent[len(standardcontent)-1]['tasks'].append({"task" : t, "standards" : Standards.objects.filter(agency__pk=self.request.user.profile.agency.pk, area__pk=a.pk, task = t.pk, area = a.pk, public=True).order_by("-created_standard_date")}) + + #context.update({'active_link' : 'standards', 'tasks': tasks, 'unpubstandards_of_user' : unpubstandards_of_user, 'standards_of_agency' : standards_of_agency, 'areas' : areas, 'standards_of_user' : standards_of_user, 'standardcontent' : standardcontent}) + + #agencynetworks = AgencyNetwork.objects.filter(creator_agency=self.request.user.profile.agency) | AgencyNetwork.objects.filter(adminagencys__in=[self.request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(members__in=[self.request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(sharemembers__in=[self.request.user.profile.agency.pk]) + + #agencynetworks = AgencyNetwork.objects.filter(adminagencys__in=[self.request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(members__in=[self.request.user.profile.agency.pk]) | AgencyNetwork.objects.filter(sharemembers__in=[self.request.user.profile.agency.pk]) + + agencynetworks_all = AgencyNetwork.objects.all() + agencynetworks = [] + + for a in agencynetworks_all: + if self.request.user.profile.agency in a.adminagencys.all() or self.request.user.profile.agency in a.members.all() or self.request.user.profile.agency in a.sharemembers.all(): + agencynetworks.append(a) + + allagencynetworkstandards = [] + for agn in agencynetworks: + for agn_s in agn.standards.all(): + allagencynetworkstandards.append(agn_s) + + + allagencynetworkstandards.sort(key=lambda x: x.agencynetworkcounter, reverse=True) + + # Beliebte Standards + famestandards = [] + famecounter = 0 + for s in allagencynetworkstandards: + if famecounter < 10 and s not in famestandards: + famestandards.append(s) + famecounter += 1 + + context.update({'active_link' : 'standards', 'unpubstandards_of_user' : unpubstandards_of_user, 'areas' : areas, 'standards_of_user' : standards_of_user, 'standardcontent' : standardcontent, "agencynetworks" : agencynetworks, "allagencynetworkstandards" : allagencynetworkstandards, 'famestandards' : famestandards}) + + return context + + +@login_required +def checkUserDirRights(request, startdir, userid): + canview = True + user = User.objects.get(pk=userid) + usergroups=list(user.groups.all()) + grouptomach = [] + singleObj = DataDir.objects.get(pk=startdir.pk) + # AGENCYCHECK + if(singleObj.agency.pk == user.profile.agency.pk): + + # Get dirs to check + while( singleObj.is_root != True and canview == True): + + for g in singleObj.visibleby.all(): + grouptomach.append(g.group) + + if(len(grouptomach) == 0): + canview = True + else: + if(len(set(usergroups).intersection(grouptomach)) > 0): + canview = True + else: + canview = False + + grouptomach = [] + singleObj = DataDir.objects.get(pk=singleObj.parent.pk) + + else: + canview = False + return canview + + +@login_required +def StandardAdd(request, id=False): + # NEW STANDARD + if(id == False): + if request.method == 'POST': + normalForm = StandardAddStandard(request.POST, instance=request.user) + editorForm = StandardAddStandardEditor(request.POST, instance=request.user) + if editorForm.is_valid() and normalForm.is_valid(): + normalForm.agency = request.user.profile.agency + normalForm.created_standard_by = request.user + normalForm.created_standard_date = datetime.now() + normalForm.published_by = request.user + normalForm.last_modifed_by = request.user + normalForm.save() + editorForm.save() + new_standard = Standards() + new_standard.agency = request.user.profile.agency + new_standard.created_standard_by = request.user + new_standard.published_by = request.user + new_standard.last_modified_by = request.user + new_standard.created_standard_date = datetime.now() + new_standard.last_modified_on = datetime.now() + new_standard.task = normalForm.cleaned_data['task'] + new_standard.area = normalForm.cleaned_data['area'] + new_standard.name = normalForm.cleaned_data['name'] + new_standard.content = editorForm.cleaned_data['content'] + new_standard.public = normalForm.cleaned_data['public'] + + new_standard.freefield_content = normalForm.cleaned_data['freefield_content'] + new_standard.freefield_title = normalForm.cleaned_data['freefield_title'] + + new_standard.save() + + #new_standard.representative.set(normalForm.cleaned_data['representative']) + #new_standard.executor.set(normalForm.cleaned_data['executor']) + #new_standard.authority.set(normalForm.cleaned_data['authority']) + + # USERS + # REPRESENTATIV + verant = normalForm.cleaned_data['us_verant'].split(",") + for v in verant: + if(v.isdigit()): + new_standard.authority.add(User.objects.get(pk=v)) + + # EXECUTORS + ex = normalForm.cleaned_data['us_ex'].split(",") + for v in ex: + if(v.isdigit()): + new_standard.executor.add(User.objects.get(pk=v)) + + # AUTHORITY + ver = normalForm.cleaned_data['us_ver'].split(",") + for v in ver: + if(v.isdigit()): + new_standard.representative.add(User.objects.get(pk=v)) + + + + # GROUPS BEI PERSONEN + # + verant_group = normalForm.cleaned_data['group_verant'].split(",") + for v in verant_group: + if(v.isdigit()): + new_standard.authority_group.add(AgencyGroup.objects.get(pk=v)) + + # EXECUTORS + ex_group = normalForm.cleaned_data['group_ex'].split(",") + for v in ex_group: + if(v.isdigit()): + new_standard.executor_group.add(AgencyGroup.objects.get(pk=v)) + + # AUTHORITY + ver_group = normalForm.cleaned_data['group_ver'].split(",") + for v in ver_group: + if(v.isdigit()): + new_standard.representative_group.add(AgencyGroup.objects.get(pk=v)) + + + + + # ADD GROUPS + groups = normalForm.cleaned_data['checked_groups'].split(",") + + for g in groups: + if(g.isdigit()): + new_standard.visibleby.add(AgencyGroup.objects.get(pk=g)) + + # ADD STANDARDS + standards = normalForm.cleaned_data['added_standards'].split(",") + for s in standards: + if(s.isdigit()): + new_standard.linked_standards.add(Standards.objects.get(pk=s)) + + # ADD FILES + files = normalForm.cleaned_data['added_files'].split(",") + for f in files: + if(f.isdigit()): + new_standard.addedfiles.add(DataFile.objects.get(pk=f)) + + # ADD QUICKLINKS + quicklinks = normalForm.cleaned_data['added_quicklinks'].split(",") + for f in quicklinks: + if(f.isdigit()): + new_standard.addedquicklinks.add(QuickLinks.objects.get(pk=f)) + + # ADD PASSWORDS + addedpasswords = normalForm.cleaned_data['added_passwords'].split(",") + for f in addedpasswords: + if(f.isdigit()): + new_standard.addedpasswords.add(AGPassword.objects.get(pk=f)) + + # ADD CONTACTS + contacts = normalForm.cleaned_data['added_contacts'].split(",") + for f in contacts: + if(f.isdigit()): + new_standard.addedcontacts.add(AGContacts.objects.get(pk=f)) + + + tempstandardname = normalForm.cleaned_data['name'] + if(new_standard.public and request.user.has_perm('users.standardmanager')): + messages.success(request, f'Standard {tempstandardname} hinzugefügt und veröffentlicht.') + else: + new_standard.public = False + new_standard.save() + messages.success(request, f'Standard {tempstandardname} hinzugefügt! Dieser muss noch veröffentlicht werden.') + return redirect('standards') + + else: + normalForm = StandardAddStandard(instance=request.user) + editorForm = StandardAddStandardEditor(instance=request.user) + + + possibleFilesByVisible = [] + + allfiles = DataFile.objects.filter(agency=request.user.profile.agency) + + for f in allfiles: + actParent = DataDir.objects.get(pk=f.parent.pk) + if actParent.is_root: + possibleFilesByVisible.append(f) + else: + if(checkUserDirRights(request, actParent, request.user.pk)): + possibleFilesByVisible.append(f) + + context = { + 'normalForm' : normalForm, + 'editorForm' : editorForm, + 'active_link' : 'standards', + 'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency), + 'usersofagency' : User.objects.filter(profile__agency=request.user.profile.agency), + 'files' : possibleFilesByVisible, + 'parentid' : list(DataDir.objects.filter(agency=request.user.profile.agency, is_root=True))[0].pk, + 'standards' : Standards.objects.filter(agency=request.user.profile.agency, public=True), + 'quicklinks' : QuickLinks.objects.filter(agency=request.user.profile.agency), + 'contacts' : AGContacts.objects.filter(agency=request.user.profile.agency), + 'passwords' : AGPassword.objects.filter(agency=request.user.profile.agency), + 'aggroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency), + } + return render(request, 'standards/standards_add.html', context) + # UPDATE A STANDARD + else: + standard = Standards.objects.get(pk=id, agency=request.user.profile.agency) + # SAVE UPDATED STANDARD + if request.method == 'POST': + + + + + + # CHECK IF USER HAS RIGHTS TO SEE THIS DIR + groupsofstandard = standard + + userisingroup = False + + if len(groupsofstandard.visibleby.all()) == 0: + userisingroup = True + else: + for ag in groupsofstandard.visibleby.all(): + + if ag.group in request.user.groups.all(): + userisingroup = True + + if userisingroup: + + normalForm = StandardUpdateStandard(request.POST, instance=standard) + editorForm = StandardUpdateStandardEditor(request.POST, instance=standard) + + if editorForm.is_valid() and normalForm.is_valid(): + standard.last_modified_by = request.user + standard.last_modified_on = datetime.now() + standard.task = normalForm.cleaned_data['task'] + standard.area = normalForm.cleaned_data['area'] + standard.name = normalForm.cleaned_data['name'] + standard.public = normalForm.cleaned_data['public'] + standard.content = editorForm.cleaned_data['content'] + standard.freefield_content = normalForm.cleaned_data['freefield_content'] + standard.freefield_title = normalForm.cleaned_data['freefield_title'] + + # Clear Users, will set again next step + standard.authority.clear() + standard.executor.clear() + standard.representative.clear() + + # GROUPS + standard.authority_group.clear() + standard.executor_group.clear() + standard.representative_group.clear() + + standard.visibleby.clear() + standard.linked_standards.clear() + standard.addedfiles.clear() + standard.addedquicklinks.clear() + standard.addedpasswords.clear() + standard.addedcontacts.clear() + + # ADD NEW INFOS + # REPRESENTATIV + verant = normalForm.cleaned_data['us_verant'].split(",") + for v in verant: + if(v.isdigit()): + standard.authority.add(User.objects.get(pk=v)) + + # EXECUTORS + ex = normalForm.cleaned_data['us_ex'].split(",") + for v in ex: + if(v.isdigit()): + standard.executor.add(User.objects.get(pk=v)) + + # AUTHORITY + ver = normalForm.cleaned_data['us_ver'].split(",") + for v in ver: + if(v.isdigit()): + standard.representative.add(User.objects.get(pk=v)) + + + verant_group = normalForm.cleaned_data['group_verant'].split(",") + for v in verant_group: + if(v.isdigit()): + standard.authority_group.add(AgencyGroup.objects.get(pk=v)) + + # EXECUTORS + ex_group = normalForm.cleaned_data['group_ex'].split(",") + for v in ex_group: + if(v.isdigit()): + standard.executor_group.add(AgencyGroup.objects.get(pk=v)) + + # AUTHORITY + ver_group = normalForm.cleaned_data['group_ver'].split(",") + for v in ver_group: + if(v.isdigit()): + standard.representative_group.add(AgencyGroup.objects.get(pk=v)) + + # ADD GROUPS + groups = normalForm.cleaned_data['checked_groups'].split(",") + + for g in groups: + if(g.isdigit()): + standard.visibleby.add(AgencyGroup.objects.get(pk=g)) + + # ADD STANDARDS + standards = normalForm.cleaned_data['added_standards'].split(",") + for s in standards: + if(s.isdigit()): + standard.linked_standards.add(Standards.objects.get(pk=s)) + + # ADD FILES + files = normalForm.cleaned_data['added_files'].split(",") + for f in files: + if(f.isdigit()): + standard.addedfiles.add(DataFile.objects.get(pk=f)) + + # ADD QUICKLINKS + quicklinks = normalForm.cleaned_data['added_quicklinks'].split(",") + for f in quicklinks: + if(f.isdigit()): + standard.addedquicklinks.add(QuickLinks.objects.get(pk=f)) + + # ADD PASSWORDS + addedpasswords = normalForm.cleaned_data['added_passwords'].split(",") + for f in addedpasswords: + if(f.isdigit()): + standard.addedpasswords.add(AGPassword.objects.get(pk=f)) + + # ADD CONTACTS + contacts = normalForm.cleaned_data['added_contacts'].split(",") + for f in contacts: + if(f.isdigit()): + standard.addedcontacts.add(AGContacts.objects.get(pk=f)) + + # ADD TO NETWORKS + networks = normalForm.cleaned_data['checked_networks'].split(",") + ''' + Alle Agenturverbunde laden, in denen die Agentur drin ist. + ''' + agencynetworks_all = AgencyNetwork.objects.all() + agencynetworks = [] + for a in agencynetworks_all: + if request.user.profile.agency in a.adminagencys.all() or request.user.profile.agency in a.members.all() or request.user.profile.agency in a.sharemembers.all(): + agencynetworks.append(a) + + + agencynetworks_standard_in = [] + + # Agenturverbünde, in denen der Standard drin sein soll + for f in networks: + if(f.isdigit()): + tempnetwork = AgencyNetwork.objects.get(pk=f) + #tempnetwork.standards.add(standard) + agencynetworks_standard_in.append(tempnetwork) + + #print(agencynetworks_standard_in) + + # Wenn Standard im gewünschten Verbund, dann rein, ansonsten raus + for a in agencynetworks: + if a in agencynetworks_standard_in and standard not in a.standards.all(): + a.standards.add(standard) + elif a not in agencynetworks_standard_in: + a.standards.remove(standard) + + + ''' + Info an die Agenturen über einen neuen Standard + + ''' + agency_send = [] + for agencynetwork_single in agencynetworks_standard_in: + for agn_admin in agencynetwork_single.adminagencys.all(): + if(agn_admin not in agency_send): + agency_send.append(agn_admin) + if agn_admin != request.user.profile.agency: + users_of_other_ag = User.objects.filter(profile__agency=agn_admin) + for u in users_of_other_ag: + if u.has_perm('users.standardmanager') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_standard_created_mail: + notificationtext = "im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_standard_created_push: + newnotification = UserNotification(touser=u, notificationtext="im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name, notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name}) + for agn_admin in agencynetwork_single.members.all(): + if(agn_admin not in agency_send): + agency_send.append(agn_admin) + if agn_admin != request.user.profile.agency: + users_of_other_ag = User.objects.filter(profile__agency=agn_admin) + for u in users_of_other_ag: + if u.has_perm('users.standardmanager') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_standard_created_mail: + notificationtext = "im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_standard_created_push: + newnotification = UserNotification(touser=u, notificationtext="im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name, notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name}) + for agn_admin in agencynetwork_single.sharemembers.all(): + if(agn_admin not in agency_send): + agency_send.append(agn_admin) + if agn_admin != request.user.profile.agency: + users_of_other_ag = User.objects.filter(profile__agency=agn_admin) + for u in users_of_other_ag: + if u.has_perm('users.standardmanager') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_standard_created_mail: + notificationtext = "im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_standard_created_push: + newnotification = UserNotification(touser=u, notificationtext="im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name, notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Im Agenturverbund " + agencynetwork_single.name + " wurde ein neuer Standard geteilt: " + standard.name}) + # Clear sended Agencys for multiple Networks + agency_send = [] + + if request.user.has_perm('users.standardmanager'): + messages.success(request, f'Standard {standard.name} aktualisiert!') + else: + if standard.public: + standard.public = False + messages.warning(request, f'Standard {standard.name} aktualisiert und ist nicht mehr öffentlich, damit Änderungen geprüft werden können.') + else: + messages.success(request, f'Standard {standard.name} aktualisiert!') + standard.save() + return redirect('/standards') + # SHOW EXISTING STANDARD + else: + + + # CHECK IF USER HAS RIGHTS TO SEE THIS DIR + groupsofstandard = standard + + userisingroup = False + + if len(groupsofstandard.visibleby.all()) == 0: + userisingroup = True + else: + for ag in groupsofstandard.visibleby.all(): + + if ag.group in request.user.groups.all(): + userisingroup = True + + if userisingroup: + + + + + + + normalForm = StandardUpdateStandard(instance=standard) + editorForm = StandardUpdateStandardEditor(instance=standard) + # GET ALL DATAS FROM STANDARD + # FILES + possibleFilesByVisible = [] + + allfiles = DataFile.objects.filter(agency=request.user.profile.agency) + # Get all files by view + for f in allfiles: + actParent = DataDir.objects.get(pk=f.parent.pk) + if actParent.is_root: + possibleFilesByVisible.append(f) + else: + if(checkUserDirRights(request, actParent, request.user.pk)): + possibleFilesByVisible.append(f) + + # Remove files which are in standard + for f in possibleFilesByVisible: + if f in standard.addedfiles.all(): + possibleFilesByVisible.remove(f) + + + # STANDARDS + possible_standards = [] + allstandards = Standards.objects.filter(agency=request.user.profile.agency, public=True) + + for s in allstandards: + if s not in standard.linked_standards.all(): + possible_standards.append(s) + + + # USERS VER AUTH EX + possible_verant = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk) + possible_verant_final = [] + for pv in possible_verant: + if pv not in standard.authority.all(): + possible_verant_final.append(pv) + + possible_ex = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk) + possible_ex_final = [] + for pv in possible_ex: + if pv not in standard.executor.all(): + possible_ex_final.append(pv) + + possible_ver = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk) + possible_ver_final = [] + for pv in possible_ver: + if pv not in standard.representative.all(): + possible_ver_final.append(pv) + + + # GROUPS VER AUTH EX + #possible_verant_group_final + #possible_ex_group_final + #possible_ver_group_final + possible_verant_group = AgencyGroup.objects.filter(agency=request.user.profile.agency) + possible_verant_group_final = [] + for g in possible_verant_group: + if g not in standard.authority_group.all(): + possible_verant_group_final.append(g) + + possible_ex_group = AgencyGroup.objects.filter(agency=request.user.profile.agency) + possible_ex_group_final = [] + for g in possible_ex_group: + if g not in standard.executor_group.all(): + possible_ex_group_final.append(g) + + possible_ver_group = AgencyGroup.objects.filter(agency=request.user.profile.agency) + possible_ver_group_final = [] + for g in possible_ver_group: + if g not in standard.representative_group.all(): + possible_ver_group_final.append(g) + + + + # QUICKLINKS + possible_quicklinks = [] + quicklinks = QuickLinks.objects.filter(agency=request.user.profile.agency) + + for q in quicklinks: + if q not in standard.addedquicklinks.all(): + possible_quicklinks.append(q) + + # CONTACTS + possible_contacts = [] + contacts = AGContacts.objects.filter(agency=request.user.profile.agency) + + for q in contacts: + if q not in standard.addedcontacts.all(): + possible_contacts.append(q) + + # PASSWORDS + possible_passwords = [] + contacts = AGPassword.objects.filter(agency=request.user.profile.agency) + + for q in contacts: + if q not in standard.addedpasswords.all(): + possible_passwords.append(q) + + # AGENCYNETWORKS + + agencynetworks_all = AgencyNetwork.objects.all() + agencynetworks = [] + + for a in agencynetworks_all: + if request.user.profile.agency in a.adminagencys.all() or request.user.profile.agency in a.members.all() or request.user.profile.agency in a.sharemembers.all(): + agencynetworks.append(a) + + # GROUPS + # Nicht nötig, da alles über agencygroups und direkt im Standard gemacht wird + + context = { + 'normalForm' : normalForm, + 'editorForm' : editorForm, + 'standard' : standard, + 'files' : possibleFilesByVisible, + 'standard_possible' : possible_standards, + 'poss_verant' : possible_verant_final, + 'poss_ex' : possible_ex_final, + 'poss_ver' : possible_ver_final, + 'possgroup_verant' : possible_verant_group_final, + 'possgroup_ex' : possible_ex_group_final, + 'possgroup_ver' : possible_ver_group_final, + 'possible_quicklinks' : possible_quicklinks, + 'possible_passwords' : possible_passwords, + 'possible_contacts' : possible_contacts, + 'agencynetworks' : agencynetworks, + 'agencygroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency), + 'parentid' : list(DataDir.objects.filter(agency=request.user.profile.agency, is_root=True))[0].pk, + 'active_link' : 'standards', + 'update' : True, + 'aggroups' : AgencyGroup.objects.filter(agency=request.user.profile.agency) + } + return render(request, 'standards/standards_add.html', context) + else: + context = { + 'active_link':'standards' + } + return render(request, 'standards/standards_noentrie.html', context) + + +''' + Gibt die Daten der Agenturgruppen zurück, welche in diesem Standard sind. +''' +@login_required +def LoadAGGroupMembers(request): + if request.method == "GET": + + aggroupid = request.GET['aggroup'] + try: + aggroup = AgencyGroup.objects.get(pk=aggroupid) + except: + return JsonResponse({"status" : "err", "message" : "Fehler! Diese Gruppe gibt es nicht."}) + + members_string = "" + if request.user.profile.agency == aggroup.agency: + members = User.objects.filter(groups__name=aggroup.group.name) + counter = 0 + for member in members: + members_string += member.get_full_name() + counter += 1 + + if counter+1 <= len(members): + members_string += ", " + + if counter == 0: + members_string = "Gruppe hat keine Mitglieder." + + else: + return JsonResponse({"status" : "err", "message" : "Sie haben auf diese Gruppe keinen Zugriff!"}) + return JsonResponse({"status" : "ok", "aggroupname" : aggroup.agencygroupname, "members" : members_string}) + else: + return JsonResponse({"status" : "err", "message" : "Allgemeiner Fehler."}) + + +# Funktion zum versenden einer Mail inkl. TEmplate +def sendMailNoti(notificationtext, user_touched, linktarget=""): + username = user_touched.first_name + " " + user_touched.last_name + msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext, 'linktarget' : linktarget}) + send_mail( + 'Agentur-Benachrichtigung', + 'Hallo ' + user_touched.first_name + ' ' + user_touched.last_name + '! ' + notificationtext, + 'noreply@digitale-agentur.com', + [user_touched.email], + html_message=msg_html, + fail_silently=True + ) + +@login_required +def load_tasks(request): + areaid = request.GET.get('areaid') + tasks = Tasks.objects.filter(area__id=areaid, agency=request.user.profile.agency).order_by('name') + return render(request, 'standards/standards_tasklist.html', {'tasks': tasks}) + + +class StandardDeleteView(LoginRequiredMixin, DeleteView): + model = Standards + success_url = '/standards' + template_name = 'standards/standard_confirm_delete.html' + + def delete(self, request, *args, **kwargs): + standard = Standards.objects.get(pk=kwargs['pk'], agency=request.user.profile.agency) + response = super(StandardDeleteView, self).delete(request, *args, **kwargs) + names = standard.name + messages.success(request, f'Standard ' +names+ ' wurde gelöscht!') + return response + + def get_context_data(self, **kwargs): + context = super(StandardDeleteView, self).get_context_data(**kwargs) + context['active_link'] = 'standards' + return context + +@login_required +def StandardChangePublic(request, pk): + standard = Standards.objects.get(pk=pk) + if standard.public: + standard.public = False + messages.warning(request, f'Standard {standard.name} ist nicht mehr öffentlich!') + else: + standard.public = True + messages.success(request, f'Standard {standard.name} wurde veröffentlicht und ist innerhalb der Agentur sichtbar!') + standard.save() + return redirect('standards') + +@login_required +def StandardSingle(request, pk): + + # CHECK IF USER HAS RIGHTS TO SEE THIS DIR + groupsofstandard = Standards.objects.get(pk=pk, agency=request.user.profile.agency) + + userisingroup = False + + if len(groupsofstandard.visibleby.all()) == 0: + userisingroup = True + else: + for ag in groupsofstandard.visibleby.all(): + + if ag.group in request.user.groups.all(): + userisingroup = True + + if userisingroup: + standard = Standards.objects.get(pk=pk) + context = { + 'active_link':'standards', + 'standard' : standard + } + + return render(request, 'standards/standards_single.html', context) + else: + context = { + 'active_link':'standards' + } + return render(request, 'standards/standards_noentrie.html', context) + + + +@login_required +def CopyStandard(request, pk): + #SANDARD COPY + sc = Standards.objects.get(pk=pk) + sc.agencynetworkcounter = sc.agencynetworkcounter+1 + sc.save() + + area = list(Areas.objects.filter(agency=request.user.profile.agency))[0] + task = list(Tasks.objects.filter(agency=request.user.profile.agency))[0] + + new_standard = Standards() + new_standard.agency = request.user.profile.agency + new_standard.created_standard_by = request.user + new_standard.published_by = request.user + new_standard.last_modified_by = request.user + new_standard.created_standard_date = datetime.now() + new_standard.last_modified_on = datetime.now() + new_standard.task = None + new_standard.area = None + new_standard.name = sc.name + new_standard.content = sc.content + new_standard.public = False + + new_standard.freefield_content = sc.freefield_content + new_standard.freefield_title = sc.freefield_title + + new_standard.parent_standard = sc + new_standard.shared_on = datetime.now() + + new_standard.save() + + datadir_parentid = list(DataDir.objects.filter(is_defaultstandard=True, agency__pk=request.user.profile.agency.pk))[0] + + for f in sc.addedfiles.all(): + tempdatafile = DataFile(file=f.file, name=f.name, owner=request.user, parent=datadir_parentid, agency=request.user.profile.agency) + tempdatafile.save() + new_standard.addedfiles.add(tempdatafile) + # TASK: Hier das kopieren der Dateien auf dem Server noch einfügen + + # Sende Info, dass ein Standard übernommen wurde, an die Erstelleragentur + usersofagency = User.objects.filter(profile__agency=sc.agency) + + for u in usersofagency: + if u.has_perm('users.standardmanager') and u.has_perm('users.agencynetwork'): + if u.usernotifications.agn_standard_copied_mail: + notificationtext = "der Standard " + sc.name + " wurde von der Agentur " + request.user.profile.agency.name + " übernommen." + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_standard_copied_push: + newnotification = UserNotification(touser=u, notificationtext="der Standard " + sc.name + " wurde von der Agentur " + request.user.profile.agency.name + " übernommen.", notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Der Standard " + sc.name + " wurde von der Agentur " + request.user.profile.agency.name + " übernommen."}) + + return redirect('standard-add', new_standard.pk) + +@login_required +def StandardArea(request, pk): + standards = Standards.objects.filter(agency__pk=request.user.profile.agency.pk).exclude(area=None).exclude(task=None).filter(area__pk=pk) + area = Areas.objects.get(pk=pk, agency=request.user.profile.agency) + context = { + 'active_link':'standards', + 'standards_of_agency_area' : standards, + 'areaid' : pk, + 'areaname' : area.name + } + return render(request, 'standards/standard_area.html', context) + +@login_required +def StandardTask(request, pk): + standards = Standards.objects.filter(agency__pk=request.user.profile.agency.pk).exclude(area=None).exclude(task=None).filter(task__pk=pk) + task = Tasks.objects.get(pk=pk, agency=request.user.profile.agency) + area = Areas.objects.get(pk=task.area.pk, agency=request.user.profile.agency) + context = { + 'active_link':'standards', + 'standards_of_agency_task' : standards, + 'taskid' : pk, + 'taskname' : task.name, + 'areaid' : area.pk, + 'areaname' : area.name + } + return render(request, 'standards/standard_task.html', context) + +@login_required +def StandardTaskUser(request, pk, userpk): + standards = Standards.objects.filter(agency__pk=request.user.profile.agency.pk, created_standard_by=User.objects.get(pk=userpk)).exclude(area=None).exclude(task=None).filter(task__pk=pk) or Standards.objects.filter(agency__pk=request.user.profile.agency.pk, last_modified_by=User.objects.get(pk=userpk)).exclude(area=None).exclude(task=None).filter(task__pk=pk) + task = Tasks.objects.get(pk=pk, agency=request.user.profile.agency) + area = Areas.objects.get(pk=task.area.pk, agency=request.user.profile.agency) + context = { + 'active_link':'standards', + 'standards_of_agency_task' : standards, + 'taskid' : pk, + 'taskname' : task.name, + 'areaid' : area.pk, + 'areaname' : area.name, + 'vieweduser' : User.objects.get(pk=userpk) + } + return render(request, 'standards/standard_task_user.html', context) + + +# AJAX Standard +@login_required +def updatesbyajax(request, pk): + if(request.method == "GET"): + success = True + workingstandard = Standards.objects.get(pk=pk, agency=request.user.profile.agency) + # Check for correct user and userrights + if(request.user.profile.agency == workingstandard.agency and request.user.has_perm("users.standardmanager")): + # CHANGE GROUP + # ADD + if(request.GET["action"] == "s_addgroup"): + workingstandard.visibleby.add(AgencyGroup.objects.get(pk=request.GET["groupid"], agency=request.user.profile.agency)) + # REMOVE + elif(request.GET["action"] == "s_remgroup"): + workingstandard.visibleby.remove(AgencyGroup.objects.get(pk=request.GET["groupid"], agency=request.user.profile.agency)) + # FILES + # REMOVE + elif(request.GET["action"] == "s_remfile"): + workingstandard.addedfiles.remove(DataFile.objects.get(pk=request.GET["fileid"], agency=request.user.profile.agency)) + # ADD + elif(request.GET["action"] == "s_addfile"): + workingstandard.addedfiles.add(DataFile.objects.get(pk=request.GET["fileid"], agency=request.user.profile.agency)) + # STANDARD + # REMOVE + elif(request.GET["action"] == "s_remstandard"): + workingstandard.linked_standards.remove(Standards.objects.get(pk=request.GET["standardid"], agency=request.user.profile.agency)) + # ADD + elif(request.GET["action"] == "s_addstandard"): + workingstandard.linked_standards.add(Standards.objects.get(pk=request.GET["standardid"], agency=request.user.profile.agency)) + # VERANTWORTLICHER / AUTHORITY + # REMOVE + elif(request.GET["action"] == "s_remverant"): + workingstandard.authority.remove(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency)) + elif(request.GET["action"] == "s_addverant"): + workingstandard.authority.add(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency)) + # ASUFÜRHENDER / EXECUTOR + # REMOVE + elif(request.GET["action"] == "s_remex"): + workingstandard.executor.remove(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency)) + elif(request.GET["action"] == "s_addex"): + workingstandard.executor.add(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency)) + # VERTRETER / REPRESENETATIVE + # REMOVE + elif(request.GET["action"] == "s_remver"): + workingstandard.representative.remove(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency)) + elif(request.GET["action"] == "s_addver"): + workingstandard.representative.add(User.objects.get(pk=request.GET["userid"], profile__agency=request.user.profile.agency)) + # ADD STANDARD TO AGENCYNETWORK + elif(request.GET["action"] == "s_addtonetwork"): + if workingstandard.public and request.user.profile.agency == workingstandard.agency: + agn = AgencyNetwork.objects.get(pk=request.GET["agn_id"]) + if(request.GET["newstat"] == "true"): + agn.standards.add(workingstandard) + else: + agn.standards.remove(workingstandard) + agn.lastactivity = datetime.now() + agn.save() + else: + success = False + + return JsonResponse({"success" : success}) + + +# CREATE PDF FROM STANDARD +from io import BytesIO +from xhtml2pdf import pisa + + +# Utility function +def convert_html_to_pdf(source_html, output_filename): + result = BytesIO() + pdf = pisa.pisaDocument(BytesIO(source_html.encode("UTF-8")), result) + if not pdf.err: + return HttpResponse(result.getvalue(), content_type='application/pdf') + return None + +@login_required +def getStandardPDF(request, pk): + standard = Standards.objects.get(pk=pk) + # CHECK IF USER HAS RIGHTS TO SEE THIS Standard + groupsofstandard = Standards.objects.get(pk=pk, agency=request.user.profile.agency) + + userisingroup = False + + if len(groupsofstandard.visibleby.all()) == 0: + userisingroup = True + else: + for ag in groupsofstandard.visibleby.all(): + if ag.group in request.user.groups.all(): + userisingroup = True + + if userisingroup: + pdf = convert_html_to_pdf("

" + standard.name + "


" + standard.content, "final.pdf") + return HttpResponse(pdf, content_type='application/pdf') + else: + messages.warning(request, f'Diesen Standard dürfen Sie nicht sehen!') + return redirect('standards') + + +@login_required +def StandardFromAgn(request, pk): + try: + agn = AgencyNetwork.objects.get(pk=pk) + context = { + 'active_link':'standards', + 'standards_of_agency_network' : agn.standards.all(), + 'agn' :agn, + } + return render(request, 'standards/standards_from_agn.html', context) + except: + context = { + 'active_link':'standards', + } + return redirect('standards') + + +# View for SingleStandard from AgencyNetwork +@login_required +def StandardSingleAgn(request, pk, agnpk): + context = { + 'active_link':'standards', + 'agnpk' : agnpk, + 'standard' : Standards.objects.get(pk=pk), + 'comments' : StandardComments.objects.filter(standard=Standards.objects.get(pk=pk)).order_by("-last_modified_on") + } + return render(request, 'standards/standards_single_agn.html', context) + +@login_required +def updatesbyajax_agn(request, pk): + if(request.method == "GET"): + + if(request.GET["action"] == "add_comment"): + content = re.sub('[^A-Za-z0-9,!?_ äüöÄÜÖ]+', '', request.GET.get("content")) + sc = StandardComments(standard=Standards.objects.get(pk=pk), content=content, comment_by=request.user, comment_on=datetime.now(), last_modified_on=datetime.now()) + sc.save() + + # Benachrichtigung an Standardagentur + standard_comment = Standards.objects.get(pk=pk) + usersofagency = User.objects.filter(profile__agency=standard_comment.agency) + + for u in usersofagency: + if u.has_perm('users.standardmanager'): + if u.usernotifications.agn_standard_comment_mail: + notificationtext = "der Standard " + standard_comment.name + " wurde kommentiert: " + content + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_standard_comment_push: + newnotification = UserNotification(touser=u, notificationtext="der Standard " + standard_comment.name + " wurde kommentiert: " + content, notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Agenturverbund | Der Standard " + standard_comment.name + " wurde kommentiert:" + content}) + + + return JsonResponse({"success" : "success", "sc_id" : sc.pk, "sc_c" : sc.content, "sc_user" : sc.comment_by.first_name + " " + sc.comment_by.last_name, "sc_date" : defaultfilters.date(sc.last_modified_on, "SHORT_DATETIME_FORMAT") }) + + elif(request.GET["action"] == "del_comment"): + StandardComments.objects.get(pk=request.GET.get("id")).delete() + return JsonResponse({}) + elif(request.GET["action"] == "update_comment_rate"): + + user = request.user + comment = StandardComments.objects.get(pk=request.GET.get("id")) + + rate = list(StandardCommentRate.objects.filter(oncomment=comment, rated_by=request.user)) + + if len(rate) == 0: + new_s_c_rate = StandardCommentRate(oncomment=comment, rated_by=request.user, rate_stats=request.GET.get("newstat")) + new_s_c_rate.save() + else: + s_c_rate = StandardCommentRate.objects.get(pk=rate[0].pk) + s_c_rate.rate_stats=request.GET.get("newstat") + s_c_rate.save() + + counter_up = len(StandardCommentRate.objects.filter(oncomment=comment, rate_stats=1)) + counter_down = len(StandardCommentRate.objects.filter(oncomment=comment, rate_stats=0)) + + u = comment.comment_by + if u.usernotifications.agn_standard_comment_react_mail: + notificationtext = "der Kommentar zum Standard " + comment.standard.name + " wurde gerated!" + sendMailNoti(notificationtext, u) + + if u.usernotifications.agn_standard_comment_react_push: + newnotification = UserNotification(touser=u, notificationtext="der Kommentar zum Standard " + comment.standard.name + " wurde gerated!", notificationtype="") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Kommantar | der Kommentar zum Standard " + comment.standard.name + " wurde gerated!"}) + + + return JsonResponse({"up" : counter_up, "down" : counter_down}) + elif(request.GET["action"] == "markingfavorit"): + workingstandard = Standards.objects.get(pk=pk) + added = False + if workingstandard.public: + if(request.user in workingstandard.favoritfrom.all()): + workingstandard.favoritfrom.remove(request.user) + else: + workingstandard.favoritfrom.add(request.user) + added = True + return JsonResponse({"added" : added}) + + +@login_required +def UpdateStandardBeforeUserDel(request): + if(request.method == "GET"): + success = False + # Get Request-Data + newuser = User.objects.get(pk=request.GET["userid"]) + finalkind = request.GET["finalkind"] + standard = Standards.objects.get(pk=request.GET["standard"]) + useractor = User.objects.get(pk=request.GET["useractorid"]) + + if(newuser.profile.agency == useractor.profile.agency and standard.agency == useractor.profile.agency and useractor.has_perm('users.usermanager')): + # User is new creator + if(finalkind == "created"): + standard.created_standard_by = newuser + # User is new executor + elif(finalkind == "ex"): + standard.executor.add(newuser) + # User is new representator + elif(finalkind == "repr"): + standard.representative.add(newuser) + # User is new in auth + elif(finalkind == "auth"): + standard.authority.add(newuser) + + standard.save() + success = True + else: + success = False + + return JsonResponse({"success" : success}) + diff --git a/tasks/__init__.py b/tasks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tasks/__pycache__/__init__.cpython-38.pyc b/tasks/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..69126d4 Binary files /dev/null and b/tasks/__pycache__/__init__.cpython-38.pyc differ diff --git a/tasks/__pycache__/admin.cpython-38.pyc b/tasks/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..a1a668b Binary files /dev/null and b/tasks/__pycache__/admin.cpython-38.pyc differ diff --git a/tasks/__pycache__/apps.cpython-38.pyc b/tasks/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..2af7ee8 Binary files /dev/null and b/tasks/__pycache__/apps.cpython-38.pyc differ diff --git a/tasks/__pycache__/forms.cpython-38.pyc b/tasks/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..e75547d Binary files /dev/null and b/tasks/__pycache__/forms.cpython-38.pyc differ diff --git a/tasks/__pycache__/models.cpython-38.pyc b/tasks/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..b44de5d Binary files /dev/null and b/tasks/__pycache__/models.cpython-38.pyc differ diff --git a/tasks/__pycache__/urls.cpython-38.pyc b/tasks/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..472d6b6 Binary files /dev/null and b/tasks/__pycache__/urls.cpython-38.pyc differ diff --git a/tasks/__pycache__/views.cpython-38.pyc b/tasks/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..b40b307 Binary files /dev/null and b/tasks/__pycache__/views.cpython-38.pyc differ diff --git a/tasks/admin.py b/tasks/admin.py new file mode 100644 index 0000000..7cf348d --- /dev/null +++ b/tasks/admin.py @@ -0,0 +1,4 @@ +from django.contrib import admin +from .models import Tasks +# Register your models here. +admin.site.register(Tasks) \ No newline at end of file diff --git a/tasks/apps.py b/tasks/apps.py new file mode 100644 index 0000000..2054722 --- /dev/null +++ b/tasks/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class TasksConfig(AppConfig): + name = 'tasks' diff --git a/tasks/forms.py b/tasks/forms.py new file mode 100644 index 0000000..a5f96f0 --- /dev/null +++ b/tasks/forms.py @@ -0,0 +1,21 @@ +from django import forms +from django.forms import ModelForm +from .models import Tasks +from areas.models import Areas + +class TasksAddTaskForm(forms.ModelForm): + + class Meta: + model =Tasks + labels = { + "name" : "Aufgabenname", + "area" : "Übergeordneter Bereich", + "visible": "Im Organigramm sichtbar" + } + fields = ['name', 'area', 'visible'] + + def __init__(self, *args, **kwargs): + user = kwargs.pop('user') + super(TasksAddTaskForm, self).__init__(*args, **kwargs) + self.fields['area'].queryset = Areas.objects.filter(agency__pk=user.profile.agency.pk) + diff --git a/tasks/migrations/0001_initial.py b/tasks/migrations/0001_initial.py new file mode 100644 index 0000000..27c369a --- /dev/null +++ b/tasks/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Tasks', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ('desc', models.TextField(blank=True, max_length=3000)), + ('created_area_date', models.DateField(blank=True, default=datetime.date.today)), + ('visible', models.BooleanField(default=True)), + ], + ), + ] diff --git a/tasks/migrations/0002_auto_20200925_0713.py b/tasks/migrations/0002_auto_20200925_0713.py new file mode 100644 index 0000000..d321de7 --- /dev/null +++ b/tasks/migrations/0002_auto_20200925_0713.py @@ -0,0 +1,40 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('tasks', '0001_initial'), + ('areas', '0002_auto_20200925_0713'), + ] + + operations = [ + migrations.AddField( + model_name='tasks', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AddField( + model_name='tasks', + name='area', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='areas.Areas'), + ), + migrations.AddField( + model_name='tasks', + name='created_area_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='tasks', + name='usersfield', + field=models.ManyToManyField(blank=True, related_name='users_in_task', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/tasks/migrations/__init__.py b/tasks/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tasks/migrations/__pycache__/0001_initial.cpython-38.pyc b/tasks/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..b0b1dc3 Binary files /dev/null and b/tasks/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/tasks/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc b/tasks/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc new file mode 100644 index 0000000..62ca22b Binary files /dev/null and b/tasks/migrations/__pycache__/0002_auto_20200925_0713.cpython-38.pyc differ diff --git a/tasks/migrations/__pycache__/__init__.cpython-38.pyc b/tasks/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..a0ac23e Binary files /dev/null and b/tasks/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/tasks/models.py b/tasks/models.py new file mode 100644 index 0000000..a89ac4a --- /dev/null +++ b/tasks/models.py @@ -0,0 +1,32 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency +from django.urls import reverse +from areas.models import Areas +import datetime + +''' + +Model Tasks + +''' + +class Tasks(models.Model): + + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + area = models.ForeignKey(Areas, on_delete=models.CASCADE) + name = models.CharField(max_length=200, blank=False, default="") + desc = models.TextField(max_length=3000, blank=True) + usersfield = models.ManyToManyField(User, blank=True, related_name='users_in_task') + created_area_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) + created_area_date = models.DateField(default=datetime.date.today, blank=True) + visible = models.BooleanField(default=True) + + def __str__(self): + return f'{self.name}' + + # Hier Path für Templates des Models mit Parametern + def get_absolute_url(self): + return reverse('tasks-update', kwargs={'pk':self.pk}) + + diff --git a/tasks/templates/tasks/tasks_add.html b/tasks/templates/tasks/tasks_add.html new file mode 100644 index 0000000..4e50986 --- /dev/null +++ b/tasks/templates/tasks/tasks_add.html @@ -0,0 +1,16 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+

Neue Tätigkeit anlegen

+
+
+ {% csrf_token %} + {{ form|crispy }} +

Nachdem Erstellen der Aufgabe können Mitarbeiter zugewiesen werden.

+
+   + Abbrechen +
+
+{% endblock content %} diff --git a/tasks/templates/tasks/tasks_confirm_delete.html b/tasks/templates/tasks/tasks_confirm_delete.html new file mode 100644 index 0000000..1774083 --- /dev/null +++ b/tasks/templates/tasks/tasks_confirm_delete.html @@ -0,0 +1,22 @@ +{% extends "users/base.html" %} +{% load crispy_forms_tags %} +{% block content %} +
+
+
+ +
+ +
+
+ +
+ {% csrf_token %} +

Alle unter dieser Aufgabe erstellten Standards werden gelöscht!

+
+   + Abbrechen +
+
+
+{% endblock content %} \ No newline at end of file diff --git a/tasks/templates/tasks/tasks_management.html b/tasks/templates/tasks/tasks_management.html new file mode 100644 index 0000000..c996f29 --- /dev/null +++ b/tasks/templates/tasks/tasks_management.html @@ -0,0 +1,67 @@ +{% extends "users/base.html" %} +{% block content %} +
+

Aufgabenverwaltung

+
+

+ Aufgaben unterteilen die Agentur in verschiedene Aufgabenbereiche innerhalb der Bereiche. +

+
+ +
+ +
+
+ +
+
+ + + + + + + + + + + + {% for item in tasks_of_agency %} + + + + + + + + {% endfor %} + +
NameBereichErstellt vonErstellt am 
{{item.name }}{{ item.area.name }}{{ item.created_area_by.first_name }} {{ item.created_area_by.last_name }}{{ item.created_area_date }} + + +
+
+
+ +{% endblock content %} diff --git a/tasks/templates/tasks/tasks_update.html b/tasks/templates/tasks/tasks_update.html new file mode 100644 index 0000000..7bae5ca --- /dev/null +++ b/tasks/templates/tasks/tasks_update.html @@ -0,0 +1,146 @@ +{% extends "users/base.html" %} +{% load static %} +{% load crispy_forms_tags %} +{% block content %} +
+

Aufgabe aktualisieren

+
+
+ {% csrf_token %} + {{ form|crispy }} +
Mitarbeiter hinzufügen
+
+ +
+ + +
+ + {% for us in possible_users %} + + {% endfor %} + + +
+
+
Zugewiesene Mitarbeiter
+
+ {% if added_users|length > 0 %} + + {% for us in added_users %} + {{ us.first_name }} {{ us.last_name }}   + + {% endfor %} + {% else %} +

Dieser Aufgabe sind noch keine Mitarbeiter zugewiesen.

+ {% endif %} +
+
+ +   + Abbrechen +
+
+ +{% endblock content %} diff --git a/tasks/tests.py b/tasks/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/tasks/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/tasks/urls.py b/tasks/urls.py new file mode 100644 index 0000000..bb32b3b --- /dev/null +++ b/tasks/urls.py @@ -0,0 +1,15 @@ +from django.urls import path +from django.contrib.auth import views as auth_views +from django.contrib.auth.decorators import login_required, permission_required +from .views import TasksAddTask, TasksDeleteView, TasksUpdateView +from . import views +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('addtask/', permission_required('users.tasks_management')(TasksAddTask.as_view(template_name="tasks/tasks_add.html")), name='tasks-addtask'), + path('tasks//delete', permission_required('users.tasks_management')(TasksDeleteView.as_view()), name='tasks-delete'), + path('tasks//', permission_required('users.tasks_management')(TasksUpdateView.as_view()), name='tasks-manage'), + path('areaajax/', views.task_addtasks_ajax, name="task-ajaxview") +] diff --git a/tasks/views.py b/tasks/views.py new file mode 100644 index 0000000..5774d77 --- /dev/null +++ b/tasks/views.py @@ -0,0 +1,127 @@ +from django.shortcuts import render +from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.models import User +from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView, View +from .models import Tasks +from .forms import TasksAddTaskForm +from django.contrib import messages +from django.http import HttpResponse, JsonResponse +from users.priomodel import Prio +from django.contrib.auth.decorators import login_required + + +class TasksAddTask(LoginRequiredMixin, CreateView): + model = Tasks + success_url = '/dasettings/main' + form_class = TasksAddTaskForm + + def get_form_kwargs(self): + kwargs = super(TasksAddTask, self).get_form_kwargs() + kwargs['user'] = self.request.user + return kwargs + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context.update({'active_link' : 'dasettings'}) + return context + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Tätigkeit angelegt!') + # SAVE OBJECTS TO SIGNALE! + form.instance.agency = self.request.user.profile.agency + form.instance.created_area_by = self.request.user + return super().form_valid(form) + +class TasksDeleteView(LoginRequiredMixin, DeleteView): + model = Tasks + success_url = '/dasettings/main' + template_name = 'tasks/tasks_confirm_delete.html' + + def delete(self, request, *args, **kwargs): + area = Tasks.objects.get(pk=kwargs['pk']) + response = super(TasksDeleteView, self).delete(request, *args, **kwargs) + name = area.name + messages.success(request, f'Tätigkeit ' +name+ ' wurde gelöscht!') + return response + + def get_context_data(self, **kwargs): + context = super(TasksDeleteView, self).get_context_data(**kwargs) + context['active_link'] = 'tasksmanagement' + return context + +# Hier andere Nutzer ändern, wenn man Usersmanagement darf! +class TasksUpdateView(LoginRequiredMixin, UpdateView): + model = Tasks + template_name = 'tasks/tasks_update.html' + success_url = '/dasettings/main' + form_class = TasksAddTaskForm + + def get_form_kwargs(self): + kwargs = super(TasksUpdateView, self).get_form_kwargs() + kwargs['user'] = self.request.user + return kwargs + + def form_valid(self, form): + # Send message to the site + messages.success(self.request, f'Tätigkeit aktualisiert!') + return super().form_valid(form) + + def get_context_data(self, **kwargs): + context = super(TasksUpdateView, self).get_context_data(**kwargs) + tasks = Tasks.objects.get(pk=context['object'].pk) + # User still in Area + user_in_task = tasks.usersfield.all() + # Get all Users from same Agency which are NOT in context_added_users + possible_users = User.objects.filter(profile__agency__pk=self.request.user.profile.agency.pk).exclude(pk__in=context['added_users']) + context['possible_users'] = possible_users + # Active-Link for Base-Design + context['active_link'] = 'dasettings' + # Area ID + context['objectid'] = context['object'].pk + return context + +''' + + Hier werden Aufgaben zu Mitarbeitern zugewiesen oder entfernt. Dabei wird bei jeder Aufgabe auch gleich ein + Prio-Objekt erzeugt/entfernt, damit der Mitarbeiter seine Prioritäten auf dem Organigramm einstellen kann. + +''' +@login_required +def task_addtasks_ajax(request): + if request.method == 'GET': + + # ADD USER TO MANY-TO-MANY USERSFIELD + if request.GET['action'] == 'adduser': + task = Tasks.objects.get(pk=request.GET['objectid'], agency=request.user.profile.agency) + task.usersfield.add(User.objects.get(pk=request.GET['userid'], profile__agency=request.user.profile.agency)) + task.save() + # PRIO + prio = Prio(user=User.objects.get(pk=request.GET['userid'], profile__agency=request.user.profile.agency), task=task) + prio.save() + # REMOVE USER TO MANY-TO-MANY USERSFIELD + elif request.GET['action'] == 'remuser': + task = Tasks.objects.get(pk=request.GET['objectid'], agency=request.user.profile.agency) + task.usersfield.remove(User.objects.get(pk=request.GET['userid'], profile__agency=request.user.profile.agency)) + task.save() + # DELETE PRIO + Prio.objects.filter(user__pk=request.GET['userid']).filter(task__pk=request.GET['objectid']).delete() + + userid = request.GET['userid'] + workinguser = User.objects.get(pk=userid, profile__agency=request.user.profile.agency) + username_clean = workinguser.first_name + " " + workinguser.last_name + + # Getting Remaining-Users + task = Tasks.objects.get(pk=request.GET['objectid']) + added_users = task.usersfield.all() + possible_users = User.objects.filter(profile__agency__pk=request.user.profile.agency.pk).exclude(pk__in=added_users) + possible_users_js = list(possible_users.values()) + # Cleaned out, that only data is neede will send to the side (first/last-name and id) + final_possible_users = {} + for ele in possible_users_js: + final_possible_users.update({'first_name':ele['first_name'],'last_name':ele['last_name'],'id':ele['id']}) + # Counter for remaining users to show/hide "Keine Mitarbeiter"-Div + remaining_users_counter = len(added_users) + return JsonResponse({'userid' : userid, 'username_clean' : username_clean, 'remaining_users':possible_users_js, 'remaining_users_counter' : final_possible_users}) + else: + return HttpResponse("Request method is not a GET") diff --git a/timemanagement/__init__.py b/timemanagement/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/timemanagement/__pycache__/__init__.cpython-38.pyc b/timemanagement/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..b925a30 Binary files /dev/null and b/timemanagement/__pycache__/__init__.cpython-38.pyc differ diff --git a/timemanagement/__pycache__/admin.cpython-38.pyc b/timemanagement/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..10bab67 Binary files /dev/null and b/timemanagement/__pycache__/admin.cpython-38.pyc differ diff --git a/timemanagement/__pycache__/apps.cpython-38.pyc b/timemanagement/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..38f48be Binary files /dev/null and b/timemanagement/__pycache__/apps.cpython-38.pyc differ diff --git a/timemanagement/__pycache__/forms.cpython-38.pyc b/timemanagement/__pycache__/forms.cpython-38.pyc new file mode 100644 index 0000000..97aa1df Binary files /dev/null and b/timemanagement/__pycache__/forms.cpython-38.pyc differ diff --git a/timemanagement/__pycache__/models.cpython-38.pyc b/timemanagement/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..dbe0dd6 Binary files /dev/null and b/timemanagement/__pycache__/models.cpython-38.pyc differ diff --git a/timemanagement/__pycache__/urls.cpython-38.pyc b/timemanagement/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..bdc0e59 Binary files /dev/null and b/timemanagement/__pycache__/urls.cpython-38.pyc differ diff --git a/timemanagement/__pycache__/views.cpython-38.pyc b/timemanagement/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..0571d0e Binary files /dev/null and b/timemanagement/__pycache__/views.cpython-38.pyc differ diff --git a/timemanagement/admin.py b/timemanagement/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/timemanagement/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/timemanagement/apps.py b/timemanagement/apps.py new file mode 100644 index 0000000..70b0057 --- /dev/null +++ b/timemanagement/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class TimemanagementConfig(AppConfig): + name = 'timemanagement' diff --git a/timemanagement/forms.py b/timemanagement/forms.py new file mode 100644 index 0000000..fc91872 --- /dev/null +++ b/timemanagement/forms.py @@ -0,0 +1,211 @@ +from bootstrap_datepicker_plus import DatePickerInput +from django import forms +from django.forms import ModelForm +from .models import Absence, AbsenceReason, FreeDays, Workday, Breaks +from users.models import UserFullName +from django.forms import HiddenInput + +class AddAbsence(forms.ModelForm): + class Meta: + model = Absence + labels = { + "start" : "Beginn der Abwesenheit", + "start_ishalf" : "Halber Tag?", + "end" : "Ende der Abwesenheit", + "end_ishalf" : "Halber Tag?", + "reason" : "Abwesenheitsgrund", + "representator" : "Vertreter", + "info" : "Begründung", + "startday_info" : "", + "endday_info" : "" + } + widgets = { + 'start': DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}), + 'end': DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}), + } + + + #fields = ['start', 'start_ishalf', 'end','end_ishalf', 'reason', "representator", 'info'] + fields = ['start', 'startday_info', 'end','endday_info', 'reason', "representator", 'info'] + + def __init__(self, *arg, **kwargs): + super(AddAbsence, self).__init__(*arg, **kwargs) + self.fields['reason'].queryset = AbsenceReason.objects.filter(agency=kwargs['instance'].profile.agency).order_by('-name') + self.fields['representator'].queryset = UserFullName.objects.filter(profile__agency=kwargs['instance'].profile.agency) + self.fields['info'].widget.attrs['rows'] = 3 + self.fields['start'].required = True + self.fields['end'].required = True + self.fields['reason'].required = True + + self.fields['nextmonth'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['prevmonth'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['nextyear'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['prevyear'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['activemonth'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['activeyear'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['userid'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + +class UpdateAbsence(forms.ModelForm): + + class Meta: + model = Absence + labels = { + "start" : "Beginn der Abwesenheit", + "start_ishalf" : "Halber Tag?", + "end" : "Ende der Abwesenheit", + "end_ishalf" : "Halber Tag?", + "reason" : "Abwesenheitsgrund", + "representator" : "Vertreter", + "info" : "Begründung", + "confirm_info" : "Begründung zur An- oder Ablehnung", + "startday_info" : "", + "endday_info" : "" + } + widgets = { + 'start': DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}), + 'end': DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}), + } + + + #fields = ['start', 'start_ishalf', 'end','end_ishalf', 'reason', "representator", 'info'] + fields = ['start', 'startday_info', 'end','endday_info', 'reason', "representator", 'info', 'holidays_normal', 'holidays_rest', 'holidays_normal_next', 'holidays_rest_next', 'confirm_info' ] + + def __init__(self, *arg, **kwargs): + super(UpdateAbsence, self).__init__(*arg, **kwargs) + self.fields['reason'].queryset = AbsenceReason.objects.filter(agency=kwargs['instance'].profile.agency).order_by('-name') + self.fields['representator'].queryset = UserFullName.objects.filter(profile__agency=kwargs['instance'].profile.agency, ) + self.fields['info'].widget.attrs['rows'] = 3 + self.fields['confirm_info'].widget.attrs['rows'] = 3 + self.fields['start'].required = True + self.fields['end'].required = True + self.fields['reason'].required = True + + self.fields['nextmonth'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['prevmonth'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['nextyear'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['prevyear'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['activemonth'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['activeyear'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + self.fields['userid'] = forms.CharField(initial="", required=False, widget=forms.HiddenInput()) + + self.fields['holidays_normal'] = forms.FloatField(required=False, widget=forms.HiddenInput()) + self.fields['holidays_rest'] = forms.FloatField(required=False, widget=forms.HiddenInput()) + self.fields['holidays_normal_next'] = forms.FloatField(required=False, widget=forms.HiddenInput()) + self.fields['holidays_rest_next'] = forms.FloatField(required=False, widget=forms.HiddenInput()) + + ''' + def clean(self): + start_date = self.cleaned_data['start'] + end_date = self.cleaned_data['end'] + + if end_date <= start_date: + raise forms.ValidationError("Das Ende der Abwesenheit muss am oder nach dem Start der Abwesenheit liegen.") + return super(AddAbsence, self).clean() + ''' + +class ConfirmAbsenceForm(forms.ModelForm): + class Meta: + model = Absence + + labels = { + "confirm_info" : "Begründung zur Annahme/zur Ablehnung" + } + fields = ['confirm_info'] + + def __init__(self, *arg, **kwargs): + super(ConfirmAbsenceForm, self).__init__(*arg, **kwargs) + self.fields['confirm_info'].widget.attrs['rows'] = 3 + + +# NEW USER FORM +class AddFreeDayForm(forms.ModelForm): + class Meta: + model = FreeDays + labels = { + "day" : "Datum", + "name" : "Bezeichnung" + } + + fields = [ + "name", "day" + ] + widgets = { + 'day': DatePickerInput(options={"format":'DD.MM.YYYY', "locale":'de'}), + } + + def __init__(self, *arg, **kwargs): + super(AddFreeDayForm, self).__init__(*arg, **kwargs) + self.fields['name'].required = True + self.fields['day'].required = True + + +# UPDATE WORK FORM +class UpdateWorkdayForm(forms.ModelForm): + class Meta: + model = Workday + labels = { + "start" : "Start", + "end" : "Ende", + "target" : "Zielarbeitszeit", + "freefield" : "Notiz" + } + + fields = [ + "start", "end", "target", "freefield" + ] + widgets = { + 'start': DatePickerInput(options={"format":'HH:mm', "locale":'de'}), + 'end': DatePickerInput(options={"format":'HH:mm', "locale":'de'}), + } + + def __init__(self, *arg, **kwargs): + super(UpdateWorkdayForm, self).__init__(*arg, **kwargs) + self.fields['start'].required = True + self.fields['end'].required = True + + +# ADD WORKDAY FORM +class AddWorkdayForm(forms.ModelForm): + class Meta: + model = Workday + labels = { + "start" : "Start", + "end" : "Ende", + "target" : "Zielarbeitszeit", + "freefield" : "Notiz" + } + + fields = [ + "start", "end", "target", "freefield" + ] + widgets = { + 'start': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + 'end': DatePickerInput(options={"format":'DD.MM.YYYY HH:mm', "locale":'de'}), + } + + def __init__(self, *arg, **kwargs): + super(AddWorkdayForm, self).__init__(*arg, **kwargs) + self.fields['start'].required = True + self.fields['end'].required = True + +# ADD BREAK FORM +class AddBreakForm(forms.ModelForm): + class Meta: + model = Breaks + labels = { + "start" : "Start", + "end" : "Ende" + } + + fields = [ + "start", "end" + ] + widgets = { + 'start': DatePickerInput(options={"format":'HH:mm', "locale":'de'}), + 'end': DatePickerInput(options={"format":'HH:mm', "locale":'de'}), + } + + def __init__(self, *arg, **kwargs): + super(AddBreakForm, self).__init__(*arg, **kwargs) + self.fields['start'].required = True + self.fields['end'].required = True diff --git a/timemanagement/migrations/0001_initial.py b/timemanagement/migrations/0001_initial.py new file mode 100644 index 0000000..9d961d6 --- /dev/null +++ b/timemanagement/migrations/0001_initial.py @@ -0,0 +1,93 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +import colorful.fields +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Breaks', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start', models.DateTimeField(blank=True, default=None, null=True)), + ('end', models.DateTimeField(blank=True, default=None, null=True)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Workday', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('start', models.DateTimeField(blank=True, default=None, null=True)), + ('end', models.DateTimeField(blank=True, default=None, null=True)), + ('target', models.FloatField(default=8.0)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ('breaks', models.ManyToManyField(blank=True, related_name='breaks_at_day', to='timemanagement.Breaks')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='FreeDays', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('day', models.DateField(blank=True, default=None, null=True)), + ('name', models.CharField(default='', max_length=200)), + ('year', models.IntegerField(default=0)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.AddField( + model_name='breaks', + name='workday', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='workdayele', to='timemanagement.Workday'), + ), + migrations.CreateModel( + name='AbsenceReason', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ('need_confirm', models.BooleanField(default=True)), + ('need_rep', models.BooleanField(default=True)), + ('is_holiday', models.BooleanField(default=True)), + ('color', colorful.fields.RGBColorField(blank=True, colors=['#FFB900', '#E74856', '#0078D7', '#0099BC', '#7A7574'], default='#0099BC')), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='Absence', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('startday_info', models.CharField(choices=[(0, 'Ganzer Tag'), (1, 'Nur Vormittags'), (2, 'Nur Nachmittags')], default=0, max_length=2)), + ('endday_info', models.CharField(choices=[(0, 'Ganzer Tag'), (1, 'Nur Vormittags'), (2, 'Nur Nachmittags')], default=0, max_length=2)), + ('start', models.DateField(blank=True, default=None, null=True)), + ('end', models.DateField(blank=True, default=None, null=True)), + ('start_ishalf', models.BooleanField(blank=True, default=False)), + ('end_ishalf', models.BooleanField(blank=True, default=False)), + ('created_date', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('info', models.TextField(blank=True, default='', verbose_name='Abwesenheitsbegründung')), + ('confirm_status', models.IntegerField(default=0)), + ('confirm_info', models.TextField(blank=True, default='', verbose_name='Begründung')), + ('holidays_normal', models.FloatField(blank=True, default=0.0, max_length=9)), + ('holidays_rest', models.FloatField(blank=True, default=0.0, max_length=9)), + ('holidays_normal_next', models.FloatField(blank=True, default=0.0, max_length=9)), + ('holidays_rest_next', models.FloatField(blank=True, default=0.0, max_length=9)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency')), + ('reason', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='timemanagement.AbsenceReason')), + ('representator', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='Vertreter', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/timemanagement/migrations/0002_historicalworkday.py b/timemanagement/migrations/0002_historicalworkday.py new file mode 100644 index 0000000..9279891 --- /dev/null +++ b/timemanagement/migrations/0002_historicalworkday.py @@ -0,0 +1,40 @@ +# Generated by Django 3.0 on 2021-01-07 16:42 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0034_agency_agencycal_publicstatus'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('timemanagement', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalWorkday', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('start', models.DateTimeField(blank=True, default=None, null=True)), + ('end', models.DateTimeField(blank=True, default=None, null=True)), + ('target', models.FloatField(default=8.0)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical workday', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/timemanagement/migrations/0003_historicalbreaks.py b/timemanagement/migrations/0003_historicalbreaks.py new file mode 100644 index 0000000..a45692e --- /dev/null +++ b/timemanagement/migrations/0003_historicalbreaks.py @@ -0,0 +1,40 @@ +# Generated by Django 3.0 on 2021-01-07 16:55 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0034_agency_agencycal_publicstatus'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('timemanagement', '0002_historicalworkday'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalBreaks', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('start', models.DateTimeField(blank=True, default=None, null=True)), + ('end', models.DateTimeField(blank=True, default=None, null=True)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)), + ('workday', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='timemanagement.Workday')), + ], + options={ + 'verbose_name': 'historical breaks', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/timemanagement/migrations/0004_auto_20210107_1656.py b/timemanagement/migrations/0004_auto_20210107_1656.py new file mode 100644 index 0000000..1f9107e --- /dev/null +++ b/timemanagement/migrations/0004_auto_20210107_1656.py @@ -0,0 +1,31 @@ +# Generated by Django 3.0 on 2021-01-07 16:56 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('timemanagement', '0003_historicalbreaks'), + ] + + operations = [ + migrations.RemoveField( + model_name='historicalworkday', + name='agency', + ), + migrations.RemoveField( + model_name='historicalworkday', + name='history_user', + ), + migrations.RemoveField( + model_name='historicalworkday', + name='user', + ), + migrations.DeleteModel( + name='HistoricalBreaks', + ), + migrations.DeleteModel( + name='HistoricalWorkday', + ), + ] diff --git a/timemanagement/migrations/0005_historicalworkday.py b/timemanagement/migrations/0005_historicalworkday.py new file mode 100644 index 0000000..2698600 --- /dev/null +++ b/timemanagement/migrations/0005_historicalworkday.py @@ -0,0 +1,40 @@ +# Generated by Django 3.0 on 2021-01-07 16:56 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0034_agency_agencycal_publicstatus'), + ('timemanagement', '0004_auto_20210107_1656'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalWorkday', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('start', models.DateTimeField(blank=True, default=None, null=True)), + ('end', models.DateTimeField(blank=True, default=None, null=True)), + ('target', models.FloatField(default=8.0)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical workday', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/timemanagement/migrations/0006_historicalabsence.py b/timemanagement/migrations/0006_historicalabsence.py new file mode 100644 index 0000000..9e02ff9 --- /dev/null +++ b/timemanagement/migrations/0006_historicalabsence.py @@ -0,0 +1,54 @@ +# Generated by Django 3.0 on 2021-01-08 07:24 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0034_agency_agencycal_publicstatus'), + ('timemanagement', '0005_historicalworkday'), + ] + + operations = [ + migrations.CreateModel( + name='HistoricalAbsence', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('startday_info', models.CharField(choices=[(0, 'Ganzer Tag'), (1, 'Nur Vormittags'), (2, 'Nur Nachmittags')], default=0, max_length=2)), + ('endday_info', models.CharField(choices=[(0, 'Ganzer Tag'), (1, 'Nur Vormittags'), (2, 'Nur Nachmittags')], default=0, max_length=2)), + ('start', models.DateField(blank=True, default=None, null=True)), + ('end', models.DateField(blank=True, default=None, null=True)), + ('start_ishalf', models.BooleanField(blank=True, default=False)), + ('end_ishalf', models.BooleanField(blank=True, default=False)), + ('created_date', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('info', models.TextField(blank=True, default='', verbose_name='Abwesenheitsbegründung')), + ('confirm_status', models.IntegerField(default=0)), + ('confirm_info', models.TextField(blank=True, default='', verbose_name='Begründung')), + ('holidays_normal', models.FloatField(blank=True, default=0.0, max_length=9)), + ('holidays_rest', models.FloatField(blank=True, default=0.0, max_length=9)), + ('holidays_normal_next', models.FloatField(blank=True, default=0.0, max_length=9)), + ('holidays_rest_next', models.FloatField(blank=True, default=0.0, max_length=9)), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('agency', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='users.Agency')), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('reason', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='timemanagement.AbsenceReason')), + ('representator', models.ForeignKey(blank=True, db_constraint=False, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical absence', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/timemanagement/migrations/0007_auto_20210118_0705.py b/timemanagement/migrations/0007_auto_20210118_0705.py new file mode 100644 index 0000000..d644b29 --- /dev/null +++ b/timemanagement/migrations/0007_auto_20210118_0705.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2021-01-18 07:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('timemanagement', '0006_historicalabsence'), + ] + + operations = [ + migrations.AddField( + model_name='historicalworkday', + name='freefield', + field=models.TextField(blank=True, default='', max_length=10000), + ), + migrations.AddField( + model_name='workday', + name='freefield', + field=models.TextField(blank=True, default='', max_length=10000), + ), + ] diff --git a/timemanagement/migrations/0008_absencereason_is_time.py b/timemanagement/migrations/0008_absencereason_is_time.py new file mode 100644 index 0000000..6ecb5b0 --- /dev/null +++ b/timemanagement/migrations/0008_absencereason_is_time.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2021-01-18 09:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('timemanagement', '0007_auto_20210118_0705'), + ] + + operations = [ + migrations.AddField( + model_name='absencereason', + name='is_time', + field=models.BooleanField(default=False), + ), + ] diff --git a/timemanagement/migrations/0009_auto_20210219_0955.py b/timemanagement/migrations/0009_auto_20210219_0955.py new file mode 100644 index 0000000..e69608a --- /dev/null +++ b/timemanagement/migrations/0009_auto_20210219_0955.py @@ -0,0 +1,36 @@ +# Generated by Django 3.0 on 2021-02-19 09:55 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('timemanagement', '0008_absencereason_is_time'), + ] + + operations = [ + migrations.AddField( + model_name='historicalworkday', + name='lastManualChangeDate', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + migrations.AddField( + model_name='historicalworkday', + name='lastManualChangeUser', + field=models.ForeignKey(blank=True, db_constraint=False, default=None, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='workday', + name='lastManualChangeDate', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + migrations.AddField( + model_name='workday', + name='lastManualChangeUser', + field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='manuelChangeUser', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/timemanagement/migrations/0010_auto_20210322_1103.py b/timemanagement/migrations/0010_auto_20210322_1103.py new file mode 100644 index 0000000..7c826ec --- /dev/null +++ b/timemanagement/migrations/0010_auto_20210322_1103.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2021-03-22 11:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('timemanagement', '0009_auto_20210219_0955'), + ] + + operations = [ + migrations.AddField( + model_name='historicalworkday', + name='delflag', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='workday', + name='delflag', + field=models.BooleanField(default=False), + ), + ] diff --git a/timemanagement/migrations/__init__.py b/timemanagement/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/timemanagement/migrations/__pycache__/0001_initial.cpython-38.pyc b/timemanagement/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..e8572d2 Binary files /dev/null and b/timemanagement/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0002_historicalworkday.cpython-38.pyc b/timemanagement/migrations/__pycache__/0002_historicalworkday.cpython-38.pyc new file mode 100644 index 0000000..8ada0b8 Binary files /dev/null and b/timemanagement/migrations/__pycache__/0002_historicalworkday.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0003_historicalbreaks.cpython-38.pyc b/timemanagement/migrations/__pycache__/0003_historicalbreaks.cpython-38.pyc new file mode 100644 index 0000000..19575a2 Binary files /dev/null and b/timemanagement/migrations/__pycache__/0003_historicalbreaks.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0004_auto_20210107_1656.cpython-38.pyc b/timemanagement/migrations/__pycache__/0004_auto_20210107_1656.cpython-38.pyc new file mode 100644 index 0000000..b7917ca Binary files /dev/null and b/timemanagement/migrations/__pycache__/0004_auto_20210107_1656.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0005_historicalworkday.cpython-38.pyc b/timemanagement/migrations/__pycache__/0005_historicalworkday.cpython-38.pyc new file mode 100644 index 0000000..e8126ec Binary files /dev/null and b/timemanagement/migrations/__pycache__/0005_historicalworkday.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0006_historicalabsence.cpython-38.pyc b/timemanagement/migrations/__pycache__/0006_historicalabsence.cpython-38.pyc new file mode 100644 index 0000000..59cee00 Binary files /dev/null and b/timemanagement/migrations/__pycache__/0006_historicalabsence.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0007_auto_20210118_0705.cpython-38.pyc b/timemanagement/migrations/__pycache__/0007_auto_20210118_0705.cpython-38.pyc new file mode 100644 index 0000000..59fcfa3 Binary files /dev/null and b/timemanagement/migrations/__pycache__/0007_auto_20210118_0705.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0008_absencereason_is_time.cpython-38.pyc b/timemanagement/migrations/__pycache__/0008_absencereason_is_time.cpython-38.pyc new file mode 100644 index 0000000..e587c4d Binary files /dev/null and b/timemanagement/migrations/__pycache__/0008_absencereason_is_time.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0009_auto_20210219_0955.cpython-38.pyc b/timemanagement/migrations/__pycache__/0009_auto_20210219_0955.cpython-38.pyc new file mode 100644 index 0000000..de6e2fe Binary files /dev/null and b/timemanagement/migrations/__pycache__/0009_auto_20210219_0955.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/0010_auto_20210322_1103.cpython-38.pyc b/timemanagement/migrations/__pycache__/0010_auto_20210322_1103.cpython-38.pyc new file mode 100644 index 0000000..f95dba7 Binary files /dev/null and b/timemanagement/migrations/__pycache__/0010_auto_20210322_1103.cpython-38.pyc differ diff --git a/timemanagement/migrations/__pycache__/__init__.cpython-38.pyc b/timemanagement/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..00320f0 Binary files /dev/null and b/timemanagement/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/timemanagement/models.py b/timemanagement/models.py new file mode 100644 index 0000000..4dd30f9 --- /dev/null +++ b/timemanagement/models.py @@ -0,0 +1,87 @@ +from django.db import models +from django.contrib.auth.models import User +from users.models import Agency +from django.core.exceptions import ValidationError +from colorful.fields import RGBColorField +from django.utils import timezone + +from simple_history.models import HistoricalRecords + +# Create your models here. +class Workday(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + delflag = models.BooleanField(default=False) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + breaks = models.ManyToManyField("Breaks", blank=True, related_name='breaks_at_day') + start = models.DateTimeField(default=None, null=True, blank=True) + end = models.DateTimeField(default=None, null=True, blank=True) + target = models.FloatField(default=8.0) + freefield = models.TextField(max_length=10000, default="", blank=True) + lastManualChangeUser = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True, default=None, related_name="manuelChangeUser") + lastManualChangeDate = models.DateTimeField(default=None, null=True, blank=True) + history = HistoricalRecords() + +class Breaks(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + workday = models.ForeignKey("Workday", on_delete=models.CASCADE, related_name='workdayele') + start = models.DateTimeField(default=None, null=True, blank=True) + end = models.DateTimeField(default=None, null=True, blank=True) + + +class AbsenceReason(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + name = models.CharField(default="", max_length=200) + need_confirm = models.BooleanField(default=True) + need_rep = models.BooleanField(default=True) + is_holiday = models.BooleanField(default=True) + is_time = models.BooleanField(default=False) + color = RGBColorField(colors=['#FFB900', '#E74856', '#0078D7', '#0099BC', '#7A7574'], default='#0099BC', blank=True) + + def __str__(self): + return f'{self.name}' + +class Absence(models.Model): + dayinfochoices = [ + (0, 'Ganzer Tag'), + (1, 'Nur Vormittags'), + (2, 'Nur Nachmittags') + ] + startday_info = models.CharField(max_length=2, choices=dayinfochoices, default=0) + endday_info = models.CharField(max_length=2, choices=dayinfochoices, default=0) + user = models.ForeignKey(User, on_delete=models.CASCADE) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + start = models.DateField(default=None, null=True, blank=True) + end = models.DateField(default=None, null=True, blank=True) + start_ishalf = models.BooleanField(default=False, blank=True) + end_ishalf = models.BooleanField(default=False, blank=True) + created_date = models.DateTimeField(default=timezone.now, blank=True) + reason = models.ForeignKey("AbsenceReason", on_delete=models.PROTECT, null=True, blank=True) + info = models.TextField(blank=True, verbose_name='Abwesenheitsbegründung', default="") + ''' + CONFIRM_STATUS INFOS + + 0 = NO NEED TO CONFIRM AND CONFIRM OK + 1 = IS CONFIRMED, AWAITING OK + 2 = NOT CONFIRMED + + ''' + confirm_status = models.IntegerField(default=0) + confirm_info = models.TextField(blank=True, verbose_name='Begründung', default="") + representator = models.ForeignKey(User, blank=True, default=None, null=True, on_delete=models.CASCADE, related_name="Vertreter") + holidays_normal = models.FloatField(default=0.0, max_length=9, blank=True) + holidays_rest = models.FloatField(default=0.0, max_length=9, blank=True) + holidays_normal_next = models.FloatField(default=0.0, max_length=9, blank=True) + holidays_rest_next = models.FloatField(default=0.0, max_length=9, blank=True) + history = HistoricalRecords() + +class FreeDays(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + day = models.DateField(default=None, null=True, blank=True) + name = models.CharField(default="", max_length=200) + year = models.IntegerField(default=0) + + + + + diff --git a/timemanagement/templates/timemanagement/realtime_dropdown.html b/timemanagement/templates/timemanagement/realtime_dropdown.html new file mode 100644 index 0000000..b04fd17 --- /dev/null +++ b/timemanagement/templates/timemanagement/realtime_dropdown.html @@ -0,0 +1,294 @@ + + + +{% load counter_tag %} +
+ + +
+ Arbeitsbeginn: 00:00:00
+ Arbeitsende: 00:00:00
+ Pausenzeit: 00:00:00 +
+
+
+ +
+
+{% loadaccounttime request.user as actualaccounttime %} +Gleitzeitkonto: +{% if actualaccounttime.1 == 0 %} + +{{actualaccounttime.0}} Stunden +{% else %} + -{{actualaccounttime.0}} Stunden +{% endif %} +
+ + + + + diff --git a/timemanagement/templates/timemanagement/rendered_confirmform.html b/timemanagement/templates/timemanagement/rendered_confirmform.html new file mode 100644 index 0000000..fc653d1 --- /dev/null +++ b/timemanagement/templates/timemanagement/rendered_confirmform.html @@ -0,0 +1,63 @@ +{% load crispy_forms_tags %} +{% load mathfilters %} +{% load counter_tag %} + +{% if user|usergperm:"absencemanager" %} + +
Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} annehmen/ablehnen
+
+
Informationen der Abwesenheit
+Von: {{absence.start|date:"d.m Y"}}
+Bis: {{absence.end|date:"d.m Y"}}
+Grund: {{absence.reason.name}}
+Vertreter: {{absence.representator.first_name}} {{absence.representator.last_name}}
+Informationen: {{absence.info}}
+
+
Übersicht Urlaubstage wenn Anfrage genehmigt
+ + + + + + + + + + + + + + + +
Gewünschte Tage{{absence.holidays_normal|addition:absence.holidays_rest|addition:absence.holidays_normal_next|addition:absence.holidays_rest_next}}
Resturlaub {{absence.start.year}}{{timeinfo_thisyear.restdays|addition:timeinfo_thisyear.days|sub:timeinfo_thisyear.days_inuse|addition:absence.holidays_rest}}
Resturlaub {{timeinfo_nextyear.year}}{{timeinfo_nextyear.restdays|addition:timeinfo_nextyear.days|sub:timeinfo_nextyear.days_inuse|addition:absence.holidays_rest_next}}
+{% if other_absences_string != False %} +
+
+
Andere Abwesenheiten in diesem Zeitraum
+ {% for ele in other_absences_string %} + {{ele}}
+ {% endfor %} +
+
+{% endif %} +
+ + {% csrf_token %} + {{confirmform|crispy}} +
+ + + + +{% else %} + +
Abwesenheit für {{absence.user.first_name}} {{absence.user.last_name}} annehmen/ablehnen
+
+Diese Daten dürfen Sie nicht abrufen. +{% endif %} diff --git a/timemanagement/templates/timemanagement/rendered_table.html b/timemanagement/templates/timemanagement/rendered_table.html new file mode 100644 index 0000000..21b7934 --- /dev/null +++ b/timemanagement/templates/timemanagement/rendered_table.html @@ -0,0 +1,757 @@ +{% load counter_tag %} + + + + {% for da in days_this_month %} + {% isfreeday user da as isfree %} + + {% endfor %} + + + {% for us in usersofagency %} + {% setdateforloopcounter forloop.counter %} + {% getactdateforloopcounter as actfcounter %} + + + {% for da in days_this_month %} + {% isfreeday user da as isfree %} + {% isfreedayname user da as isfreename %} + {% getabscenceday user us da as abday %} + {% startdatecheck us da as startdatecheck %} + {% getthisdaynotworking us da as thisdaynotworking %} + {% if isfree %} + + + {% endfor %} + + {% endfor %} +
+
+ + + +
+
{{da|date:"d D"}}
+ + {{us.get_full_name}} + {% if user|usergperm:"absencemanager" %} + {% kontingent us as userkontingent %} + {{userkontingent}} + {% endif %} + + + + {% elif startdatecheck == False %} + + {% elif thisdaynotworking == True %} + + {% elif abday != False %} + + {% if abday.confirm_status == 0 %} + {% if user|usergperm:"absencemanager" %} + + {% elif abday.user == user %} + + {% else %} + + {% endif %} + {% elif abday.confirm_status == 1 %} + {% if user|usergperm:"absencemanager" %} + + {% else %} + + {% endif %} + {% else %} + + {% endif %} + + + + {% elif today == da %} + + + {% else %} + + {% if da.weekday == 5 or da.weekday == 6 %} + + {% else %} + + {% endif %} + {% endif %} +
+ + + + + + + + + + +{% if user|usergperm:"absencemanager" %} + + +{% endif %} + + + + diff --git a/timemanagement/templates/timemanagement/timemanagement_add.html b/timemanagement/templates/timemanagement/timemanagement_add.html new file mode 100644 index 0000000..9e983b3 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_add.html @@ -0,0 +1,24 @@ +{% extends "users/base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% if request.user.profile.agency.module_timemanagement %} + + +
+

Arbeitstag {% if team == 1 %} von {{user.get_full_name}} {% endif %} hinzufügen

+
+
Start- und Endzeitpunkt
+ +
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} + +
+Abbrechen + +
+
+{% endif %} +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/timemanagement_break.html b/timemanagement/templates/timemanagement/timemanagement_break.html new file mode 100644 index 0000000..e2392f6 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_break.html @@ -0,0 +1,49 @@ +{% extends "users/base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% if request.user.profile.agency.module_timemanagement %} +
+ +

Zum Arbeitstag am {{workday.start|date:"d.m.Y"}} Pause hinzufügen

+
+
+
+ {% csrf_token %} + {{form.media}} + {{form}} + +
+ Abbrechen + +
+
+ + + + +{% endif %} +{% endblock content %} \ No newline at end of file diff --git a/timemanagement/templates/timemanagement/timemanagement_management.html b/timemanagement/templates/timemanagement/timemanagement_management.html new file mode 100644 index 0000000..2459f43 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_management.html @@ -0,0 +1,340 @@ +{% extends "users/base.html" %} +{% block content %} +{% load counter_tag %} +{% if request.user.profile.agency.module_timemanagement %} +
+

Zeiterfassung  +  Arbeitstag +

+
+ + +{% if user|usergperm:"timemanager" %} +
+ +
+ +
+ +
+
+ {% block tm_userown_rights %} + {% include "timemanagement/timemanagement_singleview.html" %} + {% endblock %} +
+ +
+
+ {% block tm_userown_team %} + {% include "timemanagement/timemanagement_teamview.html" %} + {% endblock %} +
+ +
+{% else %} + + {% block tm_userown_normal %} + {% include "timemanagement/timemanagement_singleview.html" %} + {% endblock %} +{% endif %} + + + + + +{% if user.usertime.usetime_start == None and user|usergperm:"absencemanager" == False %} + + + +{% elif userhasworkdays == False and user.usertiem.usetime %} + + + +{% endif %} + + + + + + +{% for workday in workdays %} + + +{% endfor %} + + +{% else %} +

Das Modul Abwesenheits- und Zeiterfassung wurde in ihrer Agentur deaktiviert oder die Zeiterfassung wurde im Modul deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/timemanagement_management_Kacheln.html b/timemanagement/templates/timemanagement/timemanagement_management_Kacheln.html new file mode 100644 index 0000000..efdcbfb --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_management_Kacheln.html @@ -0,0 +1,208 @@ +{% extends "users/base.html" %} +{% block content %} +{% load counter_tag %} +{% if request.user.profile.agency.module_timemanagement %} +
+

Zeiterfassung  + +

+
+ + +
+ + + +
+{% for workday in workdays %} +{% if workday.start.weekday == 0 and forloop.counter > 1%} +
+
+
+

{{workday.start|date:"W"}}. Woche

+

+{% elif forloop.counter == 1 %} +
+
+

{{workday.start|date:"W"}}. Woche

+

+{% endif %} + +
+
+
{{workday.start|date:"l"}}, {{workday.start|date:"d.m"}}
+ Von {{workday.start|date:"H:i"}} bis {{workday.end|date:"H:i"}}
+ + {% getsumworkdayexcludebreak workday as sumworkday %} + Arbeitszeit: {{ sumworkday }}
+ {% getsumbreak workday as sumbreakofday %} + Pausen: {{sumbreakofday}} min. ({{workday.breaks.all|length}}) + {% getsumworkday workday as sumwd %}
+ Gesamtzeit: {{sumwd}}
+ Gleitzeit: + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} +
+ + + +
+
+{% endfor %} +
+{% if user.usertime.usetime_start == None %} + + + +{% elif userhasworkdays == False %} + + + +{% endif %} + +{% for workday in workdays %} + + +{% endfor %} + + +{% else %} +

Das Modul Abwesenheits- und Zeiterfassung wurde in ihrer Agentur deaktiviert oder die Zeiterfassung wurde im Modul deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/timemanagement_management_OLD.html b/timemanagement/templates/timemanagement/timemanagement_management_OLD.html new file mode 100644 index 0000000..0c786b3 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_management_OLD.html @@ -0,0 +1,215 @@ +{% extends "users/base.html" %} +{% block content %} +{% load counter_tag %} +{% if request.user.profile.agency.module_timemanagement %} +
+

Zeiterfassung 

+
+
+ + + + + + + + + + + + + + + {% for workday in workdays %} + + + + + + + + + + + + {% endfor %} + +
#StartEndeArbeitszeitPausenGesamtzeitGleitzeit 
+ {{forloop.counter}} + + {{workday.start|date:"d.m.y H:i"}} + + {{workday.end|date:"d.m.y H:i"}} + + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }} + + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}) + + {% getsumworkday workday as sumwd %} + {{sumwd}} + + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + + +
+
+ +{% if user.usertime.usetime_start == None %} + + + +{% elif workdays|length == 0 %} + + +{% endif %} + +{% for workday in workdays %} + + +{% endfor %} + + +{% else %} +

Das Modul Abwesenheits- und Zeiterfassung wurde in ihrer Agentur deaktiviert oder die Zeiterfassung wurde im Modul deaktiviert.

+{% endif %} +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/timemanagement_singleview.html b/timemanagement/templates/timemanagement/timemanagement_singleview.html new file mode 100644 index 0000000..b1c4d1d --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_singleview.html @@ -0,0 +1,447 @@ +{% load counter_tag %} + +
+ + + + + {% loadmonthwork next_month user as monthwork %} + {% loadaccounttime user as actualaccounttime %} + + + + + + + + + + +
{{monthwork}} + {% if actualaccounttime.1 == 0 %} + +{{actualaccounttime.0}} + {% else %} + -{{actualaccounttime.0}} + {% endif %} +
ArbeitszeitGleitzeit
+
+
+
+
+ + + + + + + + + + + + + + + + + {% for da in days_this_month %} + + {% isfreedayname request.user da as isfreename %} + + {% getabscenceday request.user request.user da as abday %} + + + + + + + + {% if abday == False and isfreename == False %} + + + + + + + + + + + + + + {% else %} + + {% endif %} + + {% endfor %} + +
 Start Ende Arbeitszeit Pausen Gesamtzeit Gleitzeit 
+ {{da|date:"l"}} + + {{da|date:"d.m.y"}} + + {% if abday != False or isfreename != False %} + {% if isfreename != False %} + {{isfreename}} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}, + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + {% endif %} + {% endfor %} + + + {% else %} + {{abday.reason}} + {% endif %} + {% if abday.start == da%} + {% if abday.startday_info == "1" %} + (nur Vormittags) + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}, + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + {% endif %} + {% endfor %} + + + + {% elif abday.startday_info == "2" %} + (nur Nachmittags) + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + {% endif %} + {% endfor %} + + {% endif %} + {% elif abday.end == da%} + {% if abday.endday_info == "1" %} + (nur Vormittags) + + + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + + {% endif %} + {% endfor %} + + {% elif abday.endday_info == "2" %} + (nur Nachmittags) + + + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + + {% endif %} + {% endfor %} + + {% endif %} + {% endif %} + + {% else %} + + {% if abday == False %} + {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + + {% if workday.start == workday.end %} + Nichts gebucht + {% else %} + {{workday.start|date:"H:i"}} + {% endif %} + {% endif %} + {% endfor %} + {% endif %} + {% endif %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.end|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + {% if workday.start != workday.end %} + {{workday.end|date:"H:i"}} + {% endif %} + + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% if workday.start != workday.end %} + {% getsumworkday workday as sumwd %} + {% endif %} + {{sumwd}} + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + {% counterWDUp %} + + {% getsumbreak workday as sumbreakofday %} + {% if workday.start != workday.end %} + {% if workday.breaks.all|length > 0 %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}) + {% else %} + Keine Pausen + {% endif %} + {% endif %} + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + + {% getsumworkdayexcludebreak workday as sumworkday %} + {% if workday.start != workday.end %} + {{ sumworkday }} + {% endif %} + + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + {% getCounterWD as wd_counter %} + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% getWorkDayHistory workday as wd_history %} + {% if wd_history.history_user != None %} + + + {% endif %} + {% if workday.freefield != "" %} + + + {% endif %} + {% if breakmonthline < da %} + + + {% endif %} + {% endif %} + {% endfor %} +
+
\ No newline at end of file diff --git a/timemanagement/templates/timemanagement/timemanagement_teamview.html b/timemanagement/templates/timemanagement/timemanagement_teamview.html new file mode 100644 index 0000000..25d0509 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_teamview.html @@ -0,0 +1,76 @@ +{% load counter_tag %} + +
+ + + + + + + + + + + + + + + {% for item in usersofagencytm %} + + + + + + + + + + {% endfor %} + +
VornameNachnameE-MailAgenturfunktionGleitzeitLetzter Login 
{{item.first_name }}{{ item.last_name }}{{ item.email }}{% if item.profile.func == None %}-{%else%}{{ item.profile.func }}{%endif%} + {% if item.usertime.usetime %} + {% loadaccounttime item as actualaccounttime %} + {% if actualaccounttime.1 == 0 %} + +{{actualaccounttime.0}} + {% else %} + -{{actualaccounttime.0}} + {% endif %} + {% else %} + - + {% endif %} + {% if item.last_login != Nonte %}{{ item.last_login }}{% endif %} + {% if item.usertime.usetime %} + {% else %} + Mitarbeiter macht keine Zeiterfassung. + {% endif %} +
+
+ \ No newline at end of file diff --git a/timemanagement/templates/timemanagement/timemanagement_teamview_single.html b/timemanagement/templates/timemanagement/timemanagement_teamview_single.html new file mode 100644 index 0000000..5e149c9 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_teamview_single.html @@ -0,0 +1,585 @@ +{% extends "users/base.html" %} +{% block content %} +{% load counter_tag %} +

Zeiterfassung von {{user.get_full_name}} bearbeiten +  Arbeitstag +

+
+
+ + + + + + {% loadmonthwork next_month user as monthwork %} + {% loadaccounttime user as actualaccounttime %} + + + + + + + + + + +
{{monthwork}} + {% if actualaccounttime.1 == 0 %} + +{{actualaccounttime.0}} + {% else %} + -{{actualaccounttime.0}} + {% endif %} +
ArbeitszeitGleitzeit
+
+
+
+
+ + + + + + + + + + + + + + + + {% for da in days_this_month %} + {% isfreedayname request.user da as isfreename %} + {% getabscenceday user user da as abday %} + + + + + + + + + {% if abday == False and isfreename == False %} + + + + + + + + + + + + + + {% else %} + + {% endif %} + + {% endfor %} + +
 Start Ende Arbeitszeit Pausen Gesamtzeit Gleitzeit 
+ {{da|date:"l"}} + + {{da|date:"d.m.y"}} + + {% if abday != False or isfreename != False %} + {% if isfreename != False %} + {{isfreename}} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}, + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + {% endif %} + {% endfor %} + + + {% else %} + {{abday.reason}} + {% endif %} + {% if abday.start == da%} + {% if abday.startday_info == "1" %} + (nur Vormittags) + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}}, + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + {% endif %} + {% endfor %} + + + + {% elif abday.startday_info == "2" %} + (nur Nachmittags) + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + {% endif %} + {% endfor %} + + {% endif %} + {% elif abday.end == da%} + {% if abday.endday_info == "1" %} + (nur Vormittags) + + + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + + {% endif %} + {% endfor %} + + {% elif abday.endday_info == "2" %} + (nur Nachmittags) + + + + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} +
+ {{workday.start|date:"H:i"}} - {{workday.end|date:"H:i"}} + {% getsumworkdayexcludebreak workday as sumworkday %} + {{ sumworkday }}, + {% getsumbreak workday as sumbreakofday %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}), + {% getsumworkday workday as sumwd %} + {{sumwd}}, + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + + {% if breakmonthline < da %} + + + {% endif %} + + {% endif %} + {% endfor %} + + {% endif %} + {% endif %} + + {% else %} + + {% if abday == False %} + {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + + {% counterWDUp %} + + {% if workday.start == workday.end %} + Nichts gebucht + {% else %} + {{workday.start|date:"H:i"}} + {% endif %} + {% endif %} + {% endfor %} + {% endif %} + {% endif %} +
+ + {% counterWDreset %} + {% for workday in workdays %} + {% if workday.end|date:"d-m-y" == da|date:"d-m-y" %} + {% getCounterWD as wd_counter %} + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% if workday.start != workday.end %} + {{workday.end|date:"H:i"}} + {% endif %} + + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + {% getCounterWD as wd_counter %} + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% if workday.start != workday.end %} + {% getsumworkday workday as sumwd %} + {% endif %} + {{sumwd}} + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + {% getCounterWD as wd_counter %} + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% getsumbreak workday as sumbreakofday %} + {% if workday.start != workday.end %} + {% if workday.breaks.all|length > 0 %} + {{sumbreakofday}} min. ({{workday.breaks.all|length}}) + {% else %} + Keine Pausen + {% endif %} + {% endif %} + + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + {% getCounterWD as wd_counter %} + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% getsumworkdayexcludebreak workday as sumworkday %} + {% if workday.start != workday.end %} + {{ sumworkday }} + {% endif %} + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + {% getCounterWD as wd_counter %} + {% if wd_counter > 0 %} +
+ {% endif %} + {% counterWDUp %} + {% gettimeoveralldiff workday user as erg%} + {% if erg.1 == 0 %} + +{{erg.0}} + {% elif erg.1 == 1 %} + {{erg.0}} + {% else %} + -{{erg.0}} + {% endif %} + {% endif %} + {% endfor %} +
+ {% counterWDreset %} + {% for workday in workdays %} + {% if workday.start|date:"d-m-y" == da|date:"d-m-y" %} + + {% getCounterWD as wd_counter %} + + {% if wd_counter > 0 %} +
+ {% endif %} + + {% counterWDUp %} + + {% if workday.lastManualChangeUser != None %} + + + + {% endif %} + + + {% if workday.freefield != "" %} + + + + + + {% endif %} + + + + + + {% endif %} + {% endfor %} +
+
+ + + + + + + +{% for workday in workdays %} + + +{% endfor %} + + + + +{% endblock content %} \ No newline at end of file diff --git a/timemanagement/templates/timemanagement/timemanagement_update.html b/timemanagement/templates/timemanagement/timemanagement_update.html new file mode 100644 index 0000000..b1b8988 --- /dev/null +++ b/timemanagement/templates/timemanagement/timemanagement_update.html @@ -0,0 +1,122 @@ +{% extends "users/base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% if request.user.profile.agency.module_timemanagement %} +
+ +

Arbeitstag am {{workday.start|date:"d.m.Y"}} {% if team == 1 %} von {{user.get_full_name}} {% endif %} bearbeiten

+
+
Start- und Endzeitpunkt
+ +
+ {% csrf_token %} + {{form.media}} + {{form|crispy}} + +
+
Pausen + {% if team == 1 %} + + {% else %} + + {% endif %} +
+
+ + + + + + + + + + + {% for break in workday.breaks.all %} + + + + + + + {% endfor %} + +
#StartEnde 
{{forloop.counter}}{{break.start|date:"H:i"}}{{break.end|date:"H:i"}}
+
+
+{% if team == 1 %} +Abbrechen +{% else %} +Abbrechen +{% endif %} + +
+
+ + +{% for break in workday.breaks.all %} + + +{% endfor %} + + +{% endif %} +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/tm_ab_all.html b/timemanagement/templates/timemanagement/tm_ab_all.html new file mode 100644 index 0000000..d657a18 --- /dev/null +++ b/timemanagement/templates/timemanagement/tm_ab_all.html @@ -0,0 +1,103 @@ +
+
+ + + + + + + + + + + + + + + {% for abday in allabsences %} + + + + + + + + + + + {% endfor %} + +
VornameNachnameStartEndeGrundInfoStatus 
{{abday.user.first_name}}{{abday.user.last_name}}{{abday.start|date:"d.M Y"}}{{abday.end|date:"d.M Y"}}{{abday.reason.name}}{{abday.info}}{% if abday.confirm_status == 0 %} {% elif abday.confirm_status == 1 %} Beantragt {% else %} {% endif %} + + + +
+
+
+ +{% for ab in allabsences %} + + +{% endfor %} diff --git a/timemanagement/templates/timemanagement/tm_ab_management.html b/timemanagement/templates/timemanagement/tm_ab_management.html new file mode 100644 index 0000000..74d64b8 --- /dev/null +++ b/timemanagement/templates/timemanagement/tm_ab_management.html @@ -0,0 +1,815 @@ +{% extends "users/base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load mathfilters %} +{% if request.user.profile.agency.module_timemanagement %} + + +
+

Abwesenheiten{% if request.user.profile.showtooltips %} {% endif %} + + +   + + + +

+
+ +
+ +
+
+
+ Lade Kalenderdaten... +
+
+
+ +
+ {% block ab_userown %} + {% include "timemanagement/tm_ab_userown.html" %} + {% endblock %} +
+ +{% if user|usergperm:"absencemanager" %} +
+ {% block ab_toconfirm %} + {% include "timemanagement/tm_ab_toconfirm.html" %} + {% endblock %} +
+ +
+ {% block ab_all %} + {% include "timemanagement/tm_ab_all.html" %} + {% endblock %} +
+{% endif %} + + +
+
+ + + + + + + + + + + + + + + + + + + + + +{% else %} +

Das Modul Abwesenheits- und Zeiterfassung wurde in ihrer Agentur deaktiviert.

+{% endif %} + + + +{% if missinguserdata|length > 0 %} + + +{% endif %} + + + + + + +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/tm_ab_toconfirm.html b/timemanagement/templates/timemanagement/tm_ab_toconfirm.html new file mode 100644 index 0000000..6061b3f --- /dev/null +++ b/timemanagement/templates/timemanagement/tm_ab_toconfirm.html @@ -0,0 +1,58 @@ +{% load counter_tag %} +
+
+ + + + + + + + + + + + + {% for abday in needtoconfirm %} + + + + + + + + + {% endfor %} + +
MitarbeiterStartEndeGrundInfoStatus ändern
{{abday.user.first_name}} {{abday.user.last_name}}{{abday.start|date:"d.M Y"}}{{abday.end|date:"d.M Y"}}{{abday.reason.name}}{{abday.info}} + +
+
+
+ + + diff --git a/timemanagement/templates/timemanagement/tm_ab_update.html b/timemanagement/templates/timemanagement/tm_ab_update.html new file mode 100644 index 0000000..a41c1c4 --- /dev/null +++ b/timemanagement/templates/timemanagement/tm_ab_update.html @@ -0,0 +1,478 @@ +{% extends "users/base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load l10n %} +{% load mathfilters %} +{% if request.user.profile.agency.module_timemanagement %} +
+ +

Abwesenheit von {{absence.user.first_name}} {{absence.user.last_name}} Bearbeiten

+ {% getLastEditedAbsence absence as absencehistorie %} + + {% if absencehistorie.history_user != None %} + Zuletzt bearbeitet von {{absencehistorie.history_user.first_name}} {{absencehistorie.history_user.last_name}} am {{absencehistorie.history_date|date:"d.m.Y, H:i"}} + {% endif %} +
+
+
+
+ {% csrf_token %} + {{form.media}} +
+
+ {{form.start |as_crispy_field }} + {{form.startday_info |as_crispy_field }} +
+
+ {{form.end |as_crispy_field }} + {{form.endday_info |as_crispy_field }} +
+
+
+
+
+ {{form.reason|as_crispy_field}} +
+
+ {{form.representator|as_crispy_field}} +
+
+
+
+
+ {{form.confirm_info|as_crispy_field}} +
+
+
+ +
+ +
Bearbeitungsverlauf
+ {% for historyele in absence.history.all %} +
+
+
+ +
+
+ {{historyele.history_user.get_full_name}} am {{historyele.history_date|date:"d.m.Y, H:i"}} +
+ {% if historyele.confirm_status == 0 %} + Angenommen {% if historyele.confirm_info|length > 0 %}| Begründung: {{historyele.confirm_info}} {% endif %} + {% elif historyele.confirm_status == 1 %} + in Bearbeitung {% if historyele.confirm_info|length > 0 %}| Begründung: {{historyele.confirm_info}} {% endif %} + {% else %} + Abgelehnt + {% endif %} +
+
+
+ {% endfor %} +
+
+ + +
+ +
+
+
Übersicht Urlaubstage
+ +
+ +  Tage /  verbleibend im Jahr  + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
Gewünschte Tage
Resturlaub
Urlaub nächstes Jahr + Rest ()
Summe Urlaubstage
+
+ +
+
+ +
+
+
+
+ {{form.holidays_normal}} + {{form.holidays_rest}} + {{form.holidays_normal_next}} + {{form.holidays_rest_next}} +
+ +Abbrechen + + + + + +{% endif %} +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/tm_ab_update_SAVE.html b/timemanagement/templates/timemanagement/tm_ab_update_SAVE.html new file mode 100644 index 0000000..5adc1a9 --- /dev/null +++ b/timemanagement/templates/timemanagement/tm_ab_update_SAVE.html @@ -0,0 +1,442 @@ +{% extends "users/base.html" %} +{% block content %} +{% load crispy_forms_tags %} +{% load counter_tag %} +{% load l10n %} +{% load mathfilters %} +{% if request.user.profile.agency.module_timemanagement %} +
+ +

Abwesenheit von {{absence.user.first_name}} {{absence.user.last_name}} Bearbeiten

+ {% getLastEditedAbsence absence as absencehistorie %} + + {% if absencehistorie.history_user != None %} + Zuletzt bearbeitet von {{absencehistorie.history_user.first_name}} {{absencehistorie.history_user.last_name}} am {{absencehistorie.history_date|date:"d.m.Y, H:i"}} + {% endif %} +
+
+
+
+ {% csrf_token %} + {{form.media}} +
+
+ {{form.start |as_crispy_field }} + {{form.startday_info |as_crispy_field }} +
+
+ {{form.end |as_crispy_field }} + {{form.endday_info |as_crispy_field }} +
+
+
+
+
+ {{form.reason|as_crispy_field}} +
+
+ {{form.representator|as_crispy_field}} +
+
+ +
+
+
Begründung
+

{% if absence.info|length > 0 %} + {{absence.info}} + {% else %} + Keine Begründung + {% endif %}

+
+
+
+
+
+
An- oder Ablehnung
+

{% if absence.confirm_info|length > 0 %} + {{absence.confirm_info}} + {% else %} + Kein Hinweis + {% endif %} +

+
+
+
+ {% getAbsenceLastHistory absence as ab_history %} + {% if ab_history != None %} + Zuletzt geändert am {{ab_history.history_date|date:"d.m.Y, H:i"}} von {{ab_history.history_user.get_full_name}} + {% endif %} +
+ +
+
+
Übersicht Urlaubstage
+ +
+ +  Tage /  verbleibend im Jahr  + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
Gewünschte Tage
Resturlaub
Urlaub nächstes Jahr + Rest ()
Summe Urlaubstage
+
+ +
+
+ +
+
+
+
+ {{form.holidays_normal}} + {{form.holidays_rest}} + {{form.holidays_normal_next}} + {{form.holidays_rest_next}} +
+ +Abbrechen + + + + + +{% endif %} +{% endblock content %} diff --git a/timemanagement/templates/timemanagement/tm_ab_userown.html b/timemanagement/templates/timemanagement/tm_ab_userown.html new file mode 100644 index 0000000..1247f2a --- /dev/null +++ b/timemanagement/templates/timemanagement/tm_ab_userown.html @@ -0,0 +1,155 @@ +{% load l10n %} +{% load mathfilters %} +
+
+
+
+ +
Urlaubsübersicht {{activeyear}}
+
+ +
+
+
Übersicht nach Abwesenheitskategorien {{activeyear}}
+
+ +
+
+ + +
+
+
+ + +
+
+ + + + + + + + + + + + + {% for abday in userown %} + + + + + + + + + {% endfor %} + +
StartEndeGrundAntragBegründungStatus
{{abday.start|date:"d.M Y"}}{{abday.end|date:"d.M Y"}}{{abday.reason.name}}{{abday.info}}{{abday.confirm_info}}{% if abday.confirm_status == 0 %} {% elif abday.confirm_status == 1 %} Beantragt {% else %} {% endif %}
+
+ +
+
+ + diff --git a/timemanagement/tests.py b/timemanagement/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/timemanagement/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/timemanagement/urls.py b/timemanagement/urls.py new file mode 100644 index 0000000..efa88ae --- /dev/null +++ b/timemanagement/urls.py @@ -0,0 +1,24 @@ +from django.urls import path +from django.contrib.auth.decorators import login_required, permission_required +from .views import TimeManagement, TimeAjax, AbsenceManagmenet, AbsenceUpdate, TimeUpdate, AddBreak, TimeAdd, TimeManagementTeamSingle +''' +Permissions definiert in models.py bei USERS und dann hier vor die View geschrieben! +''' + +urlpatterns = [ + path('', TimeManagement, name='tm-management'), + path('tm/team/', TimeManagementTeamSingle, name='tm-team-single'), + path('tm/team///', TimeManagementTeamSingle, name='tm-team-single'), + path('/', TimeManagement, name='tm-management'), + path('update/', TimeUpdate, name='tm-update'), + path('update//', TimeUpdate, name='tm-update'), + path('add/', TimeAdd, name='tm-add'), + path('add//', TimeAdd, name='tm-add'), + path('update//addbreak/', AddBreak, name='add-break'), + path('update//addbreak/', AddBreak, name='add-break'), + path('abs/', AbsenceManagmenet, name='tma-management'), + path('abs//', AbsenceManagmenet, name='tma-management'), + path('ajax/', TimeAjax, name='tm-ajax'), + path('abs/update//', AbsenceUpdate, name='tma-update'), + +] diff --git a/timemanagement/views.py b/timemanagement/views.py new file mode 100644 index 0000000..d717c5c --- /dev/null +++ b/timemanagement/views.py @@ -0,0 +1,1243 @@ +from django.shortcuts import render, redirect +from django.contrib.auth.decorators import login_required +from django.http import JsonResponse +from .models import Workday, Breaks, FreeDays, AbsenceReason, Absence +from django.utils import timezone +import requests, csv, os +from django.templatetags.static import static +from django.conf import settings +from datetime import date +from django.contrib.auth.models import User +from calendar import monthrange +import datetime +import calendar +from .forms import AddAbsence, ConfirmAbsenceForm, UpdateAbsence, UpdateWorkdayForm, AddBreakForm, AddWorkdayForm +from django.contrib import messages +from users.models import UserFullName, UserYearAbsenceInfo +from users.models import UserTime +from datetime import timedelta +from django.db.models.signals import post_save +from users.signals import save_newabsence +import locale +from django.template.loader import render_to_string +from django.core.mail import send_mail +from digitaleagentur.utils import * + + +# Load freedays +def loadingFreeDays(plz): + # Getting land + + file_path = os.path.join(settings.STATIC_ROOT, 'users/extra/plz_short.csv') + land = False + + with open(file_path, 'rt') as csvfile: + filecsv = csv.reader(csvfile, delimiter=';') + for row in filecsv: + if row[1] == plz: + land = row[6] + break; + + if(land != False): + # CALCULATE FREEDAYS AS JSON + year = today = date.today().year + + URL = "https://feiertage-api.de/api/" + PARAMS = {'jahr':year,'nur_land':land} + r = requests.get(url = URL, params = PARAMS) + return r.json() + else: + return False + +def get_datetime_range(year, month): + nb_days = monthrange(year, month)[1] + return [datetime.date(year, month, day) for day in range(1, nb_days+1)] + +@login_required +def AbsenceUpdate(request, pk): + if request.method == "GET": + absence = Absence.objects.get(pk=pk) + if(absence.agency == request.user.profile.agency and request.user.has_perm("users.absencemanager")): + timeinfo_thisyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year, user=absence.user))[0] + try: + timeinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year+1, user=absence.user))[0] + except: + timeinfo_nextyear = False + + context = { + "active_link" : "abscence", + "form" : UpdateAbsence(instance=request.user), + "absence" : absence, + "timeinfo_thisyear" : timeinfo_thisyear, + "timeinfo_nextyear" : timeinfo_nextyear, + "start" : absence.start.strftime("%d.%m.%Y"), + "end" : absence.end.strftime("%d.%m.%Y"), + } + return render(request, 'timemanagement/tm_ab_update.html', context) + else: + return redirect("login") + elif request.method == "POST": + absence = Absence.objects.get(pk=pk) + if(absence.agency == request.user.profile.agency): + formtocheck = UpdateAbsence(request.POST, instance=request.user) + if(formtocheck.is_valid()): + abinfo = list(UserYearAbsenceInfo.objects.filter(user=absence.user, year=absence.start.year))[0] + abinfo_lastyear = "" + abinfo_nextyear = "" + + is_lastyear = False + + abinfo_lastyear = list(UserYearAbsenceInfo.objects.filter(user=absence.user, year=absence.start.year-1)) + if(len(abinfo_lastyear) > 0): + is_lastyear = True + abinfo_lastyear = abinfo_lastyear[0] + + is_nextyear = False + abinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(user=absence.user, year=absence.start.year+1)) + if(len(abinfo_nextyear) > 0): + is_nextyear = True + abinfo_nextyear = abinfo_nextyear[0] + + abinfo.days_inuse -= formtocheck.cleaned_data["holidays_normal"] + abinfo.restdays -= formtocheck.cleaned_data["holidays_rest"] + abinfo.save() + + abinfo_nextyear.days_inuse -= formtocheck.cleaned_data["holidays_normal_next"] + abinfo_nextyear.restdays -= formtocheck.cleaned_data["holidays_rest_next"] + abinfo_nextyear.save() + + absence.start = formtocheck.cleaned_data["start"] + absence.end = formtocheck.cleaned_data["end"] + absence.startday_info = str(formtocheck.cleaned_data["startday_info"]) + absence.endday_info = str(formtocheck.cleaned_data["endday_info"]) + absence.reason = formtocheck.cleaned_data["reason"] + #absence.info = formtocheck.cleaned_data["info"] + absence.confirm_info = formtocheck.cleaned_data["confirm_info"] + + rep = None + if(formtocheck.cleaned_data["representator"] != None): + rep = User.objects.get(pk=formtocheck.cleaned_data["representator"].pk) + + absence.representator = rep + absence.holidays_normal = 0.0 + absence.holidays_rest = 0.0 + absence.holidays_normal_next = 0.0 + absence.holidays_rest_next = 0.0 + absence.save() + messages.success(request, f'Abwesenheit aktualisiert!') + else: + messages.success(request, f'Fehler bei Abwesenheitsaktualisierung!') + else: + return redirect("login") + context = { + "active_link" : "abscence", + } + return redirect("tma-management") + +@login_required +def AbsenceManagmenet(request, activemonth=False, activeyear=False): + # NEW ABSENCE + if(request.method == "POST"): + ''' + + Nachdem eine neue Abwesenheit gespeichert wurde, geht es zur normalen Seite zurück, jedoch mit den Daten des aktuell angezeigten Monate/Jahr + + ''' + if(request.POST.get("form_type") == "absenceform"): + formtocheck = AddAbsence(request.POST, instance=request.user) + if(formtocheck.is_valid()): + + #try: + workinguser = UserFullName.objects.get(pk=formtocheck.cleaned_data["userid"]) + + # DIFFERENT USER AGENCY + if(workinguser.profile.agency != request.user.profile.agency): + messages.success(request, f'Das dürfen Sie nicht!') + return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear']) + # ALL OK - START SAVING ABSENCE + else: + confirmstat = 0 + reason = AbsenceReason.objects.filter(name=formtocheck.cleaned_data["reason"], agency=request.user.profile.agency)[0] + + if(request.user.has_perm("users.absencemanager") == False and reason.need_confirm == True): + confirmstat = 1 + messages.success(request, f'Abwesenheit beantragt') + # SEND NOTIFICATION + elif(request.user.has_perm("users.absencemanager") == False and reason.need_confirm == False): + confirm_status = 0 + messages.success(request, f'Abwesenheit eingetragen') + else: + messages.success(request, f'Abwesenheit eingetragen') + + rep = None + if(formtocheck.cleaned_data["representator"] != None): + rep = User.objects.get(pk=formtocheck.cleaned_data["representator"].pk) + + #newab = Absence(agency=request.user.profile.agency, user=workinguser, start=formtocheck.cleaned_data["start"],end=formtocheck.cleaned_data["end"], representator=rep, confirm_status=confirmstat, info=formtocheck.cleaned_data["info"], reason=formtocheck.cleaned_data["reason"], start_ishalf=formtocheck.cleaned_data["start_ishalf"], end_ishalf=formtocheck.cleaned_data["end_ishalf"]).save() + newab = Absence(agency=request.user.profile.agency, user=workinguser, start=formtocheck.cleaned_data["start"],end=formtocheck.cleaned_data["end"], representator=rep, confirm_status=confirmstat, info=formtocheck.cleaned_data["info"], reason=formtocheck.cleaned_data["reason"], startday_info=formtocheck.cleaned_data["startday_info"], endday_info=formtocheck.cleaned_data["endday_info"]).save() + # USER NOT FOUND + #except: + # messages.success(request, f'Fehler bei Abwesenheitsbearbeitung! Bitte wenden Sie sich an den Support.') + # return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear']) + + return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear']) + else: + messages.success(request, f'Fehler beim eintragen der neuen Abwesenheit!') + return redirect('tma-management', formtocheck.cleaned_data['activemonth'], formtocheck.cleaned_data['activeyear']) + else: + return redirect('tma-management') + # NORMAL VIEW + else: + prevmonth = "" + nextmonth = "" + #MONTH + if(not activemonth or activemonth > 12 or activemonth < 1): + activemonth = int(activemonth) + #Active month + activemonth=date.today().month + + if(activemonth == 1): + prevmonth = 12 + else: + prevmonth = activemonth-1 + + if(activemonth == 12): + nextmonth = 1 + else: + nextmonth = activemonth + 1 + else: + + if(activemonth == 1): + prevmonth = 12 + else: + prevmonth = activemonth-1 + + if(activemonth == 12): + nextmonth = 1 + else: + nextmonth = activemonth + 1 + + #YEAR + nextyear = date.today().year + prevyear = date.today().year + + if(not activeyear): + activeyear = date.today().year + else: + if(nextmonth == 1): + nextyear = activeyear + 1 + else: + nextyear = activeyear + if(prevmonth == 12): + prevyear = activeyear - 1 + else: + prevyear = activeyear + + missinguserdata = [] + #CHECK, ob alle nötigen Infos zur Urlaubsberechnung vorliegen + for user in User.objects.filter(profile__agency=request.user.profile.agency): + tempTime = UserTime.objects.get(user=user) + + if(tempTime.startdate == None): + missinguserdata.append(user) + + kontingent = 0 + inuse = 0 + yearinfo = False + try: + yearinfo = list(UserYearAbsenceInfo.objects.filter(year=activeyear, user=request.user))[0] + inuse = yearinfo.days_inuse + kontingent = yearinfo.days - inuse + except: + pass + + # ABSENCE AUFLISTUNG NACH GRUND + allreasons = AbsenceReason.objects.filter(agency=request.user.profile.agency).order_by("name") + final_reasons = [] + for ar in allreasons: + tempabsece = Absence.objects.filter(reason=ar, user=request.user, start__year=activeyear, confirm_status=0) + temp_sum = 0.0 + for t in tempabsece: + temp_sum += calculatingHolidaysByAbsence(request, t) + final_reasons.append([ar, temp_sum]) + + context = { + "active_link" : "abscence", + "usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).order_by("-last_name"), + "days_this_month" : get_datetime_range(activeyear,activemonth), + "nextmonth" : nextmonth, + "missinguserdata" : missinguserdata, + "prevmonth" : prevmonth, + "nextyear" : nextyear, + "prevyear" : prevyear, + "activemonth" : activemonth, + "activeyear" : activeyear, + "inuse" : inuse, + "final_reasons" : final_reasons, + "yearinfo" : yearinfo, + "kontingent" : kontingent, + "today" : date.today(), + "abscenceform" : AddAbsence(instance=request.user), + "userown" : Absence.objects.filter(agency=request.user.profile.agency, user=request.user).order_by("-start") + } + + if(request.user.has_perm("users.absencemanager")): + context.update({ + "needtoconfirm" : Absence.objects.filter(agency=request.user.profile.agency, confirm_status=1).order_by("-start"), + "allabsences" : Absence.objects.filter(agency=request.user.profile.agency).order_by("-start") + }) + return render(request, 'timemanagement/tm_ab_management.html', context) + + +@login_required +def TimeManagementTeamSingle(request, pk, activemonth=False, activeyear=False): + if(request.user.has_perm("users.timemanager")): + # Setzt die Monatsausgabe auf Deutsch + locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8') + user = User.objects.get(pk=pk) + # Hier wird der Monat und das Jahr für die Buttons gebaut + if(activemonth == False): + today = datetime.datetime.today() + active_month = str(today.strftime("%B")) + active_year = str(today.strftime("%Y")) + activemonth = today.month + else: + today = datetime.datetime(activeyear, activemonth, 1) + active_month = activemonth + active_month = str(today.strftime("%B")) + active_year = str(today.strftime("%Y")) + + prev_year = active_year + next_year = active_year + + next_month = today.month + 1 + if(next_month == 13): + next_month = 1 + next_year = int(next_year) + 1 + + prev_month = today.month - 1 + if(prev_month == 0): + prev_month = 12 + prev_year = int(prev_year) - 1 + + # Initialprüfung, ob Arbeitstage vorliegen + tempworkday = Workday.objects.filter(agency=request.user.profile.agency, user=user, delflag = False).order_by("start").exclude(end=None)[:1] + + user_has_workdays = False + if len(tempworkday) == 1: + user_has_workdays = True + + # Hier werden nur die Arbeitstage gefiltert, die auch aktuell zur Ansicht stehen sollen + context = { + "next_month" : next_month, + "breakmonthline" : date.today() - timedelta(days=30), + "prev_month" : prev_month, + "next_year" : next_year, + "prev_year" : prev_year, + "active_year" : int(active_year), + "active_month" : active_month, + "activemonth" : activemonth, + "active_link" : "timemanagement", + "days_this_month" : get_datetime_range(int(active_year), int(activemonth)), + "workdays" : Workday.objects.filter(agency=request.user.profile.agency, user=user, start__month=activemonth, start__year=active_year, delflag = False).order_by("start").exclude(end=None), + "userhasworkdays" : user_has_workdays, + "user" : user + } + + return render(request, 'timemanagement/timemanagement_teamview_single.html', context) + + + + # Requestet User has no rights... + else: + messages.success(request, f'Das dürfen Sie nicht!') + return redirect("tm-management") + + +@login_required +def TimeManagement(request, activemonth=False, activeyear=False): + # Setzt die Monatsausgabe auf Deutsch + locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8') + + # Hier wird der Monat und das Jahr für die Buttons gebaut + if(activemonth == False): + today = datetime.datetime.today() + active_month = str(today.strftime("%B")) + active_year = str(today.strftime("%Y")) + activemonth = today.month + else: + today = datetime.datetime(activeyear, activemonth, 1) + active_month = activemonth + active_month = str(today.strftime("%B")) + active_year = str(today.strftime("%Y")) + + prev_year = active_year + next_year = active_year + + next_month = today.month + 1 + if(next_month == 13): + next_month = 1 + next_year = int(next_year) + 1 + + prev_month = today.month - 1 + if(prev_month == 0): + prev_month = 12 + prev_year = int(prev_year) - 1 + + # Initialprüfung, ob Arbeitstage vorliegen + tempworkday = Workday.objects.filter(agency=request.user.profile.agency, user=request.user, delflag = False).order_by("start").exclude(end=None)[:1] + + user_has_workdays = False + if len(tempworkday) == 1: + user_has_workdays = True + + # Hier werden nur die Arbeitstage gefiltert, die auch aktuell zur Ansicht stehen sollen + context = { + "next_month" : next_month, + "breakmonthline" : date.today() - timedelta(days=30), + "prev_month" : prev_month, + "next_year" : next_year, + "prev_year" : prev_year, + "active_year" : int(active_year), + "active_month" : active_month, + "activemonth" : activemonth, + "active_link" : "timemanagement", + "days_this_month" : get_datetime_range(int(active_year), int(activemonth)), + "workdays" : Workday.objects.filter(agency=request.user.profile.agency, user=request.user, start__month=activemonth, start__year=active_year, delflag = False).order_by("start").exclude(end=None), + "userhasworkdays" : user_has_workdays + } + if(request.user.has_perm("users.timemanager")): + context.update({"usersofagencytm" : User.objects.filter(profile__agency=request.user.profile.agency).order_by('last_name')}) + + return render(request, 'timemanagement/timemanagement_management.html', context) + +@login_required +def TimeUpdate(request, pk, team=0): + workday = Workday.objects.get(pk=pk) + user = workday.user + if(request.user.profile.agency == workday.agency and request.user.has_perm('users.usermanager')): + if(request.method == "POST"): + if(team == 0): + form = UpdateWorkdayForm(request.POST, instance=request.user) + else: + form = UpdateWorkdayForm(request.POST, instance=user) + + start = datetime.datetime(int(workday.start.year), int(workday.start.month), int(workday.start.day), int(((str(form["start"].value()).split(":"))[0])), int(((str(form["start"].value()).split(":"))[1]))) + + end = datetime.datetime(int(workday.end.year), int(workday.end.month), int(workday.end.day), int(((str(form["end"].value()).split(":"))[0])), int(((str(form["end"].value()).split(":"))[1]))) + + workday.start = start + workday.end = end + workday.freefield = form["freefield"].value() + workday.target = form["target"].value() + + # Speichern, das jemand den Arbeitstag bearbeitet hat + workday.lastManualChangeUser = request.user + workday.lastManualChangeDate = datetime.datetime.now() + + workday.save() + messages.success(request, f'Arbeitstag aktualisiert') + if(team == 1): + return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year) + else: + return redirect('tm-management') + else: + context = { + "active_link" : "timemanagement", + "workday" : Workday.objects.get(pk=pk), + "form" : UpdateWorkdayForm(instance= Workday.objects.get(pk=pk)), + "team" : team, + "user" : workday.user + } + return render(request, 'timemanagement/timemanagement_update.html', context) + else: + return redirect("login") + +@login_required +def TimeAdd(request, team=0, pk=0): + # Nutzer fügt selber einen neuen Arbeitstag hinzu + if(team == 0): + user = request.user + form = AddWorkdayForm(request.POST, instance=request.user) + #form.fields['target'] = 2.0 + # Verwalter fügt einen Arbeitstag hinzu + else: + user = User.objects.get(pk=pk) + form = AddWorkdayForm(request.POST, instance=user) + + if(request.method == "POST"): + if form.is_valid(): + #start = datetime.datetime(int(workday.start.year), int(workday.start.month), int(workday.start.day), int(((str(form["start"].value()).split(":"))[0])), int(((str(form["start"].value()).split(":"))[1]))) + + #end = datetime.datetime(int(workday.end.year), int(workday.end.month), int(workday.end.day), int(((str(form["end"].value()).split(":"))[0])), int(((str(form["end"].value()).split(":"))[1]))) + + workday = Workday(start=form.cleaned_data["start"], end=form.cleaned_data["end"], target=form.cleaned_data["target"], user=user, freefield=form.cleaned_data["freefield"], agency=request.user.profile.agency, lastManualChangeUser=user, lastManualChangeDate=date.today()) + + if workday.start.day != workday.end.day or workday.start.month != workday.end.month or workday.start.year != workday.end.year or workday.start > workday.end: + messages.success(request, f'Der Arbeitstag darf nur an einem Tag stattfinden und das Ende muss nach dem Anfang liegen.') + context = { + "active_link" : "timemanagement", + "form" : AddWorkdayForm(), + "team" : team, + "user" : user + } + return render(request, 'timemanagement/timemanagement_add.html', context) + else: + workday.save() + messages.success(request, f'Arbeitstag hinzugefügt') + + if (team == 1): + return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year) + else: + return redirect('tm-management') + else: + messages.success(request, f'Bitte valide Daten eingeben!') + context = { + "active_link" : "timemanagement", + "form" : AddWorkdayForm(), + "team" : team, + "user" : user + } + return render(request, 'timemanagement/timemanagement_add.html', context) + else: + + form = AddWorkdayForm() + + # Setzt die Zielarbeitszeit auf die in den Vertragsdaten hinterlegten Wert + today = date.today() + if(today.isoweekday() == 1): + form.fields["target"].initial = user.usertime.wd_mo + elif(today.isoweekday() == 2): + form.fields["target"].initial = user.usertime.wd_tu + elif(today.isoweekday() == 3): + form.fields["target"].initial = user.usertime.wd_we + elif(today.isoweekday() == 4): + form.fields["target"].initial = user.usertime.wd_th + elif(today.isoweekday() == 5): + form.fields["target"].initial = user.usertime.wd_fr + elif(today.isoweekday() == 6): + form.fields["target"].initial = user.usertime.wd_sa + elif(today.isoweekday() == 7): + form.fields["target"].initial = user.usertime.wd_so + + context = { + "active_link" : "timemanagement", + "form" : form, + "team" : team, + "user" : user + } + return render(request, 'timemanagement/timemanagement_add.html', context) + +@login_required +def AddBreak(request, pk, team=0): + workday = Workday.objects.get(pk=pk) + user = workday.user + if(workday.agency == user.profile.agency): + if(request.method == "POST"): + if(team == 0): + form = AddBreakForm(request.POST, instance=request.user) + else: + form = AddBreakForm(request.POST, instance=user) + + start = datetime.datetime(int(workday.start.year), int(workday.start.month), int(workday.start.day), int(((str(form["start"].value()).split(":"))[0])), int(((str(form["start"].value()).split(":"))[1]))) + + end = datetime.datetime(int(workday.end.year), int(workday.end.month), int(workday.end.day), int(((str(form["end"].value()).split(":"))[0])), int(((str(form["end"].value()).split(":"))[1]))) + + if(team == 0): + newbreak = Breaks.objects.create(workday=workday, user=request.user, agency=request.user.profile.agency, start=start, end=end) + else: + newbreak = Breaks.objects.create(workday=workday, user=user, agency=user.profile.agency, start=start, end=end) + + workday.breaks.add(newbreak) + workday.save() + messages.success(request, f'Pause hinzugefügt') + + if(team == 0): + return redirect('tm-update', pk=pk) + else: + return redirect('tm-team-single', user.pk, workday.start.month, workday.start.year) + else: + if(team == 0): + context = { + "active_link" : "timemanagement", + "workday" : Workday.objects.get(pk=pk), + "form" : AddBreakForm(instance=request.user) + } + else: + context = { + "active_link" : "timemanagement", + "workday" : Workday.objects.get(pk=pk), + "form" : AddBreakForm(instance=user) + } + return render(request, 'timemanagement/timemanagement_break.html', context) + else: + return redirect('login') + +@login_required +def TimeAjax(request): + data = {} + if request.method == "GET": + # START WORKDAY + if request.GET["action"] == "start_day": + + today = date.today() + targettime = 0.0 + if(today.isoweekday() == 1): + targettime = request.user.usertime.wd_mo + elif(today.isoweekday() == 2): + targettime = request.user.usertime.wd_tu + elif(today.isoweekday() == 3): + targettime = request.user.usertime.wd_we + elif(today.isoweekday() == 4): + targettime = request.user.usertime.wd_th + elif(today.isoweekday() == 5): + targettime = request.user.usertime.wd_fr + elif(today.isoweekday() == 6): + targettime = request.user.usertime.wd_sa + elif(today.isoweekday() == 7): + targettime = request.user.usertime.wd_so + + + # Liegt eine halbe Abwesenheit vor, wird hier die Zielarbeitszeit halbiert + if(getAbsenceForOneDay(request.user, today) != False): + targettime = targettime / 2 + + # Prpfung, ob bereits Arbeitstage an diesem Tag vorliegen + tempworkday = Workday.objects.filter(agency=request.user.profile.agency, user=request.user, start__day=today.day, start__month=today.month, start__year=today.year, delflag = False) + + + user_has_workdays = False + if len(tempworkday) == 0: + # Noch kein Arbeitstag vorhanden, Zielarbeitszeit ganz normal + user_has_workdays = True + else: + # Es ist bereits ein ARbeitstag vorhanden, daher wird die Zielarbeitszeit des zweiten Teils auf 0 gesetzt + targettime=0.0 + + + wd = Workday(user=request.user, agency=request.user.profile.agency, start=timezone.now(), target=targettime) + wd.save() + + data = { + "success" : True, + "wd_starttime" : wd.start.strftime("%H:%M:%S"), + "wd_starttime_complete" : wd.start + } + # END DAY + elif request.GET["action"] == "end_day": + wd = list(Workday.objects.filter(user=request.user, agency=request.user.profile.agency, end=None, delflag = False))[0] + # END ALL BREAKS + for b in wd.breaks.all(): + if b.end == None: + b.end = timezone.now() + b.save() + wd.end = timezone.now() + wd.save() + + breaksum = 0 + for b in wd.breaks.all(): + if(b.end != None): + breaksum += (b.end - b.start).seconds + + data = { + "success" : True, + "wd_endtime" : wd.end.strftime("%H:%M:%S"), + "actualbreaktime" : breaksum*1000 + } + # START A BREAK + elif request.GET["action"] == "start_break": + wd = list(Workday.objects.filter(user=request.user, agency=request.user.profile.agency, end=None, delflag = False))[0] + newbreak = Breaks(workday=wd, user=request.user, agency=request.user.profile.agency, start=timezone.now()) + newbreak.save() + wd.breaks.add(newbreak) + data = { + "success" : True, + "break_starttime" : newbreak.start, + } + # END BREAK + elif request.GET["action"] == "end_break": + wd = list(Workday.objects.filter(user=request.user, agency=request.user.profile.agency, end=None, delflag = False))[0] + toendbreak = list(wd.breaks.filter(end=None))[0] + toendbreak.end = timezone.now() + toendbreak.save() + + wd = list(Workday.objects.filter(user=request.user, agency=request.user.profile.agency, end=None, delflag = False))[0] + breaksum = 0 + for b in wd.breaks.all(): + if(b.end != None): + breaksum += (b.end - b.start).seconds + + data = { + "success" : True, + "actualbreaktime" : breaksum*1000, + "wdtime" : wd.start + } + # REMOVE WORKDAY + elif request.GET["action"] == "remove_workday": + wd = Workday.objects.get(pk=request.GET.get("workday")) + if(wd.agency == request.user.profile.agency): + wd.delete() + data = { + "success" : True + } + else: + data = { "success" : False} + # REMOVE BREAK + elif request.GET["action"] == "remove_break": + breakwd = Breaks.objects.get(pk=request.GET.get("break")) + if(breakwd.agency == request.user.profile.agency): + breakwd.delete() + data = { + "success" : True + } + else: + data = { "success" : False} + # LOADING INTIAIL WORKDAYS + elif request.GET["action"] == "initial_load": + + allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency, day__gt=request.user.usertime.usetime_start, day__lt=date.today()) + + + weekdays = [6,7] + for dt in daterange(request.user.usertime.usetime_start, date.today()): + if dt.isoweekday() not in weekdays: + in_freedays = False + for freeday in allfreedays.all(): + if(dt == freeday.day): + in_freedays = True + break; + + if(not in_freedays): + # MONDAY + if(dt.isoweekday() == 1): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_mo) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_mo) + if(dt.isoweekday() == 2): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_tu) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_tu) + if(dt.isoweekday() == 3): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_we) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_we) + if(dt.isoweekday() == 4): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_th) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_th) + if(dt.isoweekday() == 5): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_fr) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_fr) + + if(dt.isoweekday() == 6): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_sa) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_sa) + + if(dt.isoweekday() == 7): + start_time = datetime.timedelta(hours=8) + start_date = datetime.date(int(dt.year), int(dt.month), int(dt.day)) + end_time = datetime.timedelta(hours=request.user.usertime.wd_so) + start_time + time_start = datetime.datetime.strptime(str(start_time), "%H:%M:%S").time() + time_end = datetime.datetime.strptime(str(end_time), "%H:%M:%S").time() + start_datetime = datetime.datetime.combine(start_date, time_start) + end_datetime = datetime.datetime.combine(start_date, time_end) + + Workday.objects.create(user=request.user, agency=request.user.profile.agency, start=start_datetime, end=end_datetime, target=request.user.usertime.wd_so) + # Get Rendered Table + elif request.GET["action"] == "getrenderedtable": + prevmonth = "" + nextmonth = "" + activemonth = int(request.GET["activemonth"]) + activeyear = int(request.GET["activeyear"]) + + #MONTH + if(not activemonth or activemonth > 12 or activemonth < 1): + activemonth = int(activemonth) + #Active month + activemonth=date.today().month + + if(activemonth == 1): + prevmonth = 12 + else: + prevmonth = activemonth-1 + + if(activemonth == 12): + nextmonth = 1 + else: + nextmonth = activemonth + 1 + else: + + if(activemonth == 1): + prevmonth = 12 + else: + prevmonth = activemonth-1 + + if(activemonth == 12): + nextmonth = 1 + else: + nextmonth = activemonth + 1 + + #YEAR + nextyear = date.today().year + prevyear = date.today().year + + if(not activeyear): + activeyear = date.today().year + else: + if(nextmonth == 1): + nextyear = activeyear + 1 + else: + nextyear = activeyear + if(prevmonth == 12): + prevyear = activeyear - 1 + else: + prevyear = activeyear + missinguserdata = [] + #CHECK, ob alle nötigen Infos zur Urlaubsberechnung vorliegen + for user in User.objects.filter(profile__agency=request.user.profile.agency): + tempTime = UserTime.objects.get(user=user) + + if(tempTime.startdate == None): + missinguserdata.append(user) + + context = { + "active_link" : "abscence", + "usersofagency" : User.objects.filter(profile__agency=request.user.profile.agency).order_by("-last_name"), + "days_this_month" : get_datetime_range(activeyear,activemonth), + "activemonth" : activemonth, + "missinguserdata" : missinguserdata, + "activeyear" : activeyear, + "nextmonth" : nextmonth, + "prevmonth" : prevmonth, + "nextyear" : nextyear, + "prevyear" : prevyear, + "today" : date.today(), + } + return render(request, "timemanagement/rendered_table.html", context) + + # Prüfung, ob eine Vertretung nötig ist oder nicht + elif request.GET["action"] == "checkrequired": + reason = AbsenceReason.objects.get(pk=request.GET["rid"]) + if(reason.agency == request.user.profile.agency): + data = { + "success" : True, + "isreq" : reason.need_rep, + "isholiday" : reason.is_holiday + } + else: + data = { + "success" : False + } + # DELETE ABSENCE + elif request.GET["action"] == "remove_absence": + absence = Absence.objects.get(pk=request.GET["ab"]) + + checkAbsenceWorkdayCollideDelete(absence) + + if(request.user.has_perm("users.absencemanager") and absence.agency == request.user.profile.agency): + absence.delete() + data = { + "success" : True + } + # GET FORM FOR CONFIRM ABSENCE + elif request.GET["action"] == "getrenderedform": + + absence = Absence.objects.get(pk=request.GET["abscenceid"]) + timeinfo_thisyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year, user=absence.user))[0] + try: + timeinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(year=absence.start.year+1, user=absence.user))[0] + except: + timeinfo_nextyear = False + + + # POrüfen, ob es in diesem Zeitraum noch andere Abwesenheiten gibt + other_absences = Absence.objects.filter(start__lte=absence.start, end__gte=absence.end, agency=request.user.profile.agency, confirm_status=0).exclude(user=absence.user) + + other_absences_string = False + if (len(other_absences) > 0): + other_absences_string = [] + for a in other_absences: + other_absences_string.append(a.user.first_name + " " + a.user.last_name + " - Vom " + a.start.strftime("%d.%m.%Y") + " bis " + a.end.strftime("%d.%m.%Y")) + + + context = { + "confirmform" : ConfirmAbsenceForm(instance=request.user), + "absence" : absence, + "other_absences_string" : other_absences_string, + "timeinfo_thisyear" : timeinfo_thisyear, + "timeinfo_nextyear" : timeinfo_nextyear + } + + return render(request, "timemanagement/rendered_confirmform.html", context) + elif request.GET["action"] == "confirmornotabscence": + absence = Absence.objects.get(pk=request.GET["absencetowork"]) + new_stat = request.GET["newconfstat"] + + info = request.GET["info"] + # Eingeloggter Nutzer hat Rechte, Urlaube einzutragen + if(absence.user.profile.agency == request.user.profile.agency and request.user.has_perm("users.absencemanager")): + absence.confirm_status = new_stat + + # Wenn eine Abwesenheit abgelehnt wurde, werden hier die Tage wieder auf das Kontingent geschrieben. Die Abewesenheit selber wird aber nicht gelöscht, sondern ist dann einfach "leer" + if(new_stat == "2"): + year = absence.start.year + userabinfo_thisyear = list(UserYearAbsenceInfo.objects.filter(user=absence.user, year=year))[0] + userabinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(user=absence.user, year=year+1))[0] + + userabinfo_thisyear.days_inuse = userabinfo_thisyear.days_inuse - absence.holidays_normal - absence.holidays_rest + userabinfo_thisyear.restdays = userabinfo_thisyear.restdays + absence.holidays_rest + + userabinfo_nextyear.days_inuse = userabinfo_nextyear.days_inuse - absence.holidays_normal_next - absence.holidays_rest_next + userabinfo_nextyear.restdays = userabinfo_nextyear.restdays + absence.holidays_rest_next + + userabinfo_thisyear.save() + userabinfo_nextyear.save() + + absence.holidays_normal = 0 + absence.holidays_rest = 0 + absence.holidays_normal_next = 0 + absence.holidays_rest_next = 0 + + + absence.confirm_info = info + post_save.disconnect(save_newabsence, sender=Absence) + absence.save() + post_save.connect(save_newabsence, sender=Absence) + messages.success(request, f'Abwesenheit gespeichert!') + + if(absence.user.usernotifications.absence_created_mail): + notificationtext = " es wurde eine Abwesenheit bearbeitet!" + + msg_html = render_to_string('notificsys/notification_mail.html', {'username': absence.user.first_name + " " + absence.user.last_name, 'notificationtext' : notificationtext, 'linktarget' : ""}) + + send_mail( + 'Agentur-Benachrichtigung', + 'Hallo ' + absence.user.first_name + " " + absence.user.last_name + '! ' + notificationtext, + 'noreply@digitale-agentur.com', + [absence.user.email], + html_message=msg_html, + fail_silently=True + ) + + else: + messages.success(request, f'Das dürfen Sie nicht!') + + data = { + "success" : True, + "activemonth" : request.GET["activemonth"], + "activeyear" : request.GET["activeyear"] + } + # Berechnung starten, da Urlaub vorhanden ist + elif request.GET["action"] == "getrestholidays": + user = User.objects.get(pk=request.GET["userid"]) + usertimedata = UserTime.objects.get(user=user) + today = date.today() + if(user.profile.agency == request.user.profile.agency): + + start_day = request.GET["startdate"].split("__") + # TASK: Diese Zeile wirft eine Fehler: invalid literal for int() with base 10: 'NaN' + start_day_obj = datetime.date(int(start_day[0]), int(start_day[1]), int(start_day[2])) + + end_day = request.GET["enddate"].split("__") + end_day_obj = datetime.date(int(end_day[0]), int(end_day[1]), int(end_day[2])) + + try: + holidayloose_date = datetime.date(start_day_obj.year, int(usertimedata.loose_holidedate.split(".")[1]), int(usertimedata.loose_holidedate.split(".")[0])) + except: + holidayloose_date = datetime.date(2020, int(usertimedata.loose_holidedate.split(".")[1]), int(usertimedata.loose_holidedate.split(".")[0])) + + + # GET INFO IF DAY IS HALF OR NOT, EQUAL PRE-POST-DAY + start_half = False + if request.GET["startday_info"] == "1" or request.GET["startday_info"] == "2": + start_half = True + + end_half = False + if request.GET["endday_info"] == "1" or request.GET["endday_info"] == "2": + end_half = True + + choosenyear = int(start_day[0]) + + yeardata = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, year=choosenyear))[0] + + holiday_thisyear = 0 + holiday_lastyear = yeardata.restdays + holiday_nextyear = 0 + holiday_nextyear_rest = 0 + two_years = False + need_days_next = 0 + need_days_this = 0 + + try: + holiday_nextyear = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].days - list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].days_inuse + holiday_nextyear_rest = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].restdays + except: + holiday_nextyear = yeardata.days + + # Urlaub innerhalb eines Jahres inkl. Prüfung auf Resturlaubsanspruch + if(end_day_obj.year == start_day_obj.year): + # Startt des Urlaubs NACH Verfallsdatum - nur aktuelles JAhr und die Zahl interessiert + if(start_day_obj > holidayloose_date): + need_days = (calculateHolidays(request, start_day_obj, end_day_obj, start_half, end_half, user))*(-1) + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days + else: + need_days = (calculateHolidays(request, start_day_obj, end_day_obj, start_half, end_half, user))*(-1) + # Kein Resturlaub + if(yeardata.restdays == 0.0): + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days + # Resturlaub vorhanden, berechne mit Resturlaub + else: + holiday_lastyear = yeardata.restdays + holiday_thisyear = yeardata.days - yeardata.days_inuse + temp_holiday = holiday_lastyear - need_days + if(temp_holiday < 0): + holiday_lastyear = 0 + holiday_thisyear = yeardata.days - yeardata.days_inuse + temp_holiday + else: + holiday_lastyear = yeardata.restdays - need_days + # Urlaub geht über das nächstes Jahr hinweg + else: + two_years = True + holiday_lastyear = yeardata.restdays + date_splitter = datetime.date(end_day_obj.year, 1, 1) + + need_days_this = (calculateHolidays(request, start_day_obj, date_splitter, start_half, False), user)*(-1) + + need_days_next = (calculateHolidays(request, date_splitter, end_day_obj, False, end_half, user))*(-1) + + need_days = (calculateHolidays(request, start_day_obj, date_splitter, start_half, False, user))*(-1) + (calculateHolidays(request, date_splitter, end_day_obj, False, end_half))*(-1) + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days_this + days_nextyear_normal = 0 + days_nextyear_rest = 0 + # Urlaub nächstes Jahr MIT und OHNE Rest + if(holiday_nextyear_rest == 0.0): + holiday_nextyear = holiday_nextyear - (calculateHolidays(request, date_splitter, end_day_obj, False, end_half, user))*(-1) + else: + temprest = holiday_nextyear_rest - need_days_next + # Rest reicht! + if(temprest >= 0): + holiday_nextyear_rest = temprest + days_nextyear_normal = 0 + days_nextyear_rest = need_days_next + # Rest reicht nicht + else: + holiday_nextyear_rest = 0 + holiday_nextyear += temprest + days_nextyear_rest = need_days_next + temprest + days_nextyear_normal = temprest * -1 + + # POrüfen, ob es in diesem Zeitraum noch andere Abwesenheiten gibt + other_absences = Absence.objects.filter(start__lte=start_day_obj, end__gte=end_day_obj, agency=request.user.profile.agency, confirm_status=0).exclude(user=user) + + other_absences_string = False + if (len(other_absences) > 0): + other_absences_string = "" + for a in other_absences: + other_absences_string += a.user.first_name + " " + a.user.last_name + " - Vom " + a.start.strftime("%d.%m.%Y") + " bis " + a.end.strftime("%d.%m.%Y") + "
" + + # Prüfen, ob der Nutzer selbst schon Abwesenheiten in diesem Zeitraum hat + + userown_absences = Absence.objects.filter(start__lte=start_day_obj, end__gte=end_day_obj, agency=request.user.profile.agency, user=user, confirm_status=0) + + userown_absences_string = False + if (len(userown_absences) > 0): + userown_absences_string = "" + for a in userown_absences: + userown_absences_string += a.reason.name + " - Vom " + a.start.strftime("%d.%m.%Y") + " bis " + a.end.strftime("%d.%m.%Y") + "
" + + data = { + "restholiday_thisyear" : holiday_thisyear, + "restholiday_lastyear" : holiday_lastyear, + "restholiday_nextyear" : holiday_nextyear, + "restholiday_nextyear_rest" : holiday_nextyear_rest, + "two_years" : two_years, + "need_days" : need_days, + "need_days_next" : need_days_next, + "need_days_this" : need_days_this, + "other_absences" : other_absences_string, + "userown_absences" : userown_absences_string, + "choosenuser_name" : user.first_name + " " + user.last_name + } + print(data) + # REQUEST USER NO RIGHTS + else: + data = { + "success" : False + } + # GET REQUEST ACTION UNKNOWN + else: + data = { + "success" : False + } + + return JsonResponse(data) + + +''' + +Gibt einen Integer zurück, welcher die Urlaubstage von Start zu Enddatum auf der Grundlage von Freitagen berechnet. +Berücksichtigt sowohl Wochenende als auch in der Agentur hinterlegte Freitage/Schließtage + +''' +@login_required +def calculateHolidays(request, start, end, start_half, end_half, user): + + restdays = 0 + #allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency).distinct('start', 'year') + allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency) + if(end == start): + if(start_half): + return restdays - 0.5 + else: + return restdays - 1 + else: + if(end < start): + return False + else: + counter = 0 + if(start_half): + counter -= 0.5 + if(end_half): + counter -= 0.5 + + weekdays = [] + freedaycounter = 0 + for dt in daterange(start, end): + day_found = False + if dt.isoweekday() not in weekdays: + counter += 1 + for freeday in allfreedays.all(): + if(dt == freeday.day): + freedaycounter += 1 + day_found = True + # Prüfung, ob der Mitarbeiter an diesem Tag überhaupt arbeitet. Wenn nicht, wird der Freedaycounter einfach erhöht + if day_found == False: + if(dt.isoweekday() == 1): + if user.usertime.wd_mo == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 2): + if user.usertime.wd_tu == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 3): + if user.usertime.wd_we == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 4): + if user.usertime.wd_th == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 5): + if user.usertime.wd_fr == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 6): + if user.usertime.wd_sa == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 7): + if user.usertime.wd_so == 0.0: + freedaycounter += 1 + + return restdays - counter + freedaycounter + +@login_required +def calculatingHolidaysByAbsence(request, absence): + # Freitage laden, die innerhalb der gewünschten Abwesenheit liegen + allfreedays = FreeDays.objects.filter(agency=request.user.profile.agency, day__gt=absence.start, day__lt=absence.end) + finalholidayinabsence = 0 + + # Start und Ende gleich, nur ein Tag. Checken, ob Halber Tag + + if(absence.start == absence.end): + if absence.startday_info == "1" or absence.startday_info == "2": + finalholidayinabsence = 0.5 + else: + finalholidayinabsence = 1 + return finalholidayinabsence + + else: + if absence.startday_info == "1" or absence.startday_info == "2": + finalholidayinabsence -= 0.5 + if absence.endday_info == "1" or absence.endday_info == "2": + finalholidayinabsence -= 0.5 + + weekdays = [] + freedaycounter = 0 + for dt in daterange(absence.start, absence.end): + day_found = False + if dt.isoweekday() not in weekdays: + finalholidayinabsence += 1 + # Prüfung, ob freie Tage vorhanden sind + for freeday in allfreedays.all(): + # FREEDAY FOUND + if(dt == freeday.day): + freedaycounter += 1 + day_found = True + # Prüfung, ob der Mitarbeiter an diesem Tag überhaupt arbeitet. Wenn nicht, wird der Freedaycounter einfach erhöht + stat = False + if day_found == False: + if(dt.isoweekday() == 1): + if absence.user.usertime.wd_mo == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 2): + if absence.user.usertime.wd_tu == 0.0:# + freedaycounter += 1 + elif(dt.isoweekday() == 3): + if absence.user.usertime.wd_we == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 4): + if absence.user.usertime.wd_th == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 5): + if absence.user.usertime.wd_fr == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 6): + if absence.user.usertime.wd_sa == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 7): + if absence.user.usertime.wd_so == 0.0: + freedaycounter += 1 + + return finalholidayinabsence - freedaycounter + +# Gibt die Woche als Wochentage zurück +def daterange(date1, date2): + for n in range(int ((date2 - date1).days)+1): + yield date1 + timedelta(n) diff --git a/users/.DS_Store b/users/.DS_Store new file mode 100644 index 0000000..8d23c85 Binary files /dev/null and b/users/.DS_Store differ diff --git a/users/__init__.py b/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/__pycache__/__init__.cpython-37.pyc b/users/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..9c66634 Binary files /dev/null and b/users/__pycache__/__init__.cpython-37.pyc differ diff --git a/users/__pycache__/__init__.cpython-38.pyc b/users/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..cf20f4c Binary files /dev/null and b/users/__pycache__/__init__.cpython-38.pyc differ diff --git a/users/__pycache__/admin.cpython-38.pyc b/users/__pycache__/admin.cpython-38.pyc new file mode 100644 index 0000000..528e4a7 Binary files /dev/null and b/users/__pycache__/admin.cpython-38.pyc differ diff --git a/users/__pycache__/apps.cpython-38.pyc b/users/__pycache__/apps.cpython-38.pyc new file mode 100644 index 0000000..e0d6e32 Binary files /dev/null and b/users/__pycache__/apps.cpython-38.pyc differ diff --git a/users/__pycache__/mainwebsocket.cpython-38.pyc b/users/__pycache__/mainwebsocket.cpython-38.pyc new file mode 100644 index 0000000..321aef0 Binary files /dev/null and b/users/__pycache__/mainwebsocket.cpython-38.pyc differ diff --git a/users/__pycache__/models.cpython-38.pyc b/users/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000..25bd8fd Binary files /dev/null and b/users/__pycache__/models.cpython-38.pyc differ diff --git a/users/__pycache__/priomodel.cpython-38.pyc b/users/__pycache__/priomodel.cpython-38.pyc new file mode 100644 index 0000000..4ed0092 Binary files /dev/null and b/users/__pycache__/priomodel.cpython-38.pyc differ diff --git a/users/__pycache__/routing.cpython-38.pyc b/users/__pycache__/routing.cpython-38.pyc new file mode 100644 index 0000000..a96be31 Binary files /dev/null and b/users/__pycache__/routing.cpython-38.pyc differ diff --git a/users/__pycache__/signals.cpython-38.pyc b/users/__pycache__/signals.cpython-38.pyc new file mode 100644 index 0000000..96b84aa Binary files /dev/null and b/users/__pycache__/signals.cpython-38.pyc differ diff --git a/users/__pycache__/urls.cpython-38.pyc b/users/__pycache__/urls.cpython-38.pyc new file mode 100644 index 0000000..95c0e16 Binary files /dev/null and b/users/__pycache__/urls.cpython-38.pyc differ diff --git a/users/__pycache__/usersforms.cpython-38.pyc b/users/__pycache__/usersforms.cpython-38.pyc new file mode 100644 index 0000000..a0b28e6 Binary files /dev/null and b/users/__pycache__/usersforms.cpython-38.pyc differ diff --git a/users/__pycache__/views.cpython-38.pyc b/users/__pycache__/views.cpython-38.pyc new file mode 100644 index 0000000..74875a2 Binary files /dev/null and b/users/__pycache__/views.cpython-38.pyc differ diff --git a/users/admin.py b/users/admin.py new file mode 100644 index 0000000..d625cf5 --- /dev/null +++ b/users/admin.py @@ -0,0 +1,46 @@ +from django.contrib import admin +from .models import Profile, Agency, AgencyGroup, AgencyJob, AgencyNetwork, AgencyNetworkPreperation, UserTime, UserYearAbsenceInfo, UserNotifications, AgencyBills, RegNotfallhilfe +from .priomodel import Prio +from standards.models import StandardCommentRate, StandardComments +from django.contrib.auth.models import Permission +from message.models import Message +from cloud.models import DataFile +from organizer.models import AGContacts +from timemanagement.models import Workday, Breaks, AbsenceReason, FreeDays, Absence +from chat.models import ChatRoom +from recoverdir.models import PersLetter, Documents, Handlungsleitfaden, RDContact, RecoverDirSetting +from simple_history.admin import SimpleHistoryAdmin +from adm.models import MainStatistic, AGBLog + + +admin.site.register(StandardComments) +admin.site.register(StandardCommentRate) +admin.site.register(Permission) +admin.site.register(Profile) +admin.site.register(Agency) +admin.site.register(AgencyGroup) +admin.site.register(AgencyJob) +admin.site.register(Prio) +admin.site.register(Message) +admin.site.register(AgencyNetwork) +admin.site.register(AGContacts) +admin.site.register(AgencyNetworkPreperation) +admin.site.register(DataFile) +admin.site.register(UserTime) +admin.site.register(Workday) +admin.site.register(Breaks) +admin.site.register(AbsenceReason) +admin.site.register(Absence) +admin.site.register(FreeDays) +admin.site.register(UserYearAbsenceInfo) +admin.site.register(ChatRoom) +admin.site.register(UserNotifications) +admin.site.register(AgencyBills) +admin.site.register(PersLetter, SimpleHistoryAdmin) +admin.site.register(Documents, SimpleHistoryAdmin) +admin.site.register(Handlungsleitfaden) +admin.site.register(RDContact) +admin.site.register(RecoverDirSetting) +admin.site.register(MainStatistic) +admin.site.register(RegNotfallhilfe) +admin.site.register(AGBLog) \ No newline at end of file diff --git a/users/apps.py b/users/apps.py new file mode 100644 index 0000000..1f60ff9 --- /dev/null +++ b/users/apps.py @@ -0,0 +1,9 @@ +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + name = 'users' + + # Hinzufügen der Signals für den User + def ready(self): + import users.signals diff --git a/users/mainwebsocket.py b/users/mainwebsocket.py new file mode 100644 index 0000000..aa843ab --- /dev/null +++ b/users/mainwebsocket.py @@ -0,0 +1,244 @@ +import json +from channels.generic.websocket import WebsocketConsumer +from asgiref.sync import async_to_sync +from channels_presence.models import Room +from channels_presence.decorators import touch_presence, remove_presence +from channels_presence.models import Presence +import channels +from django.contrib.auth.models import User +from rest_framework.authtoken.models import Token + +class UsersConsumer(WebsocketConsumer): + + appconnect = False + ''' + + CONNECT A WEBSOCKET + + Die Clients werden in Channel-Layer pro Agentur gepackt, damit gesendete Websocket-Nachrichten + auch nur Clients innerhalb der Agentur treffen! + + ''' + + def connect(self): + super().connect() + pathcheck = self.scope["path"].split("/") + loggeduser = "" + # CHECK IF SOCKET COMES FROM APP OR FROM WEB + #APP + if(len(pathcheck) == 7 and len(pathcheck[5]) > 0): + loggeduser = User.objects.get(pk=Token.objects.get(key=pathcheck[5]).user_id) + self.appconnect = True + else: + loggeduser = self.scope["user"] + # Jemand neues kommt online, daher einmal die Presence updaten + Presence.objects.touch(self.channel_name) + + # Nutzer in Agenturraum und eigenen Raum hinzufügen + Room.objects.add("agency_" + str(loggeduser.profile.agency.pk), self.channel_name, loggeduser) + Room.objects.add("user_" + str(loggeduser.pk), self.channel_name, loggeduser) + + def disconnect(self, close_code): + if(not self.appconnect): + loggeduser = self.scope["user"] + Room.objects.remove("agency_" + str(loggeduser.profile.agency.pk), self.channel_name) + Presence.objects.touch(self.channel_name) + else: + pathcheck = self.scope["path"].split("/") + loggeduser = User.objects.get(pk=Token.objects.get(key=pathcheck[5]).user_id) + loggeduser = self.scope["user"] + Room.objects.remove("agency_" + str(loggeduser.profile.agency.pk), self.channel_name) + Room.objects.remove("user_" + str(loggeduser.pk), self.channel_name, loggeduser) + Presence.objects.touch(self.channel_name) + + + ''' + def receive(self, text_data): + loggeduser = self.scope["user"] + async_to_sync(self.channel_layer.group_send)( + 'allusers', + { + 'type': 'chat_message', + 'message': 'von mainwebsocket.py' + } + ) + ''' + # WEBSOCKET-DATA-CONTENT + def receive(self, text_data=None, bytes_data=None): + if text_data == '"heartbeat"': + Presence.objects.touch(self.channel_name) + + # UPDATET STANDARD + def update_standard(self, event): + self.send("standard_update") + + ''' + Generelle FUnktion zum Weiterleiten von PUSH-Nachrichten an den einzelnen User. + + Die Infos werden dann in der Base.html zerlegt, die Nachrichten werden entweder in + der signals.py vorbereitet oder (im seltensten Fall) direkt bei der Datenveränderung. + ''' + def pushhandler(self, event): + self.send(event["pushtext"]) + + # NEW AGENCY NEWS + def agency_newnews(self, event): + self.send("pushnotification__news__" + event["pushtext"]) + #self.send("Neue Agenturnews!") + + # SOMETHING IN PRESENCE CHANGED + def update_presence_live(self, event): + self.send("presence_update") + + +class UsersChat(WebsocketConsumer): + + ''' + + CONNECT A WEBSOCKET + + Die Clients werden in Channel-Layer pro Agentur gepackt, damit gesendete Websocket-Nachrichten + auch nur Clients innerhalb der Agentur treffen! + + ''' + + def connect(self): + super().connect() + pathcheck = self.scope["path"].split("/") + loggeduser = "" + + # CHECK IF SOCKET COMES FROM APP OR FROM WEB + #APP + if(len(pathcheck) == 7 and len(pathcheck[5]) > 0): + loggeduser = User.objects.get(pk=Token.objects.get(key=pathcheck[5]).user_id) + self.appconnect = True + else: + loggeduser = self.scope["user"] + + roomname = "privatechat_" + str(self.scope["url_route"]["kwargs"]["creator"]) + "_" + str(self.scope["url_route"]["kwargs"]["single"]) + channel_layer = channels.layers.get_channel_layer() + Room.objects.add("user_" + str(loggeduser.pk), self.channel_name, loggeduser) + Room.objects.add(roomname, self.channel_name, loggeduser) + + def disconnect(self, close_code): + #self.channel_layer.group_discard(list(Room.objects.filter(room_channel_name=self.channel_name))[0].room_channel_name, self.channel_name) + Presence.objects.touch(self.channel_name) + Room.objects.remove("", self.channel_name) + + # WEBSOCKET-DATA-CONTENT + + def receive(self, text_data=None, bytes_data=None): + datainfo = text_data.split("__") + typinguserid = datainfo[1] + if datainfo[0] == 'starttyping': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'start_typing', 'typingname' : typinguserid}) + elif datainfo[0] == 'stoptyping': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'stop_typing'}) + elif datainfo[0] == 'load': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'reloadmessages'}) + elif datainfo[0] == 'delmessage': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'delmessage', 'messageid' : datainfo[1] }) + + def start_typing(self, event): + useristyping = User.objects.get(pk=event["typingname"]) + self.send("starttyping__" + str(useristyping.pk) + "_" + useristyping.first_name + " " + useristyping.last_name + " tippt...") + + def stop_typing(self, event): + self.send("stoptyping") + + def reloadmessages(self, event): + self.send("reloadmessages") + + # UPDATET STANDARD + def update_standard(self, event): + self.send("standard_update") + + # NEW AGENCY NEWS + def agency_newnews(self, event): + self.send("Neue Agenturnews!") + + def pushhandler(self, event): + self.send(event["pushtext"]) + + # SOMETHING IN PRESENCE CHANGED + def update_presence_live(self, event): + self.send("presence_update") + + def delmessage(self, event): + self.send("delete_message__" + event["messageid"]) + + +class GroupChat(WebsocketConsumer): + + def connect(self): + super().connect() + pathcheck = self.scope["path"].split("/") + loggeduser = "" + + # CHECK IF SOCKET COMES FROM APP OR FROM WEB + #APP + if(len(pathcheck) == 7 and len(pathcheck[5]) > 0): + loggeduser = User.objects.get(pk=Token.objects.get(key=pathcheck[5]).user_id) + self.appconnect = True + else: + loggeduser = self.scope["user"] + + roomname = "groupchat_" + str(self.scope["url_route"]["kwargs"]["chatid"]) + channel_layer = channels.layers.get_channel_layer() + Room.objects.add(roomname, self.channel_name, loggeduser) + + def disconnect(self, close_code): + Presence.objects.touch(self.channel_name) + Room.objects.remove("", self.channel_name) + + # WEBSOCKET-DATA-CONTENT + def receive(self, text_data=None, bytes_data=None): + datainfo = text_data.split("__") + typinguserid = datainfo[1] + + print(datainfo[2]) + + if datainfo[0] == 'starttyping': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'start_typing', 'typingname' : typinguserid}) + elif datainfo[0] == 'stoptyping': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'stop_typing'}) + elif datainfo[0] == 'load': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'reloadmessages'}) + elif datainfo[0] == 'delmessage': + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(datainfo[2], {'type' : 'delmessage', 'messageid' : datainfo[1] }) + + def start_typing(self, event): + useristyping = User.objects.get(pk=event["typingname"]) + self.send("starttyping__" + str(useristyping.pk) + "_" + useristyping.first_name + " " + useristyping.last_name + " tippt...") + + def stop_typing(self, event): + self.send("stoptyping") + + def reloadmessages(self, event): + self.send("reloadmessages") + + # UPDATET STANDARD + def update_standard(self, event): + self.send("standard_update") + + # NEW AGENCY NEWS + def agency_newnews(self, event): + self.send("Neue Agenturnews!") + + def pushhandler(self, event): + self.send(event["pushtext"]) + + # SOMETHING IN PRESENCE CHANGED + def update_presence_live(self, event): + self.send("presence_update") + + def delmessage(self, event): + self.send("delete_message__" + event["messageid"]) \ No newline at end of file diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py new file mode 100644 index 0000000..f4bc741 --- /dev/null +++ b/users/migrations/0001_initial.py @@ -0,0 +1,255 @@ +# Generated by Django 3.0 on 2020-09-25 07:13 + +from django.conf import settings +import django.contrib.auth.models +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import users.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('tasks', '0001_initial'), + #('auth', '0012_auto_20200925_0713'), + ('standards', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Agency', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ('inhaber', models.CharField(blank=True, default='', max_length=200)), + ('street', models.CharField(blank=True, default='', max_length=200)), + ('city', models.CharField(blank=True, default='', max_length=200)), + ('plz', models.CharField(blank=True, default='', max_length=5)), + ('agency_email', models.EmailField(blank=True, default='', max_length=254)), + ('phone', models.CharField(blank=True, default='', max_length=50)), + ('agencypic', models.ImageField(blank=True, default='ag_default.jpg', upload_to=users.models.picturepath_agency)), + ('balance', models.FloatField(blank=True, default=0.0, max_length=9)), + ('nextdebiting', models.DateTimeField(blank=True, default=django.utils.timezone.now)), + ('monthlyprice', models.FloatField(blank=True, default=25.0, max_length=9)), + ('module_news', models.BooleanField(default=True)), + ('module_organizer', models.BooleanField(default=True)), + ('module_files', models.BooleanField(default=True)), + ('module_organigramm', models.BooleanField(default=True)), + ('dynamicprofile', models.BooleanField(default=True)), + ('module_messages', models.BooleanField(default=True)), + ('module_chat', models.BooleanField(default=True)), + ('module_timemanagement', models.BooleanField(default=False)), + ('module_timemanagement_price', models.FloatField(blank=True, default=10.0, max_length=9)), + ('vve', models.CharField(blank=True, default='', max_length=200)), + ], + ), + migrations.CreateModel( + name='AgencyJob', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=80)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='AgencyNetwork', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='', max_length=200)), + ('created_on', models.DateTimeField(default=django.utils.timezone.now)), + ('lastactivity', models.DateTimeField(default=django.utils.timezone.now)), + ('publicjoin', models.BooleanField(default=False)), + ('networkid', models.CharField(default='', max_length=30)), + ('adminagencys', models.ManyToManyField(related_name='AdministrationAgencys', to='users.Agency')), + ('creator', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), + ('creator_agency', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.PROTECT, to='users.Agency')), + ('members', models.ManyToManyField(blank=True, related_name='MemberAgencys', to='users.Agency')), + ('sharemembers', models.ManyToManyField(blank=True, related_name='ShareMemberAgencys', to='users.Agency')), + ('standards', models.ManyToManyField(blank=True, related_name='sharedstandards', to='standards.Standards')), + ], + ), + migrations.CreateModel( + name='UserFullName', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + 'constraints': [], + }, + bases=('auth.user',), + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name='UserYearAbsenceInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('year', models.IntegerField()), + ('days_inuse', models.FloatField(default=0.0)), + ('days', models.FloatField(default=24.0)), + ('restdays', models.FloatField(default=0.0)), + ('agency', models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, to='users.Agency')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='UserTime', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('wd_mo', models.FloatField(default=0.0)), + ('wd_tu', models.FloatField(default=0.0)), + ('wd_we', models.FloatField(default=0.0)), + ('wd_th', models.FloatField(default=0.0)), + ('wd_fr', models.FloatField(default=0.0)), + ('wd_sa', models.FloatField(default=0.0)), + ('wd_so', models.FloatField(default=0.0)), + ('loose_holidedate', models.CharField(default='30.04.', max_length=6)), + ('startdate', models.DateField(blank=True, default=None, null=True)), + ('usetime', models.BooleanField(default=False)), + ('usetime_start', models.DateField(blank=True, default=None, null=True)), + ('user', models.OneToOneField(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='UserNotifications', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('standard_created_mail', models.BooleanField(default=False)), + ('standard_created_push', models.BooleanField(default=True)), + ('standard_update_mail', models.BooleanField(default=False)), + ('standard_update_push', models.BooleanField(default=True)), + ('standard_delete_mail', models.BooleanField(default=False)), + ('standard_delete_push', models.BooleanField(default=True)), + ('standard_created_unpub_mail', models.BooleanField(default=False)), + ('standard_created_unpub_push', models.BooleanField(default=True)), + ('news_created_mail', models.BooleanField(default=True)), + ('news_created_push', models.BooleanField(default=True)), + ('filedir_created_mail', models.BooleanField(default=False)), + ('filedir_created_push', models.BooleanField(default=True)), + ('filedir_update_mail', models.BooleanField(default=False)), + ('filedir_update_push', models.BooleanField(default=True)), + ('filedir_delete_mail', models.BooleanField(default=False)), + ('filedir_delete_push', models.BooleanField(default=True)), + ('ql_created_mail', models.BooleanField(default=False)), + ('ql_created_push', models.BooleanField(default=True)), + ('ql_update_mail', models.BooleanField(default=False)), + ('ql_update_push', models.BooleanField(default=True)), + ('ql_delete_mail', models.BooleanField(default=False)), + ('ql_delete_push', models.BooleanField(default=True)), + ('contact_created_mail', models.BooleanField(default=False)), + ('contact_created_push', models.BooleanField(default=True)), + ('contact_update_mail', models.BooleanField(default=False)), + ('contact_update_push', models.BooleanField(default=True)), + ('contact_delete_mail', models.BooleanField(default=False)), + ('contact_delete_push', models.BooleanField(default=True)), + ('password_created_mail', models.BooleanField(default=False)), + ('password_created_push', models.BooleanField(default=True)), + ('password_update_mail', models.BooleanField(default=False)), + ('password_update_push', models.BooleanField(default=True)), + ('password_delete_mail', models.BooleanField(default=False)), + ('password_delete_push', models.BooleanField(default=True)), + ('message_received_mail', models.BooleanField(default=False)), + ('message_received_push', models.BooleanField(default=True)), + ('task_activity_mail', models.BooleanField(default=False)), + ('task_activity_push', models.BooleanField(default=True)), + ('chat_received_mail', models.BooleanField(default=False)), + ('chat_received_push', models.BooleanField(default=True)), + ('chat_room_activity_mail', models.BooleanField(default=False)), + ('chat_room_activity_push', models.BooleanField(default=True)), + ('absence_created_mail', models.BooleanField(default=True)), + ('absence_created_push', models.BooleanField(default=True)), + ('absence_user_is_rep_mail', models.BooleanField(default=True)), + ('absence_user_is_rep_push', models.BooleanField(default=True)), + ('absence_user_is_rep_reminder_mail', models.BooleanField(default=True)), + ('absence_user_is_rep_reminder_push', models.BooleanField(default=True)), + ('time_data_changed_mail', models.BooleanField(default=True)), + ('time_data_changed_push', models.BooleanField(default=True)), + ('group_activity_mail', models.BooleanField(default=False)), + ('group_activity_push', models.BooleanField(default=True)), + ('group_rights_mail', models.BooleanField(default=False)), + ('group_rights_push', models.BooleanField(default=True)), + ('agn_standard_created_mail', models.BooleanField(default=False)), + ('agn_standard_created_push', models.BooleanField(default=True)), + ('agn_standard_copied_mail', models.BooleanField(default=False)), + ('agn_standard_copied_push', models.BooleanField(default=True)), + ('agn_standard_comment_mail', models.BooleanField(default=False)), + ('agn_standard_comment_push', models.BooleanField(default=True)), + ('agn_standard_comment_react_mail', models.BooleanField(default=False)), + ('agn_standard_comment_react_push', models.BooleanField(default=True)), + ('agn_own_change_mail', models.BooleanField(default=False)), + ('agn_own_change_push', models.BooleanField(default=True)), + ('agn_other_change_mail', models.BooleanField(default=False)), + ('agn_other_change_push', models.BooleanField(default=True)), + ('user', models.OneToOneField(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('phoneland', models.CharField(blank=True, max_length=60)), + ('phonemobile', models.CharField(blank=True, max_length=60)), + ('phone_public', models.BooleanField(default=False)), + ('image', models.ImageField(blank=True, default='default.jpg', upload_to=users.models.picturepath_user)), + ('compfunc', models.CharField(blank=True, max_length=60)), + ('visible', models.BooleanField(default=True)), + ('persnumber', models.CharField(blank=True, default='', max_length=50)), + ('showtooltips', models.BooleanField(default=True)), + ('news_mail', models.BooleanField(default=True)), + ('news_push', models.BooleanField(default=True)), + ('user_standard_public_mail', models.BooleanField(default=False)), + ('user_standard_public_push', models.BooleanField(default=True)), + ('agency_new_standard_mail', models.BooleanField(default=False)), + ('agency_new_standard_push', models.BooleanField(default=True)), + ('add_new_group_mail', models.BooleanField(default=False)), + ('add_new_group_push', models.BooleanField(default=True)), + ('add_task_mail', models.BooleanField(default=False)), + ('add_task_push', models.BooleanField(default=True)), + ('user_messages_mail', models.BooleanField(default=True)), + ('user_messages_push', models.BooleanField(default=True)), + ('onlinestatus', models.IntegerField(default=0)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')), + ('func', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.AgencyJob')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='parent_user', to=settings.AUTH_USER_MODEL)), + ('user', models.OneToOneField(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Prio', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('prio', models.IntegerField(default=0)), + ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.Tasks')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='AgencyNetworkPreperation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.IntegerField()), + ('target_network', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.AgencyNetwork')), + ('wanted_agency', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.PROTECT, to='users.Agency')), + ], + ), + migrations.CreateModel( + name='AgencyGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('agencygroupname', models.CharField(blank=True, max_length=60)), + ('savefordel', models.BooleanField(default=False)), + ('is_admin', models.BooleanField(default=False)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')), + ('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='auth.Group')), + ], + options={ + 'permissions': [('agencyinfo', 'Agenturinformationen verändern'), ('agencynetwork', 'Agenturverbund bearbeiten'), ('usermanager', 'Mitarbeiter bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'), ('structuremanager', 'Struktur bearbeiten'), ('standardmanager', 'Standards bearbeiten und freischalten'), ('modulenews', 'News bearbeiten und veröffentlichen'), ('modulesconfig', 'Module verwalten'), ('moduleorganizer', 'Organizer bearbeiten'), ('filesmanager', 'Dateien bearbeiten'), ('filedirmanager', 'Ordner bearbeiten'), ('filesviewer', 'Dateien lesen'), ('absencemanager', 'Abwesenheiten verwalten')], + }, + ), + ] diff --git a/users/migrations/0002_auto_20200925_0829.py b/users/migrations/0002_auto_20200925_0829.py new file mode 100644 index 0000000..7199e53 --- /dev/null +++ b/users/migrations/0002_auto_20200925_0829.py @@ -0,0 +1,46 @@ +# Generated by Django 3.0 on 2020-09-25 08:29 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='agency', + name='balance', + ), + migrations.RemoveField( + model_name='agency', + name='monthlyprice', + ), + migrations.RemoveField( + model_name='agency', + name='nextdebiting', + ), + migrations.AddField( + model_name='agency', + name='lexofficeid', + field=models.CharField(default='', max_length=200), + ), + migrations.AddField( + model_name='agency', + name='paymentplan', + field=models.IntegerField(default=None, null=True), + ), + migrations.AddField( + model_name='agency', + name='paymentstatus', + field=models.IntegerField(default=0, null=True), + ), + migrations.AddField( + model_name='agency', + name='registerdate', + field=models.DateField(default=django.utils.timezone.now, null=True), + ), + ] diff --git a/users/migrations/0003_auto_20200925_0830.py b/users/migrations/0003_auto_20200925_0830.py new file mode 100644 index 0000000..d1a9fda --- /dev/null +++ b/users/migrations/0003_auto_20200925_0830.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-09-25 08:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_auto_20200925_0829'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='lexofficeid', + field=models.CharField(blank=True, default='', max_length=200), + ), + migrations.AlterField( + model_name='agency', + name='paymentplan', + field=models.IntegerField(blank=True, default=None, null=True), + ), + ] diff --git a/users/migrations/0004_agency_payment_address.py b/users/migrations/0004_agency_payment_address.py new file mode 100644 index 0000000..cd3b056 --- /dev/null +++ b/users/migrations/0004_agency_payment_address.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-09-25 09:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0003_auto_20200925_0830'), + ] + + operations = [ + migrations.AddField( + model_name='agency', + name='payment_address', + field=models.EmailField(blank=True, default=None, max_length=254, null=True), + ), + ] diff --git a/users/migrations/0005_auto_20200925_1048.py b/users/migrations/0005_auto_20200925_1048.py new file mode 100644 index 0000000..f4a89a8 --- /dev/null +++ b/users/migrations/0005_auto_20200925_1048.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-09-25 10:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0004_agency_payment_address'), + ] + + operations = [ + migrations.AddField( + model_name='agency', + name='agb', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='agency', + name='contract', + field=models.BooleanField(default=False), + ), + ] diff --git a/users/migrations/0006_agency_firstbillid.py b/users/migrations/0006_agency_firstbillid.py new file mode 100644 index 0000000..a939979 --- /dev/null +++ b/users/migrations/0006_agency_firstbillid.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-09-30 18:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0005_auto_20200925_1048'), + ] + + operations = [ + migrations.AddField( + model_name='agency', + name='firstbillid', + field=models.CharField(blank=True, default=None, max_length=200, null=True), + ), + ] diff --git a/users/migrations/0007_agencybills.py b/users/migrations/0007_agencybills.py new file mode 100644 index 0000000..f7c0986 --- /dev/null +++ b/users/migrations/0007_agencybills.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-10-01 10:45 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0006_agency_firstbillid'), + ] + + operations = [ + migrations.CreateModel( + name='AgencyBills', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('lexid', models.CharField(blank=True, default='', max_length=200, null=True)), + ('name', models.CharField(default='', max_length=200)), + ('agency', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='users.Agency')), + ], + ), + ] diff --git a/users/migrations/0008_remove_agency_firstbillid.py b/users/migrations/0008_remove_agency_firstbillid.py new file mode 100644 index 0000000..cf5b609 --- /dev/null +++ b/users/migrations/0008_remove_agency_firstbillid.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0 on 2020-10-01 10:46 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0007_agencybills'), + ] + + operations = [ + migrations.RemoveField( + model_name='agency', + name='firstbillid', + ), + ] diff --git a/users/migrations/0009_auto_20201001_1052.py b/users/migrations/0009_auto_20201001_1052.py new file mode 100644 index 0000000..24f6b44 --- /dev/null +++ b/users/migrations/0009_auto_20201001_1052.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0 on 2020-10-01 10:52 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0008_remove_agency_firstbillid'), + ] + + operations = [ + migrations.RenameField( + model_name='agencybills', + old_name='name', + new_name='billtype', + ), + migrations.AddField( + model_name='agencybills', + name='billdate', + field=models.DateField(default=django.utils.timezone.now), + ), + ] diff --git a/users/migrations/0010_agencybills_billnumber.py b/users/migrations/0010_agencybills_billnumber.py new file mode 100644 index 0000000..8b535d9 --- /dev/null +++ b/users/migrations/0010_agencybills_billnumber.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-01 11:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0009_auto_20201001_1052'), + ] + + operations = [ + migrations.AddField( + model_name='agencybills', + name='billnumber', + field=models.CharField(default='', max_length=200), + ), + ] diff --git a/users/migrations/0011_agencybills_docfileid.py b/users/migrations/0011_agencybills_docfileid.py new file mode 100644 index 0000000..d0026b3 --- /dev/null +++ b/users/migrations/0011_agencybills_docfileid.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-01 12:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0010_agencybills_billnumber'), + ] + + operations = [ + migrations.AddField( + model_name='agencybills', + name='docfileid', + field=models.CharField(default='', max_length=200), + ), + ] diff --git a/users/migrations/0012_remove_agencybills_docfileid.py b/users/migrations/0012_remove_agencybills_docfileid.py new file mode 100644 index 0000000..1679fbb --- /dev/null +++ b/users/migrations/0012_remove_agencybills_docfileid.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0 on 2020-10-01 12:37 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0011_agencybills_docfileid'), + ] + + operations = [ + migrations.RemoveField( + model_name='agencybills', + name='docfileid', + ), + ] diff --git a/users/migrations/0013_agencybills_billstatus.py b/users/migrations/0013_agencybills_billstatus.py new file mode 100644 index 0000000..b3b32e2 --- /dev/null +++ b/users/migrations/0013_agencybills_billstatus.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-01 20:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0012_remove_agencybills_docfileid'), + ] + + operations = [ + migrations.AddField( + model_name='agencybills', + name='billstatus', + field=models.CharField(blank=True, default='', max_length=200, null=True), + ), + ] diff --git a/users/migrations/0014_auto_20201001_2153.py b/users/migrations/0014_auto_20201001_2153.py new file mode 100644 index 0000000..b02df55 --- /dev/null +++ b/users/migrations/0014_auto_20201001_2153.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-10-01 21:53 + +from django.db import migrations, models +import django.utils.timezone + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0013_agencybills_billstatus'), + ] + + operations = [ + migrations.AddField( + model_name='agencybills', + name='end', + field=models.DateField(default=django.utils.timezone.now), + ), + migrations.AddField( + model_name='agencybills', + name='start', + field=models.DateField(default=django.utils.timezone.now), + ), + ] diff --git a/users/migrations/0015_auto_20201001_2154.py b/users/migrations/0015_auto_20201001_2154.py new file mode 100644 index 0000000..8c37627 --- /dev/null +++ b/users/migrations/0015_auto_20201001_2154.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2020-10-01 21:54 + +from django.db import migrations, models +import django.utils.timezone + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0014_auto_20201001_2153'), + ] + + operations = [ + migrations.AlterField( + model_name='agencybills', + name='end', + field=models.DateField(blank=True, default=django.utils.timezone.now, null=True), + ), + migrations.AlterField( + model_name='agencybills', + name='start', + field=models.DateField(blank=True, default=django.utils.timezone.now, null=True), + ), + ] diff --git a/users/migrations/0016_auto_20201001_2154.py b/users/migrations/0016_auto_20201001_2154.py new file mode 100644 index 0000000..9f99fe6 --- /dev/null +++ b/users/migrations/0016_auto_20201001_2154.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0 on 2020-10-01 21:54 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0015_auto_20201001_2154'), + ] + + operations = [ + migrations.AlterField( + model_name='agencybills', + name='end', + field=models.DateField(blank=True, default=django.utils.timezone.now, null=True), + ), + migrations.AlterField( + model_name='agencybills', + name='start', + field=models.DateField(blank=True, default=django.utils.timezone.now, null=True), + ), + ] diff --git a/users/migrations/0017_auto_20201001_2155.py b/users/migrations/0017_auto_20201001_2155.py new file mode 100644 index 0000000..7a6f0c1 --- /dev/null +++ b/users/migrations/0017_auto_20201001_2155.py @@ -0,0 +1,24 @@ +# Generated by Django 3.0 on 2020-10-01 21:55 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0016_auto_20201001_2154'), + ] + + operations = [ + migrations.AlterField( + model_name='agencybills', + name='end', + field=models.DateField(default=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='agencybills', + name='start', + field=models.DateField(default=django.utils.timezone.now), + ), + ] diff --git a/users/migrations/0018_agencybills_plan.py b/users/migrations/0018_agencybills_plan.py new file mode 100644 index 0000000..b5dff69 --- /dev/null +++ b/users/migrations/0018_agencybills_plan.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-01 21:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0017_auto_20201001_2155'), + ] + + operations = [ + migrations.AddField( + model_name='agencybills', + name='plan', + field=models.CharField(default='', max_length=20), + ), + ] diff --git a/users/migrations/0019_auto_20201002_1616.py b/users/migrations/0019_auto_20201002_1616.py new file mode 100644 index 0000000..a982828 --- /dev/null +++ b/users/migrations/0019_auto_20201002_1616.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-02 16:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0018_agencybills_plan'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='paymentplan', + field=models.IntegerField(blank=True, default='0', null=True), + ), + ] diff --git a/users/migrations/0020_agencybills_usercount.py b/users/migrations/0020_agencybills_usercount.py new file mode 100644 index 0000000..3786896 --- /dev/null +++ b/users/migrations/0020_agencybills_usercount.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-02 16:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0019_auto_20201002_1616'), + ] + + operations = [ + migrations.AddField( + model_name='agencybills', + name='usercount', + field=models.IntegerField(default=0), + ), + ] diff --git a/users/migrations/0021_auto_20201002_2031.py b/users/migrations/0021_auto_20201002_2031.py new file mode 100644 index 0000000..63cad7c --- /dev/null +++ b/users/migrations/0021_auto_20201002_2031.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-02 20:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0020_agencybills_usercount'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='paymentplan', + field=models.IntegerField(blank=True, default=0, null=True), + ), + ] diff --git a/users/migrations/0022_agency_module_recoverdir.py b/users/migrations/0022_agency_module_recoverdir.py new file mode 100644 index 0000000..28f36ce --- /dev/null +++ b/users/migrations/0022_agency_module_recoverdir.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-02 20:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0021_auto_20201002_2031'), + ] + + operations = [ + migrations.AddField( + model_name='agency', + name='module_recoverdir', + field=models.BooleanField(default=False), + ), + ] diff --git a/users/migrations/0023_auto_20201002_2036.py b/users/migrations/0023_auto_20201002_2036.py new file mode 100644 index 0000000..6f2b955 --- /dev/null +++ b/users/migrations/0023_auto_20201002_2036.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0 on 2020-10-02 20:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0022_agency_module_recoverdir'), + ] + + operations = [ + migrations.AlterModelOptions( + name='agencygroup', + options={'permissions': [('agencyinfo', 'Agenturinformationen verändern'), ('agencynetwork', 'Agenturverbund bearbeiten'), ('usermanager', 'Mitarbeiter bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'), ('structuremanager', 'Struktur bearbeiten'), ('standardmanager', 'Standards bearbeiten und freischalten'), ('modulenews', 'News bearbeiten und veröffentlichen'), ('modulesconfig', 'Module verwalten'), ('moduleorganizer', 'Organizer bearbeiten'), ('filesmanager', 'Dateien bearbeiten'), ('filedirmanager', 'Ordner bearbeiten'), ('filesviewer', 'Dateien lesen'), ('absencemanager', 'Abwesenheiten verwalten'), ('recoverdirmanager', 'Notfallhilfe verwalten')]}, + ), + ] diff --git a/users/migrations/0024_profile_rd_login.py b/users/migrations/0024_profile_rd_login.py new file mode 100644 index 0000000..cd05f74 --- /dev/null +++ b/users/migrations/0024_profile_rd_login.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-07 08:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0023_auto_20201002_2036'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='rd_login', + field=models.DateTimeField(blank=True, default=None, null=True), + ), + ] diff --git a/users/migrations/0025_auto_20201012_1416.py b/users/migrations/0025_auto_20201012_1416.py new file mode 100644 index 0000000..dd3f444 --- /dev/null +++ b/users/migrations/0025_auto_20201012_1416.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-12 14:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0024_profile_rd_login'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='module_chat', + field=models.BooleanField(default=False), + ), + ] diff --git a/users/migrations/0026_regnotfallhilfe.py b/users/migrations/0026_regnotfallhilfe.py new file mode 100644 index 0000000..b468eac --- /dev/null +++ b/users/migrations/0026_regnotfallhilfe.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0 on 2020-10-23 09:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0025_auto_20201012_1416'), + ] + + operations = [ + migrations.CreateModel( + name='RegNotfallhilfe', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('mail', models.CharField(blank=True, max_length=500)), + ('name', models.CharField(blank=True, max_length=500)), + ('persnumber', models.CharField(blank=True, max_length=500)), + ('mitgliedsnummer', models.CharField(blank=True, max_length=500)), + ('plz', models.CharField(blank=True, max_length=500)), + ('stadt', models.CharField(blank=True, max_length=500)), + ('street', models.CharField(blank=True, max_length=500)), + ('data_to_vh', models.BooleanField(default=True)), + ], + ), + ] diff --git a/users/migrations/0027_regnotfallhilfe_rabatt.py b/users/migrations/0027_regnotfallhilfe_rabatt.py new file mode 100644 index 0000000..9057115 --- /dev/null +++ b/users/migrations/0027_regnotfallhilfe_rabatt.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-23 10:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0026_regnotfallhilfe'), + ] + + operations = [ + migrations.AddField( + model_name='regnotfallhilfe', + name='rabatt', + field=models.BooleanField(default=False), + ), + ] diff --git a/users/migrations/0028_regnotfallhilfe_wassend.py b/users/migrations/0028_regnotfallhilfe_wassend.py new file mode 100644 index 0000000..187fc2e --- /dev/null +++ b/users/migrations/0028_regnotfallhilfe_wassend.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-10-23 10:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0027_regnotfallhilfe_rabatt'), + ] + + operations = [ + migrations.AddField( + model_name='regnotfallhilfe', + name='wassend', + field=models.BooleanField(default=False), + ), + ] diff --git a/users/migrations/0029_regnotfallhilfe_orderdate.py b/users/migrations/0029_regnotfallhilfe_orderdate.py new file mode 100644 index 0000000..21b4a41 --- /dev/null +++ b/users/migrations/0029_regnotfallhilfe_orderdate.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0 on 2020-10-23 10:34 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0028_regnotfallhilfe_wassend'), + ] + + operations = [ + migrations.AddField( + model_name='regnotfallhilfe', + name='orderdate', + field=models.DateField(default=django.utils.timezone.now, null=True), + ), + ] diff --git a/users/migrations/0030_auto_20201109_2007.py b/users/migrations/0030_auto_20201109_2007.py new file mode 100644 index 0000000..0dc7127 --- /dev/null +++ b/users/migrations/0030_auto_20201109_2007.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-11-09 20:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0029_regnotfallhilfe_orderdate'), + ] + + operations = [ + migrations.AlterField( + model_name='agency', + name='module_timemanagement', + field=models.BooleanField(default=True), + ), + ] diff --git a/users/migrations/0031_auto_20201204_0927.py b/users/migrations/0031_auto_20201204_0927.py new file mode 100644 index 0000000..555918e --- /dev/null +++ b/users/migrations/0031_auto_20201204_0927.py @@ -0,0 +1,51 @@ +# Generated by Django 3.0 on 2020-12-04 09:27 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0030_auto_20201109_2007'), + ] + + operations = [ + migrations.AlterField( + model_name='agencybills', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='agencygroup', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='agencyjob', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='agencynetwork', + name='creator', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='agencynetwork', + name='creator_agency', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.Agency'), + ), + migrations.AlterField( + model_name='profile', + name='agency', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + migrations.AlterField( + model_name='useryearabsenceinfo', + name='agency', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/users/migrations/0032_usertime_startcount.py b/users/migrations/0032_usertime_startcount.py new file mode 100644 index 0000000..4a5f5e2 --- /dev/null +++ b/users/migrations/0032_usertime_startcount.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2020-12-16 18:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0031_auto_20201204_0927'), + ] + + operations = [ + migrations.AddField( + model_name='usertime', + name='startcount', + field=models.FloatField(default=0.0), + ), + ] diff --git a/users/migrations/0033_auto_20210107_0912.py b/users/migrations/0033_auto_20210107_0912.py new file mode 100644 index 0000000..1d97676 --- /dev/null +++ b/users/migrations/0033_auto_20210107_0912.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2021-01-07 09:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0032_usertime_startcount'), + ] + + operations = [ + migrations.AddField( + model_name='agency', + name='agencycalurl', + field=models.CharField(blank=True, default='', max_length=1000), + ), + migrations.AddField( + model_name='agency', + name='agencycalurl_all', + field=models.CharField(blank=True, default='', max_length=1000), + ), + ] diff --git a/users/migrations/0034_agency_agencycal_publicstatus.py b/users/migrations/0034_agency_agencycal_publicstatus.py new file mode 100644 index 0000000..022770e --- /dev/null +++ b/users/migrations/0034_agency_agencycal_publicstatus.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0 on 2021-01-07 09:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0033_auto_20210107_0912'), + ] + + operations = [ + migrations.AddField( + model_name='agency', + name='agencycal_publicstatus', + field=models.IntegerField(default=0), + ), + ] diff --git a/users/migrations/0035_historicaluserfullname_historicaluserhistory_userhistory.py b/users/migrations/0035_historicaluserfullname_historicaluserhistory_userhistory.py new file mode 100644 index 0000000..14cc2a3 --- /dev/null +++ b/users/migrations/0035_historicaluserfullname_historicaluserhistory_userhistory.py @@ -0,0 +1,89 @@ +# Generated by Django 3.0 on 2021-01-08 08:22 + +from django.conf import settings +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import simple_history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0012_auto_20201213_1301'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0034_agency_agencycal_publicstatus'), + ] + + operations = [ + migrations.CreateModel( + name='UserHistory', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + 'constraints': [], + }, + bases=('auth.user',), + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name='HistoricalUserHistory', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(db_index=True, error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(max_length=30, verbose_name='first name')), + ('last_name', models.CharField(max_length=150, verbose_name='last name')), + ('email', models.EmailField(db_index=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical user history', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='HistoricalUserFullName', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(db_index=True, error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(max_length=30, verbose_name='first name')), + ('last_name', models.CharField(max_length=150, verbose_name='last name')), + ('email', models.EmailField(db_index=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'historical user full name', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + ] diff --git a/users/migrations/0036_auto_20210108_0828.py b/users/migrations/0036_auto_20210108_0828.py new file mode 100644 index 0000000..6fd9e6f --- /dev/null +++ b/users/migrations/0036_auto_20210108_0828.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2021-01-08 08:28 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0035_historicaluserfullname_historicaluserhistory_userhistory'), + ] + + operations = [ + migrations.RemoveField( + model_name='historicaluserhistory', + name='history_user', + ), + migrations.DeleteModel( + name='UserHistory', + ), + migrations.DeleteModel( + name='HistoricalUserHistory', + ), + ] diff --git a/users/migrations/0037_auto_20210118_0705.py b/users/migrations/0037_auto_20210118_0705.py new file mode 100644 index 0000000..16e6024 --- /dev/null +++ b/users/migrations/0037_auto_20210118_0705.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0 on 2021-01-18 07:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0036_auto_20210108_0828'), + ] + + operations = [ + migrations.AlterField( + model_name='usertime', + name='loose_holidedate', + field=models.CharField(default='31.03.', max_length=6), + ), + migrations.AlterField( + model_name='useryearabsenceinfo', + name='days', + field=models.FloatField(default=0.0), + ), + ] diff --git a/users/migrations/0038_auto_20210219_1110.py b/users/migrations/0038_auto_20210219_1110.py new file mode 100644 index 0000000..c69f7c1 --- /dev/null +++ b/users/migrations/0038_auto_20210219_1110.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0 on 2021-02-19 11:10 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0037_auto_20210118_0705'), + ] + + operations = [ + migrations.AlterModelOptions( + name='agencygroup', + options={'permissions': [('agencyinfo', 'Agenturinformationen verändern'), ('agencynetwork', 'Agenturverbund bearbeiten'), ('usermanager', 'Mitarbeiter bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'), ('structuremanager', 'Struktur bearbeiten'), ('standardmanager', 'Standards bearbeiten'), ('standardgopublic', 'Standards freischalten'), ('modulenews', 'News bearbeiten und veröffentlichen'), ('modulesconfig', 'Module verwalten'), ('moduleorganizer', 'Organizer bearbeiten'), ('filesmanager', 'Dateien bearbeiten'), ('filedirmanager', 'Ordner bearbeiten'), ('filesviewer', 'Dateien lesen'), ('absencemanager', 'Abwesenheiten verwalten'), ('recoverdirmanager', 'Notfallhilfe verwalten')]}, + ), + ] diff --git a/users/migrations/0039_auto_20210219_1130.py b/users/migrations/0039_auto_20210219_1130.py new file mode 100644 index 0000000..5b66066 --- /dev/null +++ b/users/migrations/0039_auto_20210219_1130.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0 on 2021-02-19 11:30 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0038_auto_20210219_1110'), + ] + + operations = [ + migrations.AlterModelOptions( + name='agencygroup', + options={'permissions': [('agencyinfo', 'Agenturinformationen verändern'), ('agencynetwork', 'Agenturverbund bearbeiten'), ('usermanager', 'Mitarbeiter bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'), ('structuremanager', 'Struktur bearbeiten'), ('standardmanager', 'Standards bearbeiten'), ('standardgopublic', 'Standards freischalten'), ('modulenews', 'News bearbeiten und veröffentlichen'), ('modulesconfig', 'Module verwalten'), ('moduleorganizer', 'Organizer bearbeiten'), ('filesmanager', 'Dateien bearbeiten'), ('filedirmanager', 'Ordner bearbeiten'), ('filesviewer', 'Dateien lesen'), ('absencemanager', 'Abwesenheiten verwalten'), ('timemanager', 'Zeiterfassung verwalten'), ('recoverdirmanager', 'Notfallhilfe verwalten')]}, + ), + ] diff --git a/users/migrations/0040_auto_20210329_2126.py b/users/migrations/0040_auto_20210329_2126.py new file mode 100644 index 0000000..f58381c --- /dev/null +++ b/users/migrations/0040_auto_20210329_2126.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0 on 2021-03-29 21:26 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0039_auto_20210219_1130'), + ] + + operations = [ + migrations.AlterField( + model_name='agencynetworkpreperation', + name='wanted_agency', + field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='users.Agency'), + ), + ] diff --git a/users/migrations/__init__.py b/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/migrations/__pycache__/0001_initial.cpython-38.pyc b/users/migrations/__pycache__/0001_initial.cpython-38.pyc new file mode 100644 index 0000000..353fc75 Binary files /dev/null and b/users/migrations/__pycache__/0001_initial.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0002_auto_20200925_0829.cpython-38.pyc b/users/migrations/__pycache__/0002_auto_20200925_0829.cpython-38.pyc new file mode 100644 index 0000000..316709f Binary files /dev/null and b/users/migrations/__pycache__/0002_auto_20200925_0829.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0003_auto_20200925_0830.cpython-38.pyc b/users/migrations/__pycache__/0003_auto_20200925_0830.cpython-38.pyc new file mode 100644 index 0000000..6e10747 Binary files /dev/null and b/users/migrations/__pycache__/0003_auto_20200925_0830.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0004_agency_payment_address.cpython-38.pyc b/users/migrations/__pycache__/0004_agency_payment_address.cpython-38.pyc new file mode 100644 index 0000000..78667e5 Binary files /dev/null and b/users/migrations/__pycache__/0004_agency_payment_address.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0005_auto_20200925_1048.cpython-38.pyc b/users/migrations/__pycache__/0005_auto_20200925_1048.cpython-38.pyc new file mode 100644 index 0000000..f00cada Binary files /dev/null and b/users/migrations/__pycache__/0005_auto_20200925_1048.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0006_agency_firstbillid.cpython-38.pyc b/users/migrations/__pycache__/0006_agency_firstbillid.cpython-38.pyc new file mode 100644 index 0000000..3a852dc Binary files /dev/null and b/users/migrations/__pycache__/0006_agency_firstbillid.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0007_agencybills.cpython-38.pyc b/users/migrations/__pycache__/0007_agencybills.cpython-38.pyc new file mode 100644 index 0000000..256bd5d Binary files /dev/null and b/users/migrations/__pycache__/0007_agencybills.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0008_remove_agency_firstbillid.cpython-38.pyc b/users/migrations/__pycache__/0008_remove_agency_firstbillid.cpython-38.pyc new file mode 100644 index 0000000..9f8649e Binary files /dev/null and b/users/migrations/__pycache__/0008_remove_agency_firstbillid.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0009_auto_20201001_1052.cpython-38.pyc b/users/migrations/__pycache__/0009_auto_20201001_1052.cpython-38.pyc new file mode 100644 index 0000000..0e7cd9a Binary files /dev/null and b/users/migrations/__pycache__/0009_auto_20201001_1052.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0010_agencybills_billnumber.cpython-38.pyc b/users/migrations/__pycache__/0010_agencybills_billnumber.cpython-38.pyc new file mode 100644 index 0000000..c7109ea Binary files /dev/null and b/users/migrations/__pycache__/0010_agencybills_billnumber.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0011_agencybills_docfileid.cpython-38.pyc b/users/migrations/__pycache__/0011_agencybills_docfileid.cpython-38.pyc new file mode 100644 index 0000000..eebaed4 Binary files /dev/null and b/users/migrations/__pycache__/0011_agencybills_docfileid.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0012_remove_agencybills_docfileid.cpython-38.pyc b/users/migrations/__pycache__/0012_remove_agencybills_docfileid.cpython-38.pyc new file mode 100644 index 0000000..75237c7 Binary files /dev/null and b/users/migrations/__pycache__/0012_remove_agencybills_docfileid.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0013_agencybills_billstatus.cpython-38.pyc b/users/migrations/__pycache__/0013_agencybills_billstatus.cpython-38.pyc new file mode 100644 index 0000000..8b15645 Binary files /dev/null and b/users/migrations/__pycache__/0013_agencybills_billstatus.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0014_auto_20201001_2153.cpython-38.pyc b/users/migrations/__pycache__/0014_auto_20201001_2153.cpython-38.pyc new file mode 100644 index 0000000..c738c16 Binary files /dev/null and b/users/migrations/__pycache__/0014_auto_20201001_2153.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0015_auto_20201001_2154.cpython-38.pyc b/users/migrations/__pycache__/0015_auto_20201001_2154.cpython-38.pyc new file mode 100644 index 0000000..ed94249 Binary files /dev/null and b/users/migrations/__pycache__/0015_auto_20201001_2154.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0016_auto_20201001_2154.cpython-38.pyc b/users/migrations/__pycache__/0016_auto_20201001_2154.cpython-38.pyc new file mode 100644 index 0000000..79f0b5f Binary files /dev/null and b/users/migrations/__pycache__/0016_auto_20201001_2154.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0017_auto_20201001_2155.cpython-38.pyc b/users/migrations/__pycache__/0017_auto_20201001_2155.cpython-38.pyc new file mode 100644 index 0000000..18c6fbc Binary files /dev/null and b/users/migrations/__pycache__/0017_auto_20201001_2155.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0018_agencybills_plan.cpython-38.pyc b/users/migrations/__pycache__/0018_agencybills_plan.cpython-38.pyc new file mode 100644 index 0000000..ec74fd0 Binary files /dev/null and b/users/migrations/__pycache__/0018_agencybills_plan.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0019_auto_20201002_1616.cpython-38.pyc b/users/migrations/__pycache__/0019_auto_20201002_1616.cpython-38.pyc new file mode 100644 index 0000000..3e6eafd Binary files /dev/null and b/users/migrations/__pycache__/0019_auto_20201002_1616.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0020_agencybills_usercount.cpython-38.pyc b/users/migrations/__pycache__/0020_agencybills_usercount.cpython-38.pyc new file mode 100644 index 0000000..924b571 Binary files /dev/null and b/users/migrations/__pycache__/0020_agencybills_usercount.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0021_auto_20201002_2031.cpython-38.pyc b/users/migrations/__pycache__/0021_auto_20201002_2031.cpython-38.pyc new file mode 100644 index 0000000..8756f30 Binary files /dev/null and b/users/migrations/__pycache__/0021_auto_20201002_2031.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0022_agency_module_recoverdir.cpython-38.pyc b/users/migrations/__pycache__/0022_agency_module_recoverdir.cpython-38.pyc new file mode 100644 index 0000000..98d17ea Binary files /dev/null and b/users/migrations/__pycache__/0022_agency_module_recoverdir.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0023_auto_20201002_2036.cpython-38.pyc b/users/migrations/__pycache__/0023_auto_20201002_2036.cpython-38.pyc new file mode 100644 index 0000000..dde6b97 Binary files /dev/null and b/users/migrations/__pycache__/0023_auto_20201002_2036.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0024_profile_rd_login.cpython-38.pyc b/users/migrations/__pycache__/0024_profile_rd_login.cpython-38.pyc new file mode 100644 index 0000000..35076ad Binary files /dev/null and b/users/migrations/__pycache__/0024_profile_rd_login.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0025_auto_20201012_1416.cpython-38.pyc b/users/migrations/__pycache__/0025_auto_20201012_1416.cpython-38.pyc new file mode 100644 index 0000000..fbe9355 Binary files /dev/null and b/users/migrations/__pycache__/0025_auto_20201012_1416.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0026_regnotfallhilfe.cpython-38.pyc b/users/migrations/__pycache__/0026_regnotfallhilfe.cpython-38.pyc new file mode 100644 index 0000000..9d78bb2 Binary files /dev/null and b/users/migrations/__pycache__/0026_regnotfallhilfe.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0027_regnotfallhilfe_rabatt.cpython-38.pyc b/users/migrations/__pycache__/0027_regnotfallhilfe_rabatt.cpython-38.pyc new file mode 100644 index 0000000..d3dee7b Binary files /dev/null and b/users/migrations/__pycache__/0027_regnotfallhilfe_rabatt.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0028_regnotfallhilfe_wassend.cpython-38.pyc b/users/migrations/__pycache__/0028_regnotfallhilfe_wassend.cpython-38.pyc new file mode 100644 index 0000000..971224e Binary files /dev/null and b/users/migrations/__pycache__/0028_regnotfallhilfe_wassend.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0029_regnotfallhilfe_orderdate.cpython-38.pyc b/users/migrations/__pycache__/0029_regnotfallhilfe_orderdate.cpython-38.pyc new file mode 100644 index 0000000..9b4d93c Binary files /dev/null and b/users/migrations/__pycache__/0029_regnotfallhilfe_orderdate.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0030_auto_20201109_2007.cpython-38.pyc b/users/migrations/__pycache__/0030_auto_20201109_2007.cpython-38.pyc new file mode 100644 index 0000000..5ab0cc1 Binary files /dev/null and b/users/migrations/__pycache__/0030_auto_20201109_2007.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0031_auto_20201204_0927.cpython-38.pyc b/users/migrations/__pycache__/0031_auto_20201204_0927.cpython-38.pyc new file mode 100644 index 0000000..29b8c76 Binary files /dev/null and b/users/migrations/__pycache__/0031_auto_20201204_0927.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0032_usertime_startcount.cpython-38.pyc b/users/migrations/__pycache__/0032_usertime_startcount.cpython-38.pyc new file mode 100644 index 0000000..30a8004 Binary files /dev/null and b/users/migrations/__pycache__/0032_usertime_startcount.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0033_auto_20210107_0912.cpython-38.pyc b/users/migrations/__pycache__/0033_auto_20210107_0912.cpython-38.pyc new file mode 100644 index 0000000..a65e641 Binary files /dev/null and b/users/migrations/__pycache__/0033_auto_20210107_0912.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0034_agency_agencycal_publicstatus.cpython-38.pyc b/users/migrations/__pycache__/0034_agency_agencycal_publicstatus.cpython-38.pyc new file mode 100644 index 0000000..a333605 Binary files /dev/null and b/users/migrations/__pycache__/0034_agency_agencycal_publicstatus.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0035_historicaluserfullname_historicaluserhistory_userhistory.cpython-38.pyc b/users/migrations/__pycache__/0035_historicaluserfullname_historicaluserhistory_userhistory.cpython-38.pyc new file mode 100644 index 0000000..c53cdb0 Binary files /dev/null and b/users/migrations/__pycache__/0035_historicaluserfullname_historicaluserhistory_userhistory.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0036_auto_20210108_0828.cpython-38.pyc b/users/migrations/__pycache__/0036_auto_20210108_0828.cpython-38.pyc new file mode 100644 index 0000000..cd144c5 Binary files /dev/null and b/users/migrations/__pycache__/0036_auto_20210108_0828.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0037_auto_20210118_0705.cpython-38.pyc b/users/migrations/__pycache__/0037_auto_20210118_0705.cpython-38.pyc new file mode 100644 index 0000000..9fa1e90 Binary files /dev/null and b/users/migrations/__pycache__/0037_auto_20210118_0705.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0038_auto_20210219_1110.cpython-38.pyc b/users/migrations/__pycache__/0038_auto_20210219_1110.cpython-38.pyc new file mode 100644 index 0000000..4d04531 Binary files /dev/null and b/users/migrations/__pycache__/0038_auto_20210219_1110.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0039_auto_20210219_1130.cpython-38.pyc b/users/migrations/__pycache__/0039_auto_20210219_1130.cpython-38.pyc new file mode 100644 index 0000000..0560eba Binary files /dev/null and b/users/migrations/__pycache__/0039_auto_20210219_1130.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/0040_auto_20210329_2126.cpython-38.pyc b/users/migrations/__pycache__/0040_auto_20210329_2126.cpython-38.pyc new file mode 100644 index 0000000..daca967 Binary files /dev/null and b/users/migrations/__pycache__/0040_auto_20210329_2126.cpython-38.pyc differ diff --git a/users/migrations/__pycache__/__init__.cpython-38.pyc b/users/migrations/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..048e7c3 Binary files /dev/null and b/users/migrations/__pycache__/__init__.cpython-38.pyc differ diff --git a/users/models.py b/users/models.py new file mode 100644 index 0000000..3db38a3 --- /dev/null +++ b/users/models.py @@ -0,0 +1,542 @@ +from django.db import models +from django.contrib.auth.models import User +from django.conf import settings +from PIL import Image +from django.utils import timezone +# MAKE EMAIL UNIQUE +from django.contrib.auth.models import User, Group, Permission +from django.contrib.contenttypes.models import ContentType +import datetime +from simple_history.models import HistoricalRecords +# UNIQUE and NO BLANK fields while user-registration +User._meta.get_field('email')._unique = True +User._meta.get_field('email').blank = False +User._meta.get_field('first_name').blank = False +User._meta.get_field('last_name').blank = False + +# PATH FOR AGENCYPIC +def picturepath_agency(instance, filename): + # file will be uploaded to MEDIA_URL/agency_// + return 'agencydata/agency_{0}/agencystats/{1}'.format(instance.pk, filename) + +# PATH FOR PROFILEPICS +def picturepath_user(instance, filename): + return 'agencydata/agency_{0}/agencystats/profilepics/{1}'.format(instance.agency.pk, filename) + +''' +Class AgencyNetworkPreperation + +Regelt den Join-Prozess einer Agentur in einen Verbund, um Anfrage und Status der Anfrage zu prüfen. +Kommt nur zum tragen, wenn ein AgenturVerbund auf publicjoin=False ist! + + +''' +class AgencyNetworkPreperation(models.Model): + target_network = models.ForeignKey("AgencyNetwork", on_delete=models.CASCADE) + wanted_agency = models.ForeignKey("Agency", on_delete=models.CASCADE, blank=True) + status = models.IntegerField() + +''' +Class AgencyNetwork + +Bildet einen Agenturverbund ab + + +''' + +class AgencyNetwork(models.Model): + name = models.CharField(default="", max_length=200) + adminagencys = models.ManyToManyField("Agency", related_name="AdministrationAgencys") + creator = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True) + creator_agency = models.ForeignKey("Agency", on_delete=models.SET_NULL, blank=True, null=True) + created_on = models.DateTimeField(default=timezone.now) + lastactivity = models.DateTimeField(default=timezone.now) + members = models.ManyToManyField("Agency", related_name="MemberAgencys", blank=True) + sharemembers = models.ManyToManyField("Agency", related_name="ShareMemberAgencys", blank=True) + publicjoin = models.BooleanField(default=False) + networkid = models.CharField(default="", max_length=30) + standards = models.ManyToManyField("standards.Standards", related_name="sharedstandards", blank=True) + + + def __str__(self): + return f'{self.name}' + + +''' +Class Agency + +Speichert alle Infos für die Agency, darunter später auch die Aufgaben und Bereiche +Bezug normale User: Erhalten bei Erstellung durch den Administrator automatisch die aktuelle agency: + request.user.profile.agency + --> Dahinter ist das Agency-Objekt! + +''' + +class Agency(models.Model): + name = models.CharField(default="", max_length=200) + inhaber = models.CharField(default="", max_length=200, blank=True) + street = models.CharField(default="", max_length=200, blank=True) + city = models.CharField(default="", max_length=200, blank=True) + plz = models.CharField(default="", max_length=5, blank=True) + agency_email = models.EmailField(default="", blank=True) + phone = models.CharField(default="", max_length=50, blank=True) + agencypic = models.ImageField(default='ag_default.jpg', upload_to=picturepath_agency, blank=True) + + agencycalurl = models.CharField(default="", blank=True, max_length=1000) + agencycalurl_all = models.CharField(default="", blank=True, max_length=1000) + # Gibt an, welche Schnittstellen für Kalenderlinks offen sind + # 0 = Nur Kalenderdaten per Authenzifizierung + # 1 = Kalenderdaten per Authentifizierung UND OHNE (für Google-Kalender) + agencycal_publicstatus = models.IntegerField(default=0) + # MONEY + #balance = models.FloatField(default=0.0, max_length=9, blank=True) + #nextdebiting = models.DateTimeField(default=timezone.now, blank=True) + #monthlyprice = models.FloatField(default=25.0, max_length=9, blank=True) + + + # Payment-Status + # 0 = Normal, Agentur muss ganz normal bezahlen + # 1 = Agentur ist kostenlos dabei! + paymentstatus = models.IntegerField(default=0, null=True) + + # ID für die Verbindung mit Lexoffice + lexofficeid = models.CharField(default="", max_length=200, blank=True) + + # Bezahlplan 1,3,6,12 Monate + #0 = Kein Bezahkplan ausgewählt + paymentplan = models.IntegerField(default=0, null=True, blank=True) + + # Registrierdatum der Agentur + registerdate = models.DateField(default=timezone.now, null=True) + payment_address = models.EmailField(default=None, blank=True, null=True) + # + agb = models.BooleanField(default=False) + contract = models.BooleanField(default=False) + + + # MODULEEINSTELLUNGEN FÜR DIE AGENTUR + module_news = models.BooleanField(default=True) + module_organizer = models.BooleanField(default=True) + module_files = models.BooleanField(default=True) + + module_organigramm = models.BooleanField(default=True) + # Steckbrief dynamisch aus Standard + dynamicprofile = models.BooleanField(default=True) + + module_messages = models.BooleanField(default=True) + + # TASK: Modul Chat standardmäßig deaktiviert + module_chat = models.BooleanField(default=False) + + # KOSTENPFLICHTIGE MODULE + + # Abwesenheits- und Zeiterfassung + # Modul aktiv/deaktiviert + module_timemanagement = models.BooleanField(default=True) + module_timemanagement_price = models.FloatField(default=10.0, max_length=9, blank=True) + # Zeiterfassung Ja/Nein + #module_timemanagement_ze = models.BooleanField(default=False) + + vve = models.CharField(default="", max_length=200, blank=True) + + + + # RECOVERDIR + module_recoverdir = models.BooleanField(default=False) + + def __str__(self): + return f'{self.name}' + + # Hier wird definiert, welche Parameter in der URL übertragen werden inkl. Bezeichner + #def get_absolute_url(self): + # return reverse('agency-update', kwargs={'pk':self.pk}) + + @property + def get_photo_url(self): + if self.agencypic and hasattr(self.agencypic, 'url'): + return self.agencypic.url + else: + return settings.MEDIA_URL + "ag_default.jpg" + +# Speichern der Rechnungs-ID von LexOffice +class AgencyBills(models.Model): + lexid = models.CharField(max_length=200, default="", null=True, blank=True) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + billtype = models.CharField(default="", max_length=200) + billdate = models.DateField(default=timezone.now) + billnumber = models.CharField(default="", max_length=200) + billstatus = models.CharField(default="", max_length=200, null=True, blank=True) + start = models.DateField(default=timezone.now) + end = models.DateField(default=timezone.now) + plan = models.CharField(default="", max_length=20) + usercount = models.IntegerField(default=0) + + def __str__(self): + return f'{self.lexid}' + + +''' + +Class AgencyJob + +''' +class AgencyJob(models.Model): + name = models.CharField(default="", max_length=80) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + def __str__(self): + return f'{self.name}' + +''' +Class Profile + +Klasse für die Zusatzinfos eines Nutzers. +- Vorname +- Nachname +- Email +- Bild +- Telefonnummer + - Fest + - Mobil +- Funktion +- Auswahlfelder + - Außendienst/Innendienst/Azubi + - Rollen + - Bereiche + - Aufgaben + +''' +class Profile(models.Model): + + # Wenn der User gelöscht wird, wird auch das Profil gelöscht + user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, default=None) + parent = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True, related_name='parent_user') + phoneland = models.CharField(max_length=60, blank=True) + phonemobile = models.CharField(max_length=60, blank=True) + phone_public = models.BooleanField(default=False) + + # Wenn die Funktion gelöscht wird, wird die FUNC auf NULL gesetzt + func = models.ForeignKey("AgencyJob", blank=True, null=True, default=None, on_delete=models.SET_NULL) + # Wenn dieses Profil gelöscht wird, wird NICHT die Agency geslöscht + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + image = models.ImageField(default='default.jpg', upload_to=picturepath_user, blank=True) + compfunc = models.CharField(max_length=60, blank=True) + visible = models.BooleanField(default=True) + persnumber = models.CharField(default="", max_length=50, blank=True) + + # TOOLTIPPS + showtooltips = models.BooleanField(default=True) + + # NOTIFICATIONS + #NEWS + # Mitteilung bei neuen News innerhalb der Agentur + news_mail = models.BooleanField(default=True) + news_push = models.BooleanField(default=True) + + #STANDARDS + # Benutzerstandard wurde veröffentlicht + user_standard_public_mail = models.BooleanField(default=False) + user_standard_public_push = models.BooleanField(default=True) + + #STANDARDS + # Neue Standards + agency_new_standard_mail = models.BooleanField(default=False) + agency_new_standard_push = models.BooleanField(default=True) + + # GROUPS + # Neuer Gruppe zugeordnet + add_new_group_mail = models.BooleanField(default=False) + add_new_group_push = models.BooleanField(default=True) + + # TASKS + # Einer neuen Tätigkeit zugewiesen + add_task_mail = models.BooleanField(default=False) + add_task_push = models.BooleanField(default=True) + + # MESSAGES + # Mitteilungen + user_messages_mail = models.BooleanField(default=True) + user_messages_push = models.BooleanField(default=True) + + # ONLINESTATUS + ''' + + 0 = ONLINE - green + 1 = BESCHAFTIGT - red + 2 = ABWESEND - orange + 3 = OFFLINE - grey + + ''' + onlinestatus = models.IntegerField(default=0) + + # RECOVER DIR LAST LOGIN FIELD - AFTER LOGIN SET TO NONE + rd_login = models.DateTimeField(null=True, blank=True, default=None) + + def __str__(self): + if(self.user != None): + return f'{self.user.last_name}' + else: + return f'Nicht vergeben' + + # Hier Path für Templates des Models mit Parametern + def get_absolute_url(self): + return reverse('users-update', kwargs={'pk':self.pk}) + + # Erst Oberklasse speichern, dann Bild verkleinern + ''' + def save(self, **kwargs): + super().save() + if self.image: + img = Image.open(self.image.path) + + # Bildspeichergröße + if(img.height > 300 or img.width > 300): + output_size = (300,300) + img.thumbnail(output_size) + img.save(self.image.path) + baseheight = 560 + hpercent = (baseheight / float(img.size[1])) + wsize = int((float(img.size[0]) * float(hpercent))) + img = img.resize((wsize, baseheight), Image.ANTIALIAS) + img.save(self.image.path) + ''' + @property + def get_photo_url(self): + if self.image and hasattr(self.image, 'url'): + return self.image.url + else: + return settings.MEDIA_URL + "default.jpg" + + +class UserTime(models.Model): + + user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, default=None) + # TIME ELEMENTS + wd_mo = models.FloatField(default=0.0) + wd_tu = models.FloatField(default=0.0) + wd_we = models.FloatField(default=0.0) + wd_th = models.FloatField(default=0.0) + wd_fr = models.FloatField(default=0.0) + wd_sa = models.FloatField(default=0.0) + wd_so = models.FloatField(default=0.0) + loose_holidedate = models.CharField(default="31.03.", max_length=6) + startdate = models.DateField(default=None, blank=True, null=True) + startcount = models.FloatField(default=0.0) + usetime = models.BooleanField(default=False) + usetime_start = models.DateField(default=None, blank=True, null=True) +''' + + UserNotifications + + Beherbergt alle Benachrichtigungseinstellungen für die User. Ehemals direkt im + User-Model gepflegt, aber da es zu viele sind hierher umgezogen + +''' +class UserNotifications(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, default=None) + # NOTIFICATIONS + + # STANDARDS + standard_created_mail = models.BooleanField(default=False) + standard_created_push = models.BooleanField(default=True) + + standard_update_mail = models.BooleanField(default=False) + standard_update_push = models.BooleanField(default=True) + + standard_delete_mail = models.BooleanField(default=False) + standard_delete_push = models.BooleanField(default=True) + # Wenn neue Standards erstellt wurden, erhalten alle User mit entsprechenden Recht eine Info, dass neue, unveröffentlichte Standards vorhanden sind + standard_created_unpub_mail = models.BooleanField(default=False) + standard_created_unpub_push = models.BooleanField(default=True) + + # NEWS + news_created_mail = models.BooleanField(default=True) + news_created_push = models.BooleanField(default=True) + + # FILES + filedir_created_mail = models.BooleanField(default=False) + filedir_created_push = models.BooleanField(default=True) + + filedir_update_mail = models.BooleanField(default=False) + filedir_update_push = models.BooleanField(default=True) + + filedir_delete_mail = models.BooleanField(default=False) + filedir_delete_push = models.BooleanField(default=True) + + # Quicklinks + ql_created_mail = models.BooleanField(default=False) + ql_created_push = models.BooleanField(default=True) + + ql_update_mail = models.BooleanField(default=False) + ql_update_push = models.BooleanField(default=True) + + ql_delete_mail = models.BooleanField(default=False) + ql_delete_push = models.BooleanField(default=True) + + # Contacts + contact_created_mail = models.BooleanField(default=False) + contact_created_push = models.BooleanField(default=True) + + contact_update_mail = models.BooleanField(default=False) + contact_update_push = models.BooleanField(default=True) + + contact_delete_mail = models.BooleanField(default=False) + contact_delete_push = models.BooleanField(default=True) + + # Password + password_created_mail = models.BooleanField(default=False) + password_created_push = models.BooleanField(default=True) + + password_update_mail = models.BooleanField(default=False) + password_update_push = models.BooleanField(default=True) + + password_delete_mail = models.BooleanField(default=False) + password_delete_push = models.BooleanField(default=True) + + # MESSAGES + message_received_mail = models.BooleanField(default=False) + message_received_push = models.BooleanField(default=True) + + # TASKS + task_activity_mail = models.BooleanField(default=False) + task_activity_push = models.BooleanField(default=True) + + # CHAT + # Diese Einstellung sorgt dafür, dass User eine Mail/Push erhalten, wenn neue Chatnachrichten vorhanden sind. + chat_received_mail = models.BooleanField(default=False) + chat_received_push = models.BooleanField(default=True) + + # Benachrichtigunge, wenn es Raumaktivitäten gab + chat_room_activity_mail = models.BooleanField(default=False) + chat_room_activity_push = models.BooleanField(default=True) + + # TIMEMANAGEMENT + # Wenn neue Abwesenheitsanfragen kommen, Rechte werden gecheckt und dann wird gesendet + absence_created_mail = models.BooleanField(default=True) + absence_created_push = models.BooleanField(default=True) + + # Info, ob ein Nutzer als Vertreter eingesetzt worden ist. + absence_user_is_rep_mail = models.BooleanField(default=True) + absence_user_is_rep_push = models.BooleanField(default=True) + + # Info, ob ein Nutzer als Vertreter eingesetzt worden ist REMINDER CronJob zwei Tage vorher + absence_user_is_rep_reminder_mail = models.BooleanField(default=True) + absence_user_is_rep_reminder_push = models.BooleanField(default=True) + + # Info an den User, wenn seine Zeitdaten verändert wurden + time_data_changed_mail = models.BooleanField(default=True) + time_data_changed_push = models.BooleanField(default=True) + + # GRUPPEN + group_activity_mail = models.BooleanField(default=False) + group_activity_push = models.BooleanField(default=True) + + group_rights_mail = models.BooleanField(default=False) + group_rights_push = models.BooleanField(default=True) + + # AGENCYNETWORK + # Neuer Standard im Verbund + agn_standard_created_mail = models.BooleanField(default=False) + agn_standard_created_push = models.BooleanField(default=True) + + # Neuer Agenturstandard wurde von anderer Agentur übernommen + agn_standard_copied_mail = models.BooleanField(default=False) + agn_standard_copied_push = models.BooleanField(default=True) + + # Neuer Kommentar zu einem Standard aus meinem Verbund + agn_standard_comment_mail = models.BooleanField(default=False) + agn_standard_comment_push = models.BooleanField(default=True) + + # Reaktion auf einen Kommentar von mir + agn_standard_comment_react_mail = models.BooleanField(default=False) + agn_standard_comment_react_push = models.BooleanField(default=True) + + # Änderungen eigener Mitgliedsanfragen in anderen Verbünden + agn_own_change_mail = models.BooleanField(default=False) + agn_own_change_push = models.BooleanField(default=True) + + # Änderungen anderer Mitgliedschaften (Beitrittsanfragen!) + agn_other_change_mail = models.BooleanField(default=False) + agn_other_change_push = models.BooleanField(default=True) + + + +class UserYearAbsenceInfo(models.Model): + agency = models.ForeignKey(Agency, on_delete=models.CASCADE, default=None) + user = models.ForeignKey(User, on_delete=models.CASCADE) + year = models.IntegerField() + days_inuse = models.FloatField(default=0.0) + days = models.FloatField(default=0.0) + restdays = models.FloatField(default=0.0) + + +''' + CLASS AgencyGroup + + Hier werden die Gruppen mit der Agency verbunden + +''' +class AgencyGroup(models.Model): + group = models.OneToOneField(Group, on_delete=models.CASCADE) + agency = models.ForeignKey(Agency, on_delete=models.CASCADE) + agencygroupname = models.CharField(max_length=60, blank=True) + savefordel = models.BooleanField(default=False) + is_admin = models.BooleanField(default=False) + + class Meta: + + permissions = [ + ('agencyinfo', 'Agenturinformationen verändern'), + ('agencynetwork', 'Agenturverbund bearbeiten'), + ('usermanager', 'Mitarbeiter bearbeiten'), + ('groupmanager', 'Gruppen bearbeiten'), + ('structuremanager', 'Struktur bearbeiten'), + ('standardmanager', 'Standards bearbeiten'), + ('standardgopublic', 'Standards freischalten'), + ('modulenews', 'News bearbeiten und veröffentlichen'), + ('modulesconfig', 'Module verwalten'), + ('moduleorganizer', 'Organizer bearbeiten'), + ('filesmanager', 'Dateien bearbeiten'), + ('filedirmanager', 'Ordner bearbeiten'), + ('filesviewer', 'Dateien lesen'), + ('absencemanager', 'Abwesenheiten verwalten'), + ('timemanager', 'Zeiterfassung verwalten'), + ('recoverdirmanager', 'Notfallhilfe verwalten') + ] + +class RegNotfallhilfe(models.Model): + + mail = models.CharField(max_length=500, blank=True) + name = models.CharField(max_length=500, blank=True) + persnumber = models.CharField(max_length=500, blank=True) + mitgliedsnummer = models.CharField(max_length=500, blank=True) + plz = models.CharField(max_length=500, blank=True) + stadt = models.CharField(max_length=500, blank=True) + street = models.CharField(max_length=500, blank=True) + data_to_vh = models.BooleanField(default=True) + rabatt = models.BooleanField(default=False) + wassend = models.BooleanField(default=False) + orderdate = models.DateField(default=timezone.now, null=True) + +# SUBCLASS +class UserFullName(User): + + history = HistoricalRecords() + + class Meta: + proxy = True + + def __unicode__(self): + return "placeholder" + + def __str__(self): + return f'{self.first_name + " " + self.last_name}' + +# Hier Audit-Logeinträge einbauen für die versch. Models +from django.utils.six import python_2_unicode_compatible +from auditlog.registry import auditlog + +auditlog.register(User) +auditlog.register(Agency) + + + diff --git a/users/priomodel.py b/users/priomodel.py new file mode 100644 index 0000000..90fa395 --- /dev/null +++ b/users/priomodel.py @@ -0,0 +1,17 @@ +from django.db import models +from django.contrib.auth.models import User, AbstractBaseUser +from django.conf import settings + +from tasks.models import Tasks + + +''' + +Model zum Speichern der Priorisierungen von Aufgaben eines Nutzers + +''' + +class Prio(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + task = models.ForeignKey(Tasks, on_delete=models.CASCADE) + prio = models.IntegerField(default=0) \ No newline at end of file diff --git a/users/routing.py b/users/routing.py new file mode 100644 index 0000000..d93fd31 --- /dev/null +++ b/users/routing.py @@ -0,0 +1,10 @@ +from django.urls import re_path + +from . import mainwebsocket + +websocket_urlpatterns = [ + re_path(r'ws/chat/(?P\w+)/(?P\w+)/$', mainwebsocket.UsersChat, name="ws-chat"), + re_path(r'ws/groupchat/(?P\w+)/$', mainwebsocket.GroupChat, name="ws-groupchat"), + re_path(r'ws/appchat/(?P\w+)/(?P\w+)/(?P\w+)/$', mainwebsocket.UsersChat, name="ws-appchat"), + re_path(r'ws/', mainwebsocket.UsersConsumer, name="ws-default"), +] \ No newline at end of file diff --git a/users/signals.py b/users/signals.py new file mode 100644 index 0000000..8570cca --- /dev/null +++ b/users/signals.py @@ -0,0 +1,955 @@ +from django.db.models.signals import post_save, pre_delete, m2m_changed, pre_save +from django.contrib.auth.models import User, Group +from django.dispatch import receiver +from .models import Profile, Agency, AgencyGroup, AgencyNetworkPreperation, UserYearAbsenceInfo, UserTime, UserNotifications +from news.models import News +from django.contrib.auth.models import Permission +from notificsys.models import UserNotification +from django.core.mail import send_mail +from django.template.loader import render_to_string +from tasks.models import Tasks +from cloud.models import DataFile, DataDir +import os +from django.conf import settings +from django.utils import timezone +from standards.models import Standards +from django.contrib.auth.signals import user_logged_in, user_logged_out +from timemanagement.models import Workday, Breaks, AbsenceReason, FreeDays, Absence +from datetime import date +import datetime, json +from django.utils import timezone +import requests, csv, os +from django.templatetags.static import static +from django.conf import settings +from datetime import date +import channels.layers +from asgiref.sync import async_to_sync +from django.contrib.auth.decorators import login_required +from datetime import timedelta +from django.core.signals import request_started +from channels_presence.models import Room +from channels_presence.models import Presence +from channels_presence.signals import presence_changed +from organizer.models import * +from chat.models import ChatMessage + +from digitaleagentur.utils import * + +def loadingFreeDays(plz, year): + # Getting land + file_path = os.path.join(settings.STATIC_ROOT, 'users/extra/plz_short.csv') + + land = False + + with open(file_path, 'rt') as csvfile: + filecsv = csv.reader(csvfile, delimiter=';') + for row in filecsv: + + if str(row[1] == str(plz)): + land = row[6] + break; + + if(land != False): + URL = "https://feiertage-api.de/api/" + PARAMS = {'jahr':year,'nur_land':land} + r = requests.get(url = URL, params = PARAMS) + return r.json() + else: + return False + +# CHECK SOMETHING WHEN USER LOGGED IN +@receiver(signal=user_logged_out, sender=User) +def checkForFreeDays(sender, user, request, **kwargs): + user.profile.onlinestatus = 3 + user.profile.rd_login = None + user.save() + +# CHECK SOMETHING WHEN USER LOGGED IN +@receiver(signal=user_logged_in, sender=User) +def checkDefaultAbsenceReasons(sender, user, request, **kwargs): + user.profile.onlinestatus = 0 + user.profile.rd_login = None + user.save() + ar = AbsenceReason.objects.filter(agency=user.profile.agency) + if(len(ar) == 0): + new_ar_holidays = AbsenceReason(agency=user.profile.agency, name="Urlaub", color="#0099BC", need_confirm=True, need_rep=True, is_holiday=True) + new_ar_holidays.save() + + new_ar_specialholidays = AbsenceReason(agency=user.profile.agency, name="Sonderurlaub", need_confirm=True, need_rep=True, is_holiday=False, color="#F39C12") + new_ar_specialholidays.save() + + new_ar_ill = AbsenceReason(agency=user.profile.agency, name="Krankheit", color="#E74C3C", need_confirm=False, need_rep=False, is_holiday=False) + new_ar_ill.save() + + + new_ar_school = AbsenceReason(agency=user.profile.agency, name="Berufsschule", color="#16A085", need_confirm=False, need_rep=False, is_holiday=False) + new_ar_school.save() + + new_ar_education = AbsenceReason(agency=user.profile.agency, name="Fortbildung", color="#2ECC71", need_confirm=True, need_rep=True, is_holiday=False) + new_ar_education.save() + + new_ar_time = AbsenceReason(agency=user.profile.agency, name="Gleitzeit", color="#9B59B6", need_confirm=True, need_rep=False, is_holiday=False, is_time=True) + new_ar_time.save() + + today = date.today() + + # FREEDAYS LADEN Zwei Jahre + if len(FreeDays.objects.filter(agency=user.profile.agency, year=today.year+2)) == 0: + tempdays = loadingFreeDays(user.profile.agency.plz, today.year+2) + if(tempdays != False): + for k in tempdays.keys(): + tempdate = tempdays[k]["datum"].split("-") + FreeDays(agency=user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year+2).save() + + # FREEDAYS LADEN DIese Jahr + if len(FreeDays.objects.filter(agency=user.profile.agency, year=today.year+1)) == 0: + tempdays = loadingFreeDays(user.profile.agency.plz, today.year+1) + if(tempdays != False): + for k in tempdays.keys(): + tempdate = tempdays[k]["datum"].split("-") + FreeDays(agency=user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year+1).save() + + # CHECK FOR YEARS + # FREEDAYS LADEN LETZTES JAHR + if len(FreeDays.objects.filter(agency=user.profile.agency, year=today.year-1)) == 0: + tempdays = loadingFreeDays(user.profile.agency.plz, today.year-1) + if(tempdays != False): + for k in tempdays.keys(): + tempdate = tempdays[k]["datum"].split("-") + FreeDays(agency=user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year-1).save() + + # FREEDAYS LADEN + if len(FreeDays.objects.filter(agency=user.profile.agency, year=today.year)) == 0: + tempdays = loadingFreeDays(user.profile.agency.plz, today.year) + if(tempdays != False): + for k in tempdays.keys(): + tempdate = tempdays[k]["datum"].split("-") + FreeDays(agency=user.profile.agency, name=k, day=datetime.datetime(int(tempdate[0]),int(tempdate[1]),int(tempdate[2])), year=date.today().year).save() + + + + # NO YEARS FOUND + if len(UserYearAbsenceInfo.objects.filter(agency=user.profile.agency)) == 0: + # CREATE DATA FOR EVERY USER + uina = User.objects.filter(profile__agency=user.profile.agency) + for u in uina: + UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year).save() + UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year+1).save() + UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year+2).save() + pass + # CREATE DATE FOR YEAR PLUS 2 + elif len(UserYearAbsenceInfo.objects.filter(agency=user.profile.agency, year=today.year+2)) == 0: + uina = User.objects.filter(profile__agency=user.profile.agency) + + for u in uina: + UserYearAbsenceInfo(agency=user.profile.agency, user=u, year=today.year+2).save() + + +''' + FUNKTION ZUM SENDEN VON MAILS AUS EINEM SIGNAL + +''' +def sendMailNoti(notificationtext, user_touched, linktarget=""): + + username = user_touched.first_name + " " + user_touched.last_name + msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext, 'linktarget' : linktarget}) + send_mail( + 'Agentur-Benachrichtigung', + 'Hallo ' + user_touched.first_name + ' ' + user_touched.last_name + '! ' + notificationtext, + 'noreply@digitale-agentur.com', + [user_touched.email], + html_message=msg_html, + fail_silently=True + ) + + + +# Deletes all Notifications added to to delete news +@receiver(pre_delete, sender=News) +def del_news_notifications(sender, instance, **kwargs): + UserNotification.objects.filter(elementid=instance.pk).delete() + + +#USER SIGNAL +@receiver(post_save, sender=User) +def save_profile(sender, instance, **kwargs): + instance.profile.save() + +# SIGNALS FOR GROUPS +# Signal für das Ändern von Gruppenrechten +@receiver(signal=m2m_changed, sender=Group.permissions.through) +def adjust_group_notifications_permission(instance, action, reverse, model, pk_set, using, *args, **kwargs): + group_touched = AgencyGroup.objects.get(group=instance) + # Rechte wurden hinzugefügt + if(action == "post_add"): + users_in_group = instance.user_set.all() + for user in users_in_group: + if(user.usernotifications.group_rights_mail): + notificationtext = "Die Gruppe " + group_touched.agencygroupname + " hat neue Rechte erhalten." + sendMailNoti(notificationtext, user) + if(user.usernotifications.group_rights_push): + newnotification = UserNotification(touser=user, notificationtext="Die Gruppe " + group_touched.agencygroupname + " hat neue Rechte erhalten.", notificationtype="groupchanges") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Gruppenaktivität | Die Gruppe " + group_touched.agencygroupname + " hat neue Rechte erhalten."}) + + # Rechte wurden entfernt + elif(action == "post_remove"): + users_in_group = instance.user_set.all() + for user in users_in_group: + if(user.usernotifications.group_rights_mail): + notificationtext = "Der Gruppe " + group_touched.agencygroupname + " wurden Rechte entzogen." + sendMailNoti(notificationtext, user) + if(user.usernotifications.group_rights_push): + newnotification = UserNotification(touser=user, notificationtext="Der Gruppe " + group_touched.agencygroupname + " wurden Rechte entzogen.", notificationtype="groupchanges") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Gruppenaktivität | Der Gruppe " + group_touched.agencygroupname + " wurden Rechte entzogen."}) + +# Signal, wenn ein Nutzer aus der Gruppe entfernt/hinzugefügt wird +@receiver(signal=m2m_changed, sender=User.groups.through) +def adjust_group_notifications(instance, action, reverse, model, pk_set, using, *args, **kwargs): + if isinstance(instance, Group): + group_touched = AgencyGroup.objects.get(group=instance) + userid = list(pk_set)[0] + user_touched = User.objects.get(pk=userid) + # PUSH NOTIFICATION FOR GROUOPCHANGES AND WEBSOCKET + if(user_touched.usernotifications.group_activity_push): + if(action == 'post_remove'): + newnotification = UserNotification(touser=user_touched, notificationtext="Sie wurden aus der Gruppe " + group_touched.agencygroupname + " entfernt.", notificationtype="groupchanges") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user_touched.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Gruppenaktivität | Sie wurden aus der Gruppe " + group_touched.agencygroupname + " entfernt."}) + + # A USER WAS ADDED TO A GROUP + elif(action == 'post_add'): + + newnotification = UserNotification(touser=user_touched, notificationtext="Sie wurden zur Gruppe " + group_touched.agencygroupname + " hinzugefügt.", notificationtype="groupchanges") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user_touched.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Gruppenaktivität | Sie wurden zur Gruppe " + group_touched.agencygroupname + " hinzugefügt."}) + + # E-MAILNOTIFICATIONS FOR GROUPCHANGES + if(user_touched.usernotifications.group_activity_mail): + notificationtext = "" + if(action == 'post_remove'): + + notificationtext = "Sie wurden aus der Gruppe " + group_touched.agencygroupname + " entfernt." + + username = user_touched.first_name + " " + user_touched.last_name + msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext}) + send_mail( + 'Agentur-Benachrichtigung', + 'Hallo ' + user_touched.first_name + ' ' + user_touched.last_name + '! ' + notificationtext, + 'noreply@digitale-agentur.com', + [user_touched.email], + html_message=msg_html, + fail_silently=True + ) + + # A USER WAS ADDED TO A GROUP + elif(action == 'post_add'): + notificationtext = "Sie wurden zur Gruppe " + group_touched.agencygroupname + " hinzugefügt." + + username = user_touched.first_name + " " + user_touched.last_name + msg_html = render_to_string('notificsys/notification_mail.html', {'username': username, 'notificationtext' : notificationtext}) + send_mail( + 'Agentur-Benachrichtigung', + 'Hallo ' + user_touched.first_name + ' ' + user_touched.last_name + '! ' + notificationtext, + 'noreply@digitale-agentur.com', + [user_touched.email], + html_message=msg_html, + fail_silently=True + ) + + +# SIGNALS FOR STANDARDS +# DELETE +@receiver(pre_delete, sender=Standards) +def delete_standard(sender, instance, **kwargs): + newNotifiyPush(2, instance, " es wurde ein neuer Agenturstandard gelöscht: ", "Agenturstandard gelöscht: ", "Standards | ", "", "") + +# SAVE AND UPDATE +@receiver(post_save, sender=Standards) +def save_standard(sender, instance, **kwargs): + targeturl = settings.BASE_URL + "standards/standard/" + str(instance.pk) + "/single" + # NEW STANDARD + if(kwargs["created"] and len(instance.name) > 0): + if(instance.public): + newNotifiyPush(0, instance, " es wurde ein neuer Agenturstandard erstellt: ", "Neuer Agenturstandard: ", "Standards | ", "newstandard", targeturl) + + else: + usersofagency = User.objects.filter(profile__agency__pk=instance.agency.pk) + + for user in usersofagency: + if(user.has_perm("users.standardmanager") and user.usernotifications.standard_created_unpub_push): + newnotification = UserNotification(touser=user, notificationtext="Neuer unveröffentlichter Agenturstandard: " + instance.name, notificationtype="newstandard", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Standards | Neuer unveröffentlichter Agenturstandard: " + instance.name}) + + if(user.has_perm("users.standardmanager") and user.usernotifications.standard_created_unpub_mail): + notificationtext = " es wurde ein neuer unveröffentlichter Agenturstandard erstellt: " + instance.name + sendMailNoti(notificationtext, user) + # Standard wurde aktualisiert + else: + newNotifiyPush(1, instance, " es wurde ein neuer Agenturstandard aktualisiert: ", "Agenturstandard aktualisiert: ", "Standards | ", "newstandard", targeturl) + + +# SIGNAL FOR NEWS +@receiver(post_save, sender=News) +def save_news(sender, instance, **kwargs): + if(kwargs["created"]): + targeturl = settings.BASE_URL + "news/news/" + str(instance.pk) + "/single" + + # Prüfung, ob die News SOFORT online geht oder später + if(instance.go_online_on < timezone.now() and instance.agnotify): + newNotifiyPush(0, instance, " es gibt neue Agenturnews: ", "Neue Agenturnews: ", "News | ", "", targeturl) + else: + instance.agnotify = False + instance.save() + + +# SIGNALS FOR TASK +@receiver(signal=m2m_changed, sender=Tasks.usersfield.through) +def adjust_group_notifications_task(instance, action, reverse, model, pk_set, using, *args, **kwargs): + + # A USER WAS TOUCHED ATT HIS TASKS + user_touched = User.objects.get(pk=list(pk_set)[0]) + taskname = instance.name + + # PUSH NOTIFICATION FOR GROUOPCHANGES + if(user_touched.usernotifications.task_activity_push): + if(action == 'post_remove'): + newnotification = UserNotification(touser=user_touched, notificationtext="Sie wurden von der Tätigkeit " + taskname + " entfernt.", notificationtype="taskchange") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user_touched.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Tätigkeitsbereich | Sie wurden von der Tätigkeitn " + instance.name + " entfernt."}) + + # A USER WAS ADDED TO A GROUP + elif(action == 'post_add'): + newnotification = UserNotification(touser=user_touched, notificationtext="Sie wurden der Tätigkeit " + taskname + " zugeordnet.", notificationtype="taskchange") + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user_touched.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Tätigkeitsbereich | Sie wurden der Tätigkeitn " + instance.name + " zugeordnet."}) + + # E-MAILNOTIFICATIONS FOR GROUPCHANGES + if(user_touched.usernotifications.task_activity_mail): + notificationtext = "" + if(action == 'post_remove'): + notificationtext = "Sie wurden von der Tätigkeit " + taskname + " entfernt." + sendMailNoti(notificationtext, user_touched) + + # A USER WAS ADDED TO A GROUP + elif(action == 'post_add'): + notificationtext = "Sie wurden der Tätigkeit " + taskname + " zugeordnet." + sendMailNoti(notificationtext, user_touched) + + + +''' + + newNotifiyPush + + @param: + instance - Objekt des Signals + mode - Modus 0 --> CREATED, 1 --> UPDATE, 3 --> DELETE + mailtext - Text in der Benachrichtigung + zB " es gibt neue Ordner: " + notifytext - Text in der PUSH-Nachricht + zB "Neuer Ordner: " + pushtext - Typ bei PUSH (hinter pushnotification__) + zB "Ordner | " + notifytext + notifytype - Typ für Verlinkung + targeturl - URL für Verlinkung, Default = "" + + +''' +def newNotifiyPush(mode, instance, mailtext, notifytext, pushtext, notifytype, targeturl=""): + usersofagency = User.objects.filter(profile__agency__pk=instance.agency.pk) + + # CREATED + for user in usersofagency: + + # LOAD USERNOTIFICATIONS + created_mail = False + created_push = False + update_mail = False + update_push = False + delete_mail = False + delete_push = False + + + if isinstance(instance, Standards): + created_mail = user.usernotifications.standard_created_mail + created_push = user.usernotifications.standard_created_push + update_mail = user.usernotifications.standard_update_mail + update_push = user.usernotifications.standard_update_push + delete_mail = user.usernotifications.standard_delete_mail + delete_push = user.usernotifications.standard_delete_push + elif isinstance(instance, News): + created_mail = user.usernotifications.news_created_mail + created_push = user.usernotifications.news_created_push + elif isinstance(instance, DataFile) or isinstance(instance, DataDir): + created_mail = user.usernotifications.filedir_created_mail + created_push = user.usernotifications.filedir_created_push + update_mail = user.usernotifications.filedir_update_mail + update_push = user.usernotifications.filedir_update_push + delete_mail = user.usernotifications.filedir_delete_mail + delete_push = user.usernotifications.filedir_delete_push + elif isinstance(instance, QuickLinks): + created_mail = user.usernotifications.ql_created_mail + created_push = user.usernotifications.ql_created_push + update_mail = user.usernotifications.ql_update_mail + update_push = user.usernotifications.ql_update_push + delete_mail = user.usernotifications.ql_delete_mail + delete_push = user.usernotifications.ql_delete_push + elif isinstance(instance, AGContacts): + created_mail = user.usernotifications.contact_created_mail + created_push = user.usernotifications.contact_created_push + update_mail = user.usernotifications.contact_update_mail + update_push = user.usernotifications.contact_update_push + delete_mail = user.usernotifications.contact_delete_mail + delete_push = user.usernotifications.contact_delete_push + elif isinstance(instance, AGPassword): + created_mail = user.usernotifications.password_created_mail + created_push = user.usernotifications.password_created_push + update_mail = user.usernotifications.password_update_mail + update_push = user.usernotifications.password_update_push + delete_mail = user.usernotifications.password_delete_mail + delete_push = user.usernotifications.password_delete_push + elif isinstance(instance, Message): + created_mail = user.usernotifications.message_received_mail + created_push = user.usernotifications.message_received_push + + + if(mode == 0): + if(created_mail): + notificationtext = mailtext + instance.name + sendMailNoti(notificationtext, user, targeturl) + + if(created_push): + newnotification = UserNotification(touser=user, notificationtext=notifytext + instance.name, notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__"+ pushtext + notifytext + instance.name}) + # UPDATED + elif(mode == 1): + if(update_mail): + notificationtext = mailtext + instance.name + sendMailNoti(notificationtext, user, targeturl) + + if(update_push): + newnotification = UserNotification(touser=user, notificationtext=notifytext + instance.name, notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__" + pushtext + notifytext + instance.name}) + #DELETE + elif(mode == 2): + if(delete_mail): + notificationtext = mailtext + instance.name + sendMailNoti(notificationtext, user, targeturl) + + + if(delete_push): + newnotification = UserNotification(touser=user, notificationtext=notifytext + instance.name, notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__" + pushtext + notifytext + instance.name}) + +# DIRS +@receiver(post_save, sender=DataDir) +def save_dir(sender, instance, **kwargs): + if(kwargs["created"] and len(instance.name) > 0): + newNotifiyPush(0, instance, " es gibt neue Ordner: ", "Neuer Ordner: ", "Ordner | ", "", "") + elif(len(instance.name) > 0): + newNotifiyPush(1, instance, " Ordner wurden aktualisiert: ", "Aktualisierter Ordner: ", "Ordner | ", "", "") + +@receiver(pre_delete, sender=DataDir) +def del_dir(sender, instance, **kwargs): + newNotifiyPush(2, instance, " ein Ordner wurde gelöscht: ", "Ordner gelöscht: ", "Ordner | ", "", "") + +# Signals for FILES +@receiver(post_save, sender=DataFile) +def save_file(sender, instance, **kwargs): + if(kwargs["created"] and len(instance.name) > 0): + newNotifiyPush(0, instance, " es gibt eine neue Datei: ", "Neue Datei: ", "Dateien | ", "", "") + elif(len(instance.name) > 0): + newNotifiyPush(1, instance, " Datei wurde aktualisiert: ", "Aktualisierter Datei: ", "Dateien | ", "", "") + +@receiver(pre_delete, sender=DataFile) +def del_file(sender, instance, **kwargs): + newNotifiyPush(2, instance, " eine Datei wurde gelöscht: ", "Datei gelöscht: ", "Dateien | ", "", "") + +# QUICKLINKS +@receiver(post_save, sender=QuickLinks) +def save_ql(sender, instance, **kwargs): + if(kwargs["created"] and len(instance.name) > 0): + newNotifiyPush(0, instance, " es gibt einen neuen Quicklink: ", "Neuer Quicklink: ", "Quicklinks | ", "", "") + elif(len(instance.name) > 0): + newNotifiyPush(1, instance, " Quicklink wurde aktualisiert: ", "Aktualisierter Quicklink: ", "Quicklinks | ", "", "") + +@receiver(pre_delete, sender=QuickLinks) +def del_ql(sender, instance, **kwargs): + newNotifiyPush(2, instance, " ein Quicklink wurde gelöscht: ", "Quicklink gelöscht: ", "Quicklinks | ", "", "") + +# CONTACTS +@receiver(post_save, sender=AGContacts) +def save_contact(sender, instance, **kwargs): + if(kwargs["created"] and len(instance.name) > 0): + newNotifiyPush(0, instance, " es gibt einen neuen Kontakt: ", "Neuer Kontakt: ", "Kontakte | ", "", "") + elif(len(instance.name) > 0): + newNotifiyPush(1, instance, " Kontakt wurde aktualisiert: ", "Aktualisierter Kontakt: ", "Kontakte | ", "", "") + +@receiver(pre_delete, sender=AGContacts) +def del_contact(sender, instance, **kwargs): + newNotifiyPush(2, instance, " ein Kontakt wurde gelöscht: ", "Kontakt gelöscht: ", "Kontakte | ", "", "") + +# PASSWORDS +@receiver(post_save, sender=AGPassword) +def save_password(sender, instance, **kwargs): + if(kwargs["created"] and len(instance.name) > 0): + newNotifiyPush(0, instance, " es gibt ein neues Passwort: ", "Neues Passwort: ", "Passwörter | ", "", "") + elif(len(instance.name) > 0): + newNotifiyPush(1, instance, " Passwort wurde aktualisiert: ", "Aktualisiertes Passwort: ", "Passwörter | ", "", "") + +@receiver(pre_delete, sender=AGPassword) +def del_password(sender, instance, **kwargs): + newNotifiyPush(2, instance, " ein Passwort wurde gelöscht: ", "Passwort gelöscht: ", "Passwörter | ", "", "") + + + + + + + +# Join eines Agenturverbunds +@receiver(signal=post_save, sender=AgencyNetworkPreperation) +def save_agjoin_prep(sender, instance, **kwargs): + newnotification = UserNotification(touser=instance.target_network.creator, notificationtext="Eine Agentur möchte Ihrem Verbund beitreten.", notificationtype="wantedag", elementid=instance.pk) + newnotification.save() + +# REQUEST MAIN STUFF +@receiver(signal=request_started) +def receiver_function(sender, **kwargs): + # DELETES ALL PRESENCE-OBJECTS LOWER THAN 15 MINUTES + now_minus = datetime.datetime.now() - datetime.timedelta(minutes=2) + Presence.objects.filter(last_seen__lt=now_minus).delete() + + users = User.objects.all() + + for user in users: + user_notification = [] + try: + user_notification = UserNotifications.objects.get(user=user) + except: + if(len(user_notification) == 0): + user_notification = UserNotifications(user=user) + user_notification.save() + + +# PRESENCE CHANGED +@receiver(signal=presence_changed) +def update_presence_live(sender, **kwargs): + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)(str(kwargs["room"]), {'type' : 'update_presence_live'}) + + +''' + + ABWESENHEIT BERECHNUNG UND SPEICHERUNG DER NEUEN URLAUBSTAGE - VERWEIS AUF timemenagement.views + +''' +@receiver(signal=post_save, sender=Absence) +def save_newabsence(sender, instance, **kwargs): + post_save.disconnect(save_newabsence, sender=sender) + if(instance.reason.is_holiday): + newdata = getFinalHolidayData(instance) + + abinfo = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year))[0] + abinfo_lastyear = "" + abinfo_nextyear = "" + + is_lastyear = False + + abinfo_lastyear = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year-1)) + if(len(abinfo_lastyear) > 0): + is_lastyear = True + abinfo_lastyear = abinfo_lastyear[0] + + is_nextyear = False + abinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year+1)) + if(len(abinfo_nextyear) > 0): + is_nextyear = True + abinfo_nextyear = abinfo_nextyear[0] + + multiple_info_needays = False + if(hasattr(newdata[3], "__len__")): + multiple_info_needays = True + + # Gleiches Jahr MIT Rest + if(multiple_info_needays and newdata[3][2] == False): + # Rest ist positiv, daher bleibt rest übrig, rest wird in absence gespeichert und vom rest des Jahres-Restes abgezogen + # Rest ist positiv, damit bleibt Rest übrig + if(newdata[3][0] > 0): + instance.holidays_rest = abinfo.restdays - newdata[3][0] + instance.save() + abinfo.restdays = newdata[3][0] + abinfo.save() + # Rest ist negativ + elif(newdata[3][0] < 0): + instance.holidays_rest = (abinfo.restdays - newdata[3][0]) - newdata[3][0]*(-1) + instance.holidays_normal = newdata[3][0]*(-1) + instance.save() + abinfo.restdays = 0 + abinfo.days_inuse = abinfo.days_inuse + newdata[3][0]*(-1) + abinfo.save() + # Rest ist Urlaubsdauer + else: + instance.holidays_rest = abinfo.restdays + instance.save() + #abinfo.days_inuse = abinfo.days_inuse + abinfo.restdays + abinfo.restdays = 0 + abinfo.save() + # Gleiches Jahr ohne Rest + elif(not multiple_info_needays): + abinfo.days_inuse = abinfo.days_inuse + newdata[3] + abinfo.save() + instance.holidays_normal = newdata[3] + instance.save() + # Mehrere Jahre + elif(multiple_info_needays and newdata[3][2] == True): + + abinfo.days_inuse = abinfo.days_inuse + newdata[3][0] + abinfo.save() + abinfo_nextyear.days_inuse = abinfo_nextyear.days_inuse + newdata[3][1] + abinfo_nextyear.restdays = abinfo_nextyear.restdays - newdata[3][3] + abinfo_nextyear.save() + + # Hier werden alle benötigten Tage von Vor- und Nächstem Jahr gespeichert + instance.holidays_normal = newdata[3][0] + instance.holidays_rest = 0 + instance.holidays_normal_next = newdata[3][1] + instance.holidays_rest_next = newdata[3][3] + instance.save() + + checkAbsenceWorkdayCollide(instance) + + # NEUE ABWESENHEIT ERSTELLT + if(kwargs["created"]): + + usersofagency = User.objects.filter(profile__agency=instance.user.profile.agency) + + for user in usersofagency: + + if(user == instance.user and user.usernotifications.time_data_changed_mail): + sendMailNoti(" es wurde eine Abwesenheit erstellt!", user) + + + # Benutzer erhält Benachrichtigung bei Abwesenheit, wenn er Rechte hat + if(user.has_perm("users.absencemanager")): + if(user.usernotifications.absence_created_mail): + sendMailNoti(" es wurde eine neue Abwesenheit für den Mitarbeiter " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!", user) + + if(user.usernotifications.absence_created_push): + newnotification = UserNotification(touser=user, notificationtext="Neue Abwesenheit!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Neue Abwesenheit für " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!"}) + # Benutzer ist Vertreter + if(user == instance.representator): + if(user.usernotifications.absence_user_is_rep_mail): + sendMailNoti(" Sie wurden als Vertreter bei einer Abwesenheit von " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!", user) + + if(user.usernotifications.absence_user_is_rep_push): + newnotification = UserNotification(touser=user, notificationtext="Neue Abwesenheitsvertretung!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Sie wurden als Vertreter für " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!"}) + + # ABWESENHEIT GEÄNDERT + else: + usersofagency = User.objects.filter(profile__agency=instance.user.profile.agency) + + for user in usersofagency: + # TASK: Hier die Signals eintragen, damit die Mails verschickt werden + if(user == instance.user and user.usernotifications.time_data_changed_mail): + sendMailNoti(" es wurde eine Abwesenheit verändert!", user) + + + # Benutzer erhält Benachrichtigung bei Abwesenheit, wenn er Rechte hat + if(user.has_perm("users.absencemanager")): + if(user.usernotifications.time_data_changed_mail): + sendMailNoti(" es wurde eine Abwesenheit für den Mitarbeiter " + instance.user.first_name + " " + instance.user.last_name + " aktualisiert!", user) + + if(user.usernotifications.time_data_changed_push): + newnotification = UserNotification(touser=user, notificationtext="Aktualisierte Abwesenheit!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Abwesenheit für " + instance.user.first_name + " " + instance.user.last_name + " wurde aktualisiert!"}) + + # Benutzer ist Vertreter + if(user == instance.representator): + if(user.usernotifications.absence_user_is_rep_mail): + sendMailNoti(" Sie wurden als Vertreter bei einer Abwesenheit von " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!", user) + + if(user.usernotifications.absence_user_is_rep_push): + newnotification = UserNotification(touser=user, notificationtext="Neue Abwesenheitsvertretung!", notificationtype="", elementid=instance.pk) + newnotification.save() + + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(user.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Abwesenheit | Sie wurden als Vertreter für " + instance.user.first_name + " " + instance.user.last_name + " eingetragen!"}) + + else: + # Kein Urlaubsanspruch, dennoch prüfen ob bereits bestehende Arbeitstage involviert sind + checkAbsenceWorkdayCollide(instance) + post_save.connect(save_newabsence, sender=sender) + +# Neue Chatnachricht wurde verschickt - Hier Reaktion NUR auf PUSH! +@receiver(signal=post_save, sender=ChatMessage) +def new_chat_message(sender, instance, **kwargs): + # GRUPPENCHAT + if instance.room.chatroomtype == 1: + + sended_users = [] + + for u in instance.room.chatmembers.all(): + if u != instance.author: + if u.usernotifications.chat_received_push and u not in sended_users: + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Chat | Neue Nachricht im Gruppenchat " + instance.room.roomname + " von " + instance.author.first_name + " " + instance.author.last_name + ": " + instance.content}) + sended_users.append(u) + + for u in instance.room.chatmembers_admin.all(): + if u != instance.author: + if u.usernotifications.chat_received_push and u not in sended_users: + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Chat | Neue Nachricht im Gruppenchat " + instance.room.roomname + " von " + instance.author.first_name + " " + instance.author.last_name + ": " + instance.content}) + sended_users.append(u) + + + elif instance.room.chatroomtype == 0: + + u = instance.room.chatmember_single + + if u.usernotifications.chat_received_push and u != instance.author: + channel_layer = channels.layers.get_channel_layer() + async_to_sync(channel_layer.group_send)("user_" + str(u.pk), {'type' : 'pushhandler', 'pushtext' : "pushnotification__Chat | Neue Nachricht von " + instance.author.first_name + " " + instance.author.last_name + ": " + instance.content}) + + + +@receiver(signal=pre_delete, sender=Absence) +def delete_absence(sender, instance, **kwargs): + if(instance.reason.is_holiday): + newdata = getFinalHolidayData(instance) + + if(instance.user.usernotifications.time_data_changed_mail): + sendMailNoti(" die Abwesenheit vom " + str(instance.start) + " bis " + str(instance.start) + " wurde gelöscht.", instance.user) + + abinfo = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year))[0] + abinfo_lastyear = "" + abinfo_nextyear = "" + + is_lastyear = False + + abinfo_lastyear = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year-1)) + if(len(abinfo_lastyear) > 0): + is_lastyear = True + abinfo_lastyear = abinfo_lastyear[0] + + is_nextyear = False + abinfo_nextyear = list(UserYearAbsenceInfo.objects.filter(user=instance.user, year=instance.start.year+1)) + if(len(abinfo_nextyear) > 0): + is_nextyear = True + abinfo_nextyear = abinfo_nextyear[0] + + multiple_info_needays = False + if(hasattr(newdata[3], "__len__")): + multiple_info_needays = True + # Mehrere Jahre oder nicht + if(instance.start.year != instance.end.year): + abinfo.days_inuse = abinfo.days_inuse - instance.holidays_normal + abinfo.save() + abinfo_nextyear.days_inuse = abinfo_nextyear.days_inuse - instance.holidays_normal_next + abinfo_nextyear.restdays = abinfo_nextyear.restdays + instance.holidays_rest_next + abinfo_nextyear.save() + else: + # Gleiches Jahr MIT Rest + abinfo.days_inuse = abinfo.days_inuse - instance.holidays_normal + abinfo.restdays = abinfo.restdays + instance.holidays_rest + abinfo.save() + + else: + print("Absence-Object is no holiday...") + +def getFinalHolidayData(abscence): + + user = abscence.user + usertimedata = UserTime.objects.get(user=user) + today = date.today() + start_day_obj = abscence.start + end_day_obj = abscence.end + + try: + holidayloose_date = datetime.date(start_day_obj.year, int(usertimedata.loose_holidedate.split(".")[1]), int(usertimedata.loose_holidedate.split(".")[0])) + except: + holidayloose_date = datetime.date(2020, int(usertimedata.loose_holidedate.split(".")[1]), int(usertimedata.loose_holidedate.split(".")[0])) + + #start_half = abscence.start_ishalf + #end_half = abscence.end_ishalf + + start_half = False + if abscence.startday_info == "1" or abscence.startday_info == "2": + start_half = True + + end_half = False + if abscence.endday_info == "1" or abscence.endday_info == "2": + end_half = True + + choosenyear = abscence.start.year + yeardata = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, year=choosenyear))[0] + + holiday_thisyear = 0 + holiday_lastyear = yeardata.restdays + holiday_nextyear = 0 + + try: + holiday_nextyear = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].days - list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].days_inuse + holiday_nextyear_rest = list(UserYearAbsenceInfo.objects.filter(user=user, agency=user.profile.agency, + year=choosenyear+1))[0].restdays + except: + holiday_nextyear = yeardata.days + + # Urlaub innerhalb eines Jahres inkl. Prüfung auf Resturlaubsanspruch + if(end_day_obj.year == start_day_obj.year): + # Startt des Urlaubs NACH Verfallsdatum - nur aktuelles JAhr und die Zahl interessiert + if(start_day_obj > holidayloose_date): + need_days = (calculateHolidays(user, start_day_obj, end_day_obj, start_half, end_half))*(-1) + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days + else: + need_days = (calculateHolidays(user, start_day_obj, end_day_obj, start_half, end_half))*(-1) + # Kein Resturlaub + if(yeardata.restdays == 0.0): + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days + # Resturlaub vorhanden, berechne mit Resturlaub + else: + holiday_lastyear = yeardata.restdays + holiday_thisyear = yeardata.days - yeardata.days_inuse + temp_holiday = holiday_lastyear - need_days + if(temp_holiday < 0): + holiday_lastyear = 0 + holiday_thisyear = yeardata.days - yeardata.days_inuse + temp_holiday + need_days = [temp_holiday, holiday_thisyear, False] + else: + holiday_lastyear = yeardata.restdays - need_days + need_days = [temp_holiday, holiday_lastyear, False] + # Urlaub geht über das nächstes Jahr hinweg + else: + two_years = True + holiday_lastyear = yeardata.restdays + date_splitter = datetime.date(end_day_obj.year, 1, 1) + + need_days_this = (calculateHolidays(user, start_day_obj, date_splitter, start_half, False))*(-1) + + need_days_next = (calculateHolidays(user, date_splitter, end_day_obj, False, end_half))*(-1) + + need_days = (calculateHolidays(user, start_day_obj, date_splitter, start_half, False))*(-1) + (calculateHolidays(user, date_splitter, end_day_obj, False, end_half))*(-1) + holiday_thisyear = yeardata.days - yeardata.days_inuse - need_days_this + days_nextyear_normal = 0 + days_nextyear_rest = 0 + # Urlaub nächstes Jahr MIT und OHNE Rest + if(holiday_nextyear_rest == 0.0): + holiday_nextyear = holiday_nextyear - (calculateHolidays(user, date_splitter, end_day_obj, False, end_half))*(-1) + else: + temprest = holiday_nextyear_rest - need_days_next + # Rest reicht! + if(temprest >= 0): + holiday_nextyear_rest = temprest + days_nextyear_normal = 0 + days_nextyear_rest = need_days_next + # Rest reicht nicht + else: + holiday_nextyear_rest = 0 + holiday_nextyear += temprest + days_nextyear_rest = need_days_next + temprest + days_nextyear_normal = temprest * -1 + + # TAGE NORMAL, TAGE NEXT NORMAL, TRUE für 2jahre, TAGE NEXT REST + need_days = [need_days_this, days_nextyear_normal, True, days_nextyear_rest] + + data = [ holiday_thisyear, holiday_lastyear, holiday_nextyear, need_days ] + return data + + +def calculateHolidays(user, start, end, start_half, end_half): + restdays = 0 + allfreedays = FreeDays.objects.filter(agency=user.profile.agency) + if(end == start): + if(start_half): + return restdays - 0.5 + else: + return restdays - 1 + else: + if(end < start): + return False + else: + counter = 0 + if(start_half): + counter -= 0.5 + if(end_half): + counter -= 0.5 + + weekdays = [] + freedaycounter = 0 + for dt in daterange(start, end): + day_found = False + if dt.isoweekday() not in weekdays: + counter += 1 + for freeday in allfreedays.all(): + if(dt == freeday.day): + freedaycounter += 1 + day_found = True + if day_found == False: + if(dt.isoweekday() == 1): + if user.usertime.wd_mo == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 2): + if user.usertime.wd_tu == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 3): + if user.usertime.wd_we == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 4): + if user.usertime.wd_th == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 5): + if user.usertime.wd_fr == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 6): + if user.usertime.wd_sa == 0.0: + freedaycounter += 1 + elif(dt.isoweekday() == 7): + if user.usertime.wd_so == 0.0: + freedaycounter += 1 + + return restdays - counter + freedaycounter + +# Gibt die Woche als Wochentage zurück +def daterange(date1, date2): + for n in range(int ((date2 - date1).days)+1): + yield date1 + timedelta(n) \ No newline at end of file diff --git a/users/static/.DS_Store b/users/static/.DS_Store new file mode 100644 index 0000000..adc1891 Binary files /dev/null and b/users/static/.DS_Store differ diff --git a/users/static/summernote/lang/summernote-de-DE.min.js b/users/static/summernote/lang/summernote-de-DE.min.js new file mode 100644 index 0000000..5d133db --- /dev/null +++ b/users/static/summernote/lang/summernote-de-DE.min.js @@ -0,0 +1,157 @@ +(function($) { + $.extend($.summernote.lang, { + 'de-DE': { + font: { + bold: 'Fett', + italic: 'Kursiv', + underline: 'Unterstreichen', + clear: 'Zurücksetzen', + height: 'Zeilenhöhe', + name: 'Schriftart', + strikethrough: 'Durchgestrichen', + subscript: 'Tiefgestellt', + superscript: 'Hochgestellt', + size: 'Schriftgröße', + }, + image: { + image: 'Bild', + insert: 'Bild einfügen', + resizeFull: 'Originalgröße', + resizeHalf: '1/2 Größe', + resizeQuarter: '1/4 Größe', + floatLeft: 'Linksbündig', + floatRight: 'Rechtsbündig', + floatNone: 'Kein Textfluss', + shapeRounded: 'Abgerundeter Rahmen', + shapeCircle: 'Kreisförmiger Rahmen', + shapeThumbnail: 'Rahmenvorschau', + shapeNone: 'Kein Rahmen', + dragImageHere: 'Bild hierher ziehen', + dropImage: 'Bild oder Text nehmen', + selectFromFiles: 'Datei auswählen', + maximumFileSize: 'Maximale Dateigröße', + maximumFileSizeError: 'Maximale Dateigröße überschritten', + url: 'Bild URL', + remove: 'Bild entfernen', + original: 'Original', + }, + video: { + video: 'Video', + videoLink: 'Videolink', + insert: 'Video einfügen', + url: 'Video URL', + providers: '(YouTube, Vimeo etc.)', + }, + link: { + link: 'Link', + insert: 'Link einfügen', + unlink: 'Link entfernen', + edit: 'Bearbeiten', + textToDisplay: 'Anzeigetext', + url: 'Link URL', + openInNewWindow: 'In neuem Fenster öffnen', + useProtocol: 'HTTP-Protokoll verwenden' + }, + table: { + table: 'Tabelle', + addRowAbove: '+ Zeile oberhalb', + addRowBelow: '+ Zeile unterhalb', + addColLeft: '+ Spalte links', + addColRight: '+ Spalte rechts', + delRow: 'Reihe löschen', + delCol: 'Spalte löschen', + delTable: 'Tabelle löschen', + }, + hr: { + insert: 'Horizontale Linie einfügen', + }, + style: { + style: 'Stil', + normal: 'Normal', + p: 'Normal', + blockquote: 'Zitat', + pre: 'Quellcode', + h1: 'Überschrift 1', + h2: 'Überschrift 2', + h3: 'Überschrift 3', + h4: 'Überschrift 4', + h5: 'Überschrift 5', + h6: 'Überschrift 6', + }, + lists: { + unordered: 'Unnummerierte Liste', + ordered: 'Nummerierte Liste', + }, + options: { + help: 'Hilfe', + fullscreen: 'Vollbild', + codeview: 'Quellcode anzeigen', + }, + paragraph: { + paragraph: 'Absatz', + outdent: 'Einzug verkleinern', + indent: 'Einzug vergrößern', + left: 'Links ausrichten', + center: 'Zentriert ausrichten', + right: 'Rechts ausrichten', + justify: 'Blocksatz', + }, + color: { + recent: 'Letzte Farbe', + more: 'Weitere Farben', + background: 'Hintergrundfarbe', + foreground: 'Schriftfarbe', + transparent: 'Transparenz', + setTransparent: 'Transparenz setzen', + reset: 'Zurücksetzen', + resetToDefault: 'Auf Standard zurücksetzen', + }, + shortcut: { + shortcuts: 'Tastenkürzel', + close: 'Schließen', + textFormatting: 'Textformatierung', + action: 'Aktion', + paragraphFormatting: 'Absatzformatierung', + documentStyle: 'Dokumentenstil', + extraKeys: 'Weitere Tasten', + }, + help: { + 'insertParagraph': 'Absatz einfügen', + 'undo': 'Letzte Anweisung rückgängig', + 'redo': 'Letzte Anweisung wiederholen', + 'tab': 'Einzug hinzufügen', + 'untab': 'Einzug entfernen', + 'bold': 'Schrift Fett', + 'italic': 'Schrift Kursiv', + 'underline': 'Unterstreichen', + 'strikethrough': 'Durchstreichen', + 'removeFormat': 'Entfernt Format', + 'justifyLeft': 'Linksbündig', + 'justifyCenter': 'Mittig', + 'justifyRight': 'Rechtsbündig', + 'justifyFull': 'Blocksatz', + 'insertUnorderedList': 'Unnummerierte Liste', + 'insertOrderedList': 'Nummerierte Liste', + 'outdent': 'Aktuellen Absatz ausrücken', + 'indent': 'Aktuellen Absatz einrücken', + 'formatPara': 'Formatiert aktuellen Block als Absatz (P-Tag)', + 'formatH1': 'Formatiert aktuellen Block als H1', + 'formatH2': 'Formatiert aktuellen Block als H2', + 'formatH3': 'Formatiert aktuellen Block als H3', + 'formatH4': 'Formatiert aktuellen Block als H4', + 'formatH5': 'Formatiert aktuellen Block als H5', + 'formatH6': 'Formatiert aktuellen Block als H6', + 'insertHorizontalRule': 'Fügt eine horizontale Linie ein', + 'linkDialog.show': 'Zeigt Linkdialog', + }, + history: { + undo: 'Rückgängig', + redo: 'Wiederholen', + }, + specialChar: { + specialChar: 'Sonderzeichen', + select: 'Zeichen auswählen', + }, + }, + }); +})(jQuery); \ No newline at end of file diff --git a/users/static/users/.DS_Store b/users/static/users/.DS_Store new file mode 100644 index 0000000..9fafb8d Binary files /dev/null and b/users/static/users/.DS_Store differ diff --git a/users/static/users/css/bootstrap.min.css b/users/static/users/css/bootstrap.min.css new file mode 100644 index 0000000..ced3d12 --- /dev/null +++ b/users/static/users/css/bootstrap.min.css @@ -0,0 +1,12 @@ +/*! + * Bootswatch v4.4.0 + * Homepage: https://bootswatch.com + * Copyright 2012-2019 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! + * Bootstrap v4.4.0 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */@import url("https://fonts.googleapis.com/css?family=News+Cycle:400,700");:root{--blue: #EB6864;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #F57A00;--orange: #fd7e14;--yellow: #F5E625;--green: #22B24C;--teal: #20c997;--cyan: #369;--white: #fff;--gray: #777;--gray-dark: #333;--primary: #EB6864;--secondary: #aaa;--success: #22B24C;--info: #369;--warning: #F5E625;--danger: #F57A00;--light: #f8f9fa;--dark: #222;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#222;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0 !important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#EB6864;text-decoration:none;background-color:transparent}a:hover{color:#e22620;text-decoration:underline}a:not([href]){color:inherit;text-decoration:none}a:not([href]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:0.75rem;padding-bottom:0.75rem;color:#777;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:0.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]:not(:disabled){cursor:pointer}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:0.5rem;font-family:"News Cycle", "Arial Narrow Bold", sans-serif;font-weight:700;line-height:1.1}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:0.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:0.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#777}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:0.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:0.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:0.5rem;line-height:1}.figure-caption{font-size:90%;color:#777}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:0.2rem 0.4rem;font-size:87.5%;color:#fff;background-color:#222;border-radius:0.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#222}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid,.container-sm,.container-md,.container-lg,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container,.container-sm{max-width:540px}}@media (min-width: 768px){.container,.container-sm,.container-md{max-width:720px}}@media (min-width: 992px){.container,.container-sm,.container-md,.container-lg{max-width:960px}}@media (min-width: 1200px){.container,.container-sm,.container-md,.container-lg,.container-xl{max-width:1140px}}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media (min-width: 576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-sm-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media (min-width: 768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-md-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-md-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-md-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-md-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-md-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media (min-width: 992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-lg-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media (min-width: 1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.row-cols-xl-1>*{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{-webkit-box-flex:0;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.3333333333%;flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.6666666667%;flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.3333333333%;flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.6666666667%;flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.3333333333%;flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.6666666667%;flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.3333333333%;flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.6666666667%;flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.table{width:100%;margin-bottom:1rem;color:#222}.table th,.table td{padding:0.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:0.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{color:#222;background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#f9d5d4}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#f5b0ae}.table-hover .table-primary:hover{background-color:#f6bfbe}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#f6bfbe}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#e7e7e7}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:lightgray}.table-hover .table-secondary:hover{background-color:#dadada}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#dadada}.table-success,.table-success>th,.table-success>td{background-color:#c1e9cd}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#8cd7a2}.table-hover .table-success:hover{background-color:#aee2be}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aee2be}.table-info,.table-info>th,.table-info>td{background-color:#c6d4e2}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#95afca}.table-hover .table-info:hover{background-color:#b5c7d9}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#b5c7d9}.table-warning,.table-warning>th,.table-warning>td{background-color:#fcf8c2}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#faf28e}.table-hover .table-warning:hover{background-color:#fbf5aa}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#fbf5aa}.table-danger,.table-danger>th,.table-danger>td{background-color:#fcdab8}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#faba7a}.table-hover .table-danger:hover{background-color:#fbcda0}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#fbcda0}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#fbfcfc}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c1c1c1}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#8c8c8c}.table-hover .table-dark:hover{background-color:#b4b4b4}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b4b4b4}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#333;border-color:#464646}.table .thead-light th{color:#495057;background-color:#eee;border-color:#dee2e6}.table-dark{color:#fff;background-color:#333}.table-dark th,.table-dark td,.table-dark thead th{border-color:#464646}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 1rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:0.25rem;-webkit-transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#fad6d5;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25)}.form-control::-webkit-input-placeholder{color:#777;opacity:1}.form-control::-ms-input-placeholder{color:#777;opacity:1}.form-control::placeholder{color:#777;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eee;opacity:1}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:0.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#222;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + 0.5rem + 2px);padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}select.form-control[size],select.form-control[multiple]{height:auto}textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:0.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:0.3rem;margin-left:-1.25rem}.form-check-input[disabled] ~ .form-check-label{color:#777}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:0.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:0.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#22B24C}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(34,178,76,0.9);border-radius:0.25rem}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#22B24C;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2322B24C' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#22B24C;-webkit-box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25);box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#22B24C;padding-right:calc(0.75em + 2.5625rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 1rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%2322B24C' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 2rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#22B24C;-webkit-box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25);box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#22B24C}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#22B24C}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{border-color:#22B24C}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{border-color:#30d761;background-color:#30d761}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25);box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25)}.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before{border-color:#22B24C}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#22B24C}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{border-color:#22B24C;-webkit-box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25);box-shadow:0 0 0 0.2rem rgba(34,178,76,0.25)}.invalid-feedback{display:none;width:100%;margin-top:0.25rem;font-size:80%;color:#F57A00}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:0.25rem 0.5rem;margin-top:.1rem;font-size:0.875rem;line-height:1.5;color:#fff;background-color:rgba(245,122,0,0.9);border-radius:0.25rem}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#F57A00;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23F57A00' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23F57A00' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#F57A00;-webkit-box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25);box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#F57A00;padding-right:calc(0.75em + 2.5625rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 1rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23F57A00' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23F57A00' stroke='none'/%3e%3c/svg%3e") #fff no-repeat center right 2rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#F57A00;-webkit-box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25);box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#F57A00}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#F57A00}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{border-color:#F57A00}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{border-color:#ff9429;background-color:#ff9429}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25);box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25)}.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before,.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before{border-color:#F57A00}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#F57A00}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{border-color:#F57A00;-webkit-box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25);box-shadow:0 0 0 0.2rem rgba(245,122,0,0.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;-ms-flex-negative:0;flex-shrink:0;margin-top:0;margin-right:0.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#222;text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:0.375rem 1rem;font-size:1rem;line-height:1.5;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.btn{-webkit-transition:none;transition:none}}.btn:hover{color:#222;text-decoration:none}.btn:focus,.btn.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25)}.btn.disabled,.btn:disabled{opacity:0.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#EB6864;border-color:#EB6864}.btn-primary:hover{color:#fff;background-color:#e74742;border-color:#e53c37}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#e74742;border-color:#e53c37;-webkit-box-shadow:0 0 0 0.2rem rgba(238,127,123,0.5);box-shadow:0 0 0 0.2rem rgba(238,127,123,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#EB6864;border-color:#EB6864}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#e53c37;border-color:#e4312c}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(238,127,123,0.5);box-shadow:0 0 0 0.2rem rgba(238,127,123,0.5)}.btn-secondary{color:#222;background-color:#aaa;border-color:#aaa}.btn-secondary:hover{color:#222;background-color:#979797;border-color:#919090}.btn-secondary:focus,.btn-secondary.focus{color:#222;background-color:#979797;border-color:#919090;-webkit-box-shadow:0 0 0 0.2rem rgba(150,150,150,0.5);box-shadow:0 0 0 0.2rem rgba(150,150,150,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#222;background-color:#aaa;border-color:#aaa}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#919090;border-color:#8a8a8a}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(150,150,150,0.5);box-shadow:0 0 0 0.2rem rgba(150,150,150,0.5)}.btn-success{color:#fff;background-color:#22B24C;border-color:#22B24C}.btn-success:hover{color:#fff;background-color:#1c923e;border-color:#1a873a}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#1c923e;border-color:#1a873a;-webkit-box-shadow:0 0 0 0.2rem rgba(67,190,103,0.5);box-shadow:0 0 0 0.2rem rgba(67,190,103,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#22B24C;border-color:#22B24C}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1a873a;border-color:#187c35}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(67,190,103,0.5);box-shadow:0 0 0 0.2rem rgba(67,190,103,0.5)}.btn-info{color:#fff;background-color:#369;border-color:#369}.btn-info:hover{color:#fff;background-color:#29537c;border-color:#264d73}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#29537c;border-color:#264d73;-webkit-box-shadow:0 0 0 0.2rem rgba(82,125,168,0.5);box-shadow:0 0 0 0.2rem rgba(82,125,168,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#369;border-color:#369}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#264d73;border-color:#234669}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(82,125,168,0.5);box-shadow:0 0 0 0.2rem rgba(82,125,168,0.5)}.btn-warning{color:#222;background-color:#F5E625;border-color:#F5E625}.btn-warning:hover{color:#222;background-color:#e9d90b;border-color:#ddce0a}.btn-warning:focus,.btn-warning.focus{color:#222;background-color:#e9d90b;border-color:#ddce0a;-webkit-box-shadow:0 0 0 0.2rem rgba(213,201,37,0.5);box-shadow:0 0 0 0.2rem rgba(213,201,37,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#222;background-color:#F5E625;border-color:#F5E625}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#222;background-color:#ddce0a;border-color:#d1c20a}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(213,201,37,0.5);box-shadow:0 0 0 0.2rem rgba(213,201,37,0.5)}.btn-danger{color:#fff;background-color:#F57A00;border-color:#F57A00}.btn-danger:hover{color:#fff;background-color:#cf6700;border-color:#c26100}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#cf6700;border-color:#c26100;-webkit-box-shadow:0 0 0 0.2rem rgba(247,142,38,0.5);box-shadow:0 0 0 0.2rem rgba(247,142,38,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#F57A00;border-color:#F57A00}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c26100;border-color:#b55a00}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(247,142,38,0.5);box-shadow:0 0 0 0.2rem rgba(247,142,38,0.5)}.btn-light{color:#222;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#222;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{color:#222;background-color:#e2e6ea;border-color:#dae0e5;-webkit-box-shadow:0 0 0 0.2rem rgba(216,217,218,0.5);box-shadow:0 0 0 0.2rem rgba(216,217,218,0.5)}.btn-light.disabled,.btn-light:disabled{color:#222;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#222;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(216,217,218,0.5);box-shadow:0 0 0 0.2rem rgba(216,217,218,0.5)}.btn-dark{color:#fff;background-color:#222;border-color:#222}.btn-dark:hover{color:#fff;background-color:#0f0f0f;border-color:#090808}.btn-dark:focus,.btn-dark.focus{color:#fff;background-color:#0f0f0f;border-color:#090808;-webkit-box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5);box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#222;border-color:#222}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#090808;border-color:#020202}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5);box-shadow:0 0 0 0.2rem rgba(67,67,67,0.5)}.btn-outline-primary{color:#EB6864;border-color:#EB6864}.btn-outline-primary:hover{color:#fff;background-color:#EB6864;border-color:#EB6864}.btn-outline-primary:focus,.btn-outline-primary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.5);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#EB6864;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#EB6864;border-color:#EB6864}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.5);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.5)}.btn-outline-secondary{color:#aaa;border-color:#aaa}.btn-outline-secondary:hover{color:#222;background-color:#aaa;border-color:#aaa}.btn-outline-secondary:focus,.btn-outline-secondary.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(170,170,170,0.5);box-shadow:0 0 0 0.2rem rgba(170,170,170,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#aaa;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#222;background-color:#aaa;border-color:#aaa}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(170,170,170,0.5);box-shadow:0 0 0 0.2rem rgba(170,170,170,0.5)}.btn-outline-success{color:#22B24C;border-color:#22B24C}.btn-outline-success:hover{color:#fff;background-color:#22B24C;border-color:#22B24C}.btn-outline-success:focus,.btn-outline-success.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(34,178,76,0.5);box-shadow:0 0 0 0.2rem rgba(34,178,76,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#22B24C;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#22B24C;border-color:#22B24C}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(34,178,76,0.5);box-shadow:0 0 0 0.2rem rgba(34,178,76,0.5)}.btn-outline-info{color:#369;border-color:#369}.btn-outline-info:hover{color:#fff;background-color:#369;border-color:#369}.btn-outline-info:focus,.btn-outline-info.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(51,102,153,0.5);box-shadow:0 0 0 0.2rem rgba(51,102,153,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#369;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#369;border-color:#369}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(51,102,153,0.5);box-shadow:0 0 0 0.2rem rgba(51,102,153,0.5)}.btn-outline-warning{color:#F5E625;border-color:#F5E625}.btn-outline-warning:hover{color:#222;background-color:#F5E625;border-color:#F5E625}.btn-outline-warning:focus,.btn-outline-warning.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(245,230,37,0.5);box-shadow:0 0 0 0.2rem rgba(245,230,37,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#F5E625;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#222;background-color:#F5E625;border-color:#F5E625}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(245,230,37,0.5);box-shadow:0 0 0 0.2rem rgba(245,230,37,0.5)}.btn-outline-danger{color:#F57A00;border-color:#F57A00}.btn-outline-danger:hover{color:#fff;background-color:#F57A00;border-color:#F57A00}.btn-outline-danger:focus,.btn-outline-danger.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(245,122,0,0.5);box-shadow:0 0 0 0.2rem rgba(245,122,0,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#F57A00;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#F57A00;border-color:#F57A00}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(245,122,0,0.5);box-shadow:0 0 0 0.2rem rgba(245,122,0,0.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#222;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#222;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.btn-outline-dark{color:#222;border-color:#222}.btn-outline-dark:hover{color:#fff;background-color:#222;border-color:#222}.btn-outline-dark:focus,.btn-outline-dark.focus{-webkit-box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5);box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#222;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#222;border-color:#222}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5);box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5)}.btn-link{font-weight:400;color:#EB6864;text-decoration:none}.btn-link:hover{color:#e22620;text-decoration:underline}.btn-link:focus,.btn-link.focus{text-decoration:underline;-webkit-box-shadow:none;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#777;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}.btn-sm,.btn-group-sm>.btn{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:0.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}@media (prefers-reduced-motion: reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{-webkit-transition:none;transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid;border-right:0.3em solid transparent;border-bottom:0;border-left:0.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:0.5rem 0;margin:0.125rem 0 0;font-size:1rem;color:#222;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:0.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width: 576px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width: 768px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width: 992px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width: 1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:0.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0;border-right:0.3em solid transparent;border-bottom:0.3em solid;border-left:0.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:0.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0;border-bottom:0.3em solid transparent;border-left:0.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:0.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:0.255em;vertical-align:0.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:0.255em;vertical-align:0.255em;content:"";border-top:0.3em solid transparent;border-right:0.3em solid;border-bottom:0.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^="top"],.dropdown-menu[x-placement^="right"],.dropdown-menu[x-placement^="bottom"],.dropdown-menu[x-placement^="left"]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:0.5rem 0;overflow:hidden;border-top:1px solid #eee}.dropdown-item{display:block;width:100%;padding:0.25rem 1.5rem;clear:both;font-weight:400;color:#222;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#151515;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#EB6864}.dropdown-item.disabled,.dropdown-item:disabled{color:#777;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:0.5rem 1.5rem;margin-bottom:0;font-size:0.875rem;color:#777;white-space:nowrap}.dropdown-item-text{display:block;padding:0.25rem 1.5rem;color:#222}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:0.375rem;padding-left:0.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:0.75rem;padding-left:0.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%;min-width:0;margin-bottom:0}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.form-control-plaintext+.form-control,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file .custom-file-input:focus ~ .custom-file-label{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn:focus,.input-group-append .btn:focus{z-index:3}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.375rem 1rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#eee;border:1px solid #ced4da;border-radius:0.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group-lg>.form-control:not(textarea),.input-group-lg>.custom-select{height:calc(1.5em + 1rem + 2px)}.input-group-lg>.form-control,.input-group-lg>.custom-select,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:0.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:0.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + 0.5rem + 2px)}.input-group-sm>.form-control,.input-group-sm>.custom-select,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5;border-radius:0.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:2rem}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;border-color:#EB6864;background-color:#EB6864}.custom-control-input:focus ~ .custom-control-label::before{-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25)}.custom-control-input:focus:not(:checked) ~ .custom-control-label::before{border-color:#fad6d5}.custom-control-input:not(:disabled):active ~ .custom-control-label::before{color:#fff;background-color:white;border-color:white}.custom-control-input[disabled] ~ .custom-control-label{color:#777}.custom-control-input[disabled] ~ .custom-control-label::before{background-color:#eee}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:0.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#aaa solid 1px}.custom-control-label::after{position:absolute;top:0.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50% / 50% 50%}.custom-checkbox .custom-control-label::before{border-radius:0.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{border-color:#EB6864;background-color:#EB6864}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(235,104,100,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(235,104,100,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(235,104,100,0.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:0.5rem}.custom-switch .custom-control-label::after{top:calc(0.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#aaa;border-radius:0.5rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-switch .custom-control-label::after{-webkit-transition:none;transition:none}}.custom-switch .custom-control-input:checked ~ .custom-control-label::after{background-color:#fff;-webkit-transform:translateX(0.75rem);transform:translateX(0.75rem)}.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(235,104,100,0.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 2rem 0.375rem 1rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 1rem center/8px 10px;border:1px solid #ced4da;border-radius:0.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#fad6d5;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:1rem;background-image:none}.custom-select:disabled{color:#777;background-color:#eee}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + 0.5rem + 2px);padding-top:0.25rem;padding-bottom:0.25rem;padding-left:0.5rem;font-size:0.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:0.5rem;padding-bottom:0.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + 0.75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + 0.75rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-label{border-color:#fad6d5;-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25)}.custom-file-input[disabled] ~ .custom-file-label{background-color:#eee}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-input ~ .custom-file-label[data-browse]::after{content:attr(data-browse)}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(1.5em + 0.75rem + 2px);padding:0.375rem 1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:0.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + 0.75rem);padding:0.375rem 1rem;line-height:1.5;color:#495057;content:"Browse";background-color:#eee;border-left:inherit;border-radius:0 0.25rem 0.25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(235,104,100,0.25);box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(235,104,100,0.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(235,104,100,0.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 0.2rem rgba(235,104,100,0.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;background-color:#EB6864;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:white}.custom-range::-webkit-slider-runnable-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#EB6864;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:white}.custom-range::-moz-range-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:0.2rem;margin-left:0.2rem;background-color:#EB6864;border:0;border-radius:1rem;-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:white}.custom-range::-ms-track{width:100%;height:0.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:0.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.custom-range:disabled::-webkit-slider-thumb{background-color:#aaa}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#aaa}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#aaa}.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.custom-control-label::before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:0.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#777;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#eee #eee #dee2e6}.nav-tabs .nav-link.disabled{color:#777;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:0.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#EB6864}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:0.3125rem;padding-bottom:0.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:0.5rem;padding-bottom:0.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:0.25rem 0.75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:0.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:0.5rem;padding-left:0.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:#000}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:#000}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:#000}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:#000}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.7)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.7)}.navbar-light .navbar-text a{color:#000}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:#000}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:0.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:0.75rem}.card-subtitle{margin-top:-0.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:0.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:0.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.card-header-tabs{margin-right:-0.625rem;margin-bottom:-0.75rem;margin-left:-0.625rem;border-bottom:0}.card-header-pills{margin-right:-0.625rem;margin-left:-0.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img,.card-img-top,.card-img-bottom{-ms-flex-negative:0;flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(0.25rem - 1px);border-bottom-left-radius:calc(0.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:0.75rem}@media (min-width: 576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:0.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eee;border-radius:0.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:0.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:0.5rem;color:#777;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#777}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:0.25rem}.page-link{position:relative;display:block;padding:0.5rem 0.75rem;margin-left:-1px;line-height:1.25;color:#EB6864;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#fff;text-decoration:none;background-color:#EB6864;border-color:#EB6864}.page-link:focus{z-index:3;outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:0.25rem;border-bottom-left-radius:0.25rem}.page-item:last-child .page-link{border-top-right-radius:0.25rem;border-bottom-right-radius:0.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#EB6864;border-color:#EB6864}.page-item.disabled .page-link{color:#777;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:0.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:0.3rem;border-bottom-left-radius:0.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:0.3rem;border-bottom-right-radius:0.3rem}.pagination-sm .page-link{padding:0.25rem 0.5rem;font-size:0.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:0.2rem;border-bottom-left-radius:0.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:0.2rem;border-bottom-right-radius:0.2rem}.badge{display:inline-block;padding:0.25em 0.4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:0.25rem;-webkit-transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;transition:color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.badge{-webkit-transition:none;transition:none}}a.badge:hover,a.badge:focus{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:0.6em;padding-left:0.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#EB6864}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#e53c37}a.badge-primary:focus,a.badge-primary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(235,104,100,0.5);box-shadow:0 0 0 0.2rem rgba(235,104,100,0.5)}.badge-secondary{color:#222;background-color:#aaa}a.badge-secondary:hover,a.badge-secondary:focus{color:#222;background-color:#919090}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(170,170,170,0.5);box-shadow:0 0 0 0.2rem rgba(170,170,170,0.5)}.badge-success{color:#fff;background-color:#22B24C}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#1a873a}a.badge-success:focus,a.badge-success.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(34,178,76,0.5);box-shadow:0 0 0 0.2rem rgba(34,178,76,0.5)}.badge-info{color:#fff;background-color:#369}a.badge-info:hover,a.badge-info:focus{color:#fff;background-color:#264d73}a.badge-info:focus,a.badge-info.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(51,102,153,0.5);box-shadow:0 0 0 0.2rem rgba(51,102,153,0.5)}.badge-warning{color:#222;background-color:#F5E625}a.badge-warning:hover,a.badge-warning:focus{color:#222;background-color:#ddce0a}a.badge-warning:focus,a.badge-warning.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(245,230,37,0.5);box-shadow:0 0 0 0.2rem rgba(245,230,37,0.5)}.badge-danger{color:#fff;background-color:#F57A00}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#c26100}a.badge-danger:focus,a.badge-danger.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(245,122,0,0.5);box-shadow:0 0 0 0.2rem rgba(245,122,0,0.5)}.badge-light{color:#222;background-color:#f8f9fa}a.badge-light:hover,a.badge-light:focus{color:#222;background-color:#dae0e5}a.badge-light:focus,a.badge-light.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5);box-shadow:0 0 0 0.2rem rgba(248,249,250,0.5)}.badge-dark{color:#fff;background-color:#222}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#090808}a.badge-dark:focus,a.badge-dark.focus{outline:0;-webkit-box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5);box-shadow:0 0 0 0.2rem rgba(34,34,34,0.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eee;border-radius:0.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:0.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:0.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:0.75rem 1.25rem;color:inherit}.alert-primary{color:#7a3634;background-color:#fbe1e0;border-color:#f9d5d4}.alert-primary hr{border-top-color:#f6bfbe}.alert-primary .alert-link{color:#562625}.alert-secondary{color:#585858;background-color:#eeeeee;border-color:#e7e7e7}.alert-secondary hr{border-top-color:#dadada}.alert-secondary .alert-link{color:#3f3e3e}.alert-success{color:#125d28;background-color:#d3f0db;border-color:#c1e9cd}.alert-success hr{border-top-color:#aee2be}.alert-success .alert-link{color:#0a3216}.alert-info{color:#1b3550;background-color:#d6e0eb;border-color:#c6d4e2}.alert-info hr{border-top-color:#b5c7d9}.alert-info .alert-link{color:#0e1c2a}.alert-warning{color:#7f7813;background-color:#fdfad3;border-color:#fcf8c2}.alert-warning hr{border-top-color:#fbf5aa}.alert-warning .alert-link{color:#534e0c}.alert-danger{color:#7f3f00;background-color:#fde4cc;border-color:#fcdab8}.alert-danger hr{border-top-color:#fbcda0}.alert-danger .alert-link{color:#4c2600}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#121212;background-color:lightgray;border-color:#c1c1c1}.alert-dark hr{border-top-color:#b4b4b4}.alert-dark .alert-link{color:black}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:0.75rem;background-color:#eee;border-radius:0.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#EB6864;-webkit-transition:width 0.6s ease;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion: reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#222;background-color:#eee}.list-group-item{position:relative;display:block;padding:0.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:0.25rem;border-top-right-radius:0.25rem}.list-group-item:last-child{border-bottom-right-radius:0.25rem;border-bottom-left-radius:0.25rem}.list-group-item.disabled,.list-group-item:disabled{color:#777;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#EB6864;border-color:#EB6864}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal .list-group-item.active{margin-top:0}.list-group-horizontal .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-sm .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-sm .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm .list-group-item.active{margin-top:0}.list-group-horizontal-sm .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-md .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-md .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-md .list-group-item.active{margin-top:0}.list-group-horizontal-md .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-lg .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-lg .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg .list-group-item.active{margin-top:0}.list-group-horizontal-lg .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal-xl .list-group-item:first-child{border-bottom-left-radius:0.25rem;border-top-right-radius:0}.list-group-horizontal-xl .list-group-item:last-child{border-top-right-radius:0.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl .list-group-item.active{margin-top:0}.list-group-horizontal-xl .list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl .list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush .list-group-item{border-right-width:0;border-left-width:0;border-radius:0}.list-group-flush .list-group-item:first-child{border-top-width:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#7a3634;background-color:#f9d5d4}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#7a3634;background-color:#f6bfbe}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#7a3634;border-color:#7a3634}.list-group-item-secondary{color:#585858;background-color:#e7e7e7}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#585858;background-color:#dadada}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#585858;border-color:#585858}.list-group-item-success{color:#125d28;background-color:#c1e9cd}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#125d28;background-color:#aee2be}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#125d28;border-color:#125d28}.list-group-item-info{color:#1b3550;background-color:#c6d4e2}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#1b3550;background-color:#b5c7d9}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#1b3550;border-color:#1b3550}.list-group-item-warning{color:#7f7813;background-color:#fcf8c2}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#7f7813;background-color:#fbf5aa}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#7f7813;border-color:#7f7813}.list-group-item-danger{color:#7f3f00;background-color:#fcdab8}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#7f3f00;background-color:#fbcda0}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#7f3f00;border-color:#7f3f00}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#121212;background-color:#c1c1c1}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#121212;background-color:#b4b4b4}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#121212;border-color:#121212}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}a.close.disabled{pointer-events:none}.toast{max-width:350px;overflow:hidden;font-size:0.875rem;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);-webkit-box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);box-shadow:0 0.25rem 0.75rem rgba(0,0,0,0.1);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:0.25rem}.toast:not(:last-child){margin-bottom:0.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0.25rem 0.75rem;color:#777;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05)}.toast-body{padding:0.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:0.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform 0.3s ease-out;transition:-webkit-transform 0.3s ease-out;transition:transform 0.3s ease-out;transition:transform 0.3s ease-out, -webkit-transform 0.3s ease-out;-webkit-transform:translate(0, -50px);transform:translate(0, -50px)}@media (prefers-reduced-motion: reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);transform:scale(1.02)}.modal-dialog-scrollable{display:-webkit-box;display:-ms-flexbox;display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-header,.modal-dialog-scrollable .modal-footer{-ms-flex-negative:0;flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);content:""}.modal-dialog-centered.modal-dialog-scrollable{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable::before{content:none}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:0.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.modal-header .close{padding:1rem 1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:0.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(0.3rem - 1px);border-bottom-left-radius:calc(0.3rem - 1px)}.modal-footer>*{margin:0.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered::before{height:calc(100vh - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:0.9}.tooltip .arrow{position:absolute;display:block;width:0.8rem;height:0.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:0.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:0.4rem 0.4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 0.4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:0.4rem;height:0.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:0.4rem 0.4rem 0.4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:0.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 0.4rem 0.4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 0.4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:0.4rem;height:0.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:0.4rem 0 0.4rem 0.4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:0.25rem 0.5rem;color:#fff;text-align:center;background-color:#000;border-radius:0.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:0.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:0.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:0.5rem;margin:0 0.3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:0.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^="top"]>.arrow{bottom:calc(-0.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^="top"]>.arrow::before{bottom:0;border-width:0.5rem 0.5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^="top"]>.arrow::after{bottom:1px;border-width:0.5rem 0.5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:0.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^="right"]>.arrow{left:calc(-0.5rem - 1px);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^="right"]>.arrow::before{left:0;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^="right"]>.arrow::after{left:1px;border-width:0.5rem 0.5rem 0.5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:0.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^="bottom"]>.arrow{top:calc(-0.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^="bottom"]>.arrow::before{top:0;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^="bottom"]>.arrow::after{top:1px;border-width:0 0.5rem 0.5rem 0.5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-0.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:0.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^="left"]>.arrow{right:calc(-0.5rem - 1px);width:0.5rem;height:1rem;margin:0.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^="left"]>.arrow::before{right:0;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^="left"]>.arrow::after{right:1px;border-width:0.5rem 0 0.5rem 0.5rem;border-left-color:#fff}.popover-header{padding:0.5rem 0.75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(0.3rem - 1px);border-top-right-radius:calc(0.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:0.5rem 0.75rem;color:#222}.carousel{position:relative}.carousel.pointer-event{-ms-touch-action:pan-y;touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform 0.6s ease-in-out;transition:-webkit-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{-webkit-transform:translateX(100%);transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transition-property:opacity;transition-property:opacity;-webkit-transform:none;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;-webkit-transition:opacity 0s 0.6s;transition:opacity 0s 0.6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{-webkit-transition:none;transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:0.5;-webkit-transition:opacity 0.15s ease;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{-webkit-transition:none;transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:0.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:no-repeat 50% / 100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;-webkit-transition:opacity 0.6s ease;transition:opacity 0.6s ease}@media (prefers-reduced-motion: reduce){.carousel-indicators li{-webkit-transition:none;transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spinner-border{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:0.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:0.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#EB6864 !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#e53c37 !important}.bg-secondary{background-color:#aaa !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#919090 !important}.bg-success{background-color:#22B24C !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1a873a !important}.bg-info{background-color:#369 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#264d73 !important}.bg-warning{background-color:#F5E625 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#ddce0a !important}.bg-danger{background-color:#F57A00 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#c26100 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#222 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#090808 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#EB6864 !important}.border-secondary{border-color:#aaa !important}.border-success{border-color:#22B24C !important}.border-info{border-color:#369 !important}.border-warning{border-color:#F5E625 !important}.border-danger{border-color:#F57A00 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#222 !important}.border-white{border-color:#fff !important}.rounded-sm{border-radius:0.2rem !important}.rounded{border-radius:0.25rem !important}.rounded-top{border-top-left-radius:0.25rem !important;border-top-right-radius:0.25rem !important}.rounded-right{border-top-right-radius:0.25rem !important;border-bottom-right-radius:0.25rem !important}.rounded-bottom{border-bottom-right-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-left{border-top-left-radius:0.25rem !important;border-bottom-left-radius:0.25rem !important}.rounded-lg{border-radius:0.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:-webkit-box !important;display:-ms-flexbox !important;display:flex !important}.d-print-inline-flex{display:-webkit-inline-box !important;display:-ms-inline-flexbox !important;display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.8571428571%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-sm-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-sm-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-sm-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-sm-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-sm-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-sm-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-sm-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-sm-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-sm-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-sm-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-sm-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-sm-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-sm-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-sm-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-sm-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-sm-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-sm-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-sm-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-sm-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-sm-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-sm-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-sm-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-sm-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-sm-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-sm-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-sm-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-sm-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-md-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-md-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-md-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-md-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-md-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-md-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-md-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-md-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-md-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-md-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-md-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-md-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-md-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-md-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-md-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-md-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-md-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-md-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-md-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-md-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-md-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-md-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-md-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-md-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-md-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-md-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-md-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-lg-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-lg-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-lg-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-lg-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-lg-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-lg-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-lg-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-lg-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-lg-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-lg-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-lg-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-lg-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-lg-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-lg-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-lg-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-lg-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-lg-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-lg-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-lg-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-lg-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-lg-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-lg-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-lg-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-lg-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-lg-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-lg-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-lg-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-ms-flex-direction:row !important;flex-direction:row !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-ms-flex-direction:column !important;flex-direction:column !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-ms-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column-reverse{-webkit-box-orient:vertical !important;-webkit-box-direction:reverse !important;-ms-flex-direction:column-reverse !important;flex-direction:column-reverse !important}.flex-xl-wrap{-ms-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-ms-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse !important;flex-wrap:wrap-reverse !important}.flex-xl-fill{-webkit-box-flex:1 !important;-ms-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-grow-0{-webkit-box-flex:0 !important;-ms-flex-positive:0 !important;flex-grow:0 !important}.flex-xl-grow-1{-webkit-box-flex:1 !important;-ms-flex-positive:1 !important;flex-grow:1 !important}.flex-xl-shrink-0{-ms-flex-negative:0 !important;flex-shrink:0 !important}.flex-xl-shrink-1{-ms-flex-negative:1 !important;flex-shrink:1 !important}.justify-content-xl-start{-webkit-box-pack:start !important;-ms-flex-pack:start !important;justify-content:flex-start !important}.justify-content-xl-end{-webkit-box-pack:end !important;-ms-flex-pack:end !important;justify-content:flex-end !important}.justify-content-xl-center{-webkit-box-pack:center !important;-ms-flex-pack:center !important;justify-content:center !important}.justify-content-xl-between{-webkit-box-pack:justify !important;-ms-flex-pack:justify !important;justify-content:space-between !important}.justify-content-xl-around{-ms-flex-pack:distribute !important;justify-content:space-around !important}.align-items-xl-start{-webkit-box-align:start !important;-ms-flex-align:start !important;align-items:flex-start !important}.align-items-xl-end{-webkit-box-align:end !important;-ms-flex-align:end !important;align-items:flex-end !important}.align-items-xl-center{-webkit-box-align:center !important;-ms-flex-align:center !important;align-items:center !important}.align-items-xl-baseline{-webkit-box-align:baseline !important;-ms-flex-align:baseline !important;align-items:baseline !important}.align-items-xl-stretch{-webkit-box-align:stretch !important;-ms-flex-align:stretch !important;align-items:stretch !important}.align-content-xl-start{-ms-flex-line-pack:start !important;align-content:flex-start !important}.align-content-xl-end{-ms-flex-line-pack:end !important;align-content:flex-end !important}.align-content-xl-center{-ms-flex-line-pack:center !important;align-content:center !important}.align-content-xl-between{-ms-flex-line-pack:justify !important;align-content:space-between !important}.align-content-xl-around{-ms-flex-line-pack:distribute !important;align-content:space-around !important}.align-content-xl-stretch{-ms-flex-line-pack:stretch !important;align-content:stretch !important}.align-self-xl-auto{-ms-flex-item-align:auto !important;align-self:auto !important}.align-self-xl-start{-ms-flex-item-align:start !important;align-self:flex-start !important}.align-self-xl-end{-ms-flex-item-align:end !important;align-self:flex-end !important}.align-self-xl-center{-ms-flex-item-align:center !important;align-self:center !important}.align-self-xl-baseline{-ms-flex-item-align:baseline !important;align-self:baseline !important}.align-self-xl-stretch{-ms-flex-item-align:stretch !important;align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:-webkit-sticky !important;position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: -webkit-sticky) or (position: sticky){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important;box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow{-webkit-box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important;box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important;box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{-webkit-box-shadow:none !important;box-shadow:none !important}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.min-vw-100{min-width:100vw !important}.min-vh-100{min-height:100vh !important}.vw-100{width:100vw !important}.vh-100{height:100vh !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:rgba(0,0,0,0)}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:0.25rem !important}.mt-1,.my-1{margin-top:0.25rem !important}.mr-1,.mx-1{margin-right:0.25rem !important}.mb-1,.my-1{margin-bottom:0.25rem !important}.ml-1,.mx-1{margin-left:0.25rem !important}.m-2{margin:0.5rem !important}.mt-2,.my-2{margin-top:0.5rem !important}.mr-2,.mx-2{margin-right:0.5rem !important}.mb-2,.my-2{margin-bottom:0.5rem !important}.ml-2,.mx-2{margin-left:0.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:0.25rem !important}.pt-1,.py-1{padding-top:0.25rem !important}.pr-1,.px-1{padding-right:0.25rem !important}.pb-1,.py-1{padding-bottom:0.25rem !important}.pl-1,.px-1{padding-left:0.25rem !important}.p-2{padding:0.5rem !important}.pt-2,.py-2{padding-top:0.5rem !important}.pr-2,.px-2{padding-right:0.5rem !important}.pb-2,.py-2{padding-bottom:0.5rem !important}.pl-2,.px-2{padding-left:0.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-n1{margin:-0.25rem !important}.mt-n1,.my-n1{margin-top:-0.25rem !important}.mr-n1,.mx-n1{margin-right:-0.25rem !important}.mb-n1,.my-n1{margin-bottom:-0.25rem !important}.ml-n1,.mx-n1{margin-left:-0.25rem !important}.m-n2{margin:-0.5rem !important}.mt-n2,.my-n2{margin-top:-0.5rem !important}.mr-n2,.mx-n2{margin-right:-0.5rem !important}.mb-n2,.my-n2{margin-bottom:-0.5rem !important}.ml-n2,.mx-n2{margin-left:-0.5rem !important}.m-n3{margin:-1rem !important}.mt-n3,.my-n3{margin-top:-1rem !important}.mr-n3,.mx-n3{margin-right:-1rem !important}.mb-n3,.my-n3{margin-bottom:-1rem !important}.ml-n3,.mx-n3{margin-left:-1rem !important}.m-n4{margin:-1.5rem !important}.mt-n4,.my-n4{margin-top:-1.5rem !important}.mr-n4,.mx-n4{margin-right:-1.5rem !important}.mb-n4,.my-n4{margin-bottom:-1.5rem !important}.ml-n4,.mx-n4{margin-left:-1.5rem !important}.m-n5{margin:-3rem !important}.mt-n5,.my-n5{margin-top:-3rem !important}.mr-n5,.mx-n5{margin-right:-3rem !important}.mb-n5,.my-n5{margin-bottom:-3rem !important}.ml-n5,.mx-n5{margin-left:-3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:0.25rem !important}.mt-sm-1,.my-sm-1{margin-top:0.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:0.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:0.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:0.25rem !important}.m-sm-2{margin:0.5rem !important}.mt-sm-2,.my-sm-2{margin-top:0.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:0.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:0.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:0.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:0.25rem !important}.pt-sm-1,.py-sm-1{padding-top:0.25rem !important}.pr-sm-1,.px-sm-1{padding-right:0.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:0.25rem !important}.pl-sm-1,.px-sm-1{padding-left:0.25rem !important}.p-sm-2{padding:0.5rem !important}.pt-sm-2,.py-sm-2{padding-top:0.5rem !important}.pr-sm-2,.px-sm-2{padding-right:0.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:0.5rem !important}.pl-sm-2,.px-sm-2{padding-left:0.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-n1{margin:-0.25rem !important}.mt-sm-n1,.my-sm-n1{margin-top:-0.25rem !important}.mr-sm-n1,.mx-sm-n1{margin-right:-0.25rem !important}.mb-sm-n1,.my-sm-n1{margin-bottom:-0.25rem !important}.ml-sm-n1,.mx-sm-n1{margin-left:-0.25rem !important}.m-sm-n2{margin:-0.5rem !important}.mt-sm-n2,.my-sm-n2{margin-top:-0.5rem !important}.mr-sm-n2,.mx-sm-n2{margin-right:-0.5rem !important}.mb-sm-n2,.my-sm-n2{margin-bottom:-0.5rem !important}.ml-sm-n2,.mx-sm-n2{margin-left:-0.5rem !important}.m-sm-n3{margin:-1rem !important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem !important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem !important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem !important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem !important}.m-sm-n4{margin:-1.5rem !important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem !important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem !important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem !important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem !important}.m-sm-n5{margin:-3rem !important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem !important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem !important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem !important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:0.25rem !important}.mt-md-1,.my-md-1{margin-top:0.25rem !important}.mr-md-1,.mx-md-1{margin-right:0.25rem !important}.mb-md-1,.my-md-1{margin-bottom:0.25rem !important}.ml-md-1,.mx-md-1{margin-left:0.25rem !important}.m-md-2{margin:0.5rem !important}.mt-md-2,.my-md-2{margin-top:0.5rem !important}.mr-md-2,.mx-md-2{margin-right:0.5rem !important}.mb-md-2,.my-md-2{margin-bottom:0.5rem !important}.ml-md-2,.mx-md-2{margin-left:0.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:0.25rem !important}.pt-md-1,.py-md-1{padding-top:0.25rem !important}.pr-md-1,.px-md-1{padding-right:0.25rem !important}.pb-md-1,.py-md-1{padding-bottom:0.25rem !important}.pl-md-1,.px-md-1{padding-left:0.25rem !important}.p-md-2{padding:0.5rem !important}.pt-md-2,.py-md-2{padding-top:0.5rem !important}.pr-md-2,.px-md-2{padding-right:0.5rem !important}.pb-md-2,.py-md-2{padding-bottom:0.5rem !important}.pl-md-2,.px-md-2{padding-left:0.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-n1{margin:-0.25rem !important}.mt-md-n1,.my-md-n1{margin-top:-0.25rem !important}.mr-md-n1,.mx-md-n1{margin-right:-0.25rem !important}.mb-md-n1,.my-md-n1{margin-bottom:-0.25rem !important}.ml-md-n1,.mx-md-n1{margin-left:-0.25rem !important}.m-md-n2{margin:-0.5rem !important}.mt-md-n2,.my-md-n2{margin-top:-0.5rem !important}.mr-md-n2,.mx-md-n2{margin-right:-0.5rem !important}.mb-md-n2,.my-md-n2{margin-bottom:-0.5rem !important}.ml-md-n2,.mx-md-n2{margin-left:-0.5rem !important}.m-md-n3{margin:-1rem !important}.mt-md-n3,.my-md-n3{margin-top:-1rem !important}.mr-md-n3,.mx-md-n3{margin-right:-1rem !important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem !important}.ml-md-n3,.mx-md-n3{margin-left:-1rem !important}.m-md-n4{margin:-1.5rem !important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem !important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem !important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem !important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem !important}.m-md-n5{margin:-3rem !important}.mt-md-n5,.my-md-n5{margin-top:-3rem !important}.mr-md-n5,.mx-md-n5{margin-right:-3rem !important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem !important}.ml-md-n5,.mx-md-n5{margin-left:-3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:0.25rem !important}.mt-lg-1,.my-lg-1{margin-top:0.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:0.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:0.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:0.25rem !important}.m-lg-2{margin:0.5rem !important}.mt-lg-2,.my-lg-2{margin-top:0.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:0.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:0.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:0.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:0.25rem !important}.pt-lg-1,.py-lg-1{padding-top:0.25rem !important}.pr-lg-1,.px-lg-1{padding-right:0.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:0.25rem !important}.pl-lg-1,.px-lg-1{padding-left:0.25rem !important}.p-lg-2{padding:0.5rem !important}.pt-lg-2,.py-lg-2{padding-top:0.5rem !important}.pr-lg-2,.px-lg-2{padding-right:0.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:0.5rem !important}.pl-lg-2,.px-lg-2{padding-left:0.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-n1{margin:-0.25rem !important}.mt-lg-n1,.my-lg-n1{margin-top:-0.25rem !important}.mr-lg-n1,.mx-lg-n1{margin-right:-0.25rem !important}.mb-lg-n1,.my-lg-n1{margin-bottom:-0.25rem !important}.ml-lg-n1,.mx-lg-n1{margin-left:-0.25rem !important}.m-lg-n2{margin:-0.5rem !important}.mt-lg-n2,.my-lg-n2{margin-top:-0.5rem !important}.mr-lg-n2,.mx-lg-n2{margin-right:-0.5rem !important}.mb-lg-n2,.my-lg-n2{margin-bottom:-0.5rem !important}.ml-lg-n2,.mx-lg-n2{margin-left:-0.5rem !important}.m-lg-n3{margin:-1rem !important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem !important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem !important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem !important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem !important}.m-lg-n4{margin:-1.5rem !important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem !important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem !important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem !important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem !important}.m-lg-n5{margin:-3rem !important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem !important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem !important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem !important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:0.25rem !important}.mt-xl-1,.my-xl-1{margin-top:0.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:0.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:0.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:0.25rem !important}.m-xl-2{margin:0.5rem !important}.mt-xl-2,.my-xl-2{margin-top:0.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:0.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:0.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:0.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:0.25rem !important}.pt-xl-1,.py-xl-1{padding-top:0.25rem !important}.pr-xl-1,.px-xl-1{padding-right:0.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:0.25rem !important}.pl-xl-1,.px-xl-1{padding-left:0.25rem !important}.p-xl-2{padding:0.5rem !important}.pt-xl-2,.py-xl-2{padding-top:0.5rem !important}.pr-xl-2,.px-xl-2{padding-right:0.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:0.5rem !important}.pl-xl-2,.px-xl-2{padding-left:0.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-n1{margin:-0.25rem !important}.mt-xl-n1,.my-xl-n1{margin-top:-0.25rem !important}.mr-xl-n1,.mx-xl-n1{margin-right:-0.25rem !important}.mb-xl-n1,.my-xl-n1{margin-bottom:-0.25rem !important}.ml-xl-n1,.mx-xl-n1{margin-left:-0.25rem !important}.m-xl-n2{margin:-0.5rem !important}.mt-xl-n2,.my-xl-n2{margin-top:-0.5rem !important}.mr-xl-n2,.mx-xl-n2{margin-right:-0.5rem !important}.mb-xl-n2,.my-xl-n2{margin-bottom:-0.5rem !important}.ml-xl-n2,.mx-xl-n2{margin-left:-0.5rem !important}.m-xl-n3{margin:-1rem !important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem !important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem !important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem !important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem !important}.m-xl-n4{margin:-1.5rem !important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem !important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem !important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem !important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem !important}.m-xl-n5{margin:-3rem !important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem !important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem !important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem !important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-monospace{font-family:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important}.text-justify{text-align:justify !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-lighter{font-weight:lighter !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-weight-bolder{font-weight:bolder !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#EB6864 !important}a.text-primary:hover,a.text-primary:focus{color:#e22620 !important}.text-secondary{color:#aaa !important}a.text-secondary:hover,a.text-secondary:focus{color:#848484 !important}.text-success{color:#22B24C !important}a.text-success:hover,a.text-success:focus{color:#167231 !important}.text-info{color:#369 !important}a.text-info:hover,a.text-info:focus{color:#204060 !important}.text-warning{color:#F5E625 !important}a.text-warning:hover,a.text-warning:focus{color:#c4b709 !important}.text-danger{color:#F57A00 !important}a.text-danger:hover,a.text-danger:focus{color:#a95400 !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#cbd3da !important}.text-dark{color:#222 !important}a.text-dark:hover,a.text-dark:focus{color:black !important}.text-body{color:#222 !important}.text-muted{color:#777 !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none !important}.text-break{word-break:break-word !important;overflow-wrap:break-word !important}.text-reset{color:inherit !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;-webkit-box-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #aaa;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #dee2e6 !important}.table-dark{color:inherit}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}.bg-dark{background-color:#000 !important}.bg-light{background-color:#fff !important;color:#000;border:1px solid #eee}.bg-light.navbar-fixed-top{border-width:0 0 1px 0}.bg-light.navbar-fixed-bottom{border-width:1px 0 0 0}.navbar{font-size:18px;font-family:"News Cycle", "Arial Narrow Bold", sans-serif;font-weight:700}.navbar-brand{padding-top:0.5rem;font-size:inherit;font-weight:700;text-transform:uppercase}.btn{font-family:"News Cycle", "Arial Narrow Bold", sans-serif;font-weight:700}.btn-secondary,.btn-warning{color:#fff}.pagination a:hover{text-decoration:none} diff --git a/users/static/users/css/bs4_summernote.css b/users/static/users/css/bs4_summernote.css new file mode 100644 index 0000000..fd2baea --- /dev/null +++ b/users/static/users/css/bs4_summernote.css @@ -0,0 +1,291 @@ +/*! + * + * Super simple wysiwyg editor v0.8.16 + * https://summernote.org + * + * + * Copyright 2013- Alan Hong. and other contributors + * summernote may be freely distributed under the MIT license. + * + * Date: 2020-02-19T09:12Z + * + */ +@font-face { + font-family: "summernote"; + font-style: normal; + font-weight: 400; + font-display: auto; + src: url(font/summernote.eot); + src: url(font/summernote.eot?#iefix) format("embedded-opentype"), url(font/summernote.woff2) format("woff2"), url(font/summernote.woff) format("woff"), url(font/summernote.ttf) format("truetype");} + + +[class^="note-icon"]:before, +[class*=" note-icon"]:before { + display: inline-block; + font-family: summernote; + font-style: normal; + font-size: inherit; + text-decoration: inherit; + text-rendering: auto; + text-transform: none; + vertical-align: middle; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + speak: none; +} + + +.note-icon-fw { + text-align: center; + width: 1.25em; +} + +.note-icon-border { + border: solid 0.08em #eee; + border-radius: 0.1em; + padding: 0.2em 0.25em 0.15em; +} + +.note-icon-pull-left { + float: left; +} + +.note-icon-pull-right { + float: right; +} + +.note-icon.note-icon-pull-left { + margin-right: 0.3em; +} + +.note-icon.note-icon-pull-right { + margin-left: 0.3em; +} + + +.note-icon-align::before { + content: "\ea01"; +} + +.note-icon-align-center::before { + content: "\ea02"; +} + +.note-icon-align-indent::before { + content: "\ea03"; +} + +.note-icon-align-justify::before { + content: "\ea04"; +} + +.note-icon-align-left::before { + content: "\ea05"; +} + +.note-icon-align-outdent::before { + content: "\ea06"; +} + +.note-icon-align-right::before { + content: "\ea07"; +} + +.note-icon-arrow-circle-down::before { + content: "\ea08"; +} + +.note-icon-arrow-circle-left::before { + content: "\ea09"; +} + +.note-icon-arrow-circle-right::before { + content: "\ea0a"; +} + +.note-icon-arrow-circle-up::before { + content: "\ea0b"; +} + +.note-icon-arrows-alt::before { + content: "\ea0c"; +} + +.note-icon-arrows-h::before { + content: "\ea0d"; +} + +.note-icon-arrows-v::before { + content: "\ea0e"; +} + +.note-icon-bold::before { + content: "\ea0f"; +} + +.note-icon-caret::before { + content: "\ea10"; +} + +.note-icon-chain-broken::before { + content: "\ea11"; +} + +.note-icon-circle::before { + content: "\ea12"; +} + +.note-icon-close::before { + content: "\ea13"; +} + +.note-icon-code::before { + content: "\ea14"; +} + +.note-icon-col-after::before { + content: "\ea15"; +} + +.note-icon-col-before::before { + content: "\ea16"; +} + +.note-icon-col-remove::before { + content: "\ea17"; +} + +.note-icon-eraser::before { + content: "\ea18"; +} + +.note-icon-float-left::before { + content: "\ea19"; +} + +.note-icon-float-none::before { + content: "\ea1a"; +} + +.note-icon-float-right::before { + content: "\ea1b"; +} + +.note-icon-font::before { + content: "\ea1c"; +} + +.note-icon-frame::before { + content: "\ea1d"; +} + +.note-icon-italic::before { + content: "\ea1e"; +} + +.note-icon-link::before { + content: "\ea1f"; +} + +.note-icon-magic::before { + content: "\ea20"; +} + +.note-icon-menu-check::before { + content: "\ea21"; +} + +.note-icon-minus::before { + content: "\ea22"; +} + +.note-icon-orderedlist::before { + content: "\ea23"; +} + +.note-icon-pencil::before { + content: "\ea24"; +} + +.note-icon-picture::before { + content: "\ea25"; +} + +.note-icon-question::before { + content: "\ea26"; +} + +.note-icon-redo::before { + content: "\ea27"; +} + +.note-icon-rollback::before { + content: "\ea28"; +} + +.note-icon-row-above::before { + content: "\ea29"; +} + +.note-icon-row-below::before { + content: "\ea2a"; +} + +.note-icon-row-remove::before { + content: "\ea2b"; +} + +.note-icon-special-character::before { + content: "\ea2c"; +} + +.note-icon-square::before { + content: "\ea2d"; +} + +.note-icon-strikethrough::before { + content: "\ea2e"; +} + +.note-icon-subscript::before { + content: "\ea2f"; +} + +.note-icon-summernote::before { + content: "\ea30"; +} + +.note-icon-superscript::before { + content: "\ea31"; +} + +.note-icon-table::before { + content: "\ea32"; +} + +.note-icon-text-height::before { + content: "\ea33"; +} + +.note-icon-trash::before { + content: "\ea34"; +} + +.note-icon-underline::before { + content: "\ea35"; +} + +.note-icon-undo::before { + content: "\ea36"; +} + +.note-icon-unorderedlist::before { + content: "\ea37"; +} + +.note-icon-video::before { + content: "\ea38"; +} + + +.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;display:none;z-index:100;color:#87cefa;background-color:#fff;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;vertical-align:middle;text-align:center;font-size:28px;font-weight:700}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-frame,.note-editor.note-airframe{border:1px solid #a9a9a9}.note-editor.note-frame.codeview .note-editing-area .note-editable,.note-editor.note-airframe.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable,.note-editor.note-airframe.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area,.note-editor.note-airframe .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable,.note-editor.note-airframe .note-editing-area .note-editable{background-color:#fff;color:#000;padding:10px;overflow:auto;word-wrap:break-word}.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false]{background-color:#e5e5e5}.note-editor.note-frame .note-editing-area .note-codable,.note-editor.note-airframe .note-editing-area .note-codable{display:none;width:100%;padding:10px;border:none;box-shadow:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;resize:none;outline:none;-ms-box-sizing:border-box;box-sizing:border-box;border-radius:0;margin-bottom:0}.note-editor.note-frame.fullscreen,.note-editor.note-airframe.fullscreen{position:fixed;top:0;left:0;width:100% !important;z-index:1050}.note-editor.note-frame.fullscreen .note-editable,.note-editor.note-airframe.fullscreen .note-editable{background-color:#fff}.note-editor.note-frame.fullscreen .note-resizebar,.note-editor.note-airframe.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output,.note-editor.note-airframe .note-status-output{display:block;width:100%;font-size:14px;line-height:1.42857143;height:20px;margin-bottom:0;color:#000;border:0;border-top:1px solid #e2e2e2}.note-editor.note-frame .note-status-output:empty,.note-editor.note-airframe .note-status-output:empty{height:0;border-top:0 solid transparent}.note-editor.note-frame .note-status-output .pull-right,.note-editor.note-airframe .note-status-output .pull-right{float:right !important}.note-editor.note-frame .note-status-output .text-muted,.note-editor.note-airframe .note-status-output .text-muted{color:#777}.note-editor.note-frame .note-status-output .text-primary,.note-editor.note-airframe .note-status-output .text-primary{color:#286090}.note-editor.note-frame .note-status-output .text-success,.note-editor.note-airframe .note-status-output .text-success{color:#3c763d}.note-editor.note-frame .note-status-output .text-info,.note-editor.note-airframe .note-status-output .text-info{color:#31708f}.note-editor.note-frame .note-status-output .text-warning,.note-editor.note-airframe .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-frame .note-status-output .text-danger,.note-editor.note-airframe .note-status-output .text-danger{color:#a94442}.note-editor.note-frame .note-status-output .alert,.note-editor.note-airframe .note-status-output .alert{margin:-7px 0 0 0;padding:7px 10px 2px 10px;border-radius:0;color:#000;background-color:#f5f5f5}.note-editor.note-frame .note-status-output .alert .note-icon,.note-editor.note-airframe .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-frame .note-status-output .alert-success,.note-editor.note-airframe .note-status-output .alert-success{color:#3c763d !important;background-color:#dff0d8 !important}.note-editor.note-frame .note-status-output .alert-info,.note-editor.note-airframe .note-status-output .alert-info{color:#31708f !important;background-color:#d9edf7 !important}.note-editor.note-frame .note-status-output .alert-warning,.note-editor.note-airframe .note-status-output .alert-warning{color:#8a6d3b !important;background-color:#fcf8e3 !important}.note-editor.note-frame .note-status-output .alert-danger,.note-editor.note-airframe .note-status-output .alert-danger{color:#a94442 !important;background-color:#f2dede !important}.note-editor.note-frame .note-statusbar,.note-editor.note-airframe .note-statusbar{background-color:#f5f5f5;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #ddd}.note-editor.note-frame .note-statusbar .note-resizebar,.note-editor.note-airframe .note-statusbar .note-resizebar{padding-top:1px;height:9px;width:100%;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #a9a9a9}.note-editor.note-frame .note-statusbar.locked .note-resizebar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder,.note-editor.note-airframe .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px !important}.note-toolbar{position:relative}.note-popover .popover-content,.note-toolbar{margin:0;padding:0 0 5px 5px}.note-popover .popover-content>.note-btn-group,.note-toolbar>.note-btn-group{margin-top:5px;margin-left:0;margin-right:5px}.note-popover .popover-content .note-btn-group .note-table,.note-toolbar .note-btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker,.note-toolbar .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute !important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative !important;z-index:1;width:5em;height:5em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute !important;z-index:2;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.note-toolbar .note-style .dropdown-style blockquote,.note-toolbar .note-style .dropdown-style pre{margin:0;padding:5px 10px}.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.note-toolbar .note-style .dropdown-style h1,.note-toolbar .note-style .dropdown-style h2,.note-toolbar .note-style .dropdown-style h3,.note-toolbar .note-style .dropdown-style h4,.note-toolbar .note-style .dropdown-style h5,.note-toolbar .note-style .dropdown-style h6,.note-toolbar .note-style .dropdown-style p{margin:0;padding:0}.note-popover .popover-content .note-color-all .note-dropdown-menu,.note-toolbar .note-color-all .note-dropdown-menu{min-width:337px}.note-popover .popover-content .note-color .dropdown-toggle,.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette,.note-toolbar .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:160px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child,.note-toolbar .note-color .note-dropdown-menu .note-palette:first-child{margin:0 5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title{font-size:12px;margin:2px 7px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select{font-size:11px;margin:3px;padding:0 3px;cursor:pointer;width:100%;border-radius:5px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover{background:#eee}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row{height:20px}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-popover .popover-content .note-para .note-dropdown-menu,.note-toolbar .note-para .note-dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .note-dropdown-menu>div:first-child,.note-toolbar .note-para .note-dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .note-dropdown-menu,.note-toolbar .note-dropdown-menu{min-width:160px}.note-popover .popover-content .note-dropdown-menu.right,.note-toolbar .note-dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .note-dropdown-menu.right::before,.note-toolbar .note-dropdown-menu.right::before{right:9px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.right::after,.note-toolbar .note-dropdown-menu.right::after{right:10px;left:auto !important}.note-popover .popover-content .note-dropdown-menu.note-check a i,.note-toolbar .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-popover .popover-content .note-dropdown-menu.note-check a.checked i,.note-toolbar .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #fff}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-modal .modal-dialog{outline:0;border-radius:5px;box-shadow:0 3px 9px rgba(0,0,0,.5)}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{min-height:100px;font-size:30px;line-height:4;color:#d3d3d3;text-align:center;border:4px dashed #d3d3d3;margin-bottom:10px}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-sizing,.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:none;border-bottom:none}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:none;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:none;border-right:none}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:none;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;color:#fff;background-color:#000;font-size:12px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{padding:3px;max-height:150px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block !important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;white-space:nowrap;text-decoration:none;background-color:#428bca;outline:0;cursor:pointer} \ No newline at end of file diff --git a/users/static/users/css/colorPick.css b/users/static/users/css/colorPick.css new file mode 100644 index 0000000..9554afb --- /dev/null +++ b/users/static/users/css/colorPick.css @@ -0,0 +1,88 @@ +/*! +* +* ColorPick jQuery plugin +* https://github.com/philzet/ColorPick.js +* +* Copyright (c) 2017-2019 Phil Zet (a.k.a. Phil Zakharchenko) +* Licensed under the MIT License +* +*/ + +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 400; + src: local("Open Sans"), local("OpenSans"), + url(https://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3bO3LdcAZYWl9Si6vvxL-qU.woff) + format("woff"); +} +@font-face { + font-family: "Open Sans"; + font-style: normal; + font-weight: 700; + src: local("Open Sans Bold"), local("OpenSans-Bold"), + url(https://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzKRDOzjiPcYnFooOUGCOsRk.woff) + format("woff"); +} + +#colorPick * { + -webkit-transition: all linear 0.2s; + -moz-transition: all linear 0.2s; + -ms-transition: all linear 0.2s; + -o-transition: all linear 0.2s; + transition: all linear 0.2s; +} + +#colorPick { + background: rgba(255, 255, 255, 0.85); + -webkit-backdrop-filter: blur(15px); + position: absolute; + border-radius: 5px; + box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2); + padding: 15px; + font-family: "Open Sans", sans-serif; + width: 140px; +} + +#colorPick span { + font-size: 9pt; + text-transform: uppercase; + font-weight: bold; + color: #bbb; + margin-bottom: 5px; + display: block; + clear: both; +} + +.customColorHash { + border-radius: 5px; + height: 23px; + width: 122px; + margin: 1px 4px; + padding: 0 4px; + border: 1px solid #babbba; + outline: none; +} +.customColorHash.error { + border-color: #ff424c; + color: #ff424c; +} + +.colorPickButton { + border-radius: 5px; + width: 20px; + height: 20px; + margin: 0px 3px; + cursor: pointer; + display: inline-block; + border: thin solid #eee; +} + +.colorPickButton:hover { + transform: scale(1.1); +} + +.colorPickDummy { + background: #fff; + border: 1px dashed #bbb; +} diff --git a/users/static/users/css/colorPick.min.css b/users/static/users/css/colorPick.min.css new file mode 100644 index 0000000..8103d27 --- /dev/null +++ b/users/static/users/css/colorPick.min.css @@ -0,0 +1,10 @@ +/*! +* +* ColorPick jQuery plugin +* https://github.com/philzet/ColorPick.js +* +* Copyright (c) 2017-2019 Phil Zet (a.k.a. Phil Zakharchenko) +* Licensed under the MIT License +* +*/ +@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url(http://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3bO3LdcAZYWl9Si6vvxL-qU.woff) format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url(http://fonts.gstatic.com/s/opensans/v13/k3k702ZOKiLJc3WVjuplzKRDOzjiPcYnFooOUGCOsRk.woff) format('woff')}#colorPick *{-webkit-transition:all linear .2s;-moz-transition:all linear .2s;-ms-transition:all linear .2s;-o-transition:all linear .2s;transition:all linear .2s}#colorPick{background:rgba(255,255,255,.85);-webkit-backdrop-filter:blur(15px);position:absolute;border-radius:5px;box-shadow:0 3px 8px rgba(0,0,0,.2);padding:15px;font-family:"Open Sans",sans-serif;width:140px}#colorPick span{font-size:9pt;text-transform:uppercase;font-weight:700;color:#bbb;margin-bottom:5px;display:block;clear:both}.customColorHash{border-radius:5px;height:23px;width:122px;margin:1px 4px;padding:0 4px;border:1px solid #babbba;outline:0}.customColorHash.error{border-color:#ff424c;color:#ff424c}.colorPickButton{border-radius:5px;width:20px;height:20px;margin:0 3px;cursor:pointer;display:inline-block;border:thin solid #eee}.colorPickButton:hover{transform:scale(1.1)}.colorPickDummy{background:#fff;border:1px dashed #bbb} diff --git a/users/static/users/css/cropper.min.css b/users/static/users/css/cropper.min.css new file mode 100644 index 0000000..d870a67 --- /dev/null +++ b/users/static/users/css/cropper.min.css @@ -0,0 +1,9 @@ +/*! + * Cropper.js v1.5.6 + * https://fengyuanchen.github.io/cropperjs + * + * Copyright 2015-present Chen Fengyuan + * Released under the MIT license + * + * Date: 2019-10-04T04:33:44.164Z + */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:rgba(51,153,255,.75);overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed} \ No newline at end of file diff --git a/users/static/users/css/custom.css b/users/static/users/css/custom.css new file mode 100644 index 0000000..0523e77 --- /dev/null +++ b/users/static/users/css/custom.css @@ -0,0 +1,196 @@ +html { + font-family: 'Roboto' !important; + +} +html h6 { + font-family: 'Roboto' !important; + font-size: 1.0em; +} + +html h5 { + font-family: 'Roboto' !important; + font-size: 1.1em; +} + +html h4 { + font-family: 'Roboto' !important; + font-size: 1.3em; +} + +html h3 { + font-family: 'Roboto' !important; + font-size: 1.5em; +} + +html h2 { + font-family: 'Roboto' !important; + font-size: 1.7em; +} + +html h1 { + font-family: 'Roboto' !important; + font-size: 2em; +} +.sidenav { + height: 100%; /* Full-height: remove this if you want "auto" height */ + width: 160px; /* Set the width of the sidebar */ + position: fixed; /* Fixed Sidebar (stay in place on scroll) */ + z-index: 1; /* Stay on top */ + top: 0; /* Stay at the top */ + left: 0; + background-color: #111; /* Black */ + overflow-x: hidden; /* Disable horizontal scroll */ + padding-top: 20px; +} +/* On smaller screens, where height is less than 450px, change the style of the sidebar (less padding and a smaller font size) */ +@media screen and (max-height: 450px) { + .sidenav {padding-top: 15px;} + .sidenav a {font-size: 18px;} +} +.contentagainstnav{ + margin-left: 220px; +} +body{ + background-color: #f8f9fc; + padding-top: 70px; +} +.modal-open {overflow-y: auto} + +.preview { + overflow: hidden; + width: 200px; + height: 200px; +} + + .navbar{ + min-height: 50px; + margin-bottom: 20px; + } + + +.default_content_style { + margin-left: 212px !important; +} + +/* + PAGINATION +*/ +.paginate_button_custom { + padding: 0px !important; + font-size: 2em; +} + +/* + FOR TREE ORGA + +*/ + /*Now the CSS*/ +.profpic_orga { + max-width: 50px; +} + +.sidebar {margin: 0; padding: 0;} + + + +.tree ul { + padding-top: 20px; position: relative; + + transition: all 0.5s; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; +} + +.tree li { + float: left; text-align: center; + list-style-type: none; + position: relative; + padding: 20px 5px 0 5px; + transition: all 0.5s; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; +} + +/*We will use ::before and ::after to draw the connectors*/ + +.tree li::before, .tree li::after{ + content: ''; + position: absolute; top: 0; right: 50%; + border-top: 2px solid #ccc; + width: 50%; height: 20px; +} +.tree li::after{ + right: auto; left: 50%; + border-left: 2px solid #ccc; +} + +/*We need to remove left-right connectors from elements without +any siblings*/ +.tree li:only-child::after, .tree li:only-child::before { + display: none; +} + +/*Remove space from the top of single children*/ +.tree li:only-child{ padding-top: 0;} + +/*Remove left connector from first child and +right connector from last child*/ +.tree li:first-child::before, .tree li:last-child::after{ + border: 0 none; +} +/*Adding back the vertical connector to the last nodes*/ +.tree li:last-child::before{ + border-right: 2px solid #ccc; + border-radius: 0 5px 0 0; + -webkit-border-radius: 0 5px 0 0; + -moz-border-radius: 0 5px 0 0; +} +.tree li:first-child::after{ + border-radius: 5px 0 0 0; + -webkit-border-radius: 5px 0 0 0; + -moz-border-radius: 5px 0 0 0; +} + +/*Time to add downward connectors from parents*/ +.tree ul ul::before{ + content: ''; + position: absolute; top: 0; left: 50%; + border-left: 2px solid #ccc; + width: 0; height: 20px; +} + +.tree li a{ + border: 1px solid #ccc; + padding: 5px 10px; + text-decoration: none; + color: #666; + font-size: 1.2em; + display: inline-block; + + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + + transition: all 0.5s; + -webkit-transition: all 0.5s; + -moz-transition: all 0.5s; +} + +/*Time for some hover effects*/ +/*We will apply the hover effect the the lineage of the element also*/ +.tree li a:hover, .tree li a:hover+ul li a { + background: #c8e4f8; color: #000; border: 1px solid #94a0b4; +} +/*Connector styles on hover*/ +.tree li a:hover+ul li::after, +.tree li a:hover+ul li::before, +.tree li a:hover+ul::before, +.tree li a:hover+ul ul::before{ + border-color: #94a0b4; +} + + +/*Thats all. I hope you enjoyed it. +Thanks :)*/ + + diff --git a/users/static/users/css/dashboard.css b/users/static/users/css/dashboard.css new file mode 100644 index 0000000..e75d73e --- /dev/null +++ b/users/static/users/css/dashboard.css @@ -0,0 +1,94 @@ +body { + font-size: .875rem; +} + +.feather { + width: 16px; + height: 16px; + vertical-align: text-bottom; +} + +/* + * Sidebar + */ + +.sidebar { + position: fixed; + top: 0; + bottom: 0; + left: 0; + z-index: 100; /* Behind the navbar */ + padding: 0; + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); +} + +.sidebar-sticky { + position: -webkit-sticky; + position: sticky; + top: 48px; /* Height of navbar */ + height: calc(100vh - 48px); + padding-top: .5rem; + overflow-x: hidden; + overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */ +} + +.sidebar .nav-link { + font-weight: 500; + color: #333; + +} + +.sidebar .nav-link .feather { + margin-right: 4px; + color: #999; +} + +.sidebar .nav-link.active { + color: #007bff; +} + +.sidebar .nav-link:hover .feather, +.sidebar .nav-link.active .feather { + color: inherit; +} + +.sidebar-heading { + font-size: .75rem; + text-transform: uppercase; +} + +/* + * Navbar + */ + +.navbar-brand { + padding-top: .75rem; + padding-bottom: .75rem; + font-size: 1rem; + background-color: rgba(0, 0, 0, .25); + box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25); +} + +.navbar .form-control { + padding: .75rem 1rem; + border-width: 0; + border-radius: 0; +} + +.form-control-dark { + color: #fff; + background-color: rgba(255, 255, 255, .1); + border-color: rgba(255, 255, 255, .1); +} + +.form-control-dark:focus { + border-color: transparent; + box-shadow: 0 0 0 3px rgba(255, 255, 255, .25); +} + +/* + * Utilities + */ + +.border-top { border-top: 1px solid #e5e5e5; } +.border-bottom { border-bottom: 1px solid #e5e5e5; } diff --git a/users/static/users/css/datatables_bs4.css b/users/static/users/css/datatables_bs4.css new file mode 100644 index 0000000..5532a9d --- /dev/null +++ b/users/static/users/css/datatables_bs4.css @@ -0,0 +1 @@ +table.dataTable{clear:both;margin-top:6px !important;margin-bottom:6px !important;max-width:none !important;border-collapse:separate !important;border-spacing:0}table.dataTable td,table.dataTable th{-webkit-box-sizing:content-box;box-sizing:content-box}table.dataTable td.dataTables_empty,table.dataTable th.dataTables_empty{text-align:center}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}div.dataTables_wrapper div.dataTables_length label{font-weight:normal;text-align:left;white-space:nowrap}div.dataTables_wrapper div.dataTables_length select{width:auto;display:inline-block}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter label{font-weight:normal;white-space:nowrap;text-align:left}div.dataTables_wrapper div.dataTables_filter input{margin-left:0.5em;display:inline-block;width:auto}div.dataTables_wrapper div.dataTables_info{padding-top:0.85em;white-space:nowrap}div.dataTables_wrapper div.dataTables_paginate{margin:0;white-space:nowrap;text-align:right}div.dataTables_wrapper div.dataTables_paginate ul.pagination{margin:2px 0;white-space:nowrap;justify-content:flex-end}div.dataTables_wrapper div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:1em 0}table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting{padding-right:30px}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:before,table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{position:absolute;bottom:0.9em;display:block;opacity:0.3}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"\2191"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc_disabled:after{right:0.5em;content:"\2193"}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0}div.dataTables_scrollHead table.dataTable{margin-bottom:0 !important}div.dataTables_scrollBody table{border-top:none;margin-top:0 !important;margin-bottom:0 !important}div.dataTables_scrollBody table thead .sorting:before,div.dataTables_scrollBody table thead .sorting_asc:before,div.dataTables_scrollBody table thead .sorting_desc:before,div.dataTables_scrollBody table thead .sorting:after,div.dataTables_scrollBody table thead .sorting_asc:after,div.dataTables_scrollBody table thead .sorting_desc:after{display:none}div.dataTables_scrollBody table tbody tr:first-child th,div.dataTables_scrollBody table tbody tr:first-child td{border-top:none}div.dataTables_scrollFoot>.dataTables_scrollFootInner{box-sizing:content-box}div.dataTables_scrollFoot>.dataTables_scrollFootInner>table{margin-top:0 !important;border-top:none}@media screen and (max-width: 767px){div.dataTables_wrapper div.dataTables_length,div.dataTables_wrapper div.dataTables_filter,div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{text-align:center}}table.dataTable.table-sm>thead>tr>th{padding-right:20px}table.dataTable.table-sm .sorting:before,table.dataTable.table-sm .sorting_asc:before,table.dataTable.table-sm .sorting_desc:before{top:5px;right:0.85em}table.dataTable.table-sm .sorting:after,table.dataTable.table-sm .sorting_asc:after,table.dataTable.table-sm .sorting_desc:after{top:5px}table.table-bordered.dataTable th,table.table-bordered.dataTable td{border-left-width:0}table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable th:last-child,table.table-bordered.dataTable td:last-child,table.table-bordered.dataTable td:last-child{border-right-width:0}table.table-bordered.dataTable tbody th,table.table-bordered.dataTable tbody td{border-bottom-width:0}div.dataTables_scrollHead table.table-bordered{border-bottom-width:0}div.table-responsive>div.dataTables_wrapper>div.row{margin:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:first-child{padding-left:0}div.table-responsive>div.dataTables_wrapper>div.row>div[class^="col-"]:last-child{padding-right:0} \ No newline at end of file diff --git a/users/static/users/css/font/summernote.eot b/users/static/users/css/font/summernote.eot new file mode 100644 index 0000000..4f047db Binary files /dev/null and b/users/static/users/css/font/summernote.eot differ diff --git a/users/static/users/css/font/summernote.ttf b/users/static/users/css/font/summernote.ttf new file mode 100644 index 0000000..64ef84c Binary files /dev/null and b/users/static/users/css/font/summernote.ttf differ diff --git a/users/static/users/css/font/summernote.woff b/users/static/users/css/font/summernote.woff new file mode 100644 index 0000000..dfd4f66 Binary files /dev/null and b/users/static/users/css/font/summernote.woff differ diff --git a/users/static/users/css/font/summernote.woff2 b/users/static/users/css/font/summernote.woff2 new file mode 100644 index 0000000..40b2030 Binary files /dev/null and b/users/static/users/css/font/summernote.woff2 differ diff --git a/users/static/users/css/google_font.css b/users/static/users/css/google_font.css new file mode 100644 index 0000000..194309b --- /dev/null +++ b/users/static/users/css/google_font.css @@ -0,0 +1,560 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 200; + src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5MZ9vHUT8_DQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 200; + src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5MZ9vOUT8_DQ.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 200; + src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5MZ9vFUT8_DQ.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 200; + src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5MZ9vEUT8_DQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 200; + src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5MZ9vKUT8.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 300; + src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4oZNvHUT8_DQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 300; + src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4oZNvOUT8_DQ.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 300; + src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4oZNvFUT8_DQ.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 300; + src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4oZNvEUT8_DQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 300; + src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4oZNvKUT8.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 400; + src: local('Nunito Italic'), local('Nunito-Italic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXX3I6Li01BKofIMNaORs71cA.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 400; + src: local('Nunito Italic'), local('Nunito-Italic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXX3I6Li01BKofIMNaHRs71cA.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 400; + src: local('Nunito Italic'), local('Nunito-Italic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXX3I6Li01BKofIMNaMRs71cA.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 400; + src: local('Nunito Italic'), local('Nunito-Italic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXX3I6Li01BKofIMNaNRs71cA.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 400; + src: local('Nunito Italic'), local('Nunito-Italic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXX3I6Li01BKofIMNaDRs4.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 600; + src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5cYtvHUT8_DQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 600; + src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5cYtvOUT8_DQ.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 600; + src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5cYtvFUT8_DQ.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 600; + src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5cYtvEUT8_DQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 600; + src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN5cYtvKUT8.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 700; + src: local('Nunito Bold Italic'), local('Nunito-BoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN44Y9vHUT8_DQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 700; + src: local('Nunito Bold Italic'), local('Nunito-BoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN44Y9vOUT8_DQ.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 700; + src: local('Nunito Bold Italic'), local('Nunito-BoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN44Y9vFUT8_DQ.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 700; + src: local('Nunito Bold Italic'), local('Nunito-BoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN44Y9vEUT8_DQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 700; + src: local('Nunito Bold Italic'), local('Nunito-BoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN44Y9vKUT8.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 800; + src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4kYNvHUT8_DQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 800; + src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4kYNvOUT8_DQ.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 800; + src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4kYNvFUT8_DQ.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 800; + src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4kYNvEUT8_DQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 800; + src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4kYNvKUT8.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 900; + src: local('Nunito Black Italic'), local('Nunito-BlackItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4AYdvHUT8_DQ.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 900; + src: local('Nunito Black Italic'), local('Nunito-BlackItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4AYdvOUT8_DQ.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 900; + src: local('Nunito Black Italic'), local('Nunito-BlackItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4AYdvFUT8_DQ.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 900; + src: local('Nunito Black Italic'), local('Nunito-BlackItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4AYdvEUT8_DQ.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: italic; + font-weight: 900; + src: local('Nunito Black Italic'), local('Nunito-BlackItalic'), url(https://fonts.gstatic.com/s/nunito/v14/XRXQ3I6Li01BKofIMN4AYdvKUT8.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 200; + src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA-seUbOvISTs.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 200; + src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA-seUZevISTs.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 200; + src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA-seUbuvISTs.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 200; + src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA-seUb-vISTs.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 200; + src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA-seUYevI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 300; + src: local('Nunito Light'), local('Nunito-Light'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAnsSUbOvISTs.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 300; + src: local('Nunito Light'), local('Nunito-Light'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAnsSUZevISTs.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 300; + src: local('Nunito Light'), local('Nunito-Light'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAnsSUbuvISTs.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 300; + src: local('Nunito Light'), local('Nunito-Light'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAnsSUb-vISTs.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 300; + src: local('Nunito Light'), local('Nunito-Light'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAnsSUYevI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: local('Nunito Regular'), local('Nunito-Regular'), url(https://fonts.gstatic.com/s/nunito/v14/XRXV3I6Li01BKofIOOaBXso.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: local('Nunito Regular'), local('Nunito-Regular'), url(https://fonts.gstatic.com/s/nunito/v14/XRXV3I6Li01BKofIMeaBXso.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: local('Nunito Regular'), local('Nunito-Regular'), url(https://fonts.gstatic.com/s/nunito/v14/XRXV3I6Li01BKofIOuaBXso.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: local('Nunito Regular'), local('Nunito-Regular'), url(https://fonts.gstatic.com/s/nunito/v14/XRXV3I6Li01BKofIO-aBXso.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 400; + src: local('Nunito Regular'), local('Nunito-Regular'), url(https://fonts.gstatic.com/s/nunito/v14/XRXV3I6Li01BKofINeaB.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 600; + src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA6sKUbOvISTs.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 600; + src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA6sKUZevISTs.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 600; + src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA6sKUbuvISTs.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 600; + src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA6sKUb-vISTs.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 600; + src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofA6sKUYevI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: local('Nunito Bold'), local('Nunito-Bold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAjsOUbOvISTs.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: local('Nunito Bold'), local('Nunito-Bold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAjsOUZevISTs.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: local('Nunito Bold'), local('Nunito-Bold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAjsOUbuvISTs.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: local('Nunito Bold'), local('Nunito-Bold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAjsOUb-vISTs.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 700; + src: local('Nunito Bold'), local('Nunito-Bold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAjsOUYevI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 800; + src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAksCUbOvISTs.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 800; + src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAksCUZevISTs.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 800; + src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAksCUbuvISTs.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 800; + src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAksCUb-vISTs.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 800; + src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAksCUYevI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 900; + src: local('Nunito Black'), local('Nunito-Black'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAtsGUbOvISTs.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 900; + src: local('Nunito Black'), local('Nunito-Black'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAtsGUZevISTs.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* vietnamese */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 900; + src: local('Nunito Black'), local('Nunito-Black'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAtsGUbuvISTs.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 900; + src: local('Nunito Black'), local('Nunito-Black'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAtsGUb-vISTs.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Nunito'; + font-style: normal; + font-weight: 900; + src: local('Nunito Black'), local('Nunito-Black'), url(https://fonts.gstatic.com/s/nunito/v14/XRXW3I6Li01BKofAtsGUYevI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} \ No newline at end of file diff --git a/users/static/users/css/google_swap.css b/users/static/users/css/google_swap.css new file mode 100644 index 0000000..d442b26 --- /dev/null +++ b/users/static/users/css/google_swap.css @@ -0,0 +1,63 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKOzY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu5mxKOzY.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKOzY.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4WxKOzY.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7WxKOzY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7GxKOzY.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} \ No newline at end of file diff --git a/users/static/users/css/jquery_datatables.css b/users/static/users/css/jquery_datatables.css new file mode 100644 index 0000000..55360f9 --- /dev/null +++ b/users/static/users/css/jquery_datatables.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} \ No newline at end of file diff --git a/users/static/users/css/jsLists.css b/users/static/users/css/jsLists.css new file mode 100644 index 0000000..e54b16f --- /dev/null +++ b/users/static/users/css/jsLists.css @@ -0,0 +1,22 @@ + + +/* List styling */ +.jslists{ + font-size: 1.3rem; + font-family: Arial, Helvetica, sans-serif; +} +.jslist-ul, .jslist-ol, .jslist-li {margin-left: 12px;} /* Unordered lists */ +.jsl-collapsed {display: none;} +.jsl-list-closed { + float: left; + clear: both; + margin: 2px 4px 2px 0px; + width: 18px; + height: 18px; + cursor: pointer; + background-image: url('data:image/svg+xml;utf8,'); + background-repeat: no-repeat; + background-position: center; +} +.jsl-open {display: block;} +.jsl-list-open {background-image: url('data:image/svg+xml;utf8,');} \ No newline at end of file diff --git a/users/static/users/css/sb-admin-2.css b/users/static/users/css/sb-admin-2.css new file mode 100644 index 0000000..c4f10de --- /dev/null +++ b/users/static/users/css/sb-admin-2.css @@ -0,0 +1,11006 @@ +/*! + * Start Bootstrap - SB Admin 2 v4.0.7 (https://startbootstrap.com/template-overviews/sb-admin-2) + * Copyright 2013-2019 Start Bootstrap + * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin-2/blob/master/LICENSE) + */ + +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #4e73df; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #e74a3b; + --orange: #fd7e14; + --yellow: #f6c23e; + --green: #1cc88a; + --teal: #20c9a6; + --cyan: #36b9cc; + --white: #fff; + --gray: #858796; + --gray-dark: #5a5c69; + --primary: #4e73df; + --secondary: #858796; + --success: #1cc88a; + --info: #36b9cc; + --warning: #f6c23e; + --danger: #e74a3b; + --light: #f8f9fc; + --dark: #5a5c69; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #858796; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #4e73df; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #224abe; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} + +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #858796; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +select { + word-wrap: normal; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 400; + line-height: 1.2; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} + +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #858796; +} + +.blockquote-footer::before { + content: "\2014\00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dddfeb; + border-radius: 0.35rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #858796; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; +} + +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #3a3b45; + border-radius: 0.2rem; +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #3a3b45; +} + +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 0.75rem; + padding-left: 0.75rem; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 0.75rem; + padding-left: 0.75rem; + margin-right: auto; + margin-left: auto; +} + +.row { + display: flex; + flex-wrap: wrap; + margin-right: -0.75rem; + margin-left: -0.75rem; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + flex: 0 0 8.33333%; + max-width: 8.33333%; +} + +.col-2 { + flex: 0 0 16.66667%; + max-width: 16.66667%; +} + +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + flex: 0 0 33.33333%; + max-width: 33.33333%; +} + +.col-5 { + flex: 0 0 41.66667%; + max-width: 41.66667%; +} + +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + flex: 0 0 58.33333%; + max-width: 58.33333%; +} + +.col-8 { + flex: 0 0 66.66667%; + max-width: 66.66667%; +} + +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + flex: 0 0 83.33333%; + max-width: 83.33333%; +} + +.col-11 { + flex: 0 0 91.66667%; + max-width: 91.66667%; +} + +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + order: -1; +} + +.order-last { + order: 13; +} + +.order-0 { + order: 0; +} + +.order-1 { + order: 1; +} + +.order-2 { + order: 2; +} + +.order-3 { + order: 3; +} + +.order-4 { + order: 4; +} + +.order-5 { + order: 5; +} + +.order-6 { + order: 6; +} + +.order-7 { + order: 7; +} + +.order-8 { + order: 8; +} + +.order-9 { + order: 9; +} + +.order-10 { + order: 10; +} + +.order-11 { + order: 11; +} + +.order-12 { + order: 12; +} + +.offset-1 { + margin-left: 8.33333%; +} + +.offset-2 { + margin-left: 16.66667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333%; +} + +.offset-5 { + margin-left: 41.66667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333%; +} + +.offset-8 { + margin-left: 66.66667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333%; +} + +.offset-11 { + margin-left: 91.66667%; +} + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-sm-2 { + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-sm-5 { + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-sm-8 { + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-sm-11 { + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + order: -1; + } + .order-sm-last { + order: 13; + } + .order-sm-0 { + order: 0; + } + .order-sm-1 { + order: 1; + } + .order-sm-2 { + order: 2; + } + .order-sm-3 { + order: 3; + } + .order-sm-4 { + order: 4; + } + .order-sm-5 { + order: 5; + } + .order-sm-6 { + order: 6; + } + .order-sm-7 { + order: 7; + } + .order-sm-8 { + order: 8; + } + .order-sm-9 { + order: 9; + } + .order-sm-10 { + order: 10; + } + .order-sm-11 { + order: 11; + } + .order-sm-12 { + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333%; + } + .offset-sm-2 { + margin-left: 16.66667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333%; + } + .offset-sm-5 { + margin-left: 41.66667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333%; + } + .offset-sm-8 { + margin-left: 66.66667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333%; + } + .offset-sm-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-md-2 { + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-md-5 { + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-md-8 { + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-md-11 { + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + order: -1; + } + .order-md-last { + order: 13; + } + .order-md-0 { + order: 0; + } + .order-md-1 { + order: 1; + } + .order-md-2 { + order: 2; + } + .order-md-3 { + order: 3; + } + .order-md-4 { + order: 4; + } + .order-md-5 { + order: 5; + } + .order-md-6 { + order: 6; + } + .order-md-7 { + order: 7; + } + .order-md-8 { + order: 8; + } + .order-md-9 { + order: 9; + } + .order-md-10 { + order: 10; + } + .order-md-11 { + order: 11; + } + .order-md-12 { + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333%; + } + .offset-md-2 { + margin-left: 16.66667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333%; + } + .offset-md-5 { + margin-left: 41.66667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333%; + } + .offset-md-8 { + margin-left: 66.66667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333%; + } + .offset-md-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 992px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-lg-2 { + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-lg-5 { + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-lg-8 { + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-lg-11 { + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + order: -1; + } + .order-lg-last { + order: 13; + } + .order-lg-0 { + order: 0; + } + .order-lg-1 { + order: 1; + } + .order-lg-2 { + order: 2; + } + .order-lg-3 { + order: 3; + } + .order-lg-4 { + order: 4; + } + .order-lg-5 { + order: 5; + } + .order-lg-6 { + order: 6; + } + .order-lg-7 { + order: 7; + } + .order-lg-8 { + order: 8; + } + .order-lg-9 { + order: 9; + } + .order-lg-10 { + order: 10; + } + .order-lg-11 { + order: 11; + } + .order-lg-12 { + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333%; + } + .offset-lg-2 { + margin-left: 16.66667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333%; + } + .offset-lg-5 { + margin-left: 41.66667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333%; + } + .offset-lg-8 { + margin-left: 66.66667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333%; + } + .offset-lg-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-xl-2 { + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-xl-5 { + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-xl-8 { + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-xl-11 { + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + order: -1; + } + .order-xl-last { + order: 13; + } + .order-xl-0 { + order: 0; + } + .order-xl-1 { + order: 1; + } + .order-xl-2 { + order: 2; + } + .order-xl-3 { + order: 3; + } + .order-xl-4 { + order: 4; + } + .order-xl-5 { + order: 5; + } + .order-xl-6 { + order: 6; + } + .order-xl-7 { + order: 7; + } + .order-xl-8 { + order: 8; + } + .order-xl-9 { + order: 9; + } + .order-xl-10 { + order: 10; + } + .order-xl-11 { + order: 11; + } + .order-xl-12 { + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333%; + } + .offset-xl-2 { + margin-left: 16.66667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333%; + } + .offset-xl-5 { + margin-left: 41.66667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333%; + } + .offset-xl-8 { + margin-left: 66.66667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333%; + } + .offset-xl-11 { + margin-left: 91.66667%; + } +} + +.table { + width: 100%; + margin-bottom: 1rem; + color: #858796; +} + +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #e3e6f0; +} + +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #e3e6f0; +} + +.table tbody + tbody { + border-top: 2px solid #e3e6f0; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #e3e6f0; +} + +.table-bordered th, +.table-bordered td { + border: 1px solid #e3e6f0; +} + +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + color: #858796; + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #cdd8f6; +} + +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #a3b6ee; +} + +.table-hover .table-primary:hover { + background-color: #b7c7f2; +} + +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #b7c7f2; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #dddde2; +} + +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #c0c1c8; +} + +.table-hover .table-secondary:hover { + background-color: #cfcfd6; +} + +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #cfcfd6; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #bff0de; +} + +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #89e2c2; +} + +.table-hover .table-success:hover { + background-color: #aaebd3; +} + +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #aaebd3; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #c7ebf1; +} + +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #96dbe4; +} + +.table-hover .table-info:hover { + background-color: #b3e4ec; +} + +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #b3e4ec; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #fceec9; +} + +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #fadf9b; +} + +.table-hover .table-warning:hover { + background-color: #fbe6b1; +} + +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #fbe6b1; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f8ccc8; +} + +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #f3a199; +} + +.table-hover .table-danger:hover { + background-color: #f5b7b1; +} + +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f5b7b1; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fdfdfe; +} + +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfd; +} + +.table-hover .table-light:hover { + background-color: #ececf6; +} + +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #ececf6; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #d1d1d5; +} + +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #a9aab1; +} + +.table-hover .table-dark:hover { + background-color: #c4c4c9; +} + +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #c4c4c9; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #fff; + background-color: #5a5c69; + border-color: #6c6e7e; +} + +.table .thead-light th { + color: #6e707e; + background-color: #eaecf4; + border-color: #e3e6f0; +} + +.table-dark { + color: #fff; + background-color: #5a5c69; +} + +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #6c6e7e; +} + +.table-dark.table-bordered { + border: 0; +} + +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} + +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} + +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} + +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} + +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} + +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.table-responsive > .table-bordered { + border: 0; +} + +.form-control { + display: block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #d1d3e2; + border-radius: 0.35rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} + +.form-control:focus { + color: #6e707e; + background-color: #fff; + border-color: #bac8f3; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.form-control::-webkit-input-placeholder { + color: #858796; + opacity: 1; +} + +.form-control::-moz-placeholder { + color: #858796; + opacity: 1; +} + +.form-control:-ms-input-placeholder { + color: #858796; + opacity: 1; +} + +.form-control::-ms-input-placeholder { + color: #858796; + opacity: 1; +} + +.form-control::placeholder { + color: #858796; + opacity: 1; +} + +.form-control:disabled, .form-control[readonly] { + background-color: #eaecf4; + opacity: 1; +} + +select.form-control:focus::-ms-value { + color: #6e707e; + background-color: #fff; +} + +.form-control-file, +.form-control-range { + display: block; + width: 100%; +} + +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; + line-height: 1.5; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; + line-height: 1.5; +} + +.form-control-plaintext { + display: block; + width: 100%; + padding-top: 0.375rem; + padding-bottom: 0.375rem; + margin-bottom: 0; + line-height: 1.5; + color: #858796; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} + +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.form-control-lg { + height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +select.form-control[size], select.form-control[multiple] { + height: auto; +} + +textarea.form-control { + height: auto; +} + +.form-group { + margin-bottom: 1rem; +} + +.form-text { + display: block; + margin-top: 0.25rem; +} + +.form-row { + display: flex; + flex-wrap: wrap; + margin-right: -5px; + margin-left: -5px; +} + +.form-row > .col, +.form-row > [class*="col-"] { + padding-right: 5px; + padding-left: 5px; +} + +.form-check { + position: relative; + display: block; + padding-left: 1.25rem; +} + +.form-check-input { + position: absolute; + margin-top: 0.3rem; + margin-left: -1.25rem; +} + +.form-check-input:disabled ~ .form-check-label { + color: #858796; +} + +.form-check-label { + margin-bottom: 0; +} + +.form-check-inline { + display: inline-flex; + align-items: center; + padding-left: 0; + margin-right: 0.75rem; +} + +.form-check-inline .form-check-input { + position: static; + margin-top: 0; + margin-right: 0.3125rem; + margin-left: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #1cc88a; +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(28, 200, 138, 0.9); + border-radius: 0.35rem; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: #1cc88a; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: #1cc88a; + box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); +} + +.was-validated .form-control:valid ~ .valid-feedback, +.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback, +.form-control.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:valid, .custom-select.is-valid { + border-color: #1cc88a; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%231cc88a' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus { + border-color: #1cc88a; + box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); +} + +.was-validated .custom-select:valid ~ .valid-feedback, +.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback, +.custom-select.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control-file:valid ~ .valid-feedback, +.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback, +.form-control-file.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: #1cc88a; +} + +.was-validated .form-check-input:valid ~ .valid-feedback, +.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback, +.form-check-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label { + color: #1cc88a; +} + +.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before { + border-color: #1cc88a; +} + +.was-validated .custom-control-input:valid ~ .valid-feedback, +.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback, +.custom-control-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before { + border-color: #34e3a4; + background-color: #34e3a4; +} + +.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); +} + +.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #1cc88a; +} + +.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label { + border-color: #1cc88a; +} + +.was-validated .custom-file-input:valid ~ .valid-feedback, +.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback, +.custom-file-input.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label { + border-color: #1cc88a; + box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.25); +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 80%; + color: #e74a3b; +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: .1rem; + font-size: 0.875rem; + line-height: 1.5; + color: #fff; + background-color: rgba(231, 74, 59, 0.9); + border-radius: 0.35rem; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: #e74a3b; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23e74a3b' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23e74a3b' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E"); + background-repeat: no-repeat; + background-position: center right calc(0.375em + 0.1875rem); + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: #e74a3b; + box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.25); +} + +.was-validated .form-control:invalid ~ .invalid-feedback, +.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback, +.form-control.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .custom-select:invalid, .custom-select.is-invalid { + border-color: #e74a3b; + padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23e74a3b' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23e74a3b' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} + +.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus { + border-color: #e74a3b; + box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.25); +} + +.was-validated .custom-select:invalid ~ .invalid-feedback, +.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback, +.custom-select.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control-file:invalid ~ .invalid-feedback, +.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback, +.form-control-file.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: #e74a3b; +} + +.was-validated .form-check-input:invalid ~ .invalid-feedback, +.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback, +.form-check-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label { + color: #e74a3b; +} + +.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before { + border-color: #e74a3b; +} + +.was-validated .custom-control-input:invalid ~ .invalid-feedback, +.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback, +.custom-control-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before { + border-color: #ed7468; + background-color: #ed7468; +} + +.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.25); +} + +.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before { + border-color: #e74a3b; +} + +.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label { + border-color: #e74a3b; +} + +.was-validated .custom-file-input:invalid ~ .invalid-feedback, +.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback, +.custom-file-input.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label { + border-color: #e74a3b; + box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.25); +} + +.form-inline { + display: flex; + flex-flow: row wrap; + align-items: center; +} + +.form-inline .form-check { + width: 100%; +} + +@media (min-width: 576px) { + .form-inline label { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0; + } + .form-inline .form-group { + display: flex; + flex: 0 0 auto; + flex-flow: row wrap; + align-items: center; + margin-bottom: 0; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-plaintext { + display: inline-block; + } + .form-inline .input-group, + .form-inline .custom-select { + width: auto; + } + .form-inline .form-check { + display: flex; + align-items: center; + justify-content: center; + width: auto; + padding-left: 0; + } + .form-inline .form-check-input { + position: relative; + flex-shrink: 0; + margin-top: 0; + margin-right: 0.25rem; + margin-left: 0; + } + .form-inline .custom-control { + align-items: center; + justify-content: center; + } + .form-inline .custom-control-label { + margin-bottom: 0; + } +} + +.btn { + display: inline-block; + font-weight: 400; + color: #858796; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.35rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} + +.btn:hover { + color: #858796; + text-decoration: none; +} + +.btn:focus, .btn.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.btn.disabled, .btn:disabled { + opacity: 0.65; +} + +a.btn.disabled, +fieldset:disabled a.btn { + pointer-events: none; +} + +.btn-primary { + color: #fff; + background-color: #4e73df; + border-color: #4e73df; +} + +.btn-primary:hover { + color: #fff; + background-color: #2e59d9; + border-color: #2653d4; +} + +.btn-primary:focus, .btn-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(105, 136, 228, 0.5); +} + +.btn-primary.disabled, .btn-primary:disabled { + color: #fff; + background-color: #4e73df; + border-color: #4e73df; +} + +.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #2653d4; + border-color: #244ec9; +} + +.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(105, 136, 228, 0.5); +} + +.btn-secondary { + color: #fff; + background-color: #858796; + border-color: #858796; +} + +.btn-secondary:hover { + color: #fff; + background-color: #717384; + border-color: #6b6d7d; +} + +.btn-secondary:focus, .btn-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(151, 153, 166, 0.5); +} + +.btn-secondary.disabled, .btn-secondary:disabled { + color: #fff; + background-color: #858796; + border-color: #858796; +} + +.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active, +.show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #6b6d7d; + border-color: #656776; +} + +.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(151, 153, 166, 0.5); +} + +.btn-success { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a; +} + +.btn-success:hover { + color: #fff; + background-color: #17a673; + border-color: #169b6b; +} + +.btn-success:focus, .btn-success.focus { + box-shadow: 0 0 0 0.2rem rgba(62, 208, 156, 0.5); +} + +.btn-success.disabled, .btn-success:disabled { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a; +} + +.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #169b6b; + border-color: #149063; +} + +.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(62, 208, 156, 0.5); +} + +.btn-info { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc; +} + +.btn-info:hover { + color: #fff; + background-color: #2c9faf; + border-color: #2a96a5; +} + +.btn-info:focus, .btn-info.focus { + box-shadow: 0 0 0 0.2rem rgba(84, 196, 212, 0.5); +} + +.btn-info.disabled, .btn-info:disabled { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc; +} + +.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active, +.show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #2a96a5; + border-color: #278c9b; +} + +.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(84, 196, 212, 0.5); +} + +.btn-warning { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e; +} + +.btn-warning:hover { + color: #fff; + background-color: #f4b619; + border-color: #f4b30d; +} + +.btn-warning:focus, .btn-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(247, 203, 91, 0.5); +} + +.btn-warning.disabled, .btn-warning:disabled { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e; +} + +.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active, +.show > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #f4b30d; + border-color: #e9aa0b; +} + +.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(247, 203, 91, 0.5); +} + +.btn-danger { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b; +} + +.btn-danger:hover { + color: #fff; + background-color: #e02d1b; + border-color: #d52a1a; +} + +.btn-danger:focus, .btn-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(235, 101, 88, 0.5); +} + +.btn-danger.disabled, .btn-danger:disabled { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b; +} + +.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #d52a1a; + border-color: #ca2819; +} + +.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(235, 101, 88, 0.5); +} + +.btn-light { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc; +} + +.btn-light:hover { + color: #3a3b45; + background-color: #dde2f1; + border-color: #d4daed; +} + +.btn-light:focus, .btn-light.focus { + box-shadow: 0 0 0 0.2rem rgba(220, 221, 225, 0.5); +} + +.btn-light.disabled, .btn-light:disabled { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc; +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, +.show > .btn-light.dropdown-toggle { + color: #3a3b45; + background-color: #d4daed; + border-color: #cbd3e9; +} + +.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(220, 221, 225, 0.5); +} + +.btn-dark { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69; +} + +.btn-dark:hover { + color: #fff; + background-color: #484a54; + border-color: #42444e; +} + +.btn-dark:focus, .btn-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(115, 116, 128, 0.5); +} + +.btn-dark.disabled, .btn-dark:disabled { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69; +} + +.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #42444e; + border-color: #3d3e47; +} + +.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(115, 116, 128, 0.5); +} + +.btn-outline-primary { + color: #4e73df; + border-color: #4e73df; +} + +.btn-outline-primary:hover { + color: #fff; + background-color: #4e73df; + border-color: #4e73df; +} + +.btn-outline-primary:focus, .btn-outline-primary.focus { + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.5); +} + +.btn-outline-primary.disabled, .btn-outline-primary:disabled { + color: #4e73df; + background-color: transparent; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active, +.show > .btn-outline-primary.dropdown-toggle { + color: #fff; + background-color: #4e73df; + border-color: #4e73df; +} + +.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.5); +} + +.btn-outline-secondary { + color: #858796; + border-color: #858796; +} + +.btn-outline-secondary:hover { + color: #fff; + background-color: #858796; + border-color: #858796; +} + +.btn-outline-secondary:focus, .btn-outline-secondary.focus { + box-shadow: 0 0 0 0.2rem rgba(133, 135, 150, 0.5); +} + +.btn-outline-secondary.disabled, .btn-outline-secondary:disabled { + color: #858796; + background-color: transparent; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active, +.show > .btn-outline-secondary.dropdown-toggle { + color: #fff; + background-color: #858796; + border-color: #858796; +} + +.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(133, 135, 150, 0.5); +} + +.btn-outline-success { + color: #1cc88a; + border-color: #1cc88a; +} + +.btn-outline-success:hover { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a; +} + +.btn-outline-success:focus, .btn-outline-success.focus { + box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.5); +} + +.btn-outline-success.disabled, .btn-outline-success:disabled { + color: #1cc88a; + background-color: transparent; +} + +.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active, +.show > .btn-outline-success.dropdown-toggle { + color: #fff; + background-color: #1cc88a; + border-color: #1cc88a; +} + +.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.5); +} + +.btn-outline-info { + color: #36b9cc; + border-color: #36b9cc; +} + +.btn-outline-info:hover { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc; +} + +.btn-outline-info:focus, .btn-outline-info.focus { + box-shadow: 0 0 0 0.2rem rgba(54, 185, 204, 0.5); +} + +.btn-outline-info.disabled, .btn-outline-info:disabled { + color: #36b9cc; + background-color: transparent; +} + +.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active, +.show > .btn-outline-info.dropdown-toggle { + color: #fff; + background-color: #36b9cc; + border-color: #36b9cc; +} + +.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(54, 185, 204, 0.5); +} + +.btn-outline-warning { + color: #f6c23e; + border-color: #f6c23e; +} + +.btn-outline-warning:hover { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e; +} + +.btn-outline-warning:focus, .btn-outline-warning.focus { + box-shadow: 0 0 0 0.2rem rgba(246, 194, 62, 0.5); +} + +.btn-outline-warning.disabled, .btn-outline-warning:disabled { + color: #f6c23e; + background-color: transparent; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active, +.show > .btn-outline-warning.dropdown-toggle { + color: #fff; + background-color: #f6c23e; + border-color: #f6c23e; +} + +.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(246, 194, 62, 0.5); +} + +.btn-outline-danger { + color: #e74a3b; + border-color: #e74a3b; +} + +.btn-outline-danger:hover { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b; +} + +.btn-outline-danger:focus, .btn-outline-danger.focus { + box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.5); +} + +.btn-outline-danger.disabled, .btn-outline-danger:disabled { + color: #e74a3b; + background-color: transparent; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active, +.show > .btn-outline-danger.dropdown-toggle { + color: #fff; + background-color: #e74a3b; + border-color: #e74a3b; +} + +.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.5); +} + +.btn-outline-light { + color: #f8f9fc; + border-color: #f8f9fc; +} + +.btn-outline-light:hover { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc; +} + +.btn-outline-light:focus, .btn-outline-light.focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 252, 0.5); +} + +.btn-outline-light.disabled, .btn-outline-light:disabled { + color: #f8f9fc; + background-color: transparent; +} + +.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active, +.show > .btn-outline-light.dropdown-toggle { + color: #3a3b45; + background-color: #f8f9fc; + border-color: #f8f9fc; +} + +.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(248, 249, 252, 0.5); +} + +.btn-outline-dark { + color: #5a5c69; + border-color: #5a5c69; +} + +.btn-outline-dark:hover { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69; +} + +.btn-outline-dark:focus, .btn-outline-dark.focus { + box-shadow: 0 0 0 0.2rem rgba(90, 92, 105, 0.5); +} + +.btn-outline-dark.disabled, .btn-outline-dark:disabled { + color: #5a5c69; + background-color: transparent; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active, +.show > .btn-outline-dark.dropdown-toggle { + color: #fff; + background-color: #5a5c69; + border-color: #5a5c69; +} + +.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus, +.show > .btn-outline-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(90, 92, 105, 0.5); +} + +.btn-link { + font-weight: 400; + color: #4e73df; + text-decoration: none; +} + +.btn-link:hover { + color: #224abe; + text-decoration: underline; +} + +.btn-link:focus, .btn-link.focus { + text-decoration: underline; + box-shadow: none; +} + +.btn-link:disabled, .btn-link.disabled { + color: #858796; + pointer-events: none; +} + +.btn-lg, .btn-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.btn-sm, .btn-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.btn-block { + display: block; + width: 100%; +} + +.btn-block + .btn-block { + margin-top: 0.5rem; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.fade { + transition: opacity 0.15s linear; +} + +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} + +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height 0.15s ease; +} + +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} + +.dropup, +.dropright, +.dropdown, +.dropleft { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} + +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} + +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0.125rem 0 0; + font-size: 0.85rem; + color: #858796; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #e3e6f0; + border-radius: 0.35rem; +} + +.dropdown-menu-left { + right: auto; + left: 0; +} + +.dropdown-menu-right { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-left { + right: auto; + left: 0; + } + .dropdown-menu-sm-right { + right: 0; + left: auto; + } +} + +@media (min-width: 768px) { + .dropdown-menu-md-left { + right: auto; + left: 0; + } + .dropdown-menu-md-right { + right: 0; + left: auto; + } +} + +@media (min-width: 992px) { + .dropdown-menu-lg-left { + right: auto; + left: 0; + } + .dropdown-menu-lg-right { + right: 0; + left: auto; + } +} + +@media (min-width: 1200px) { + .dropdown-menu-xl-left { + right: auto; + left: 0; + } + .dropdown-menu-xl-right { + right: 0; + left: auto; + } +} + +.dropup .dropdown-menu { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} + +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} + +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-menu { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} + +.dropright .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} + +.dropright .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropright .dropdown-toggle::after { + vertical-align: 0; +} + +.dropleft .dropdown-menu { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} + +.dropleft .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} + +.dropleft .dropdown-toggle::after { + display: none; +} + +.dropleft .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} + +.dropleft .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-menu[x-placement^="top"], .dropdown-menu[x-placement^="right"], .dropdown-menu[x-placement^="bottom"], .dropdown-menu[x-placement^="left"] { + right: auto; + bottom: auto; +} + +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #eaecf4; +} + +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1.5rem; + clear: both; + font-weight: 400; + color: #3a3b45; + text-align: inherit; + white-space: nowrap; + background-color: transparent; + border: 0; +} + +.dropdown-item:hover, .dropdown-item:focus { + color: #2e2f37; + text-decoration: none; + background-color: #f8f9fc; +} + +.dropdown-item.active, .dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #4e73df; +} + +.dropdown-item.disabled, .dropdown-item:disabled { + color: #858796; + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: 0.5rem 1.5rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #858796; + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: 0.25rem 1.5rem; + color: #3a3b45; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} + +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} + +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover { + z-index: 1; +} + +.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} + +.btn-toolbar .input-group { + width: auto; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) { + margin-left: -1px; +} + +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.btn-group > .btn:not(:first-child), +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} + +.dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after, +.dropright .dropdown-toggle-split::after { + margin-left: 0; +} + +.dropleft .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} + +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: -1px; +} + +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.btn-group-toggle > .btn, +.btn-group-toggle > .btn-group > .btn { + margin-bottom: 0; +} + +.btn-group-toggle > .btn input[type="radio"], +.btn-group-toggle > .btn input[type="checkbox"], +.btn-group-toggle > .btn-group > .btn input[type="radio"], +.btn-group-toggle > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} + +.input-group > .form-control, +.input-group > .form-control-plaintext, +.input-group > .custom-select, +.input-group > .custom-file { + position: relative; + flex: 1 1 auto; + width: 1%; + margin-bottom: 0; +} + +.input-group > .form-control + .form-control, +.input-group > .form-control + .custom-select, +.input-group > .form-control + .custom-file, +.input-group > .form-control-plaintext + .form-control, +.input-group > .form-control-plaintext + .custom-select, +.input-group > .form-control-plaintext + .custom-file, +.input-group > .custom-select + .form-control, +.input-group > .custom-select + .custom-select, +.input-group > .custom-select + .custom-file, +.input-group > .custom-file + .form-control, +.input-group > .custom-file + .custom-select, +.input-group > .custom-file + .custom-file { + margin-left: -1px; +} + +.input-group > .form-control:focus, +.input-group > .custom-select:focus, +.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label { + z-index: 3; +} + +.input-group > .custom-file .custom-file-input:focus { + z-index: 4; +} + +.input-group > .form-control:not(:last-child), +.input-group > .custom-select:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .form-control:not(:first-child), +.input-group > .custom-select:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group > .custom-file { + display: flex; + align-items: center; +} + +.input-group > .custom-file:not(:last-child) .custom-file-label, +.input-group > .custom-file:not(:last-child) .custom-file-label::after { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .custom-file:not(:first-child) .custom-file-label { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.input-group-prepend, +.input-group-append { + display: flex; +} + +.input-group-prepend .btn, +.input-group-append .btn { + position: relative; + z-index: 2; +} + +.input-group-prepend .btn:focus, +.input-group-append .btn:focus { + z-index: 3; +} + +.input-group-prepend .btn + .btn, +.input-group-prepend .btn + .input-group-text, +.input-group-prepend .input-group-text + .input-group-text, +.input-group-prepend .input-group-text + .btn, +.input-group-append .btn + .btn, +.input-group-append .btn + .input-group-text, +.input-group-append .input-group-text + .input-group-text, +.input-group-append .input-group-text + .btn { + margin-left: -1px; +} + +.input-group-prepend { + margin-right: -1px; +} + +.input-group-append { + margin-left: -1px; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + text-align: center; + white-space: nowrap; + background-color: #eaecf4; + border: 1px solid #d1d3e2; + border-radius: 0.35rem; +} + +.input-group-text input[type="radio"], +.input-group-text input[type="checkbox"] { + margin-top: 0; +} + +.input-group-lg > .form-control:not(textarea), +.input-group-lg > .custom-select { + height: calc(1.5em + 1rem + 2px); +} + +.input-group-lg > .form-control, +.input-group-lg > .custom-select, +.input-group-lg > .input-group-prepend > .input-group-text, +.input-group-lg > .input-group-append > .input-group-text, +.input-group-lg > .input-group-prepend > .btn, +.input-group-lg > .input-group-append > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + line-height: 1.5; + border-radius: 0.3rem; +} + +.input-group-sm > .form-control:not(textarea), +.input-group-sm > .custom-select { + height: calc(1.5em + 0.5rem + 2px); +} + +.input-group-sm > .form-control, +.input-group-sm > .custom-select, +.input-group-sm > .input-group-prepend > .input-group-text, +.input-group-sm > .input-group-append > .input-group-text, +.input-group-sm > .input-group-prepend > .btn, +.input-group-sm > .input-group-append > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; +} + +.input-group-lg > .custom-select, +.input-group-sm > .custom-select { + padding-right: 1.75rem; +} + +.input-group > .input-group-prepend > .btn, +.input-group > .input-group-prepend > .input-group-text, +.input-group > .input-group-append:not(:last-child) > .btn, +.input-group > .input-group-append:not(:last-child) > .input-group-text, +.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.input-group > .input-group-append > .btn, +.input-group > .input-group-append > .input-group-text, +.input-group > .input-group-prepend:not(:first-child) > .btn, +.input-group > .input-group-prepend:not(:first-child) > .input-group-text, +.input-group > .input-group-prepend:first-child > .btn:not(:first-child), +.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.custom-control { + position: relative; + display: block; + min-height: 1.5rem; + padding-left: 1.5rem; +} + +.custom-control-inline { + display: inline-flex; + margin-right: 1rem; +} + +.custom-control-input { + position: absolute; + z-index: -1; + opacity: 0; +} + +.custom-control-input:checked ~ .custom-control-label::before { + color: #fff; + border-color: #4e73df; + background-color: #4e73df; +} + +.custom-control-input:focus ~ .custom-control-label::before { + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.custom-control-input:focus:not(:checked) ~ .custom-control-label::before { + border-color: #bac8f3; +} + +.custom-control-input:not(:disabled):active ~ .custom-control-label::before { + color: #fff; + background-color: #e5ebfa; + border-color: #e5ebfa; +} + +.custom-control-input:disabled ~ .custom-control-label { + color: #858796; +} + +.custom-control-input:disabled ~ .custom-control-label::before { + background-color: #eaecf4; +} + +.custom-control-label { + position: relative; + margin-bottom: 0; + vertical-align: top; +} + +.custom-control-label::before { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + pointer-events: none; + content: ""; + background-color: #fff; + border: #b7b9cc solid 1px; +} + +.custom-control-label::after { + position: absolute; + top: 0.25rem; + left: -1.5rem; + display: block; + width: 1rem; + height: 1rem; + content: ""; + background: no-repeat 50% / 50% 50%; +} + +.custom-checkbox .custom-control-label::before { + border-radius: 0.35rem; +} + +.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before { + border-color: #4e73df; + background-color: #4e73df; +} + +.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e"); +} + +.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(78, 115, 223, 0.5); +} + +.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before { + background-color: rgba(78, 115, 223, 0.5); +} + +.custom-radio .custom-control-label::before { + border-radius: 50%; +} + +.custom-radio .custom-control-input:checked ~ .custom-control-label::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} + +.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(78, 115, 223, 0.5); +} + +.custom-switch { + padding-left: 2.25rem; +} + +.custom-switch .custom-control-label::before { + left: -2.25rem; + width: 1.75rem; + pointer-events: all; + border-radius: 0.5rem; +} + +.custom-switch .custom-control-label::after { + top: calc(0.25rem + 2px); + left: calc(-2.25rem + 2px); + width: calc(1rem - 4px); + height: calc(1rem - 4px); + background-color: #b7b9cc; + border-radius: 0.5rem; + transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-switch .custom-control-label::after { + transition: none; + } +} + +.custom-switch .custom-control-input:checked ~ .custom-control-label::after { + background-color: #fff; + transform: translateX(0.75rem); +} + +.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before { + background-color: rgba(78, 115, 223, 0.5); +} + +.custom-select { + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 1.75rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + vertical-align: middle; + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%235a5c69' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e") no-repeat right 0.75rem center/8px 10px; + background-color: #fff; + border: 1px solid #d1d3e2; + border-radius: 0.35rem; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-select:focus { + border-color: #bac8f3; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.custom-select:focus::-ms-value { + color: #6e707e; + background-color: #fff; +} + +.custom-select[multiple], .custom-select[size]:not([size="1"]) { + height: auto; + padding-right: 0.75rem; + background-image: none; +} + +.custom-select:disabled { + color: #858796; + background-color: #eaecf4; +} + +.custom-select::-ms-expand { + display: none; +} + +.custom-select-sm { + height: calc(1.5em + 0.5rem + 2px); + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; +} + +.custom-select-lg { + height: calc(1.5em + 1rem + 2px); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; +} + +.custom-file { + position: relative; + display: inline-block; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin-bottom: 0; +} + +.custom-file-input { + position: relative; + z-index: 2; + width: 100%; + height: calc(1.5em + 0.75rem + 2px); + margin: 0; + opacity: 0; +} + +.custom-file-input:focus ~ .custom-file-label { + border-color: #bac8f3; + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.custom-file-input:disabled ~ .custom-file-label { + background-color: #eaecf4; +} + +.custom-file-input:lang(en) ~ .custom-file-label::after { + content: "Browse"; +} + +.custom-file-input ~ .custom-file-label[data-browse]::after { + content: attr(data-browse); +} + +.custom-file-label { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + height: calc(1.5em + 0.75rem + 2px); + padding: 0.375rem 0.75rem; + font-weight: 400; + line-height: 1.5; + color: #6e707e; + background-color: #fff; + border: 1px solid #d1d3e2; + border-radius: 0.35rem; +} + +.custom-file-label::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + z-index: 3; + display: block; + height: calc(1.5em + 0.75rem); + padding: 0.375rem 0.75rem; + line-height: 1.5; + color: #6e707e; + content: "Browse"; + background-color: #eaecf4; + border-left: inherit; + border-radius: 0 0.35rem 0.35rem 0; +} + +.custom-range { + width: 100%; + height: calc(1rem + 0.4rem); + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.custom-range:focus { + outline: none; +} + +.custom-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.custom-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.custom-range:focus::-ms-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.custom-range::-moz-focus-outer { + border: 0; +} + +.custom-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #4e73df; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-webkit-slider-thumb { + transition: none; + } +} + +.custom-range::-webkit-slider-thumb:active { + background-color: #e5ebfa; +} + +.custom-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dddfeb; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #4e73df; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-moz-range-thumb { + transition: none; + } +} + +.custom-range::-moz-range-thumb:active { + background-color: #e5ebfa; +} + +.custom-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dddfeb; + border-color: transparent; + border-radius: 1rem; +} + +.custom-range::-ms-thumb { + width: 1rem; + height: 1rem; + margin-top: 0; + margin-right: 0.2rem; + margin-left: 0.2rem; + background-color: #4e73df; + border: 0; + border-radius: 1rem; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +@media (prefers-reduced-motion: reduce) { + .custom-range::-ms-thumb { + transition: none; + } +} + +.custom-range::-ms-thumb:active { + background-color: #e5ebfa; +} + +.custom-range::-ms-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: transparent; + border-color: transparent; + border-width: 0.5rem; +} + +.custom-range::-ms-fill-lower { + background-color: #dddfeb; + border-radius: 1rem; +} + +.custom-range::-ms-fill-upper { + margin-right: 15px; + background-color: #dddfeb; + border-radius: 1rem; +} + +.custom-range:disabled::-webkit-slider-thumb { + background-color: #b7b9cc; +} + +.custom-range:disabled::-webkit-slider-runnable-track { + cursor: default; +} + +.custom-range:disabled::-moz-range-thumb { + background-color: #b7b9cc; +} + +.custom-range:disabled::-moz-range-track { + cursor: default; +} + +.custom-range:disabled::-ms-thumb { + background-color: #b7b9cc; +} + +.custom-control-label::before, +.custom-file-label, +.custom-select { + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .custom-control-label::before, + .custom-file-label, + .custom-select { + transition: none; + } +} + +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: 0.5rem 1rem; +} + +.nav-link:hover, .nav-link:focus { + text-decoration: none; +} + +.nav-link.disabled { + color: #858796; + pointer-events: none; + cursor: default; +} + +.nav-tabs { + border-bottom: 1px solid #dddfeb; +} + +.nav-tabs .nav-item { + margin-bottom: -1px; +} + +.nav-tabs .nav-link { + border: 1px solid transparent; + border-top-left-radius: 0.35rem; + border-top-right-radius: 0.35rem; +} + +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + border-color: #eaecf4 #eaecf4 #dddfeb; +} + +.nav-tabs .nav-link.disabled { + color: #858796; + background-color: transparent; + border-color: transparent; +} + +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: #6e707e; + background-color: #fff; + border-color: #dddfeb #dddfeb #fff; +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills .nav-link { + border-radius: 0.35rem; +} + +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #4e73df; +} + +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} + +.tab-content > .tab-pane { + display: none; +} + +.tab-content > .active { + display: block; +} + +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: 0.5rem 1rem; +} + +.navbar > .container, +.navbar > .container-fluid { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; +} + +.navbar-brand { + display: inline-block; + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + line-height: inherit; + white-space: nowrap; +} + +.navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} + +.navbar-nav .dropdown-menu { + position: static; + float: none; +} + +.navbar-text { + display: inline-block; + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} + +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.35rem; +} + +.navbar-toggler:hover, .navbar-toggler:focus { + text-decoration: none; +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + content: ""; + background: no-repeat center center; + background-size: 100% 100%; +} + +@media (max-width: 575.98px) { + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm > .container, + .navbar-expand-sm > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } +} + +@media (max-width: 767.98px) { + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md > .container, + .navbar-expand-md > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } +} + +@media (max-width: 991.98px) { + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg > .container, + .navbar-expand-lg > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } +} + +@media (max-width: 1199.98px) { + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + padding-right: 0; + padding-left: 0; + } +} + +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-flow: row nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl > .container, + .navbar-expand-xl > .container-fluid { + flex-wrap: nowrap; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } +} + +.navbar-expand { + flex-flow: row nowrap; + justify-content: flex-start; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid { + padding-right: 0; + padding-left: 0; +} + +.navbar-expand .navbar-nav { + flex-direction: row; +} + +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} + +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +.navbar-expand > .container, +.navbar-expand > .container-fluid { + flex-wrap: nowrap; +} + +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} + +.navbar-expand .navbar-toggler { + display: none; +} + +.navbar-light .navbar-brand { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-nav .nav-link { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus { + color: rgba(0, 0, 0, 0.7); +} + +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} + +.navbar-light .navbar-nav .show > .nav-link, +.navbar-light .navbar-nav .active > .nav-link, +.navbar-light .navbar-nav .nav-link.show, +.navbar-light .navbar-nav .nav-link.active { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-toggler { + color: rgba(0, 0, 0, 0.5); + border-color: rgba(0, 0, 0, 0.1); +} + +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-light .navbar-text { + color: rgba(0, 0, 0, 0.5); +} + +.navbar-light .navbar-text a { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus { + color: rgba(0, 0, 0, 0.9); +} + +.navbar-dark .navbar-brand { + color: #fff; +} + +.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus { + color: #fff; +} + +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus { + color: rgba(255, 255, 255, 0.75); +} + +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} + +.navbar-dark .navbar-nav .show > .nav-link, +.navbar-dark .navbar-nav .active > .nav-link, +.navbar-dark .navbar-nav .nav-link.show, +.navbar-dark .navbar-nav .nav-link.active { + color: #fff; +} + +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.5); + border-color: rgba(255, 255, 255, 0.1); +} + +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.5); +} + +.navbar-dark .navbar-text a { + color: #fff; +} + +.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus { + color: #fff; +} + +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #fff; + background-clip: border-box; + border: 1px solid #e3e6f0; + border-radius: 0.35rem; +} + +.card > hr { + margin-right: 0; + margin-left: 0; +} + +.card > .list-group:first-child .list-group-item:first-child { + border-top-left-radius: 0.35rem; + border-top-right-radius: 0.35rem; +} + +.card > .list-group:last-child .list-group-item:last-child { + border-bottom-right-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; +} + +.card-body { + flex: 1 1 auto; + padding: 1.25rem; +} + +.card-title { + margin-bottom: 0.75rem; +} + +.card-subtitle { + margin-top: -0.375rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link:hover { + text-decoration: none; +} + +.card-link + .card-link { + margin-left: 1.25rem; +} + +.card-header { + padding: 0.75rem 1.25rem; + margin-bottom: 0; + background-color: #f8f9fc; + border-bottom: 1px solid #e3e6f0; +} + +.card-header:first-child { + border-radius: calc(0.35rem - 1px) calc(0.35rem - 1px) 0 0; +} + +.card-header + .list-group .list-group-item:first-child { + border-top: 0; +} + +.card-footer { + padding: 0.75rem 1.25rem; + background-color: #f8f9fc; + border-top: 1px solid #e3e6f0; +} + +.card-footer:last-child { + border-radius: 0 0 calc(0.35rem - 1px) calc(0.35rem - 1px); +} + +.card-header-tabs { + margin-right: -0.625rem; + margin-bottom: -0.75rem; + margin-left: -0.625rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.625rem; + margin-left: -0.625rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + +.card-img { + width: 100%; + border-radius: calc(0.35rem - 1px); +} + +.card-img-top { + width: 100%; + border-top-left-radius: calc(0.35rem - 1px); + border-top-right-radius: calc(0.35rem - 1px); +} + +.card-img-bottom { + width: 100%; + border-bottom-right-radius: calc(0.35rem - 1px); + border-bottom-left-radius: calc(0.35rem - 1px); +} + +.card-deck { + display: flex; + flex-direction: column; +} + +.card-deck .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-deck { + flex-flow: row wrap; + margin-right: -0.75rem; + margin-left: -0.75rem; + } + .card-deck .card { + display: flex; + flex: 1 0 0%; + flex-direction: column; + margin-right: 0.75rem; + margin-bottom: 0; + margin-left: 0.75rem; + } +} + +.card-group { + display: flex; + flex-direction: column; +} + +.card-group > .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-group { + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + +.card-columns .card { + margin-bottom: 0.75rem; +} + +@media (min-width: 576px) { + .card-columns { + -moz-column-count: 3; + column-count: 3; + -moz-column-gap: 1.25rem; + column-gap: 1.25rem; + orphans: 1; + widows: 1; + } + .card-columns .card { + display: inline-block; + width: 100%; + } +} + +.accordion > .card { + overflow: hidden; +} + +.accordion > .card:not(:first-of-type) .card-header:first-child { + border-radius: 0; +} + +.accordion > .card:not(:first-of-type):not(:last-of-type) { + border-bottom: 0; + border-radius: 0; +} + +.accordion > .card:first-of-type { + border-bottom: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.accordion > .card:last-of-type { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.accordion > .card .card-header { + margin-bottom: -1px; +} + +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: 0.75rem 1rem; + margin-bottom: 1rem; + list-style: none; + background-color: #eaecf4; + border-radius: 0.35rem; +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} + +.breadcrumb-item + .breadcrumb-item::before { + display: inline-block; + padding-right: 0.5rem; + color: #858796; + content: "/"; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: underline; +} + +.breadcrumb-item + .breadcrumb-item:hover::before { + text-decoration: none; +} + +.breadcrumb-item.active { + color: #858796; +} + +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.35rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #4e73df; + background-color: #fff; + border: 1px solid #dddfeb; +} + +.page-link:hover { + z-index: 2; + color: #224abe; + text-decoration: none; + background-color: #eaecf4; + border-color: #dddfeb; +} + +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25); +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; +} + +.page-item:last-child .page-link { + border-top-right-radius: 0.35rem; + border-bottom-right-radius: 0.35rem; +} + +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #4e73df; + border-color: #4e73df; +} + +.page-item.disabled .page-link { + color: #858796; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dddfeb; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} + +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} + +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} + +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.badge { + display: inline-block; + padding: 0.25em 0.4em; + font-size: 75%; + font-weight: 700; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.35rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .badge { + transition: none; + } +} + +a.badge:hover, a.badge:focus { + text-decoration: none; +} + +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.badge-pill { + padding-right: 0.6em; + padding-left: 0.6em; + border-radius: 10rem; +} + +.badge-primary { + color: #fff; + background-color: #4e73df; +} + +a.badge-primary:hover, a.badge-primary:focus { + color: #fff; + background-color: #2653d4; +} + +a.badge-primary:focus, a.badge-primary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.5); +} + +.badge-secondary { + color: #fff; + background-color: #858796; +} + +a.badge-secondary:hover, a.badge-secondary:focus { + color: #fff; + background-color: #6b6d7d; +} + +a.badge-secondary:focus, a.badge-secondary.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(133, 135, 150, 0.5); +} + +.badge-success { + color: #fff; + background-color: #1cc88a; +} + +a.badge-success:hover, a.badge-success:focus { + color: #fff; + background-color: #169b6b; +} + +a.badge-success:focus, a.badge-success.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(28, 200, 138, 0.5); +} + +.badge-info { + color: #fff; + background-color: #36b9cc; +} + +a.badge-info:hover, a.badge-info:focus { + color: #fff; + background-color: #2a96a5; +} + +a.badge-info:focus, a.badge-info.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(54, 185, 204, 0.5); +} + +.badge-warning { + color: #fff; + background-color: #f6c23e; +} + +a.badge-warning:hover, a.badge-warning:focus { + color: #fff; + background-color: #f4b30d; +} + +a.badge-warning:focus, a.badge-warning.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(246, 194, 62, 0.5); +} + +.badge-danger { + color: #fff; + background-color: #e74a3b; +} + +a.badge-danger:hover, a.badge-danger:focus { + color: #fff; + background-color: #d52a1a; +} + +a.badge-danger:focus, a.badge-danger.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(231, 74, 59, 0.5); +} + +.badge-light { + color: #3a3b45; + background-color: #f8f9fc; +} + +a.badge-light:hover, a.badge-light:focus { + color: #3a3b45; + background-color: #d4daed; +} + +a.badge-light:focus, a.badge-light.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(248, 249, 252, 0.5); +} + +.badge-dark { + color: #fff; + background-color: #5a5c69; +} + +a.badge-dark:hover, a.badge-dark:focus { + color: #fff; + background-color: #42444e; +} + +a.badge-dark:focus, a.badge-dark.focus { + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(90, 92, 105, 0.5); +} + +.jumbotron { + padding: 2rem 1rem; + margin-bottom: 2rem; + background-color: #eaecf4; + border-radius: 0.3rem; +} + +@media (min-width: 576px) { + .jumbotron { + padding: 4rem 2rem; + } +} + +.jumbotron-fluid { + padding-right: 0; + padding-left: 0; + border-radius: 0; +} + +.alert { + position: relative; + padding: 0.75rem 1.25rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.35rem; +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; +} + +.alert-dismissible { + padding-right: 4rem; +} + +.alert-dismissible .close { + position: absolute; + top: 0; + right: 0; + padding: 0.75rem 1.25rem; + color: inherit; +} + +.alert-primary { + color: #293c74; + background-color: #dce3f9; + border-color: #cdd8f6; +} + +.alert-primary hr { + border-top-color: #b7c7f2; +} + +.alert-primary .alert-link { + color: #1c294e; +} + +.alert-secondary { + color: #45464e; + background-color: #e7e7ea; + border-color: #dddde2; +} + +.alert-secondary hr { + border-top-color: #cfcfd6; +} + +.alert-secondary .alert-link { + color: #2d2e33; +} + +.alert-success { + color: #0f6848; + background-color: #d2f4e8; + border-color: #bff0de; +} + +.alert-success hr { + border-top-color: #aaebd3; +} + +.alert-success .alert-link { + color: #093b29; +} + +.alert-info { + color: #1c606a; + background-color: #d7f1f5; + border-color: #c7ebf1; +} + +.alert-info hr { + border-top-color: #b3e4ec; +} + +.alert-info .alert-link { + color: #113b42; +} + +.alert-warning { + color: #806520; + background-color: #fdf3d8; + border-color: #fceec9; +} + +.alert-warning hr { + border-top-color: #fbe6b1; +} + +.alert-warning .alert-link { + color: #574516; +} + +.alert-danger { + color: #78261f; + background-color: #fadbd8; + border-color: #f8ccc8; +} + +.alert-danger hr { + border-top-color: #f5b7b1; +} + +.alert-danger .alert-link { + color: #4f1915; +} + +.alert-light { + color: #818183; + background-color: #fefefe; + border-color: #fdfdfe; +} + +.alert-light hr { + border-top-color: #ececf6; +} + +.alert-light .alert-link { + color: #686869; +} + +.alert-dark { + color: #2f3037; + background-color: #dedee1; + border-color: #d1d1d5; +} + +.alert-dark hr { + border-top-color: #c4c4c9; +} + +.alert-dark .alert-link { + color: #18181c; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 1rem 0; + } + to { + background-position: 0 0; + } +} + +.progress { + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #eaecf4; + border-radius: 0.35rem; +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #4e73df; + transition: width 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 1rem 1rem; +} + +.progress-bar-animated { + -webkit-animation: progress-bar-stripes 1s linear infinite; + animation: progress-bar-stripes 1s linear infinite; +} + +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} + +.media { + display: flex; + align-items: flex-start; +} + +.media-body { + flex: 1; +} + +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; +} + +.list-group-item-action { + width: 100%; + color: #6e707e; + text-align: inherit; +} + +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #6e707e; + text-decoration: none; + background-color: #f8f9fc; +} + +.list-group-item-action:active { + color: #858796; + background-color: #eaecf4; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.75rem 1.25rem; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} + +.list-group-item:first-child { + border-top-left-radius: 0.35rem; + border-top-right-radius: 0.35rem; +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; +} + +.list-group-item.disabled, .list-group-item:disabled { + color: #858796; + pointer-events: none; + background-color: #fff; +} + +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #4e73df; + border-color: #4e73df; +} + +.list-group-horizontal { + flex-direction: row; +} + +.list-group-horizontal .list-group-item { + margin-right: -1px; + margin-bottom: 0; +} + +.list-group-horizontal .list-group-item:first-child { + border-top-left-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; + border-top-right-radius: 0; +} + +.list-group-horizontal .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.35rem; + border-bottom-right-radius: 0.35rem; + border-bottom-left-radius: 0; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-sm .list-group-item:first-child { + border-top-left-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.35rem; + border-bottom-right-radius: 0.35rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-md .list-group-item:first-child { + border-top-left-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.35rem; + border-bottom-right-radius: 0.35rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-lg .list-group-item:first-child { + border-top-left-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.35rem; + border-bottom-right-radius: 0.35rem; + border-bottom-left-radius: 0; + } +} + +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl .list-group-item { + margin-right: -1px; + margin-bottom: 0; + } + .list-group-horizontal-xl .list-group-item:first-child { + border-top-left-radius: 0.35rem; + border-bottom-left-radius: 0.35rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl .list-group-item:last-child { + margin-right: 0; + border-top-right-radius: 0.35rem; + border-bottom-right-radius: 0.35rem; + border-bottom-left-radius: 0; + } +} + +.list-group-flush .list-group-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} + +.list-group-flush .list-group-item:last-child { + margin-bottom: -1px; +} + +.list-group-flush:first-child .list-group-item:first-child { + border-top: 0; +} + +.list-group-flush:last-child .list-group-item:last-child { + margin-bottom: 0; + border-bottom: 0; +} + +.list-group-item-primary { + color: #293c74; + background-color: #cdd8f6; +} + +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #293c74; + background-color: #b7c7f2; +} + +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #293c74; + border-color: #293c74; +} + +.list-group-item-secondary { + color: #45464e; + background-color: #dddde2; +} + +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #45464e; + background-color: #cfcfd6; +} + +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #45464e; + border-color: #45464e; +} + +.list-group-item-success { + color: #0f6848; + background-color: #bff0de; +} + +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f6848; + background-color: #aaebd3; +} + +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f6848; + border-color: #0f6848; +} + +.list-group-item-info { + color: #1c606a; + background-color: #c7ebf1; +} + +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #1c606a; + background-color: #b3e4ec; +} + +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #1c606a; + border-color: #1c606a; +} + +.list-group-item-warning { + color: #806520; + background-color: #fceec9; +} + +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #806520; + background-color: #fbe6b1; +} + +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #806520; + border-color: #806520; +} + +.list-group-item-danger { + color: #78261f; + background-color: #f8ccc8; +} + +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #78261f; + background-color: #f5b7b1; +} + +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #78261f; + border-color: #78261f; +} + +.list-group-item-light { + color: #818183; + background-color: #fdfdfe; +} + +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #818183; + background-color: #ececf6; +} + +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #818183; + border-color: #818183; +} + +.list-group-item-dark { + color: #2f3037; + background-color: #d1d1d5; +} + +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #2f3037; + background-color: #c4c4c9; +} + +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #2f3037; + border-color: #2f3037; +} + +.close { + float: right; + font-size: 1.5rem; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + opacity: .5; +} + +.close:hover { + color: #000; + text-decoration: none; +} + +.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus { + opacity: .75; +} + +button.close { + padding: 0; + background-color: transparent; + border: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +a.close.disabled { + pointer-events: none; +} + +.toast { + max-width: 350px; + overflow: hidden; + font-size: 0.875rem; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1); + -webkit-backdrop-filter: blur(10px); + backdrop-filter: blur(10px); + opacity: 0; + border-radius: 0.25rem; +} + +.toast:not(:last-child) { + margin-bottom: 0.75rem; +} + +.toast.showing { + opacity: 1; +} + +.toast.show { + display: block; + opacity: 1; +} + +.toast.hide { + display: none; +} + +.toast-header { + display: flex; + align-items: center; + padding: 0.25rem 0.75rem; + color: #858796; + background-color: rgba(255, 255, 255, 0.85); + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); +} + +.toast-body { + padding: 0.75rem; +} + +.modal-open { + overflow: hidden; +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + display: none; + width: 100%; + height: 100%; + overflow: hidden; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} + +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} + +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} + +.modal.show .modal-dialog { + transform: none; +} + +.modal-dialog-scrollable { + display: flex; + max-height: calc(100% - 1rem); +} + +.modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 1rem); + overflow: hidden; +} + +.modal-dialog-scrollable .modal-header, +.modal-dialog-scrollable .modal-footer { + flex-shrink: 0; +} + +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - 1rem); +} + +.modal-dialog-centered::before { + display: block; + height: calc(100vh - 1rem); + content: ""; +} + +.modal-dialog-centered.modal-dialog-scrollable { + flex-direction: column; + justify-content: center; + height: 100%; +} + +.modal-dialog-centered.modal-dialog-scrollable .modal-content { + max-height: none; +} + +.modal-dialog-centered.modal-dialog-scrollable::before { + content: none; +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop.show { + opacity: 0.5; +} + +.modal-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #e3e6f0; + border-top-left-radius: 0.3rem; + border-top-right-radius: 0.3rem; +} + +.modal-header .close { + padding: 1rem 1rem; + margin: -1rem -1rem -1rem auto; +} + +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: 1rem; +} + +.modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + padding: 1rem; + border-top: 1px solid #e3e6f0; + border-bottom-right-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} + +.modal-footer > :not(:first-child) { + margin-left: .25rem; +} + +.modal-footer > :not(:last-child) { + margin-right: .25rem; +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + .modal-dialog-scrollable { + max-height: calc(100% - 3.5rem); + } + .modal-dialog-scrollable .modal-content { + max-height: calc(100vh - 3.5rem); + } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + .modal-dialog-centered::before { + height: calc(100vh - 3.5rem); + } + .modal-sm { + max-width: 300px; + } +} + +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} + +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + margin: 0; + font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} + +.tooltip.show { + opacity: 0.9; +} + +.tooltip .arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} + +.tooltip .arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top, .bs-tooltip-auto[x-placement^="top"] { + padding: 0.4rem 0; +} + +.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^="top"] .arrow { + bottom: 0; +} + +.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^="top"] .arrow::before { + top: 0; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} + +.bs-tooltip-right, .bs-tooltip-auto[x-placement^="right"] { + padding: 0 0.4rem; +} + +.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^="right"] .arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^="right"] .arrow::before { + right: 0; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} + +.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^="bottom"] { + padding: 0.4rem 0; +} + +.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^="bottom"] .arrow { + top: 0; +} + +.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^="bottom"] .arrow::before { + bottom: 0; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} + +.bs-tooltip-left, .bs-tooltip-auto[x-placement^="left"] { + padding: 0 0.4rem; +} + +.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^="left"] .arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} + +.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^="left"] .arrow::before { + left: 0; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} + +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.35rem; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: block; + max-width: 276px; + font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #fff; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} + +.popover .arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; + margin: 0 0.3rem; +} + +.popover .arrow::before, .popover .arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-popover-top, .bs-popover-auto[x-placement^="top"] { + margin-bottom: 0.5rem; +} + +.bs-popover-top > .arrow, .bs-popover-auto[x-placement^="top"] > .arrow { + bottom: calc((0.5rem + 1px) * -1); +} + +.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^="top"] > .arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^="top"] > .arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #fff; +} + +.bs-popover-right, .bs-popover-auto[x-placement^="right"] { + margin-left: 0.5rem; +} + +.bs-popover-right > .arrow, .bs-popover-auto[x-placement^="right"] > .arrow { + left: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^="right"] > .arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^="right"] > .arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #fff; +} + +.bs-popover-bottom, .bs-popover-auto[x-placement^="bottom"] { + margin-top: 0.5rem; +} + +.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^="bottom"] > .arrow { + top: calc((0.5rem + 1px) * -1); +} + +.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #fff; +} + +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ""; + border-bottom: 1px solid #f7f7f7; +} + +.bs-popover-left, .bs-popover-auto[x-placement^="left"] { + margin-right: 0.5rem; +} + +.bs-popover-left > .arrow, .bs-popover-auto[x-placement^="left"] > .arrow { + right: calc((0.5rem + 1px) * -1); + width: 0.5rem; + height: 1rem; + margin: 0.3rem 0; +} + +.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^="left"] > .arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} + +.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^="left"] > .arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #fff; +} + +.popover-header { + padding: 0.5rem 0.75rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} + +.popover-header:empty { + display: none; +} + +.popover-body { + padding: 0.5rem 0.75rem; + color: #858796; +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-left), +.active.carousel-item-right { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-right), +.active.carousel-item-left { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} + +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-left, +.carousel-fade .carousel-item-prev.carousel-item-right { + z-index: 1; + opacity: 1; +} + +.carousel-fade .active.carousel-item-left, +.carousel-fade .active.carousel-item-right { + z-index: 0; + opacity: 0; + transition: 0s 0.6s opacity; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-left, + .carousel-fade .active.carousel-item-right { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + color: #fff; + text-align: center; + opacity: 0.5; + transition: opacity 0.15s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} + +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 20px; + height: 20px; + background: no-repeat 50% / 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e"); +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e"); +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 15; + display: flex; + justify-content: center; + padding-left: 0; + margin-right: 15%; + margin-left: 15%; + list-style: none; +} + +.carousel-indicators li { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: .5; + transition: opacity 0.6s ease; +} + +@media (prefers-reduced-motion: reduce) { + .carousel-indicators li { + transition: none; + } +} + +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; +} + +@-webkit-keyframes spinner-border { + to { + transform: rotate(360deg); + } +} + +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} + +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: spinner-border .75s linear infinite; + animation: spinner-border .75s linear infinite; +} + +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} + +@-webkit-keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + } +} + +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: text-bottom; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: spinner-grow .75s linear infinite; + animation: spinner-grow .75s linear infinite; +} + +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #4e73df !important; +} + +a.bg-primary:hover, a.bg-primary:focus, +button.bg-primary:hover, +button.bg-primary:focus { + background-color: #2653d4 !important; +} + +.bg-secondary { + background-color: #858796 !important; +} + +a.bg-secondary:hover, a.bg-secondary:focus, +button.bg-secondary:hover, +button.bg-secondary:focus { + background-color: #6b6d7d !important; +} + +.bg-success { + background-color: #1cc88a !important; +} + +a.bg-success:hover, a.bg-success:focus, +button.bg-success:hover, +button.bg-success:focus { + background-color: #169b6b !important; +} + +.bg-info { + background-color: #36b9cc !important; +} + +a.bg-info:hover, a.bg-info:focus, +button.bg-info:hover, +button.bg-info:focus { + background-color: #2a96a5 !important; +} + +.bg-warning { + background-color: #f6c23e !important; +} + +a.bg-warning:hover, a.bg-warning:focus, +button.bg-warning:hover, +button.bg-warning:focus { + background-color: #f4b30d !important; +} + +.bg-danger { + background-color: #e74a3b !important; +} + +a.bg-danger:hover, a.bg-danger:focus, +button.bg-danger:hover, +button.bg-danger:focus { + background-color: #d52a1a !important; +} + +.bg-light { + background-color: #f8f9fc !important; +} + +a.bg-light:hover, a.bg-light:focus, +button.bg-light:hover, +button.bg-light:focus { + background-color: #d4daed !important; +} + +.bg-dark { + background-color: #5a5c69 !important; +} + +a.bg-dark:hover, a.bg-dark:focus, +button.bg-dark:hover, +button.bg-dark:focus { + background-color: #42444e !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #e3e6f0 !important; +} + +.border-top { + border-top: 1px solid #e3e6f0 !important; +} + +.border-right { + border-right: 1px solid #e3e6f0 !important; +} + +.border-bottom { + border-bottom: 1px solid #e3e6f0 !important; +} + +.border-left { + border-left: 1px solid #e3e6f0 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #4e73df !important; +} + +.border-secondary { + border-color: #858796 !important; +} + +.border-success { + border-color: #1cc88a !important; +} + +.border-info { + border-color: #36b9cc !important; +} + +.border-warning { + border-color: #f6c23e !important; +} + +.border-danger { + border-color: #e74a3b !important; +} + +.border-light { + border-color: #f8f9fc !important; +} + +.border-dark { + border-color: #5a5c69 !important; +} + +.border-white { + border-color: #fff !important; +} + +.rounded-sm { + border-radius: 0.2rem !important; +} + +.rounded { + border-radius: 0.35rem !important; +} + +.rounded-top { + border-top-left-radius: 0.35rem !important; + border-top-right-radius: 0.35rem !important; +} + +.rounded-right { + border-top-right-radius: 0.35rem !important; + border-bottom-right-radius: 0.35rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.35rem !important; + border-bottom-left-radius: 0.35rem !important; +} + +.rounded-left { + border-top-left-radius: 0.35rem !important; + border-bottom-left-radius: 0.35rem !important; +} + +.rounded-lg { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } +} + +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } +} + +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } +} + +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } +} + +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } +} + +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} + +.embed-responsive::before { + display: block; + content: ""; +} + +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.85714%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } +} + +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } +} + +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } +} + +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .float-sm-none { + float: none !important; + } +} + +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .float-md-none { + float: none !important; + } +} + +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .float-lg-none { + float: none !important; + } +} + +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .float-xl-none { + float: none !important; + } +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem 0 rgba(58, 59, 69, 0.2) !important; +} + +.shadow { + box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + .p-sm-0 { + padding: 0 !important; + } + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + .m-sm-n1 { + margin: -0.25rem !important; + } + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; + } + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; + } + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; + } + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; + } + .m-sm-n2 { + margin: -0.5rem !important; + } + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; + } + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; + } + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; + } + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; + } + .m-sm-n3 { + margin: -1rem !important; + } + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; + } + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; + } + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; + } + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; + } + .m-sm-n4 { + margin: -1.5rem !important; + } + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; + } + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; + } + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; + } + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; + } + .m-sm-n5 { + margin: -3rem !important; + } + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; + } + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; + } + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; + } + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + .p-md-0 { + padding: 0 !important; + } + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + .m-md-n1 { + margin: -0.25rem !important; + } + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; + } + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; + } + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; + } + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; + } + .m-md-n2 { + margin: -0.5rem !important; + } + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; + } + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; + } + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; + } + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; + } + .m-md-n3 { + margin: -1rem !important; + } + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; + } + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; + } + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; + } + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; + } + .m-md-n4 { + margin: -1.5rem !important; + } + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; + } + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; + } + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; + } + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; + } + .m-md-n5 { + margin: -3rem !important; + } + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; + } + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; + } + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; + } + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} + +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + .p-lg-0 { + padding: 0 !important; + } + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + .m-lg-n1 { + margin: -0.25rem !important; + } + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; + } + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; + } + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; + } + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; + } + .m-lg-n2 { + margin: -0.5rem !important; + } + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; + } + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; + } + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; + } + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; + } + .m-lg-n3 { + margin: -1rem !important; + } + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; + } + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; + } + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; + } + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; + } + .m-lg-n4 { + margin: -1.5rem !important; + } + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; + } + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; + } + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; + } + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; + } + .m-lg-n5 { + margin: -3rem !important; + } + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; + } + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; + } + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; + } + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} + +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + .p-xl-0 { + padding: 0 !important; + } + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + .m-xl-n1 { + margin: -0.25rem !important; + } + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; + } + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; + } + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; + } + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; + } + .m-xl-n2 { + margin: -0.5rem !important; + } + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; + } + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; + } + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; + } + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; + } + .m-xl-n3 { + margin: -1rem !important; + } + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; + } + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; + } + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; + } + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; + } + .m-xl-n4 { + margin: -1.5rem !important; + } + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; + } + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; + } + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; + } + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; + } + .m-xl-n5 { + margin: -3rem !important; + } + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; + } + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; + } + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; + } + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} + +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} + +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} + +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} + +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase, .dropdown .dropdown-menu .dropdown-header, .sidebar .sidebar-heading { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #fff !important; +} + +.text-primary { + color: #4e73df !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #224abe !important; +} + +.text-secondary { + color: #858796 !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #60616f !important; +} + +.text-success { + color: #1cc88a !important; +} + +a.text-success:hover, a.text-success:focus { + color: #13855c !important; +} + +.text-info { + color: #36b9cc !important; +} + +a.text-info:hover, a.text-info:focus { + color: #258391 !important; +} + +.text-warning { + color: #f6c23e !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #dda20a !important; +} + +.text-danger { + color: #e74a3b !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #be2617 !important; +} + +.text-light { + color: #f8f9fc !important; +} + +a.text-light:hover, a.text-light:focus { + color: #c2cbe5 !important; +} + +.text-dark { + color: #5a5c69 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #373840 !important; +} + +.text-body { + color: #858796 !important; +} + +.text-muted { + color: #858796 !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +@media print { + *, + *::before, + *::after { + text-shadow: none !important; + box-shadow: none !important; + } + a:not(.btn) { + text-decoration: underline; + } + abbr[title]::after { + content: " (" attr(title) ")"; + } + pre { + white-space: pre-wrap !important; + } + pre, + blockquote { + border: 1px solid #b7b9cc; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + @page { + size: a3; + } + body { + min-width: 992px !important; + } + .container { + min-width: 992px !important; + } + .navbar { + display: none; + } + .badge { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #dddfeb !important; + } + .table-dark { + color: inherit; + } + .table-dark th, + .table-dark td, + .table-dark thead th, + .table-dark tbody + tbody { + border-color: #e3e6f0; + } + .table .thead-dark th { + color: inherit; + border-color: #e3e6f0; + } +} + +html { + position: relative; + min-height: 100%; +} + +body { + height: 100%; +} + +a:focus { + outline: none; +} + +#wrapper { + display: flex; +} + +#wrapper #content-wrapper { + background-color: #f8f9fc; + width: 100%; + overflow-x: hidden; + +} + +#wrapper #content-wrapper #content { + flex: 1 0 auto; +} + +.container, +.container-fluid { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.scroll-to-top { + position: fixed; + right: 1rem; + bottom: 1rem; + display: none; + width: 2.75rem; + height: 2.75rem; + text-align: center; + color: #fff; + background: rgba(90, 92, 105, 0.5); + line-height: 46px; +} + +.scroll-to-top:focus, .scroll-to-top:hover { + color: white; +} + +.scroll-to-top:hover { + background: #5a5c69; +} + +.scroll-to-top i { + font-weight: 800; +} + +@-webkit-keyframes growIn { + 0% { + transform: scale(0.9); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +@keyframes growIn { + 0% { + transform: scale(0.9); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +.animated--grow-in, .sidebar .nav-item .collapse { + -webkit-animation-name: growIn; + animation-name: growIn; + -webkit-animation-duration: 200ms; + animation-duration: 200ms; + -webkit-animation-timing-function: transform cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1); + animation-timing-function: transform cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1); +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.animated--fade-in { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; + -webkit-animation-duration: 200ms; + animation-duration: 200ms; + -webkit-animation-timing-function: opacity cubic-bezier(0, 1, 0.4, 1); + animation-timing-function: opacity cubic-bezier(0, 1, 0.4, 1); +} + +.bg-gradient-primary { + background-color: #4e73df; + background-image: linear-gradient(180deg, #4e73df 10%, #224abe 100%); + background-size: cover; +} + +.bg-gradient-secondary { + background-color: #858796; + background-image: linear-gradient(180deg, #858796 10%, #60616f 100%); + background-size: cover; +} + +.bg-gradient-success { + background-color: #1cc88a; + background-image: linear-gradient(180deg, #1cc88a 10%, #13855c 100%); + background-size: cover; +} + +.bg-gradient-info { + background-color: #36b9cc; + background-image: linear-gradient(180deg, #36b9cc 10%, #258391 100%); + background-size: cover; +} + +.bg-gradient-warning { + background-color: #f6c23e; + background-image: linear-gradient(180deg, #f6c23e 10%, #dda20a 100%); + background-size: cover; +} + +.bg-gradient-danger { + background-color: #e74a3b; + background-image: linear-gradient(180deg, #e74a3b 10%, #be2617 100%); + background-size: cover; +} + +.bg-gradient-light { + background-color: #f8f9fc; + background-image: linear-gradient(180deg, #f8f9fc 10%, #c2cbe5 100%); + background-size: cover; +} + +.bg-gradient-dark { + background-color: #5a5c69; + background-image: linear-gradient(180deg, #5a5c69 10%, #373840 100%); + background-size: cover; +} + +.bg-gray-100 { + background-color: #f8f9fc !important; +} + +.bg-gray-200 { + background-color: #eaecf4 !important; +} + +.bg-gray-300 { + background-color: #dddfeb !important; +} + +.bg-gray-400 { + background-color: #d1d3e2 !important; +} + +.bg-gray-500 { + background-color: #b7b9cc !important; +} + +.bg-gray-600 { + background-color: #858796 !important; +} + +.bg-gray-700 { + background-color: #6e707e !important; +} + +.bg-gray-800 { + background-color: #5a5c69 !important; +} + +.bg-gray-900 { + background-color: #3a3b45 !important; +} + +.o-hidden { + overflow: hidden !important; +} + +.text-xs { + font-size: .7rem; +} + +.text-lg { + font-size: 1.2rem; +} + +.text-gray-100 { + color: #f8f9fc !important; +} + +.text-gray-200 { + color: #eaecf4 !important; +} + +.text-gray-300 { + color: #dddfeb !important; +} + +.text-gray-400 { + color: #d1d3e2 !important; +} + +.text-gray-500 { + color: #b7b9cc !important; +} + +.text-gray-600 { + color: #858796 !important; +} + +.text-gray-700 { + color: #6e707e !important; +} + +.text-gray-800 { + color: #5a5c69 !important; +} + +.text-gray-900 { + color: #3a3b45 !important; +} + +.icon-circle { + height: 2.5rem; + width: 2.5rem; + border-radius: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.border-left-primary { + border-left: 0.25rem solid #4e73df !important; +} + +.border-bottom-primary { + border-bottom: 0.25rem solid #4e73df !important; +} + +.border-left-secondary { + border-left: 0.25rem solid #858796 !important; +} + +.border-bottom-secondary { + border-bottom: 0.25rem solid #858796 !important; +} + +.border-left-success { + border-left: 0.25rem solid #1cc88a !important; +} + +.border-bottom-success { + border-bottom: 0.25rem solid #1cc88a !important; +} + +.border-left-info { + border-left: 0.25rem solid #36b9cc !important; +} + +.border-bottom-info { + border-bottom: 0.25rem solid #36b9cc !important; +} + +.border-left-warning { + border-left: 0.25rem solid #f6c23e !important; +} + +.border-bottom-warning { + border-bottom: 0.25rem solid #f6c23e !important; +} + +.border-left-danger { + border-left: 0.25rem solid #e74a3b !important; +} + +.border-bottom-danger { + border-bottom: 0.25rem solid #e74a3b !important; +} + +.border-left-light { + border-left: 0.25rem solid #f8f9fc !important; +} + +.border-bottom-light { + border-bottom: 0.25rem solid #f8f9fc !important; +} + +.border-left-dark { + border-left: 0.25rem solid #5a5c69 !important; +} + +.border-bottom-dark { + border-bottom: 0.25rem solid #5a5c69 !important; +} + +.progress-sm { + height: .5rem; +} + +.rotate-15 { + transform: rotate(15deg); +} + +.rotate-n-15 { + transform: rotate(-15deg); +} + +.dropdown .dropdown-menu { + font-size: 0.85rem; +} + +.dropdown .dropdown-menu .dropdown-header { + font-weight: 800; + font-size: 0.65rem; + color: #b7b9cc; +} + +.dropdown.no-arrow .dropdown-toggle::after { + display: none; +} + +.sidebar .nav-item.dropdown .dropdown-toggle::after, +.topbar .nav-item.dropdown .dropdown-toggle::after { + width: 1rem; + text-align: center; + float: right; + vertical-align: 0; + border: 0; + font-weight: 900; + content: '\f105'; + font-family: 'Font Awesome 5 Free'; +} + +.sidebar .nav-item.dropdown.show .dropdown-toggle::after, +.topbar .nav-item.dropdown.show .dropdown-toggle::after { + content: '\f107'; +} + +.sidebar .nav-item .nav-link, +.topbar .nav-item .nav-link { + position: relative; +} + +.sidebar .nav-item .nav-link .badge-counter, +.topbar .nav-item .nav-link .badge-counter { + position: absolute; + transform: scale(0.7); + transform-origin: top right; + right: .25rem; + margin-top: -.25rem; +} + +.sidebar .nav-item .nav-link .img-profile, +.topbar .nav-item .nav-link .img-profile { + height: 2rem; + width: 2rem; +} + +.topbar { + height: 4.375rem; +} + +.topbar #sidebarToggleTop { + height: 2.5rem; + width: 2.5rem; +} + +.topbar #sidebarToggleTop:hover { + background-color: #eaecf4; +} + +.topbar #sidebarToggleTop:active { + background-color: #dddfeb; +} + +.topbar .navbar-search { + width: 25rem; +} + +.topbar .navbar-search input { + font-size: 0.85rem; + height: auto; +} + +.topbar .topbar-divider { + width: 0; + border-right: 1px solid #e3e6f0; + height: calc(4.375rem - 2rem); + margin: auto 1rem; +} + +.topbar .nav-item .nav-link { + height: 4.375rem; + display: flex; + align-items: center; + padding: 0 0.75rem; +} + +.topbar .nav-item .nav-link:focus { + outline: none; +} + +.topbar .nav-item:focus { + outline: none; +} + +.topbar .dropdown { + position: static; +} + +.topbar .dropdown .dropdown-menu { + width: calc(100% - 1.5rem); + right: 0.75rem; +} + +.topbar .dropdown-list { + padding: 0; + border: none; + overflow: hidden; +} + +.topbar .dropdown-list .dropdown-header { + background-color: #4e73df; + border: 1px solid #4e73df; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #fff; +} + +.topbar .dropdown-list .dropdown-item { + white-space: normal; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + border-left: 1px solid #e3e6f0; + border-right: 1px solid #e3e6f0; + border-bottom: 1px solid #e3e6f0; + line-height: 1.3rem; +} + +.topbar .dropdown-list .dropdown-item .dropdown-list-image { + position: relative; + height: 2.5rem; + width: 2.5rem; +} + +.topbar .dropdown-list .dropdown-item .dropdown-list-image img { + height: 2.5rem; + width: 2.5rem; +} + +.topbar .dropdown-list .dropdown-item .dropdown-list-image .status-indicator { + background-color: #eaecf4; + height: 0.75rem; + width: 0.75rem; + border-radius: 100%; + position: absolute; + bottom: 0; + right: 0; + border: 0.125rem solid #fff; +} + +.topbar .dropdown-list .dropdown-item .text-truncate { + max-width: 10rem; +} + +.topbar .dropdown-list .dropdown-item:active { + background-color: #eaecf4; + color: #3a3b45; +} + +@media (min-width: 576px) { + .topbar .dropdown { + position: relative; + } + .topbar .dropdown .dropdown-menu { + width: auto; + right: 0; + } + .topbar .dropdown-list { + width: 20rem !important; + } + .topbar .dropdown-list .dropdown-item .text-truncate { + max-width: 13.375rem; + } +} + +.topbar.navbar-light .navbar-nav .nav-item .nav-link { + color: #d1d3e2; +} + +.topbar.navbar-light .navbar-nav .nav-item .nav-link:hover { + color: #b7b9cc; +} + +.topbar.navbar-light .navbar-nav .nav-item .nav-link:active { + color: #858796; +} + +.sidebar { + width: 6.5rem; + min-height: 100vh; +} + +.sidebar .nav-item { + position: relative; +} + +.sidebar .nav-item:last-child { + margin-bottom: 1rem; +} + +.sidebar .nav-item .nav-link { + text-align: center; + padding: 0.75rem 1rem; + width: 6.5rem; +} + +.sidebar .nav-item .nav-link span { + font-size: 0.65rem; + display: block; +} + +.sidebar .nav-item.active .nav-link { + font-weight: 700; +} + +.sidebar .nav-item .collapse { + position: absolute; + left: calc(6.5rem + 1.5rem / 2); + z-index: 1; + top: 2px; +} + +.sidebar .nav-item .collapse .collapse-inner { + border-radius: 0.35rem; + box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15); +} + +.sidebar .nav-item .collapsing { + display: none; + transition: none; +} + +.sidebar .nav-item .collapse .collapse-inner, +.sidebar .nav-item .collapsing .collapse-inner { + padding: .5rem 0; + min-width: 10rem; + font-size: 0.85rem; + margin: 0 0 1rem 0; +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-header, +.sidebar .nav-item .collapsing .collapse-inner .collapse-header { + margin: 0; + white-space: nowrap; + padding: .5rem 1.5rem; + text-transform: uppercase; + font-weight: 800; + font-size: 0.65rem; + color: #b7b9cc; +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item, +.sidebar .nav-item .collapsing .collapse-inner .collapse-item { + padding: 0.5rem 1rem; + margin: 0 0.5rem; + display: block; + color: #3a3b45; + text-decoration: none; + border-radius: 0.35rem; + white-space: nowrap; +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item:hover, +.sidebar .nav-item .collapsing .collapse-inner .collapse-item:hover { + background-color: #eaecf4; +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item:active, +.sidebar .nav-item .collapsing .collapse-inner .collapse-item:active { + background-color: #dddfeb; +} + +.sidebar .nav-item .collapse .collapse-inner .collapse-item.active, +.sidebar .nav-item .collapsing .collapse-inner .collapse-item.active { + color: #4e73df; + font-weight: 700; +} + +.sidebar #sidebarToggle { + width: 2.5rem; + height: 2.5rem; + text-align: center; + margin-bottom: 1rem; + cursor: pointer; +} + +.sidebar #sidebarToggle::after { + font-weight: 900; + content: '\f104'; + font-family: 'Font Awesome 5 Free'; + margin-right: 0.1rem; +} + +.sidebar #sidebarToggle:hover { + text-decoration: none; +} + +.sidebar #sidebarToggle:focus { + outline: none; +} + +.sidebar.toggled { + width: 0 !important; + overflow: hidden; +} + +.sidebar.toggled #sidebarToggle::after { + content: '\f105'; + font-family: 'Font Awesome 5 Free'; + margin-left: 0.25rem; +} + +.sidebar .sidebar-brand { + height: 4.375rem; + text-decoration: none; + font-size: 1rem; + font-weight: 800; + padding: 1.5rem 1rem; + text-align: center; + text-transform: uppercase; + letter-spacing: 0.05rem; + z-index: 1; +} + +.sidebar .sidebar-brand .sidebar-brand-icon i { + font-size: 2rem; +} + +.sidebar .sidebar-brand .sidebar-brand-text { + display: none; +} + +.sidebar hr.sidebar-divider { + margin: 0 1rem 1rem; +} + +.sidebar .sidebar-heading { + text-align: center; + padding: 0 1rem; + font-weight: 800; + font-size: 0.65rem; +} + +@media (min-width: 768px) { + .sidebar { + width: 14rem !important; + } + .sidebar .nav-item .collapse { + position: relative; + left: 0; + z-index: 1; + top: 0; + -webkit-animation: none; + animation: none; + } + .sidebar .nav-item .collapse .collapse-inner { + border-radius: 0; + box-shadow: none; + } + .sidebar .nav-item .collapsing { + display: block; + transition: height 0.15s ease; + } + .sidebar .nav-item .collapse, + .sidebar .nav-item .collapsing { + margin: 0 1rem; + } + .sidebar .nav-item .nav-link { + display: block; + width: 100%; + text-align: left; + padding: 1rem; + width: 14rem; + } + .sidebar .nav-item .nav-link i { + font-size: 0.85rem; + margin-right: 0.25rem; + } + .sidebar .nav-item .nav-link span { + font-size: 0.85rem; + display: inline; + } + .sidebar .nav-item .nav-link[data-toggle="collapse"]::after { + width: 1rem; + text-align: center; + float: right; + vertical-align: 0; + border: 0; + font-weight: 900; + content: '\f107'; + font-family: 'Font Awesome 5 Free'; + } + .sidebar .nav-item .nav-link[data-toggle="collapse"].collapsed::after { + content: '\f105'; + } + .sidebar .sidebar-brand .sidebar-brand-icon i { + font-size: 2rem; + } + .sidebar .sidebar-brand .sidebar-brand-text { + display: inline; + } + .sidebar .sidebar-heading { + text-align: left; + } + .sidebar.toggled { + overflow: visible; + width: 6.5rem !important; + } + .sidebar.toggled .nav-item .collapse { + position: absolute; + left: calc(6.5rem + 1.5rem / 2); + z-index: 1; + top: 2px; + -webkit-animation-name: growIn; + animation-name: growIn; + -webkit-animation-duration: 200ms; + animation-duration: 200ms; + -webkit-animation-timing-function: transform cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1); + animation-timing-function: transform cubic-bezier(0.18, 1.25, 0.4, 1), opacity cubic-bezier(0, 1, 0.4, 1); + } + .sidebar.toggled .nav-item .collapse .collapse-inner { + box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15); + border-radius: 0.35rem; + } + .sidebar.toggled .nav-item .collapsing { + display: none; + transition: none; + } + .sidebar.toggled .nav-item .collapse, + .sidebar.toggled .nav-item .collapsing { + margin: 0; + } + .sidebar.toggled .nav-item:last-child { + margin-bottom: 1rem; + } + .sidebar.toggled .nav-item .nav-link { + text-align: center; + padding: 0.75rem 1rem; + width: 6.5rem; + } + .sidebar.toggled .nav-item .nav-link span { + font-size: 0.65rem; + display: block; + } + .sidebar.toggled .nav-item .nav-link i { + margin-right: 0; + } + .sidebar.toggled .nav-item .nav-link[data-toggle="collapse"]::after { + display: none; + } + .sidebar.toggled .sidebar-brand .sidebar-brand-icon i { + font-size: 2rem; + } + .sidebar.toggled .sidebar-brand .sidebar-brand-text { + display: none; + } + .sidebar.toggled .sidebar-heading { + text-align: center; + } +} + +.sidebar-light .sidebar-brand { + color: #6e707e; +} + +.sidebar-light hr.sidebar-divider { + border-top: 1px solid #eaecf4; +} + +.sidebar-light .sidebar-heading { + color: #b7b9cc; +} + +.sidebar-light .nav-item .nav-link { + color: #858796; +} + +.sidebar-light .nav-item .nav-link i { + color: #d1d3e2; +} + +.sidebar-light .nav-item .nav-link:active, .sidebar-light .nav-item .nav-link:focus, .sidebar-light .nav-item .nav-link:hover { + color: #6e707e; +} + +.sidebar-light .nav-item .nav-link:active i, .sidebar-light .nav-item .nav-link:focus i, .sidebar-light .nav-item .nav-link:hover i { + color: #6e707e; +} + +.sidebar-light .nav-item .nav-link[data-toggle="collapse"]::after { + color: #b7b9cc; +} + +.sidebar-light .nav-item.active .nav-link { + color: #6e707e; +} + +.sidebar-light .nav-item.active .nav-link i { + color: #6e707e; +} + +.sidebar-light #sidebarToggle { + background-color: #eaecf4; +} + +.sidebar-light #sidebarToggle::after { + color: #b7b9cc; +} + +.sidebar-light #sidebarToggle:hover { + background-color: #dddfeb; +} + +.sidebar-dark .sidebar-brand { + color: #fff; +} + +.sidebar-dark hr.sidebar-divider { + border-top: 1px solid rgba(255, 255, 255, 0.15); +} + +.sidebar-dark .sidebar-heading { + color: rgba(255, 255, 255, 0.4); +} + +.sidebar-dark .nav-item .nav-link { + color: rgba(255, 255, 255, 0.8); +} + +.sidebar-dark .nav-item .nav-link i { + color: rgba(255, 255, 255, 0.3); +} + +.sidebar-dark .nav-item .nav-link:active, .sidebar-dark .nav-item .nav-link:focus, .sidebar-dark .nav-item .nav-link:hover { + color: #fff; +} + +.sidebar-dark .nav-item .nav-link:active i, .sidebar-dark .nav-item .nav-link:focus i, .sidebar-dark .nav-item .nav-link:hover i { + color: #fff; +} + +.sidebar-dark .nav-item .nav-link[data-toggle="collapse"]::after { + color: rgba(255, 255, 255, 0.5); +} + +.sidebar-dark .nav-item.active .nav-link { + color: #fff; +} + +.sidebar-dark .nav-item.active .nav-link i { + color: #fff; +} + +.sidebar-dark #sidebarToggle { + background-color: rgba(255, 255, 255, 0.2); +} + +.sidebar-dark #sidebarToggle::after { + color: rgba(255, 255, 255, 0.5); +} + +.sidebar-dark #sidebarToggle:hover { + background-color: rgba(255, 255, 255, 0.25); +} + +.sidebar-dark.toggled #sidebarToggle::after { + color: rgba(255, 255, 255, 0.5); +} + +.btn-circle { + border-radius: 100%; + height: 2.5rem; + width: 2.5rem; + font-size: 1rem; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.btn-circle.btn-sm, .btn-group-sm > .btn-circle.btn { + height: 1.8rem; + width: 1.8rem; + font-size: 0.75rem; +} + +.btn-circle.btn-lg, .btn-group-lg > .btn-circle.btn { + height: 3.5rem; + width: 3.5rem; + font-size: 1.35rem; +} + +.btn-icon-split { + padding: 0; + overflow: hidden; + display: inline-flex; + align-items: stretch; + justify-content: center; +} + +.btn-icon-split .icon { + background: rgba(0, 0, 0, 0.15); + display: inline-block; + padding: 0.375rem 0.75rem; +} + +.btn-icon-split .text { + display: inline-block; + padding: 0.375rem 0.75rem; +} + +.btn-icon-split.btn-sm .icon, .btn-group-sm > .btn-icon-split.btn .icon { + padding: 0.25rem 0.5rem; +} + +.btn-icon-split.btn-sm .text, .btn-group-sm > .btn-icon-split.btn .text { + padding: 0.25rem 0.5rem; +} + +.btn-icon-split.btn-lg .icon, .btn-group-lg > .btn-icon-split.btn .icon { + padding: 0.5rem 1rem; +} + +.btn-icon-split.btn-lg .text, .btn-group-lg > .btn-icon-split.btn .text { + padding: 0.5rem 1rem; +} + +.card .card-header .dropdown { + line-height: 1; +} + +.card .card-header .dropdown .dropdown-menu { + line-height: 1.5; +} + +.card .card-header[data-toggle="collapse"] { + text-decoration: none; + position: relative; + padding: 0.75rem 3.25rem 0.75rem 1.25rem; +} + +.card .card-header[data-toggle="collapse"]::after { + position: absolute; + right: 0; + top: 0; + padding-right: 1.725rem; + line-height: 51px; + font-weight: 900; + content: '\f107'; + font-family: 'Font Awesome 5 Free'; + color: #d1d3e2; +} + +.card .card-header[data-toggle="collapse"].collapsed { + border-radius: 0.35rem; +} + +.card .card-header[data-toggle="collapse"].collapsed::after { + content: '\f105'; +} + +.chart-area { + position: relative; + height: 10rem; + width: 100%; +} + +@media (min-width: 768px) { + .chart-area { + height: 20rem; + } +} + +.chart-bar { + position: relative; + height: 10rem; + width: 100%; +} + +@media (min-width: 768px) { + .chart-bar { + height: 20rem; + } +} + +.chart-pie { + position: relative; + height: 15rem; + width: 100%; +} + +@media (min-width: 768px) { + .chart-pie { + height: calc(20rem - 43px) !important; + } +} + +.bg-login-image { + background: url("https://source.unsplash.com/K4mSJ7kc0As/600x800"); + background-position: center; + background-size: cover; +} + +.bg-register-image { + background: url("https://source.unsplash.com/Mv9hjnEUHR4/600x800"); + background-position: center; + background-size: cover; +} + +.bg-password-image { + background: url("https://source.unsplash.com/oWTW-jNGl9I/600x800"); + background-position: center; + background-size: cover; +} + +form.user .custom-checkbox.small label { + line-height: 1.5rem; +} + +form.user .form-control-user { + font-size: 0.8rem; + border-radius: 10rem; + padding: 1.5rem 1rem; +} + +form.user .btn-user { + font-size: 0.8rem; + border-radius: 10rem; + padding: 0.75rem 1rem; +} + +.btn-google { + color: #fff; + background-color: #ea4335; + border-color: #fff; +} + +.btn-google:hover { + color: #fff; + background-color: #e12717; + border-color: #e6e6e6; +} + +.btn-google:focus, .btn-google.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5); +} + +.btn-google.disabled, .btn-google:disabled { + color: #fff; + background-color: #ea4335; + border-color: #fff; +} + +.btn-google:not(:disabled):not(.disabled):active, .btn-google:not(:disabled):not(.disabled).active, +.show > .btn-google.dropdown-toggle { + color: #fff; + background-color: #d62516; + border-color: #dfdfdf; +} + +.btn-google:not(:disabled):not(.disabled):active:focus, .btn-google:not(:disabled):not(.disabled).active:focus, +.show > .btn-google.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5); +} + +.btn-facebook { + color: #fff; + background-color: #3b5998; + border-color: #fff; +} + +.btn-facebook:hover { + color: #fff; + background-color: #30497c; + border-color: #e6e6e6; +} + +.btn-facebook:focus, .btn-facebook.focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5); +} + +.btn-facebook.disabled, .btn-facebook:disabled { + color: #fff; + background-color: #3b5998; + border-color: #fff; +} + +.btn-facebook:not(:disabled):not(.disabled):active, .btn-facebook:not(:disabled):not(.disabled).active, +.show > .btn-facebook.dropdown-toggle { + color: #fff; + background-color: #2d4373; + border-color: #dfdfdf; +} + +.btn-facebook:not(:disabled):not(.disabled):active:focus, .btn-facebook:not(:disabled):not(.disabled).active:focus, +.show > .btn-facebook.dropdown-toggle:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 255, 255, 0.5); +} + +.error { + color: #5a5c69; + font-size: 7rem; + position: relative; + line-height: 1; + width: 12.5rem; +} + +@-webkit-keyframes noise-anim { + 0% { + clip: rect(32px, 9999px, 16px, 0); + } + 5% { + clip: rect(5px, 9999px, 24px, 0); + } + 10% { + clip: rect(77px, 9999px, 87px, 0); + } + 15% { + clip: rect(91px, 9999px, 95px, 0); + } + 20% { + clip: rect(74px, 9999px, 9px, 0); + } + 25% { + clip: rect(37px, 9999px, 32px, 0); + } + 30% { + clip: rect(56px, 9999px, 27px, 0); + } + 35% { + clip: rect(35px, 9999px, 33px, 0); + } + 40% { + clip: rect(89px, 9999px, 6px, 0); + } + 45% { + clip: rect(81px, 9999px, 77px, 0); + } + 50% { + clip: rect(64px, 9999px, 69px, 0); + } + 55% { + clip: rect(12px, 9999px, 11px, 0); + } + 60% { + clip: rect(59px, 9999px, 11px, 0); + } + 65% { + clip: rect(69px, 9999px, 59px, 0); + } + 70% { + clip: rect(74px, 9999px, 65px, 0); + } + 75% { + clip: rect(56px, 9999px, 79px, 0); + } + 80% { + clip: rect(80px, 9999px, 64px, 0); + } + 85% { + clip: rect(87px, 9999px, 29px, 0); + } + 90% { + clip: rect(16px, 9999px, 21px, 0); + } + 95% { + clip: rect(69px, 9999px, 43px, 0); + } + 100% { + clip: rect(75px, 9999px, 63px, 0); + } +} + +@keyframes noise-anim { + 0% { + clip: rect(32px, 9999px, 16px, 0); + } + 5% { + clip: rect(5px, 9999px, 24px, 0); + } + 10% { + clip: rect(77px, 9999px, 87px, 0); + } + 15% { + clip: rect(91px, 9999px, 95px, 0); + } + 20% { + clip: rect(74px, 9999px, 9px, 0); + } + 25% { + clip: rect(37px, 9999px, 32px, 0); + } + 30% { + clip: rect(56px, 9999px, 27px, 0); + } + 35% { + clip: rect(35px, 9999px, 33px, 0); + } + 40% { + clip: rect(89px, 9999px, 6px, 0); + } + 45% { + clip: rect(81px, 9999px, 77px, 0); + } + 50% { + clip: rect(64px, 9999px, 69px, 0); + } + 55% { + clip: rect(12px, 9999px, 11px, 0); + } + 60% { + clip: rect(59px, 9999px, 11px, 0); + } + 65% { + clip: rect(69px, 9999px, 59px, 0); + } + 70% { + clip: rect(74px, 9999px, 65px, 0); + } + 75% { + clip: rect(56px, 9999px, 79px, 0); + } + 80% { + clip: rect(80px, 9999px, 64px, 0); + } + 85% { + clip: rect(87px, 9999px, 29px, 0); + } + 90% { + clip: rect(16px, 9999px, 21px, 0); + } + 95% { + clip: rect(69px, 9999px, 43px, 0); + } + 100% { + clip: rect(75px, 9999px, 63px, 0); + } +} + +.error:after { + content: attr(data-text); + position: absolute; + left: 2px; + text-shadow: -1px 0 #e74a3b; + top: 0; + color: #5a5c69; + background: #f8f9fc; + overflow: hidden; + clip: rect(0, 900px, 0, 0); + animation: noise-anim 2s infinite linear alternate-reverse; +} + +@-webkit-keyframes noise-anim-2 { + 0% { + clip: rect(12px, 9999px, 52px, 0); + } + 5% { + clip: rect(42px, 9999px, 39px, 0); + } + 10% { + clip: rect(64px, 9999px, 36px, 0); + } + 15% { + clip: rect(52px, 9999px, 15px, 0); + } + 20% { + clip: rect(79px, 9999px, 7px, 0); + } + 25% { + clip: rect(17px, 9999px, 41px, 0); + } + 30% { + clip: rect(15px, 9999px, 20px, 0); + } + 35% { + clip: rect(62px, 9999px, 87px, 0); + } + 40% { + clip: rect(94px, 9999px, 11px, 0); + } + 45% { + clip: rect(49px, 9999px, 10px, 0); + } + 50% { + clip: rect(82px, 9999px, 4px, 0); + } + 55% { + clip: rect(70px, 9999px, 100px, 0); + } + 60% { + clip: rect(62px, 9999px, 23px, 0); + } + 65% { + clip: rect(51px, 9999px, 56px, 0); + } + 70% { + clip: rect(41px, 9999px, 24px, 0); + } + 75% { + clip: rect(6px, 9999px, 85px, 0); + } + 80% { + clip: rect(96px, 9999px, 58px, 0); + } + 85% { + clip: rect(16px, 9999px, 24px, 0); + } + 90% { + clip: rect(40px, 9999px, 31px, 0); + } + 95% { + clip: rect(91px, 9999px, 34px, 0); + } + 100% { + clip: rect(87px, 9999px, 26px, 0); + } +} + +@keyframes noise-anim-2 { + 0% { + clip: rect(12px, 9999px, 52px, 0); + } + 5% { + clip: rect(42px, 9999px, 39px, 0); + } + 10% { + clip: rect(64px, 9999px, 36px, 0); + } + 15% { + clip: rect(52px, 9999px, 15px, 0); + } + 20% { + clip: rect(79px, 9999px, 7px, 0); + } + 25% { + clip: rect(17px, 9999px, 41px, 0); + } + 30% { + clip: rect(15px, 9999px, 20px, 0); + } + 35% { + clip: rect(62px, 9999px, 87px, 0); + } + 40% { + clip: rect(94px, 9999px, 11px, 0); + } + 45% { + clip: rect(49px, 9999px, 10px, 0); + } + 50% { + clip: rect(82px, 9999px, 4px, 0); + } + 55% { + clip: rect(70px, 9999px, 100px, 0); + } + 60% { + clip: rect(62px, 9999px, 23px, 0); + } + 65% { + clip: rect(51px, 9999px, 56px, 0); + } + 70% { + clip: rect(41px, 9999px, 24px, 0); + } + 75% { + clip: rect(6px, 9999px, 85px, 0); + } + 80% { + clip: rect(96px, 9999px, 58px, 0); + } + 85% { + clip: rect(16px, 9999px, 24px, 0); + } + 90% { + clip: rect(40px, 9999px, 31px, 0); + } + 95% { + clip: rect(91px, 9999px, 34px, 0); + } + 100% { + clip: rect(87px, 9999px, 26px, 0); + } +} + +.error:before { + content: attr(data-text); + position: absolute; + left: -2px; + text-shadow: 1px 0 #4e73df; + top: 0; + color: #5a5c69; + background: #f8f9fc; + overflow: hidden; + clip: rect(0, 900px, 0, 0); + animation: noise-anim-2 3s infinite linear alternate-reverse; +} + +footer.sticky-footer { + padding: 2rem 0; + flex-shrink: 0; +} + +footer.sticky-footer .copyright { + line-height: 1; + font-size: 0.8rem; +} + +body.sidebar-toggled footer.sticky-footer { + width: 100%; +} + + +.navbar-default{ + position: fixed; + width: 100%; + margin: 0 0 405px 0; +} \ No newline at end of file diff --git a/users/static/users/css/theme.css b/users/static/users/css/theme.css new file mode 100644 index 0000000..60f1b66 --- /dev/null +++ b/users/static/users/css/theme.css @@ -0,0 +1,6 @@ +/*! Tophat `Wandoo` Bootstrap 4.3.1 theme */@import url(https://fonts.googleapis.com/css?family=Nunito:200,300,400,700);@import url(https://fonts.googleapis.com/css?family=Comfortaa:200,300,400,700);/*! Import Bootstrap 4 variables *//*! + * Bootstrap v4.1.1 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#FF304F;--secondary:#CACACA;--success:#015668;--info:#0F81C7;--warning:#0DE2EA;--danger:#06648C;--light:#ececec;--dark:#222222;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Nunito;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#ff304f;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#e30022;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:Comfortaa;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#ffc5ce}.table-hover .table-primary:hover{background-color:#ffacb8}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#ffacb8}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#f0f0f0}.table-hover .table-secondary:hover{background-color:#e3e3e3}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#e3e3e3}.table-success,.table-success>td,.table-success>th{background-color:#b8d0d5}.table-hover .table-success:hover{background-color:#a8c5cc}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a8c5cc}.table-info,.table-info>td,.table-info>th{background-color:#bcdcef}.table-hover .table-info:hover{background-color:#a7d1ea}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#a7d1ea}.table-warning,.table-warning>td,.table-warning>th{background-color:#bbf7f9}.table-hover .table-warning:hover{background-color:#a4f4f7}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#a4f4f7}.table-danger,.table-danger>td,.table-danger>th{background-color:#b9d4df}.table-hover .table-danger:hover{background-color:#a8c9d7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#a8c9d7}.table-light,.table-light>td,.table-light>th{background-color:#fafafa}.table-hover .table-light:hover{background-color:#ededed}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ededed}.table-dark,.table-dark>td,.table-dark>th{background-color:#c1c1c1}.table-hover .table-dark:hover{background-color:#b4b4b4}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b4b4b4}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#ffb0bb;outline:0;box-shadow:0 0 0 .2rem rgba(255,48,79,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#015668}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(1,86,104,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#015668}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#015668;box-shadow:0 0 0 .2rem rgba(1,86,104,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#015668}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#015668}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#02bee6}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#01809b}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(1,86,104,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#015668}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(1,86,104,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#06648c}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(6,100,140,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#06648c}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#06648c;box-shadow:0 0 0 .2rem rgba(6,100,140,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#06648c}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#06648c}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#1cb4f5}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#0887bd}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(6,100,140,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#06648c}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(6,100,140,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,48,79,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#ff304f;border-color:#ff304f}.btn-primary:hover{color:#fff;background-color:#ff0a2e;border-color:#fc0026}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(255,48,79,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#ff304f;border-color:#ff304f}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#fc0026;border-color:#ef0024}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,48,79,.5)}.btn-secondary{color:#212529;background-color:#cacaca;border-color:#cacaca}.btn-secondary:hover{color:#212529;background-color:#b7b7b7;border-color:#b1b1b1}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(202,202,202,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#212529;background-color:#cacaca;border-color:#cacaca}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#212529;background-color:#b1b1b1;border-color:#aaa}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(202,202,202,.5)}.btn-success{color:#fff;background-color:#015668;border-color:#015668}.btn-success:hover{color:#fff;background-color:#013742;border-color:#012c35}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(1,86,104,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#015668;border-color:#015668}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#012c35;border-color:#002229}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(1,86,104,.5)}.btn-info{color:#fff;background-color:#0f81c7;border-color:#0f81c7}.btn-info:hover{color:#fff;background-color:#0c6aa3;border-color:#0b6298}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(15,129,199,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#0f81c7;border-color:#0f81c7}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#0b6298;border-color:#0b5b8c}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(15,129,199,.5)}.btn-warning{color:#212529;background-color:#0de2ea;border-color:#0de2ea}.btn-warning:hover{color:#fff;background-color:#0bbfc6;border-color:#0ab3ba}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(13,226,234,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#0de2ea;border-color:#0de2ea}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#0ab3ba;border-color:#0aa8ae}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(13,226,234,.5)}.btn-danger{color:#fff;background-color:#06648c;border-color:#06648c}.btn-danger:hover{color:#fff;background-color:#044a67;border-color:#04415b}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(6,100,140,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#06648c;border-color:#06648c}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#04415b;border-color:#03384f}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(6,100,140,.5)}.btn-light{color:#212529;background-color:#ececec;border-color:#ececec}.btn-light:hover{color:#212529;background-color:#d9d9d9;border-color:#d3d3d3}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(236,236,236,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#ececec;border-color:#ececec}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#d3d3d3;border-color:#ccc}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(236,236,236,.5)}.btn-dark{color:#fff;background-color:#222;border-color:#222}.btn-dark:hover{color:#fff;background-color:#0f0f0f;border-color:#090909}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(34,34,34,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#222;border-color:#222}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#090909;border-color:#020202}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(34,34,34,.5)}.btn-outline-primary{color:#ff304f;background-color:transparent;background-image:none;border-color:#ff304f}.btn-outline-primary:hover{color:#fff;background-color:#ff304f;border-color:#ff304f}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(255,48,79,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#ff304f;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#ff304f;border-color:#ff304f}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,48,79,.5)}.btn-outline-secondary{color:#cacaca;background-color:transparent;background-image:none;border-color:#cacaca}.btn-outline-secondary:hover{color:#212529;background-color:#cacaca;border-color:#cacaca}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(202,202,202,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#cacaca;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#212529;background-color:#cacaca;border-color:#cacaca}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(202,202,202,.5)}.btn-outline-success{color:#015668;background-color:transparent;background-image:none;border-color:#015668}.btn-outline-success:hover{color:#fff;background-color:#015668;border-color:#015668}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(1,86,104,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#015668;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#015668;border-color:#015668}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(1,86,104,.5)}.btn-outline-info{color:#0f81c7;background-color:transparent;background-image:none;border-color:#0f81c7}.btn-outline-info:hover{color:#fff;background-color:#0f81c7;border-color:#0f81c7}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(15,129,199,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0f81c7;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#0f81c7;border-color:#0f81c7}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(15,129,199,.5)}.btn-outline-warning{color:#0de2ea;background-color:transparent;background-image:none;border-color:#0de2ea}.btn-outline-warning:hover{color:#212529;background-color:#0de2ea;border-color:#0de2ea}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(13,226,234,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#0de2ea;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#0de2ea;border-color:#0de2ea}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(13,226,234,.5)}.btn-outline-danger{color:#06648c;background-color:transparent;background-image:none;border-color:#06648c}.btn-outline-danger:hover{color:#fff;background-color:#06648c;border-color:#06648c}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(6,100,140,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#06648c;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#06648c;border-color:#06648c}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(6,100,140,.5)}.btn-outline-light{color:#ececec;background-color:transparent;background-image:none;border-color:#ececec}.btn-outline-light:hover{color:#212529;background-color:#ececec;border-color:#ececec}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(236,236,236,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#ececec;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#ececec;border-color:#ececec}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(236,236,236,.5)}.btn-outline-dark{color:#222;background-color:transparent;background-image:none;border-color:#222}.btn-outline-dark:hover{color:#fff;background-color:#222;border-color:#222}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(34,34,34,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#222;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#222;border-color:#222}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(34,34,34,.5)}.btn-link{font-weight:400;color:#ff304f;background-color:transparent}.btn-link:hover{color:#e30022;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#ff304f}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#ff304f}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(255,48,79,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#ffe3e7}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#ff304f}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#ff304f}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(255,48,79,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(255,48,79,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#ff304f}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(255,48,79,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#ffb0bb;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(255,176,187,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#ffb0bb;box-shadow:0 0 0 .2rem rgba(255,48,79,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#ffb0bb}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:2.25rem;padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#ff304f;border:0;border-radius:1rem;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(255,48,79,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#ffe3e7}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#ff304f;border:0;border-radius:1rem;appearance:none}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(255,48,79,.25)}.custom-range::-moz-range-thumb:active{background-color:#ffe3e7}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#ff304f;border:0;border-radius:1rem;appearance:none}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(255,48,79,.25)}.custom-range::-ms-thumb:active{background-color:#ffe3e7}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#ff304f}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#ff304f;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#e30022;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(255,48,79,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#ff304f;border-color:#ff304f}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#ff304f}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#fc0026}.badge-secondary{color:#212529;background-color:#cacaca}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#212529;text-decoration:none;background-color:#b1b1b1}.badge-success{color:#fff;background-color:#015668}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#012c35}.badge-info{color:#fff;background-color:#0f81c7}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#0b6298}.badge-warning{color:#212529;background-color:#0de2ea}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#0ab3ba}.badge-danger{color:#fff;background-color:#06648c}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#04415b}.badge-light{color:#212529;background-color:#ececec}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#d3d3d3}.badge-dark{color:#fff;background-color:#222}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#090909}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#851929;background-color:#ffd6dc;border-color:#ffc5ce}.alert-primary hr{border-top-color:#ffacb8}.alert-primary .alert-link{color:#5a111c}.alert-secondary{color:#696969;background-color:#f4f4f4;border-color:#f0f0f0}.alert-secondary hr{border-top-color:#e3e3e3}.alert-secondary .alert-link{color:#505050}.alert-success{color:#012d36;background-color:#ccdde1;border-color:#b8d0d5}.alert-success hr{border-top-color:#a8c5cc}.alert-success .alert-link{color:#000304}.alert-info{color:#084367;background-color:#cfe6f4;border-color:#bcdcef}.alert-info hr{border-top-color:#a7d1ea}.alert-info .alert-link{color:#042438}.alert-warning{color:#07767a;background-color:#cff9fb;border-color:#bbf7f9}.alert-warning hr{border-top-color:#a4f4f7}.alert-warning .alert-link{color:#04474a}.alert-danger{color:#033449;background-color:#cde0e8;border-color:#b9d4df}.alert-danger hr{border-top-color:#a8c9d7}.alert-danger .alert-link{color:#011118}.alert-light{color:#7b7b7b;background-color:#fbfbfb;border-color:#fafafa}.alert-light hr{border-top-color:#ededed}.alert-light .alert-link{color:#626262}.alert-dark{color:#121212;background-color:#d3d3d3;border-color:#c1c1c1}.alert-dark hr{border-top-color:#b4b4b4}.alert-dark .alert-link{color:#000}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#ff304f;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#ff304f;border-color:#ff304f}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#851929;background-color:#ffc5ce}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#851929;background-color:#ffacb8}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#851929;border-color:#851929}.list-group-item-secondary{color:#696969;background-color:#f0f0f0}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#696969;background-color:#e3e3e3}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#696969;border-color:#696969}.list-group-item-success{color:#012d36;background-color:#b8d0d5}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#012d36;background-color:#a8c5cc}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#012d36;border-color:#012d36}.list-group-item-info{color:#084367;background-color:#bcdcef}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#084367;background-color:#a7d1ea}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#084367;border-color:#084367}.list-group-item-warning{color:#07767a;background-color:#bbf7f9}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#07767a;background-color:#a4f4f7}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#07767a;border-color:#07767a}.list-group-item-danger{color:#033449;background-color:#b9d4df}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#033449;background-color:#a8c9d7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#033449;border-color:#033449}.list-group-item-light{color:#7b7b7b;background-color:#fafafa}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#7b7b7b;background-color:#ededed}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#7b7b7b;border-color:#7b7b7b}.list-group-item-dark{color:#121212;background-color:#c1c1c1}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#121212;background-color:#b4b4b4}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#121212;border-color:#121212}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:translate(0,0)}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:Nunito;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:Nunito;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;align-items:center;width:100%;transition:transform .6s ease;backface-visibility:hidden;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translateX(0)}@supports (transform-style:preserve-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{transform:translateX(100%)}@supports (transform-style:preserve-3d){.active.carousel-item-right,.carousel-item-next{transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{transform:translateX(-100%)}@supports (transform-style:preserve-3d){.active.carousel-item-left,.carousel-item-prev{transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{transform:translateX(0)}@supports (transform-style:preserve-3d){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#ff304f!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#fc0026!important}.bg-secondary{background-color:#cacaca!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#b1b1b1!important}.bg-success{background-color:#015668!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#012c35!important}.bg-info{background-color:#0f81c7!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#0b6298!important}.bg-warning{background-color:#0de2ea!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#0ab3ba!important}.bg-danger{background-color:#06648c!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#04415b!important}.bg-light{background-color:#ececec!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#d3d3d3!important}.bg-dark{background-color:#222!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#090909!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#ff304f!important}.border-secondary{border-color:#cacaca!important}.border-success{border-color:#015668!important}.border-info{border-color:#0f81c7!important}.border-warning{border-color:#0de2ea!important}.border-danger{border-color:#06648c!important}.border-light{border-color:#ececec!important}.border-dark{border-color:#222!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#ff304f!important}a.text-primary:focus,a.text-primary:hover{color:#fc0026!important}.text-secondary{color:#cacaca!important}a.text-secondary:focus,a.text-secondary:hover{color:#b1b1b1!important}.text-success{color:#015668!important}a.text-success:focus,a.text-success:hover{color:#012c35!important}.text-info{color:#0f81c7!important}a.text-info:focus,a.text-info:hover{color:#0b6298!important}.text-warning{color:#0de2ea!important}a.text-warning:focus,a.text-warning:hover{color:#0ab3ba!important}.text-danger{color:#06648c!important}a.text-danger:focus,a.text-danger:hover{color:#04415b!important}.text-light{color:#ececec!important}a.text-light:focus,a.text-light:hover{color:#d3d3d3!important}.text-dark{color:#222!important}a.text-dark:focus,a.text-dark:hover{color:#090909!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #e0e0e0!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}} \ No newline at end of file diff --git a/users/static/users/css/tree.css b/users/static/users/css/tree.css new file mode 100644 index 0000000..b044215 --- /dev/null +++ b/users/static/users/css/tree.css @@ -0,0 +1 @@ +.tf-tree{font-size:16px;overflow:auto}.tf-tree *{box-sizing:border-box;margin:0;padding:0}.tf-tree ul{display:inline-flex}.tf-tree li{align-items:center;display:flex;flex-direction:column;flex-wrap:wrap;padding:0 1em;position:relative}.tf-tree li ul{margin:2em 0}.tf-tree li li:before{border-top:.0625em solid #000;content:"";display:block;height:.0625em;left:-.03125em;position:absolute;top:-1.03125em;width:100%}.tf-tree li li:first-child:before{left:calc(50% - .03125em);max-width:calc(50% + .0625em)}.tf-tree li li:last-child:before{left:auto;max-width:calc(50% + .0625em);right:calc(50% - .03125em)}.tf-tree li li:only-child:before{display:none}.tf-tree li li:only-child>.tf-nc:before,.tf-tree li li:only-child>.tf-node-content:before{height:1.0625em;top:-1.0625em}.tf-tree .tf-nc,.tf-tree .tf-node-content{border:.0625em solid #000;display:inline-block;padding:.5em 1em;position:relative}.tf-tree .tf-nc:before,.tf-tree .tf-node-content:before{top:-1.03125em}.tf-tree .tf-nc:after,.tf-tree .tf-nc:before,.tf-tree .tf-node-content:after,.tf-tree .tf-node-content:before{border-left:.0625em solid #000;content:"";display:block;height:1em;left:calc(50% - .03125em);position:absolute;width:.0625em}.tf-tree .tf-nc:after,.tf-tree .tf-node-content:after{top:calc(100% + .03125em)}.tf-tree .tf-nc:only-child:after,.tf-tree .tf-node-content:only-child:after,.tf-tree>ul>li>.tf-nc:before,.tf-tree>ul>li>.tf-node-content:before{display:none}.tf-tree.tf-gap-sm li{padding:0 .6em}.tf-tree.tf-gap-sm li>.tf-nc:before,.tf-tree.tf-gap-sm li>.tf-node-content:before{height:.6em;top:-.6em}.tf-tree.tf-gap-sm li>.tf-nc:after,.tf-tree.tf-gap-sm li>.tf-node-content:after{height:.6em}.tf-tree.tf-gap-sm li ul{margin:1.2em 0}.tf-tree.tf-gap-sm li li:before{top:-.63125em}.tf-tree.tf-gap-sm li li:only-child>.tf-nc:before,.tf-tree.tf-gap-sm li li:only-child>.tf-node-content:before{height:.6625em;top:-.6625em}.tf-tree.tf-gap-lg li{padding:0 1.5em}.tf-tree.tf-gap-lg li>.tf-nc:before,.tf-tree.tf-gap-lg li>.tf-node-content:before{height:1.5em;top:-1.5em}.tf-tree.tf-gap-lg li>.tf-nc:after,.tf-tree.tf-gap-lg li>.tf-node-content:after{height:1.5em}.tf-tree.tf-gap-lg li ul{margin:3em 0}.tf-tree.tf-gap-lg li li:before{top:-1.53125em}.tf-tree.tf-gap-lg li li:only-child>.tf-nc:before,.tf-tree.tf-gap-lg li li:only-child>.tf-node-content:before{height:1.5625em;top:-1.5625em}.tf-tree li.tf-dotted-children .tf-nc:after,.tf-tree li.tf-dotted-children .tf-nc:before,.tf-tree li.tf-dotted-children .tf-node-content:after,.tf-tree li.tf-dotted-children .tf-node-content:before{border-left-style:dotted}.tf-tree li.tf-dotted-children li:before{border-top-style:dotted}.tf-tree li.tf-dotted-children>.tf-nc:before,.tf-tree li.tf-dotted-children>.tf-node-content:before{border-left-style:solid}.tf-tree li.tf-dashed-children .tf-nc:after,.tf-tree li.tf-dashed-children .tf-nc:before,.tf-tree li.tf-dashed-children .tf-node-content:after,.tf-tree li.tf-dashed-children .tf-node-content:before{border-left-style:dashed}.tf-tree li.tf-dashed-children li:before{border-top-style:dashed}.tf-tree li.tf-dashed-children>.tf-nc:before,.tf-tree li.tf-dashed-children>.tf-node-content:before{border-left-style:solid} \ No newline at end of file diff --git a/users/static/users/extra/da.png b/users/static/users/extra/da.png new file mode 100644 index 0000000..97deaa1 Binary files /dev/null and b/users/static/users/extra/da.png differ diff --git a/users/static/users/extra/da_onepager.pdf b/users/static/users/extra/da_onepager.pdf new file mode 100644 index 0000000..46e2cc3 Binary files /dev/null and b/users/static/users/extra/da_onepager.pdf differ diff --git a/users/static/users/extra/kp.png b/users/static/users/extra/kp.png new file mode 100644 index 0000000..0266330 Binary files /dev/null and b/users/static/users/extra/kp.png differ diff --git a/users/static/users/extra/nf.png b/users/static/users/extra/nf.png new file mode 100644 index 0000000..c1fdb55 Binary files /dev/null and b/users/static/users/extra/nf.png differ diff --git a/users/static/users/extra/plz_short.csv b/users/static/users/extra/plz_short.csv new file mode 100644 index 0000000..6b577e1 --- /dev/null +++ b/users/static/users/extra/plz_short.csv @@ -0,0 +1,14956 @@ +0;1067;Dresden;14262;Dresden, Stadt;14;SN +1;1069;Dresden;14262;Dresden, Stadt;14;SN +2;1097;Dresden;14262;Dresden, Stadt;14;SN +3;1099;Dresden;14262;Dresden, Stadt;14;SN +4;1108;Dresden;14262;Dresden, Stadt;14;SN +5;1109;Dresden;14262;Dresden, Stadt;14;SN +6;1127;Dresden;14262;Dresden, Stadt;14;SN +7;1129;Dresden;14262;Dresden, Stadt;14;SN +8;1139;Dresden;14262;Dresden, Stadt;14;SN +9;1156;Dresden;14262;Dresden, Stadt;14;SN +10;1157;Dresden;14262;Dresden, Stadt;14;SN +11;1159;Dresden;14262;Dresden, Stadt;14;SN +12;1169;Dresden;14262;Dresden, Stadt;14;SN +13;1187;Dresden;14262;Dresden, Stadt;14;SN +14;1189;Dresden;14262;Dresden, Stadt;14;SN +15;1217;Dresden;14262;Dresden, Stadt;14;SN +16;1219;Dresden;14262;Dresden, Stadt;14;SN +17;1237;Dresden;14262;Dresden, Stadt;14;SN +18;1239;Dresden;14262;Dresden, Stadt;14;SN +19;1257;Dresden;14262;Dresden, Stadt;14;SN +20;1259;Dresden;14262;Dresden, Stadt;14;SN +21;1277;Dresden;14262;Dresden, Stadt;14;SN +22;1279;Dresden;14262;Dresden, Stadt;14;SN +23;1307;Dresden;14262;Dresden, Stadt;14;SN +24;1309;Dresden;14262;Dresden, Stadt;14;SN +25;1324;Dresden;14262;Dresden, Stadt;14;SN +26;1326;Dresden;14262;Dresden, Stadt;14;SN +27;1328;Dresden;14262;Dresden, Stadt;14;SN +28;1445;Radebeul;14280;Meissen;14;SN +29;1454;Radeberg;14292;Kamenz;14;SN +30;1454;Wachau;14292;Kamenz;14;SN +31;1458;Ottendorf-Okrilla;14292;Kamenz;14;SN +32;1462;Dresden;14262;Dresden, Stadt;14;SN +33;1465;Dresden;14262;Dresden, Stadt;14;SN +34;1465;Langebrueck;14262;Dresden, Stadt;14;SN +35;1468;Moritzburg;14280;Meissen;14;SN +36;1471;Radeburg;14280;Meissen;14;SN +37;1477;Arnsdorf;14292;Kamenz;14;SN +38;1478;Dresden;14262;Dresden, Stadt;14;SN +39;1558;Grossenhain;14285;Riesa-Grossenhain;14;SN +40;1561;Schoenfeld;14285;Riesa-Grossenhain;14;SN +41;1561;Lampertswalde;14285;Riesa-Grossenhain;14;SN +42;1561;Tauscha;14285;Riesa-Grossenhain;14;SN +43;1561;Priestewitz;14285;Riesa-Grossenhain;14;SN +44;1561;Ebersbach;14285;Riesa-Grossenhain;14;SN +45;1561;Weissig am Raschuetz;14285;Riesa-Grossenhain;14;SN +46;1561;Wildenhain;14285;Riesa-Grossenhain;14;SN +47;1561;Thiendorf;14285;Riesa-Grossenhain;14;SN +48;1561;Zabeltitz;14285;Riesa-Grossenhain;14;SN +49;1587;Riesa;14285;Riesa-Grossenhain;14;SN +50;1589;Riesa;14285;Riesa-Grossenhain;14;SN +51;1591;Riesa;14285;Riesa-Grossenhain;14;SN +52;1594;Hirschstein;14285;Riesa-Grossenhain;14;SN +53;1594;Stauchitz;14285;Riesa-Grossenhain;14;SN +54;1609;Groeditz;14285;Riesa-Grossenhain;14;SN +55;1609;Nauwalde;14285;Riesa-Grossenhain;14;SN +56;1609;Wuelknitz;14285;Riesa-Grossenhain;14;SN +57;1612;Glaubitz;14285;Riesa-Grossenhain;14;SN +58;1612;Diesbar-Seusslitz;14285;Riesa-Grossenhain;14;SN +59;1612;Nuenchritz;14285;Riesa-Grossenhain;14;SN +60;1616;Strehla;14285;Riesa-Grossenhain;14;SN +61;1619;Roederaue;14285;Riesa-Grossenhain;14;SN +62;1619;Zeithain;14285;Riesa-Grossenhain;14;SN +63;1623;Lommatzsch;14280;Meissen;14;SN +64;1623;Leuben-Schleinitz;14280;Meissen;14;SN +65;1623;Ketzerbachtal;14280;Meissen;14;SN +66;1640;Coswig;14280;Meissen;14;SN +67;1662;Meissen;14280;Meissen;14;SN +68;1665;Triebischtal;14280;Meissen;14;SN +69;1665;Taubenheim;14280;Meissen;14;SN +70;1665;Kaebschuetztal;14280;Meissen;14;SN +71;1665;Diera-Zehren;14280;Meissen;14;SN +72;1665;Klipphausen;14280;Meissen;14;SN +73;1683;Heynitz;14280;Meissen;14;SN +74;1683;Nossen;14280;Meissen;14;SN +75;1689;Weinboehla;14280;Meissen;14;SN +76;1689;Niederau;14280;Meissen;14;SN +77;1705;Freital;14290;Weisseritzkreis;14;SN +78;1723;Wilsdruff;14290;Weisseritzkreis;14;SN +79;1728;Bannewitz;14290;Weisseritzkreis;14;SN +80;1731;Kreischa;14290;Weisseritzkreis;14;SN +81;1734;Rabenau;14290;Weisseritzkreis;14;SN +82;1737;Tharandt;14290;Weisseritzkreis;14;SN +83;1738;Dorfhain;14290;Weisseritzkreis;14;SN +84;1744;Dippoldiswalde;14290;Weisseritzkreis;14;SN +85;1762;Schmiedeberg;14290;Weisseritzkreis;14;SN +86;1762;Hartmannsdorf-Reichenau;14290;Weisseritzkreis;14;SN +87;1768;Glashuette;14290;Weisseritzkreis;14;SN +88;1768;Baerenstein;14290;Weisseritzkreis;14;SN +89;1768;Reinhardtsgrimma;14290;Weisseritzkreis;14;SN +90;1773;Altenberg;14290;Weisseritzkreis;14;SN +91;1774;Hoeckendorf;14290;Weisseritzkreis;14;SN +92;1774;Pretzschendorf;14290;Weisseritzkreis;14;SN +93;1776;Hermsdorf/Erzgebirge;14290;Weisseritzkreis;14;SN +94;1778;Geising;14290;Weisseritzkreis;14;SN +95;1796;Pirna;14287;Saechsische Schweiz;14;SN +96;1796;Struppen;14287;Saechsische Schweiz;14;SN +97;1796;Dohma;14287;Saechsische Schweiz;14;SN +98;1809;Mueglitztal;14287;Saechsische Schweiz;14;SN +99;1809;Dohna;14287;Saechsische Schweiz;14;SN +100;1809;Heidenau;14287;Saechsische Schweiz;14;SN +101;1814;Bad Schandau;14287;Saechsische Schweiz;14;SN +102;1814;Reinhardtsdorf-Schoena;14287;Saechsische Schweiz;14;SN +103;1814;Porschdorf;14287;Saechsische Schweiz;14;SN +104;1814;Rathmannsdorf;14287;Saechsische Schweiz;14;SN +105;1816;Bad Gottleuba-Berggiesshuebel;14287;Saechsische Schweiz;14;SN +106;1819;Bahretal;14287;Saechsische Schweiz;14;SN +107;1824;Gohrisch;14287;Saechsische Schweiz;14;SN +108;1824;Rosenthal-Bielatal;14287;Saechsische Schweiz;14;SN +109;1824;Rathen;14287;Saechsische Schweiz;14;SN +110;1824;Koenigstein/Saechsische Schweiz;14287;Saechsische Schweiz;14;SN +111;1825;Liebstadt;14287;Saechsische Schweiz;14;SN +112;1829;Stadt Wehlen;14287;Saechsische Schweiz;14;SN +113;1833;Stolpen;14287;Saechsische Schweiz;14;SN +114;1833;Duerrroehrsdorf-Dittersbach;14287;Saechsische Schweiz;14;SN +115;1844;Hohwald;14287;Saechsische Schweiz;14;SN +116;1844;Neustadt in SN;14287;Saechsische Schweiz;14;SN +117;1847;Lohmen;14287;Saechsische Schweiz;14;SN +118;1848;Hohnstein;14287;Saechsische Schweiz;14;SN +119;1855;Kirnitzschtal;14287;Saechsische Schweiz;14;SN +120;1855;Sebnitz;14287;Saechsische Schweiz;14;SN +121;1877;Rammenau;14272;Bautzen;14;SN +122;1877;Demitz-Thumitz;14272;Bautzen;14;SN +123;1877;Schmoelln-Putzkau;14272;Bautzen;14;SN +124;1877;Doberschau-Gaussig;14272;Bautzen;14;SN +125;1877;Bischofswerda;14272;Bautzen;14;SN +126;1896;Lichtenberg;14292;Kamenz;14;SN +127;1896;Pulsnitz;14292;Kamenz;14;SN +128;1896;Ohorn;14292;Kamenz;14;SN +129;1900;Grossroehrsdorf;14292;Kamenz;14;SN +130;1900;Bretnig-Hauswalde;14292;Kamenz;14;SN +131;1904;Neukirch/Lausitz;14272;Bautzen;14;SN +132;1904;Steinigtwolmsdorf;14272;Bautzen;14;SN +133;1906;Burkau;14272;Bautzen;14;SN +134;1909;Frankenthal;14272;Bautzen;14;SN +135;1909;Grossharthau;14272;Bautzen;14;SN +136;1917;Kamenz;14292;Kamenz;14;SN +137;1920;Crostwitz;14292;Kamenz;14;SN +138;1920;Panschwitz-Kuckau;14292;Kamenz;14;SN +139;1920;Steina;14292;Kamenz;14;SN +140;1920;Nebelschuetz;14292;Kamenz;14;SN +141;1920;Schoenteichen;14292;Kamenz;14;SN +142;1920;Elstra;14292;Kamenz;14;SN +143;1920;Ossling;14292;Kamenz;14;SN +144;1920;Raeckelwitz;14292;Kamenz;14;SN +145;1920;Haselbachtal;14292;Kamenz;14;SN +146;1920;Ralbitz-Rosenthal;14292;Kamenz;14;SN +147;1936;Schwepnitz;14292;Kamenz;14;SN +148;1936;Koenigsbrueck;14292;Kamenz;14;SN +149;1936;Laussnitz;14292;Kamenz;14;SN +150;1936;Neukirch;14292;Kamenz;14;SN +151;1936;Grossnaundorf;14292;Kamenz;14;SN +152;1936;Strassgraebchen;14292;Kamenz;14;SN +153;1936;Oberlichtenau;14292;Kamenz;14;SN +154;1936;Haselbachtal;14292;Kamenz;14;SN +155;1945;Ruhland;12066;Oberspreewald-Lausitz;12;BB +156;1945;Kroppen;12066;Oberspreewald-Lausitz;12;BB +157;1945;Gruenewald;12066;Oberspreewald-Lausitz;12;BB +158;1945;Schwarzbach;12066;Oberspreewald-Lausitz;12;BB +159;1945;Tettau;12066;Oberspreewald-Lausitz;12;BB +160;1945;Hohenbocka;12066;Oberspreewald-Lausitz;12;BB +161;1945;Hermsdorf;12066;Oberspreewald-Lausitz;12;BB +162;1945;Guteborn;12066;Oberspreewald-Lausitz;12;BB +163;1945;Lindenau;12066;Oberspreewald-Lausitz;12;BB +164;1968;Schipkau;12066;Oberspreewald-Lausitz;12;BB +165;1968;Senftenberg;12066;Oberspreewald-Lausitz;12;BB +166;1979;Lauchhammer;12066;Oberspreewald-Lausitz;12;BB +167;1983;Neu-Seeland;12066;Oberspreewald-Lausitz;12;BB +168;1983;Grossraeschen;12066;Oberspreewald-Lausitz;12;BB +169;1987;Schwarzheide;12066;Oberspreewald-Lausitz;12;BB +170;1990;Ortrand;12066;Oberspreewald-Lausitz;12;BB +171;1990;Grosskmehlen;12066;Oberspreewald-Lausitz;12;BB +172;1990;Frauendorf;12066;Oberspreewald-Lausitz;12;BB +173;1993;Schipkau;12066;Oberspreewald-Lausitz;12;BB +174;1994;Schipkau;12066;Oberspreewald-Lausitz;12;BB +175;1998;Schipkau;12066;Oberspreewald-Lausitz;12;BB +176;2625;Bautzen;14272;Bautzen;14;SN +177;2627;Radibor;14272;Bautzen;14;SN +178;2627;Hochkirch;14272;Bautzen;14;SN +179;2627;Kubschuetz;14272;Bautzen;14;SN +180;2627;Weissenberg;14272;Bautzen;14;SN +181;2633;Goeda;14272;Bautzen;14;SN +182;2633;Doberschau-Gaussig;14272;Bautzen;14;SN +183;2681;Kirschau;14272;Bautzen;14;SN +184;2681;Wilthen;14272;Bautzen;14;SN +185;2681;Crostau;14272;Bautzen;14;SN +186;2681;Schirgiswalde;14272;Bautzen;14;SN +187;2689;Sohland an der Spree;14272;Bautzen;14;SN +188;2692;Obergurig;14272;Bautzen;14;SN +189;2692;Doberschau-Gaussig;14272;Bautzen;14;SN +190;2692;Grosspostwitz/Oberlausitz;14272;Bautzen;14;SN +191;2694;Grossdubrau;14272;Bautzen;14;SN +192;2694;Malschwitz;14272;Bautzen;14;SN +193;2694;Guttau;14272;Bautzen;14;SN +194;2699;Neschwitz;14272;Bautzen;14;SN +195;2699;Puschwitz;14272;Bautzen;14;SN +196;2699;Koenigswartha;14272;Bautzen;14;SN +197;2708;Kittlitz;14286;Loebau-Zittau;14;SN +198;2708;Grossschweidnitz;14286;Loebau-Zittau;14;SN +199;2708;Lawalde;14286;Loebau-Zittau;14;SN +200;2708;Rosenbach;14286;Loebau-Zittau;14;SN +201;2708;Obercunnersdorf;14286;Loebau-Zittau;14;SN +202;2708;Loebau;14286;Loebau-Zittau;14;SN +203;2708;Schoenbach;14286;Loebau-Zittau;14;SN +204;2708;Niedercunnersdorf;14286;Loebau-Zittau;14;SN +205;2708;Duerrhennersdorf;14286;Loebau-Zittau;14;SN +206;2727;Neugersdorf;14286;Loebau-Zittau;14;SN +207;2730;Ebersbach/SN;14286;Loebau-Zittau;14;SN +208;2733;Cunewalde;14272;Bautzen;14;SN +209;2736;Oppach;14286;Loebau-Zittau;14;SN +210;2736;Beiersdorf;14286;Loebau-Zittau;14;SN +211;2739;Eibau;14286;Loebau-Zittau;14;SN +212;2742;Neusalza-Spremberg;14286;Loebau-Zittau;14;SN +213;2742;Friedersdorf;14286;Loebau-Zittau;14;SN +214;2747;Strahwalde;14286;Loebau-Zittau;14;SN +215;2747;Grosshennersdorf;14286;Loebau-Zittau;14;SN +216;2747;Berthelsdorf;14286;Loebau-Zittau;14;SN +217;2747;Herrnhut;14286;Loebau-Zittau;14;SN +218;2748;Bernstadt auf dem Eigen;14286;Loebau-Zittau;14;SN +219;2763;Zittau;14286;Loebau-Zittau;14;SN +220;2763;Bertsdorf-Hoernitz;14286;Loebau-Zittau;14;SN +221;2763;Mittelherwigsdorf;14286;Loebau-Zittau;14;SN +222;2779;Grossschoenau;14286;Loebau-Zittau;14;SN +223;2779;Hainewalde;14286;Loebau-Zittau;14;SN +224;2782;Seifhennersdorf;14286;Loebau-Zittau;14;SN +225;2785;Olbersdorf;14286;Loebau-Zittau;14;SN +226;2788;Schlegel;14286;Loebau-Zittau;14;SN +227;2788;Hirschfelde;14286;Loebau-Zittau;14;SN +228;2791;Oderwitz;14286;Loebau-Zittau;14;SN +229;2794;Leutersdorf;14286;Loebau-Zittau;14;SN +230;2796;Jonsdorf;14286;Loebau-Zittau;14;SN +231;2797;Oybin;14286;Loebau-Zittau;14;SN +232;2799;Waltersdorf;14286;Loebau-Zittau;14;SN +233;2826;Goerlitz;14263;Goerlitz, Stadt;14;SN +234;2827;Goerlitz;14263;Goerlitz, Stadt;14;SN +235;2828;Goerlitz;14263;Goerlitz, Stadt;14;SN +236;2829;Markersdorf;14284;Niederschlesischer Oberlausitzkreis;14;SN +237;2829;Koenigshain;14284;Niederschlesischer Oberlausitzkreis;14;SN +238;2829;Schoepstal;14284;Niederschlesischer Oberlausitzkreis;14;SN +239;2829;Neisseaue;14284;Niederschlesischer Oberlausitzkreis;14;SN +240;2894;Vierkirchen;14284;Niederschlesischer Oberlausitzkreis;14;SN +241;2894;Reichenbach/Oberlausitz;14284;Niederschlesischer Oberlausitzkreis;14;SN +242;2894;Sohland am Rotstein;14284;Niederschlesischer Oberlausitzkreis;14;SN +243;2899;Ostritz;14286;Loebau-Zittau;14;SN +244;2899;Schoenau-Berzdorf auf dem Eigen;14286;Loebau-Zittau;14;SN +245;2906;Niesky;14284;Niederschlesischer Oberlausitzkreis;14;SN +246;2906;Muecka;14284;Niederschlesischer Oberlausitzkreis;14;SN +247;2906;Quitzdorf am See;14284;Niederschlesischer Oberlausitzkreis;14;SN +248;2906;Waldhufen;14284;Niederschlesischer Oberlausitzkreis;14;SN +249;2906;Kreba-Neudorf;14284;Niederschlesischer Oberlausitzkreis;14;SN +250;2906;Klitten;14284;Niederschlesischer Oberlausitzkreis;14;SN +251;2906;Hohendubrau;14284;Niederschlesischer Oberlausitzkreis;14;SN +252;2923;Neisseaue;14284;Niederschlesischer Oberlausitzkreis;14;SN +253;2923;Horka;14284;Niederschlesischer Oberlausitzkreis;14;SN +254;2923;Kodersdorf;14284;Niederschlesischer Oberlausitzkreis;14;SN +255;2923;Haehnichen;14284;Niederschlesischer Oberlausitzkreis;14;SN +256;2929;Rothenburg/Oberlausitz;14284;Niederschlesischer Oberlausitzkreis;14;SN +257;2943;Boxberg/Oberlausitz;14284;Niederschlesischer Oberlausitzkreis;14;SN +258;2943;Weisswasser;14284;Niederschlesischer Oberlausitzkreis;14;SN +259;2953;Gablenz;14284;Niederschlesischer Oberlausitzkreis;14;SN +260;2953;Bad Muskau;14284;Niederschlesischer Oberlausitzkreis;14;SN +261;2956;Rietschen;14284;Niederschlesischer Oberlausitzkreis;14;SN +262;2957;Weisskeissel;14284;Niederschlesischer Oberlausitzkreis;14;SN +263;2957;Krauschwitz;14284;Niederschlesischer Oberlausitzkreis;14;SN +264;2959;Schleife;14284;Niederschlesischer Oberlausitzkreis;14;SN +265;2959;Trebendorf;14284;Niederschlesischer Oberlausitzkreis;14;SN +266;2959;Gross Dueben;14284;Niederschlesischer Oberlausitzkreis;14;SN +267;2977;Hoyerswerda;14264;Hoyerswerda, Stadt;14;SN +268;2979;Elsterheide;14292;Kamenz;14;SN +269;2979;Spreetal;14292;Kamenz;14;SN +270;2991;Leippe-Torno;14292;Kamenz;14;SN +271;2991;Lauta;14292;Kamenz;14;SN +272;2991;Elsterheide;14292;Kamenz;14;SN +273;2994;Bernsdorf;14292;Kamenz;14;SN +274;2994;Wiednitz;14292;Kamenz;14;SN +275;2997;Wittichenau;14292;Kamenz;14;SN +276;2999;Knappensee;14292;Kamenz;14;SN +277;2999;Uhyst;14284;Niederschlesischer Oberlausitzkreis;14;SN +278;2999;Lohsa;14292;Kamenz;14;SN +279;3042;Cottbus;12052;Cottbus, Stadt;12;BB +280;3044;Cottbus;12052;Cottbus, Stadt;12;BB +281;3046;Cottbus;12052;Cottbus, Stadt;12;BB +282;3048;Cottbus;12052;Cottbus, Stadt;12;BB +283;3050;Cottbus;12052;Cottbus, Stadt;12;BB +284;3051;Cottbus;12052;Cottbus, Stadt;12;BB +285;3052;Cottbus;12052;Cottbus, Stadt;12;BB +286;3053;Cottbus;12052;Cottbus, Stadt;12;BB +287;3054;Cottbus;12052;Cottbus, Stadt;12;BB +288;3055;Cottbus;12052;Cottbus, Stadt;12;BB +289;3058;Frauendorf;12071;Spree-Neisse;12;BB +290;3058;Haasow;12071;Spree-Neisse;12;BB +291;3058;Koppatz;12071;Spree-Neisse;12;BB +292;3058;Kathlow;12071;Spree-Neisse;12;BB +293;3058;Gross Gaglow;12071;Spree-Neisse;12;BB +294;3058;Gross Doebbern;12071;Spree-Neisse;12;BB +295;3058;Komptendorf;12071;Spree-Neisse;12;BB +296;3058;Sergen;12071;Spree-Neisse;12;BB +297;3058;Kiekebusch;12071;Spree-Neisse;12;BB +298;3058;Gablenz;12071;Spree-Neisse;12;BB +299;3058;Roggosen;12071;Spree-Neisse;12;BB +300;3058;Gallinchen;12071;Spree-Neisse;12;BB +301;3058;Gross Ossnig;12071;Spree-Neisse;12;BB +302;3058;Laubsdorf;12071;Spree-Neisse;12;BB +303;3058;Klein Doebbern;12071;Spree-Neisse;12;BB +304;3058;Neuhausen;12071;Spree-Neisse;12;BB +305;3096;Schmogrow-Fehrow;12071;Spree-Neisse;12;BB +306;3096;Burg (Spreewald);12071;Spree-Neisse;12;BB +307;3096;Werben;12071;Spree-Neisse;12;BB +308;3096;Guhrow;12071;Spree-Neisse;12;BB +309;3096;Briesen;12071;Spree-Neisse;12;BB +310;3096;Dissen-Striesow;12071;Spree-Neisse;12;BB +311;3099;Kolkwitz;12071;Spree-Neisse;12;BB +312;3103;Neupetershain;12066;Oberspreewald-Lausitz;12;BB +313;3103;Neu-Seeland;12066;Oberspreewald-Lausitz;12;BB +314;3116;Drebkau;12071;Spree-Neisse;12;BB +315;3119;Welzow;12071;Spree-Neisse;12;BB +316;3130;Bagenz;12071;Spree-Neisse;12;BB +317;3130;Graustein;12071;Spree-Neisse;12;BB +318;3130;Proschim;12071;Spree-Neisse;12;BB +319;3130;Jaemlitz-Klein Dueben;12071;Spree-Neisse;12;BB +320;3130;Gross Luja;12071;Spree-Neisse;12;BB +321;3130;Tuerkendorf;12071;Spree-Neisse;12;BB +322;3130;Hornow-Wadelsdorf;12071;Spree-Neisse;12;BB +323;3130;Tschernitz;12071;Spree-Neisse;12;BB +324;3130;Drieschnitz-Kahsel;12071;Spree-Neisse;12;BB +325;3130;Wolfshain;12071;Spree-Neisse;12;BB +326;3130;Lieskau;12071;Spree-Neisse;12;BB +327;3130;Reuthen;12071;Spree-Neisse;12;BB +328;3130;Spremberg;12071;Spree-Neisse;12;BB +329;3130;Haidemuehl;12071;Spree-Neisse;12;BB +330;3130;Felixsee;12071;Spree-Neisse;12;BB +331;3149;Gross Schacksdorf-Simmersdorf;12071;Spree-Neisse;12;BB +332;3149;Forst (Lausitz);12071;Spree-Neisse;12;BB +333;3149;Wiesengrund;12071;Spree-Neisse;12;BB +334;3159;Wiesengrund;12071;Spree-Neisse;12;BB +335;3159;Neisse-Malxetal;12071;Spree-Neisse;12;BB +336;3159;Doebern;12071;Spree-Neisse;12;BB +337;3172;Gastrose-Kerkwitz;12071;Spree-Neisse;12;BB +338;3172;Atterwasch;12071;Spree-Neisse;12;BB +339;3172;Guben;12071;Spree-Neisse;12;BB +340;3172;Griessen;12071;Spree-Neisse;12;BB +341;3172;Baerenklau;12071;Spree-Neisse;12;BB +342;3172;Lutzketal;12071;Spree-Neisse;12;BB +343;3172;Pinnow-Heideland;12071;Spree-Neisse;12;BB +344;3172;Grabko;12071;Spree-Neisse;12;BB +345;3185;Peitz;12071;Spree-Neisse;12;BB +346;3185;Teichland;12071;Spree-Neisse;12;BB +347;3185;Turnow-Preilack;12071;Spree-Neisse;12;BB +348;3185;Heinersbrueck;12071;Spree-Neisse;12;BB +349;3185;Tauer;12071;Spree-Neisse;12;BB +350;3185;Drachhausen;12071;Spree-Neisse;12;BB +351;3185;Drehnow;12071;Spree-Neisse;12;BB +352;3185;Groetsch;12071;Spree-Neisse;12;BB +353;3197;Jaenschwalde;12071;Spree-Neisse;12;BB +354;3197;Drewitz;12071;Spree-Neisse;12;BB +355;3205;Bronkow;12066;Oberspreewald-Lausitz;12;BB +356;3205;Sassleben;12066;Oberspreewald-Lausitz;12;BB +357;3205;Gross-Mehssow;12066;Oberspreewald-Lausitz;12;BB +358;3205;Bischdorf;12066;Oberspreewald-Lausitz;12;BB +359;3205;Luckaitztal;12066;Oberspreewald-Lausitz;12;BB +360;3205;Missen;12066;Oberspreewald-Lausitz;12;BB +361;3205;Calau;12066;Oberspreewald-Lausitz;12;BB +362;3205;Mlode;12066;Oberspreewald-Lausitz;12;BB +363;3205;Laasow;12066;Oberspreewald-Lausitz;12;BB +364;3205;Bolschwitz;12066;Oberspreewald-Lausitz;12;BB +365;3205;Ogrosen;12066;Oberspreewald-Lausitz;12;BB +366;3205;Kemmen;12066;Oberspreewald-Lausitz;12;BB +367;3205;Lipten;12066;Oberspreewald-Lausitz;12;BB +368;3205;Lug;12066;Oberspreewald-Lausitz;12;BB +369;3205;Werchow;12066;Oberspreewald-Lausitz;12;BB +370;3222;Hindenberg;12066;Oberspreewald-Lausitz;12;BB +371;3222;Kittlitz;12066;Oberspreewald-Lausitz;12;BB +372;3222;Luebbenau/Spreewald;12066;Oberspreewald-Lausitz;12;BB +373;3222;Gross Beuchow;12066;Oberspreewald-Lausitz;12;BB +374;3222;Ragow;12066;Oberspreewald-Lausitz;12;BB +375;3222;Boblitz;12066;Oberspreewald-Lausitz;12;BB +376;3222;Klein Radden;12066;Oberspreewald-Lausitz;12;BB +377;3222;Gross-Klessow;12066;Oberspreewald-Lausitz;12;BB +378;3226;Vetschau;12066;Oberspreewald-Lausitz;12;BB +379;3226;Suschow;12066;Oberspreewald-Lausitz;12;BB +380;3226;Kosswig;12066;Oberspreewald-Lausitz;12;BB +381;3226;Leipe;12066;Oberspreewald-Lausitz;12;BB +382;3226;Raddusch;12066;Oberspreewald-Lausitz;12;BB +383;3229;Altdoebern;12066;Oberspreewald-Lausitz;12;BB +384;3229;Luckaitztal;12066;Oberspreewald-Lausitz;12;BB +385;3238;Staupitz;12062;Elbe-Elster;12;BB +386;3238;Sallgast;12062;Elbe-Elster;12;BB +387;3238;Schadewitz;12062;Elbe-Elster;12;BB +388;3238;Dollenchen;12062;Elbe-Elster;12;BB +389;3238;Eichholz-Droessig;12062;Elbe-Elster;12;BB +390;3238;Lugau;12062;Elbe-Elster;12;BB +391;3238;Gorden;12062;Elbe-Elster;12;BB +392;3238;Massen;12062;Elbe-Elster;12;BB +393;3238;Rueckersdorf;12062;Elbe-Elster;12;BB +394;3238;Lindena;12062;Elbe-Elster;12;BB +395;3238;Lindthal;12062;Elbe-Elster;12;BB +396;3238;Betten;12062;Elbe-Elster;12;BB +397;3238;Ponnsdorf;12062;Elbe-Elster;12;BB +398;3238;Schacksdorf;12062;Elbe-Elster;12;BB +399;3238;Goellnitz;12062;Elbe-Elster;12;BB +400;3238;Oppelhain;12062;Elbe-Elster;12;BB +401;3238;Finsterwalde;12062;Elbe-Elster;12;BB +402;3238;Lieskau;12062;Elbe-Elster;12;BB +403;3238;Muenchhausen;12062;Elbe-Elster;12;BB +404;3238;Lichterfeld;12062;Elbe-Elster;12;BB +405;3238;Gruhno;12062;Elbe-Elster;12;BB +406;3238;Groebitz;12062;Elbe-Elster;12;BB +407;3238;Fischwasser;12062;Elbe-Elster;12;BB +408;3246;Babben;12062;Elbe-Elster;12;BB +409;3246;Crinitz;12062;Elbe-Elster;12;BB +410;3246;Gahro;12062;Elbe-Elster;12;BB +411;3249;Breitenau;12062;Elbe-Elster;12;BB +412;3249;Sonnewalde;12062;Elbe-Elster;12;BB +413;3249;Gossmar;12062;Elbe-Elster;12;BB +414;3249;Bahren;12062;Elbe-Elster;12;BB +415;3249;Grosskrausnik;12062;Elbe-Elster;12;BB +416;3249;Kleinkrausnik;12062;Elbe-Elster;12;BB +417;3249;Zeckerin;12062;Elbe-Elster;12;BB +418;3249;Pahlsdorf;12062;Elbe-Elster;12;BB +419;3253;Schilda;12062;Elbe-Elster;12;BB +420;3253;Trebbus;12062;Elbe-Elster;12;BB +421;3253;Duebrichen;12062;Elbe-Elster;12;BB +422;3253;Schoenborn;12062;Elbe-Elster;12;BB +423;3253;Schoenewalde;12062;Elbe-Elster;12;BB +424;3253;Hennersdorf;12062;Elbe-Elster;12;BB +425;3253;Arenzhain;12062;Elbe-Elster;12;BB +426;3253;Doberlug-Kirchhain;12062;Elbe-Elster;12;BB +427;3253;Buchhain;12062;Elbe-Elster;12;BB +428;3253;Priessen;12062;Elbe-Elster;12;BB +429;3253;Werenzhain;12062;Elbe-Elster;12;BB +430;3253;Troebitz;12062;Elbe-Elster;12;BB +431;3253;Nexdorf;12062;Elbe-Elster;12;BB +432;3253;Friedersdorf;12062;Elbe-Elster;12;BB +433;3253;Brenitz;12062;Elbe-Elster;12;BB +434;3253;Frankena;12062;Elbe-Elster;12;BB +435;4103;Leipzig;14365;Leipzig, Stadt;14;SN +436;4105;Leipzig;14365;Leipzig, Stadt;14;SN +437;4107;Leipzig;14365;Leipzig, Stadt;14;SN +438;4109;Leipzig;14365;Leipzig, Stadt;14;SN +439;4129;Leipzig;14365;Leipzig, Stadt;14;SN +440;4155;Leipzig;14365;Leipzig, Stadt;14;SN +441;4157;Leipzig;14365;Leipzig, Stadt;14;SN +442;4159;Leipzig;14365;Leipzig, Stadt;14;SN +443;4177;Leipzig;14365;Leipzig, Stadt;14;SN +444;4179;Leipzig;14365;Leipzig, Stadt;14;SN +445;4205;Leipzig;14365;Leipzig, Stadt;14;SN +446;4207;Leipzig;14365;Leipzig, Stadt;14;SN +447;4209;Leipzig;14365;Leipzig, Stadt;14;SN +448;4229;Leipzig;14365;Leipzig, Stadt;14;SN +449;4249;Leipzig;14365;Leipzig, Stadt;14;SN +450;4275;Leipzig;14365;Leipzig, Stadt;14;SN +451;4277;Leipzig;14365;Leipzig, Stadt;14;SN +452;4279;Leipzig;14365;Leipzig, Stadt;14;SN +453;4289;Leipzig;14365;Leipzig, Stadt;14;SN +454;4299;Leipzig;14365;Leipzig, Stadt;14;SN +455;4315;Leipzig;14365;Leipzig, Stadt;14;SN +456;4317;Leipzig;14365;Leipzig, Stadt;14;SN +457;4318;Leipzig;14365;Leipzig, Stadt;14;SN +458;4319;Leipzig;14365;Leipzig, Stadt;14;SN +459;4329;Leipzig;14365;Leipzig, Stadt;14;SN +460;4347;Leipzig;14365;Leipzig, Stadt;14;SN +461;4349;Leipzig;14365;Leipzig, Stadt;14;SN +462;4357;Leipzig;14365;Leipzig, Stadt;14;SN +463;4416;Markkleeberg;14379;Leipziger Land;14;SN +464;4420;Grosslehna;14379;Leipziger Land;14;SN +465;4420;Markranstaedt;14379;Leipziger Land;14;SN +466;4425;Taucha;14374;Delitzsch;14;SN +467;4435;Schkeuditz;14374;Delitzsch;14;SN +468;4442;Zwenkau;14379;Leipziger Land;14;SN +469;4451;Borsdorf;14383;Muldentalkreis;14;SN +470;4460;Kitzen;14379;Leipziger Land;14;SN +471;4463;Grosspoesna;14379;Leipziger Land;14;SN +472;4509;Wiedemar;14374;Delitzsch;14;SN +473;4509;Delitzsch;14374;Delitzsch;14;SN +474;4509;Zschortau;14374;Delitzsch;14;SN +475;4509;Loebnitz;14374;Delitzsch;14;SN +476;4509;Neukyhna;14374;Delitzsch;14;SN +477;4509;Doebernitz;14374;Delitzsch;14;SN +478;4509;Schoenwoelkau;14374;Delitzsch;14;SN +479;4509;Krostitz;14374;Delitzsch;14;SN +480;4509;Zwochau;14374;Delitzsch;14;SN +481;4519;Rackwitz;14374;Delitzsch;14;SN +482;4523;Elstertrebnitz;14379;Leipziger Land;14;SN +483;4523;Pegau;14379;Leipziger Land;14;SN +484;4539;Groitzsch;14379;Leipziger Land;14;SN +485;4552;Wyhratal;14379;Leipziger Land;14;SN +486;4552;Borna;14379;Leipziger Land;14;SN +487;4552;Lobstaedt;14379;Leipziger Land;14;SN +488;4564;Boehlen;14379;Leipziger Land;14;SN +489;4565;Regis-Breitingen;14379;Leipziger Land;14;SN +490;4567;Kitzscher;14379;Leipziger Land;14;SN +491;4571;Roetha;14379;Leipziger Land;14;SN +492;4574;Heuersdorf;14379;Leipziger Land;14;SN +493;4574;Deutzen;14379;Leipziger Land;14;SN +494;4575;Neukieritzsch;14379;Leipziger Land;14;SN +495;4579;Espenhain;14379;Leipziger Land;14;SN +496;4600;Altenburg;16077;Altenburger Land;16;TH +497;4603;Nobitz;16077;Altenburger Land;16;TH +498;4603;Goehren;16077;Altenburger Land;16;TH +499;4603;Saara;16077;Altenburger Land;16;TH +500;4603;Windischleuba;16077;Altenburger Land;16;TH +501;4610;Meuselwitz;16077;Altenburger Land;16;TH +502;4610;Wintersdorf;16077;Altenburger Land;16;TH +503;4613;Lucka;16077;Altenburger Land;16;TH +504;4617;Starkenberg;16077;Altenburger Land;16;TH +505;4617;Monstab;16077;Altenburger Land;16;TH +506;4617;Rositz;16077;Altenburger Land;16;TH +507;4617;Grossroeda;16077;Altenburger Land;16;TH +508;4617;Haselbach;16077;Altenburger Land;16;TH +509;4617;Naundorf;16077;Altenburger Land;16;TH +510;4617;Gerstenberg;16077;Altenburger Land;16;TH +511;4617;Treben;16077;Altenburger Land;16;TH +512;4617;Tegkwitz;16077;Altenburger Land;16;TH +513;4617;Fockendorf;16077;Altenburger Land;16;TH +514;4617;Kriebitzsch;16077;Altenburger Land;16;TH +515;4617;Loedla;16077;Altenburger Land;16;TH +516;4618;Ziegelheim;16077;Altenburger Land;16;TH +517;4618;Langenleuba-Niederhain;16077;Altenburger Land;16;TH +518;4618;Goepfersdorf;16077;Altenburger Land;16;TH +519;4618;Jueckelberg;16077;Altenburger Land;16;TH +520;4618;Frohnsdorf;16077;Altenburger Land;16;TH +521;4626;Lumpzig;16077;Altenburger Land;16;TH +522;4626;Mehna;16077;Altenburger Land;16;TH +523;4626;Dobitschen;16077;Altenburger Land;16;TH +524;4626;Drogen;16077;Altenburger Land;16;TH +525;4626;Altkirchen;16077;Altenburger Land;16;TH +526;4626;Vollmershain;16077;Altenburger Land;16;TH +527;4626;Wildenboerten;16077;Altenburger Land;16;TH +528;4626;Schmoelln;16077;Altenburger Land;16;TH +529;4626;Posterstein;16077;Altenburger Land;16;TH +530;4626;Jonaswalde;16077;Altenburger Land;16;TH +531;4626;Goellnitz;16077;Altenburger Land;16;TH +532;4626;Heukewalde;16077;Altenburger Land;16;TH +533;4626;Thonhausen;16077;Altenburger Land;16;TH +534;4626;Loebichau;16077;Altenburger Land;16;TH +535;4626;Noebdenitz;16077;Altenburger Land;16;TH +536;4639;Goessnitz;16077;Altenburger Land;16;TH +537;4643;Geithain;14379;Leipziger Land;14;SN +538;4651;Eulatal;14379;Leipziger Land;14;SN +539;4651;Bad Lausick;14383;Muldentalkreis;14;SN +540;4654;Frohburg;14379;Leipziger Land;14;SN +541;4655;Kohren-Sahlis;14379;Leipziger Land;14;SN +542;4657;Narsdorf;14379;Leipziger Land;14;SN +543;4668;Grimma;14383;Muldentalkreis;14;SN +544;4668;Grossbardau;14383;Muldentalkreis;14;SN +545;4668;Grossbothen;14383;Muldentalkreis;14;SN +546;4668;Parthenstein;14383;Muldentalkreis;14;SN +547;4668;Thuemmlitzwalde;14383;Muldentalkreis;14;SN +548;4668;Otterwisch;14383;Muldentalkreis;14;SN +549;4680;Colditz;14383;Muldentalkreis;14;SN +550;4680;Zschadrass;14383;Muldentalkreis;14;SN +551;4683;Belgershain;14383;Muldentalkreis;14;SN +552;4683;Naunhof;14383;Muldentalkreis;14;SN +553;4685;Nerchau;14383;Muldentalkreis;14;SN +554;4687;Trebsen/Mulde;14383;Muldentalkreis;14;SN +555;4688;Mutzschen;14383;Muldentalkreis;14;SN +556;4703;Leisnig;14375;Doebeln;14;SN +557;4703;Gersdorf;14375;Doebeln;14;SN +558;4703;Bockelwitz;14375;Doebeln;14;SN +559;4720;Doebeln;14375;Doebeln;14;SN +560;4720;Mochau;14375;Doebeln;14;SN +561;4720;Ebersbach;14375;Doebeln;14;SN +562;4720;Grossweitzschen;14375;Doebeln;14;SN +563;4720;Ziegra-Knobelsdorf;14375;Doebeln;14;SN +564;4720;Zschaitz-Ottewig;14375;Doebeln;14;SN +565;4736;Waldheim;14375;Doebeln;14;SN +566;4741;Niederstriegis;14375;Doebeln;14;SN +567;4741;Rosswein;14375;Doebeln;14;SN +568;4746;Hartha;14375;Doebeln;14;SN +569;4749;Ostrau;14375;Doebeln;14;SN +570;4758;Oschatz;14389;Torgau-Oschatz;14;SN +571;4758;Liebschuetzberg;14389;Torgau-Oschatz;14;SN +572;4758;Cavertitz;14389;Torgau-Oschatz;14;SN +573;4769;Sornzig-Ablass;14389;Torgau-Oschatz;14;SN +574;4769;Naundorf;14389;Torgau-Oschatz;14;SN +575;4769;Muegeln;14389;Torgau-Oschatz;14;SN +576;4774;Dahlen;14389;Torgau-Oschatz;14;SN +577;4779;Wermsdorf;14389;Torgau-Oschatz;14;SN +578;4808;Hohburg;14383;Muldentalkreis;14;SN +579;4808;Wurzen;14383;Muldentalkreis;14;SN +580;4808;Falkenhain;14383;Muldentalkreis;14;SN +581;4808;Kuehren-Burkartshain;14383;Muldentalkreis;14;SN +582;4808;Thallwitz;14383;Muldentalkreis;14;SN +583;4821;Brandis;14383;Muldentalkreis;14;SN +584;4827;Machern;14383;Muldentalkreis;14;SN +585;4828;Bennewitz;14383;Muldentalkreis;14;SN +586;4838;Eilenburg;14374;Delitzsch;14;SN +587;4838;Laussig;14374;Delitzsch;14;SN +588;4838;Jesewitz;14374;Delitzsch;14;SN +589;4838;Zschepplin;14374;Delitzsch;14;SN +590;4838;Mockrehna;14389;Torgau-Oschatz;14;SN +591;4838;Doberschuetz;14374;Delitzsch;14;SN +592;4849;Kossa;14374;Delitzsch;14;SN +593;4849;Bad Dueben;14374;Delitzsch;14;SN +594;4860;Pflueckuff;14389;Torgau-Oschatz;14;SN +595;4860;Torgau;14389;Torgau-Oschatz;14;SN +596;4860;Dreiheide;14389;Torgau-Oschatz;14;SN +597;4860;Zinna;14389;Torgau-Oschatz;14;SN +598;4874;Belgern;14389;Torgau-Oschatz;14;SN +599;4880;Dommitzsch;14389;Torgau-Oschatz;14;SN +600;4880;Trossin;14389;Torgau-Oschatz;14;SN +601;4880;Elsnig;14389;Torgau-Oschatz;14;SN +602;4886;Arzberg;14389;Torgau-Oschatz;14;SN +603;4886;Grosstreben-Zwethau;14389;Torgau-Oschatz;14;SN +604;4886;Beilrode;14389;Torgau-Oschatz;14;SN +605;4889;Schildau;14389;Torgau-Oschatz;14;SN +606;4895;Falkenberg/Elster;12062;Elbe-Elster;12;BB +607;4910;Elsterwerda;12062;Elbe-Elster;12;BB +608;4910;Haida;12062;Elbe-Elster;12;BB +609;4916;Stolzenhain;12062;Elbe-Elster;12;BB +610;4916;Themesgrund;12062;Elbe-Elster;12;BB +611;4916;Heideeck;12062;Elbe-Elster;12;BB +612;4916;Herzberg (Elster);12062;Elbe-Elster;12;BB +613;4916;Wildberg;12062;Elbe-Elster;12;BB +614;4916;Werchau;12062;Elbe-Elster;12;BB +615;4924;Uebigau-Wahrenbrueck;12062;Elbe-Elster;12;BB +616;4924;Bad Liebenwerda;12062;Elbe-Elster;12;BB +617;4928;Doellingen;12062;Elbe-Elster;12;BB +618;4928;Kahla;12062;Elbe-Elster;12;BB +619;4928;Schraden;12062;Elbe-Elster;12;BB +620;4928;Plessa;12062;Elbe-Elster;12;BB +621;4931;Muehlberg (Elbe);12062;Elbe-Elster;12;BB +622;4932;Wainsdorf;12062;Elbe-Elster;12;BB +623;4932;Grossthiemig;12062;Elbe-Elster;12;BB +624;4932;Proesen;12062;Elbe-Elster;12;BB +625;4932;Groeden;12062;Elbe-Elster;12;BB +626;4932;Saathain;12062;Elbe-Elster;12;BB +627;4932;Hirschfeld;12062;Elbe-Elster;12;BB +628;4932;Reichenhain;12062;Elbe-Elster;12;BB +629;4932;Merzdorf;12062;Elbe-Elster;12;BB +630;4934;Dreska;12062;Elbe-Elster;12;BB +631;4934;Hohenleipisch;12062;Elbe-Elster;12;BB +632;4936;Schlieben;12062;Elbe-Elster;12;BB +633;4936;lsig;12062;Elbe-Elster;12;BB +634;4936;Schoena-Kolpien;12072;Teltow-Flaeming;12;BB +635;4936;Hohenbucko;12062;Elbe-Elster;12;BB +636;4936;Jagsal;12062;Elbe-Elster;12;BB +637;4936;Stechau;12062;Elbe-Elster;12;BB +638;4936;Koerba;12062;Elbe-Elster;12;BB +639;4936;Naundorf;12062;Elbe-Elster;12;BB +640;4936;Kolochau;12062;Elbe-Elster;12;BB +641;4936;Malitschkendorf;12062;Elbe-Elster;12;BB +642;4936;Wehrhain;12062;Elbe-Elster;12;BB +643;4936;Frankenhain;12062;Elbe-Elster;12;BB +644;4936;Prossmarke;12062;Elbe-Elster;12;BB +645;4936;Hillmersdorf;12062;Elbe-Elster;12;BB +646;4936;Freileben;12062;Elbe-Elster;12;BB +647;4936;Lebusa;12062;Elbe-Elster;12;BB +648;4938;Uebigau-Wahrenbrueck;12062;Elbe-Elster;12;BB +649;6108;Halle;15202;Halle (Saale), Stadt;15;ST +650;6110;Halle;15202;Halle (Saale), Stadt;15;ST +651;6112;Halle;15202;Halle (Saale), Stadt;15;ST +652;6114;Halle;15202;Halle (Saale), Stadt;15;ST +653;6116;Halle;15202;Halle (Saale), Stadt;15;ST +654;6118;Halle;15202;Halle (Saale), Stadt;15;ST +655;6120;Halle;15202;Halle (Saale), Stadt;15;ST +656;6120;Lieskau;15265;Saalkreis;15;ST +657;6122;Halle;15202;Halle (Saale), Stadt;15;ST +658;6124;Halle;15202;Halle (Saale), Stadt;15;ST +659;6126;Halle;15202;Halle (Saale), Stadt;15;ST +660;6128;Halle;15202;Halle (Saale), Stadt;15;ST +661;6130;Halle;15202;Halle (Saale), Stadt;15;ST +662;6132;Halle;15202;Halle (Saale), Stadt;15;ST +663;6179;Teutschenthal;15265;Saalkreis;15;ST +664;6179;Steuden;15265;Saalkreis;15;ST +665;6179;Schochwitz;15265;Saalkreis;15;ST +666;6179;Schkopau;15261;Merseburg-Querfurt;15;ST +667;6179;Langenbogen;15265;Saalkreis;15;ST +668;6179;Holleben;15265;Saalkreis;15;ST +669;6179;Hohenweiden;15265;Saalkreis;15;ST +670;6179;Hoehnstedt;15265;Saalkreis;15;ST +671;6179;Zscherben;15265;Saalkreis;15;ST +672;6179;Zappendorf;15265;Saalkreis;15;ST +673;6179;Dornstedt;15265;Saalkreis;15;ST +674;6179;Angersdorf;15265;Saalkreis;15;ST +675;6179;Bennstedt;15265;Saalkreis;15;ST +676;6184;Schkopau;15261;Merseburg-Querfurt;15;ST +677;6184;Roeglitz;15261;Merseburg-Querfurt;15;ST +678;6184;Grosskugel;15265;Saalkreis;15;ST +679;6184;Groebers;15265;Saalkreis;15;ST +680;6184;Ermlitz;15261;Merseburg-Querfurt;15;ST +681;6184;Doellnitz;15265;Saalkreis;15;ST +682;6184;Doelbau;15265;Saalkreis;15;ST +683;6184;Dieskau;15265;Saalkreis;15;ST +684;6184;Burgliebenau;15261;Merseburg-Querfurt;15;ST +685;6184;Lochau;15265;Saalkreis;15;ST +686;6184;Rassnitz;15261;Merseburg-Querfurt;15;ST +687;6188;Spickendorf;15265;Saalkreis;15;ST +688;6188;Sietzsch;15265;Saalkreis;15;ST +689;6188;Schwerz;15265;Saalkreis;15;ST +690;6188;Reussen;15265;Saalkreis;15;ST +691;6188;Landsberg;15265;Saalkreis;15;ST +692;6188;Hohenthurm;15265;Saalkreis;15;ST +693;6188;Braschwitz;15265;Saalkreis;15;ST +694;6188;Brachstedt;15265;Saalkreis;15;ST +695;6188;Queis;15265;Saalkreis;15;ST +696;6188;Peissen;15265;Saalkreis;15;ST +697;6188;Oppin;15265;Saalkreis;15;ST +698;6188;Niemberg;15265;Saalkreis;15;ST +699;6193;Wallwitz;15265;Saalkreis;15;ST +700;6193;Teicha;15265;Saalkreis;15;ST +701;6193;Sennewitz;15265;Saalkreis;15;ST +702;6193;Kuetten;15265;Saalkreis;15;ST +703;6193;Krosigk;15265;Saalkreis;15;ST +704;6193;Gutenberg;15265;Saalkreis;15;ST +705;6193;Ploetz;15265;Saalkreis;15;ST +706;6193;Petersberg;15265;Saalkreis;15;ST +707;6193;Ostrau;15265;Saalkreis;15;ST +708;6193;Nehlitz;15265;Saalkreis;15;ST +709;6193;Nauendorf;15265;Saalkreis;15;ST +710;6193;Morl;15265;Saalkreis;15;ST +711;6193;Moesthinsdorf;15265;Saalkreis;15;ST +712;6193;Loebejuen;15265;Saalkreis;15;ST +713;6198;Salzmuende;15265;Saalkreis;15;ST +714;6198;Kloschwitz;15265;Saalkreis;15;ST +715;6198;Wettin;15265;Saalkreis;15;ST +716;6198;Fienstedt;15265;Saalkreis;15;ST +717;6198;Doessel;15265;Saalkreis;15;ST +718;6198;Doeblitz;15265;Saalkreis;15;ST +719;6198;Brachwitz;15265;Saalkreis;15;ST +720;6198;Neutz-Lettewitz;15265;Saalkreis;15;ST +721;6198;Beesenstedt;15265;Saalkreis;15;ST +722;6198;Gimritz;15265;Saalkreis;15;ST +723;6217;Beuna;15261;Merseburg-Querfurt;15;ST +724;6217;Merseburg;15261;Merseburg-Querfurt;15;ST +725;6217;Geusa;15261;Merseburg-Querfurt;15;ST +726;6231;Tollwitz;15261;Merseburg-Querfurt;15;ST +727;6231;Rodden;15261;Merseburg-Querfurt;15;ST +728;6231;Kreypau;15261;Merseburg-Querfurt;15;ST +729;6231;Koetzschau;15261;Merseburg-Querfurt;15;ST +730;6231;Oebles-Schlechtewitz;15261;Merseburg-Querfurt;15;ST +731;6231;Nempitz;15261;Merseburg-Querfurt;15;ST +732;6231;Bad Duerrenberg;15261;Merseburg-Querfurt;15;ST +733;6237;Spergau;15261;Merseburg-Querfurt;15;ST +734;6237;Leuna;15261;Merseburg-Querfurt;15;ST +735;6242;Rossbach;15261;Merseburg-Querfurt;15;ST +736;6242;Krumpa;15261;Merseburg-Querfurt;15;ST +737;6242;Grosskayna;15261;Merseburg-Querfurt;15;ST +738;6242;Braunsbedra;15261;Merseburg-Querfurt;15;ST +739;6246;Knapendorf;15261;Merseburg-Querfurt;15;ST +740;6246;Klobikau;15261;Merseburg-Querfurt;15;ST +741;6246;Delitz am Berge;15261;Merseburg-Querfurt;15;ST +742;6246;Milzau;15261;Merseburg-Querfurt;15;ST +743;6246;Bad Lauchstaedt;15261;Merseburg-Querfurt;15;ST +744;6249;Muecheln (Geiseltal);15261;Merseburg-Querfurt;15;ST +745;6254;Wallendorf;15261;Merseburg-Querfurt;15;ST +746;6254;Koetschlitz;15261;Merseburg-Querfurt;15;ST +747;6254;Horburg-Masslau;15261;Merseburg-Querfurt;15;ST +748;6254;Guenthersdorf;15261;Merseburg-Querfurt;15;ST +749;6254;Zweimen;15261;Merseburg-Querfurt;15;ST +750;6254;Zoeschen;15261;Merseburg-Querfurt;15;ST +751;6254;Friedensdorf;15261;Merseburg-Querfurt;15;ST +752;6254;Luppenau;15261;Merseburg-Querfurt;15;ST +753;6255;Schafstaedt;15261;Merseburg-Querfurt;15;ST +754;6255;Wuensch;15261;Merseburg-Querfurt;15;ST +755;6258;Schkopau;15261;Merseburg-Querfurt;15;ST +756;6258;Korbetha;15261;Merseburg-Querfurt;15;ST +757;6259;Frankleben;15261;Merseburg-Querfurt;15;ST +758;6268;Vitzenburg;15261;Merseburg-Querfurt;15;ST +759;6268;Steigra;15261;Merseburg-Querfurt;15;ST +760;6268;Schmon;15261;Merseburg-Querfurt;15;ST +761;6268;Leimbach;15261;Merseburg-Querfurt;15;ST +762;6268;Langeneichstaedt;15261;Merseburg-Querfurt;15;ST +763;6268;Ziegelroda;15261;Merseburg-Querfurt;15;ST +764;6268;Weissenschirmbach;15261;Merseburg-Querfurt;15;ST +765;6268;Grockstaedt;15261;Merseburg-Querfurt;15;ST +766;6268;Querfurt;15261;Merseburg-Querfurt;15;ST +767;6268;Oechlitz;15261;Merseburg-Querfurt;15;ST +768;6268;Obhausen;15261;Merseburg-Querfurt;15;ST +769;6268;Nemsdorf-Goehrendorf;15261;Merseburg-Querfurt;15;ST +770;6268;Albersroda;15261;Merseburg-Querfurt;15;ST +771;6268;Barnstaedt;15261;Merseburg-Querfurt;15;ST +772;6279;Schraplau;15261;Merseburg-Querfurt;15;ST +773;6279;Farnstaedt;15261;Merseburg-Querfurt;15;ST +774;6279;Esperstedt;15261;Merseburg-Querfurt;15;ST +775;6279;Alberstedt;15261;Merseburg-Querfurt;15;ST +776;6295;Volkstedt;15260;Mansfelder Land;15;ST +777;6295;Unterrissdorf;15260;Mansfelder Land;15;ST +778;6295;Schmalzerode;15260;Mansfelder Land;15;ST +779;6295;Rottelsdorf;15260;Mansfelder Land;15;ST +780;6295;Rothenschirmbach;15260;Mansfelder Land;15;ST +781;6295;Hornburg;15260;Mansfelder Land;15;ST +782;6295;Hedersleben;15260;Mansfelder Land;15;ST +783;6295;Wolferode;15260;Mansfelder Land;15;ST +784;6295;Dederstedt;15260;Mansfelder Land;15;ST +785;6295;Burgsdorf;15260;Mansfelder Land;15;ST +786;6295;Bornstedt;15260;Mansfelder Land;15;ST +787;6295;Bischofrode;15260;Mansfelder Land;15;ST +788;6295;Polleben;15260;Mansfelder Land;15;ST +789;6295;Osterhausen;15260;Mansfelder Land;15;ST +790;6295;Neehausen;15260;Mansfelder Land;15;ST +791;6295;Lutherstadt Eisleben;15260;Mansfelder Land;15;ST +792;6308;Siersleben;15260;Mansfelder Land;15;ST +793;6308;Siebigerode;15260;Mansfelder Land;15;ST +794;6308;Klostermansfeld;15260;Mansfelder Land;15;ST +795;6308;Huebitz;15260;Mansfelder Land;15;ST +796;6308;Augsdorf;15260;Mansfelder Land;15;ST +797;6308;Annarode;15260;Mansfelder Land;15;ST +798;6308;Benndorf;15260;Mansfelder Land;15;ST +799;6311;Helbra;15260;Mansfelder Land;15;ST +800;6313;Hergisdorf;15260;Mansfelder Land;15;ST +801;6313;Wimmelburg;15260;Mansfelder Land;15;ST +802;6313;Ahlsdorf;15260;Mansfelder Land;15;ST +803;6317;Stedten;15260;Mansfelder Land;15;ST +804;6317;Seeburg;15260;Mansfelder Land;15;ST +805;6317;Roeblingen am See;15260;Mansfelder Land;15;ST +806;6317;Erdeborn;15260;Mansfelder Land;15;ST +807;6317;Luettchendorf;15260;Mansfelder Land;15;ST +808;6317;Aseleben;15260;Mansfelder Land;15;ST +809;6317;Amsdorf;15260;Mansfelder Land;15;ST +810;6318;Wansleben am See;15260;Mansfelder Land;15;ST +811;6333;Walbeck;15260;Mansfelder Land;15;ST +812;6333;Sylda;15260;Mansfelder Land;15;ST +813;6333;Ritterode;15260;Mansfelder Land;15;ST +814;6333;Hettstedt;15260;Mansfelder Land;15;ST +815;6333;Harkerode;15260;Mansfelder Land;15;ST +816;6333;Wiederstedt;15260;Mansfelder Land;15;ST +817;6333;Welfesholz;15260;Mansfelder Land;15;ST +818;6333;Welbsleben;15260;Mansfelder Land;15;ST +819;6333;Endorf;15352;Aschersleben-Stassfurt;15;ST +820;6333;Braeunrode;15260;Mansfelder Land;15;ST +821;6333;Quenstedt;15260;Mansfelder Land;15;ST +822;6333;Neuplatendorf;15352;Aschersleben-Stassfurt;15;ST +823;6333;Arnstedt;15260;Mansfelder Land;15;ST +824;6333;Greifenhagen;15260;Mansfelder Land;15;ST +825;6343;Vatterode;15260;Mansfelder Land;15;ST +826;6343;Biesenrode;15260;Mansfelder Land;15;ST +827;6343;Piskaborn;15260;Mansfelder Land;15;ST +828;6343;Moellendorf;15260;Mansfelder Land;15;ST +829;6343;Mansfeld;15260;Mansfelder Land;15;ST +830;6343;Gorenzen;15260;Mansfelder Land;15;ST +831;6347;Ihlewitz;15260;Mansfelder Land;15;ST +832;6347;Heiligenthal;15260;Mansfelder Land;15;ST +833;6347;Zabenstedt;15260;Mansfelder Land;15;ST +834;6347;Gerbstedt;15260;Mansfelder Land;15;ST +835;6347;Friedeburgerhuette;15260;Mansfelder Land;15;ST +836;6347;Friedeburg;15260;Mansfelder Land;15;ST +837;6347;Freist;15260;Mansfelder Land;15;ST +838;6348;Grossoerner;15260;Mansfelder Land;15;ST +839;6366;Koethen;15159;Koethen;15;ST +840;6369;Trinum;15159;Koethen;15;ST +841;6369;Trebbichau an der Fuhne;15159;Koethen;15;ST +842;6369;Schortewitz;15159;Koethen;15;ST +843;6369;Riesdorf;15159;Koethen;15;ST +844;6369;Reupzig;15159;Koethen;15;ST +845;6369;Zehbitz;15159;Koethen;15;ST +846;6369;Zabitz;15159;Koethen;15;ST +847;6369;Wulfen;15159;Koethen;15;ST +848;6369;Wuelknitz;15159;Koethen;15;ST +849;6369;Woerbzig;15159;Koethen;15;ST +850;6369;Weissandt-Goelzau;15159;Koethen;15;ST +851;6369;Grosspaschleben;15159;Koethen;15;ST +852;6369;Grossbadegast;15159;Koethen;15;ST +853;6369;Drosa;15159;Koethen;15;ST +854;6369;Dornbock;15159;Koethen;15;ST +855;6369;Dohndorf;15159;Koethen;15;ST +856;6369;Diebzig;15159;Koethen;15;ST +857;6369;Cosa;15159;Koethen;15;ST +858;6369;Coesitz;15159;Koethen;15;ST +859;6369;Radegast;15159;Koethen;15;ST +860;6369;Prosigk;15159;Koethen;15;ST +861;6369;Loebnitz an der Linde;15159;Koethen;15;ST +862;6369;Arensdorf;15159;Koethen;15;ST +863;6369;Goerzig;15159;Koethen;15;ST +864;6369;Glauzig;15159;Koethen;15;ST +865;6385;Aken;15159;Koethen;15;ST +866;6386;Scheuder;15159;Koethen;15;ST +867;6386;Hinsdorf;15159;Koethen;15;ST +868;6386;Frassdorf;15159;Koethen;15;ST +869;6386;Elsnigk;15159;Koethen;15;ST +870;6386;Choerau;15159;Koethen;15;ST +871;6386;Quellendorf;15159;Koethen;15;ST +872;6386;Osternienburg;15159;Koethen;15;ST +873;6386;Micheln;15159;Koethen;15;ST +874;6386;Meilendorf;15159;Koethen;15;ST +875;6386;Libbesdorf;15159;Koethen;15;ST +876;6386;Reppichau;15159;Koethen;15;ST +877;6388;Wieskau;15159;Koethen;15;ST +878;6388;Groebzig;15159;Koethen;15;ST +879;6388;Edderitz;15159;Koethen;15;ST +880;6388;Piethen;15159;Koethen;15;ST +881;6388;Maasdorf;15159;Koethen;15;ST +882;6388;Baasdorf;15159;Koethen;15;ST +883;6406;Bernburg;15153;Bernburg;15;ST +884;6408;Latdorf;15153;Bernburg;15;ST +885;6408;Ilberstedt;15153;Bernburg;15;ST +886;6408;Wohlsdorf;15153;Bernburg;15;ST +887;6408;Groena;15153;Bernburg;15;ST +888;6408;Coermigk;15153;Bernburg;15;ST +889;6408;Biendorf;15153;Bernburg;15;ST +890;6408;Preusslitz;15153;Bernburg;15;ST +891;6408;Poley;15153;Bernburg;15;ST +892;6408;Peissen;15153;Bernburg;15;ST +893;6408;Aderstedt;15153;Bernburg;15;ST +894;6408;Baalberge;15153;Bernburg;15;ST +895;6420;Rothenburg;15265;Saalkreis;15;ST +896;6420;Lebendorf;15153;Bernburg;15;ST +897;6420;Koennern;15153;Bernburg;15;ST +898;6420;Zickeritz;15153;Bernburg;15;ST +899;6420;Wiendorf;15153;Bernburg;15;ST +900;6420;Gerlebogk;15153;Bernburg;15;ST +901;6420;Edlau;15153;Bernburg;15;ST +902;6420;Domnitz;15265;Saalkreis;15;ST +903;6420;Golbitz;15153;Bernburg;15;ST +904;6425;Strenznaundorf;15153;Bernburg;15;ST +905;6425;Schackstedt;15153;Bernburg;15;ST +906;6425;Ploetzkau;15153;Bernburg;15;ST +907;6425;Alsleben (Saale);15153;Bernburg;15;ST +908;6425;Belleben;15153;Bernburg;15;ST +909;6425;Beesenlaublingen;15153;Bernburg;15;ST +910;6429;Wedlitz;15153;Bernburg;15;ST +911;6429;Gerbitz;15153;Bernburg;15;ST +912;6429;Pobzig;15153;Bernburg;15;ST +913;6429;Nienburg (Saale);15153;Bernburg;15;ST +914;6429;Neugattersleben;15153;Bernburg;15;ST +915;6449;Schadeleben;15352;Aschersleben-Stassfurt;15;ST +916;6449;Schackenthal;15352;Aschersleben-Stassfurt;15;ST +917;6449;Klein Schierstedt;15352;Aschersleben-Stassfurt;15;ST +918;6449;Gross Schierstedt;15352;Aschersleben-Stassfurt;15;ST +919;6449;Winningen;15352;Aschersleben-Stassfurt;15;ST +920;6449;Wilsleben;15352;Aschersleben-Stassfurt;15;ST +921;6449;Westdorf;15352;Aschersleben-Stassfurt;15;ST +922;6449;Friedrichsaue;15352;Aschersleben-Stassfurt;15;ST +923;6449;Cochstedt;15352;Aschersleben-Stassfurt;15;ST +924;6449;Neu Koenigsaue;15352;Aschersleben-Stassfurt;15;ST +925;6449;Aschersleben;15352;Aschersleben-Stassfurt;15;ST +926;6449;Giersleben;15352;Aschersleben-Stassfurt;15;ST +927;6456;Sandersleben;15260;Mansfelder Land;15;ST +928;6456;Freckleben;15352;Aschersleben-Stassfurt;15;ST +929;6456;Drohndorf;15352;Aschersleben-Stassfurt;15;ST +930;6456;Mehringen;15352;Aschersleben-Stassfurt;15;ST +931;6458;Heteborn;15364;Quedlinburg;15;ST +932;6458;Hedersleben;15364;Quedlinburg;15;ST +933;6458;Hausneindorf;15364;Quedlinburg;15;ST +934;6458;Wedderstedt;15364;Quedlinburg;15;ST +935;6463;Ermsleben;15352;Aschersleben-Stassfurt;15;ST +936;6463;Radisleben;15364;Quedlinburg;15;ST +937;6463;Meisdorf;15352;Aschersleben-Stassfurt;15;ST +938;6463;Reinstedt;15352;Aschersleben-Stassfurt;15;ST +939;6464;Frose;15352;Aschersleben-Stassfurt;15;ST +940;6466;Gatersleben;15352;Aschersleben-Stassfurt;15;ST +941;6467;Hoym;15352;Aschersleben-Stassfurt;15;ST +942;6469;Nachterstedt;15352;Aschersleben-Stassfurt;15;ST +943;6484;Westerhausen;15364;Quedlinburg;15;ST +944;6484;Ditfurt;15364;Quedlinburg;15;ST +945;6484;Quedlinburg;15364;Quedlinburg;15;ST +946;6493;Strassberg;15364;Quedlinburg;15;ST +947;6493;Schielo;15364;Quedlinburg;15;ST +948;6493;Koenigerode;15364;Quedlinburg;15;ST +949;6493;Harzgerode;15364;Quedlinburg;15;ST +950;6493;Dankerode;15364;Quedlinburg;15;ST +951;6493;Neudorf;15364;Quedlinburg;15;ST +952;6493;Ballenstedt;15364;Quedlinburg;15;ST +953;6502;Weddersleben;15364;Quedlinburg;15;ST +954;6502;Warnstedt;15364;Quedlinburg;15;ST +955;6502;Thale;15364;Quedlinburg;15;ST +956;6502;Neinstedt;15364;Quedlinburg;15;ST +957;6507;Timmenrode;15369;Wernigerode;15;ST +958;6507;Stecklenberg;15364;Quedlinburg;15;ST +959;6507;Siptenfelde;15364;Quedlinburg;15;ST +960;6507;Rieder;15364;Quedlinburg;15;ST +961;6507;Guentersberge;15364;Quedlinburg;15;ST +962;6507;Friedrichsbrunn;15364;Quedlinburg;15;ST +963;6507;Allrode;15369;Wernigerode;15;ST +964;6507;Gernrode;15364;Quedlinburg;15;ST +965;6507;Bad Suderode;15364;Quedlinburg;15;ST +966;6526;Sangerhausen;15266;Sangerhausen;15;ST +967;6528;Wallhausen;15266;Sangerhausen;15;ST +968;6528;Sotterhausen;15266;Sangerhausen;15;ST +969;6528;Rotha;15266;Sangerhausen;15;ST +970;6528;Riethnordhausen;15266;Sangerhausen;15;ST +971;6528;Riestedt;15266;Sangerhausen;15;ST +972;6528;Kleinleinungen;15266;Sangerhausen;15;ST +973;6528;Horla;15266;Sangerhausen;15;ST +974;6528;Holdenstedt;15266;Sangerhausen;15;ST +975;6528;Hainrode;15266;Sangerhausen;15;ST +976;6528;Hackpfueffel;15266;Sangerhausen;15;ST +977;6528;Wettelrode;15266;Sangerhausen;15;ST +978;6528;Grossleinungen;15266;Sangerhausen;15;ST +979;6528;Grillenberg;15266;Sangerhausen;15;ST +980;6528;Emseloh;15266;Sangerhausen;15;ST +981;6528;Edersleben;15266;Sangerhausen;15;ST +982;6528;Drebsdorf;15266;Sangerhausen;15;ST +983;6528;Bruecken;15266;Sangerhausen;15;ST +984;6528;Breitenbach;15266;Sangerhausen;15;ST +985;6528;Blankenheim;15266;Sangerhausen;15;ST +986;6528;Beyernaumburg;15266;Sangerhausen;15;ST +987;6528;Poelsfeld;15266;Sangerhausen;15;ST +988;6528;Obersdorf;15266;Sangerhausen;15;ST +989;6528;Oberroeblingen;15266;Sangerhausen;15;ST +990;6528;Morungen;15266;Sangerhausen;15;ST +991;6528;Martinsrieth;15266;Sangerhausen;15;ST +992;6528;Liedersdorf;15266;Sangerhausen;15;ST +993;6528;Lengefeld;15266;Sangerhausen;15;ST +994;6528;Gonna;15266;Sangerhausen;15;ST +995;6536;Rossla;15266;Sangerhausen;15;ST +996;6536;Hayn;15266;Sangerhausen;15;ST +997;6536;Wolfsberg;15266;Sangerhausen;15;ST +998;6536;Wickerode;15266;Sangerhausen;15;ST +999;6536;Dietersdorf;15266;Sangerhausen;15;ST +1000;6536;Breitungen;15266;Sangerhausen;15;ST +1001;6536;Questenberg;15266;Sangerhausen;15;ST +1002;6536;Berga;15266;Sangerhausen;15;ST +1003;6536;Bennungen;15266;Sangerhausen;15;ST +1004;6537;Tilleda;15266;Sangerhausen;15;ST +1005;6537;Kelbra;15266;Sangerhausen;15;ST +1006;6542;Katharinenrieth;15266;Sangerhausen;15;ST +1007;6542;Wolferstedt;15266;Sangerhausen;15;ST +1008;6542;Winkel;15266;Sangerhausen;15;ST +1009;6542;Nienstedt;15266;Sangerhausen;15;ST +1010;6542;Niederroeblingen;15266;Sangerhausen;15;ST +1011;6542;Mittelhausen;15266;Sangerhausen;15;ST +1012;6542;Allstedt;15266;Sangerhausen;15;ST +1013;6543;Ulzigerode;15260;Mansfelder Land;15;ST +1014;6543;Stangerode;15260;Mansfelder Land;15;ST +1015;6543;Ritzgerode;15260;Mansfelder Land;15;ST +1016;6543;Hermerode;15260;Mansfelder Land;15;ST +1017;6543;Wippra;15260;Mansfelder Land;15;ST +1018;6543;Wieserode;15352;Aschersleben-Stassfurt;15;ST +1019;6543;Friesdorf;15260;Mansfelder Land;15;ST +1020;6543;Braunschwende;15260;Mansfelder Land;15;ST +1021;6543;Pansfelde;15352;Aschersleben-Stassfurt;15;ST +1022;6543;Molmerswende;15260;Mansfelder Land;15;ST +1023;6543;Alterode;15260;Mansfelder Land;15;ST +1024;6543;Abberode;15260;Mansfelder Land;15;ST +1025;6547;Stolberg (Harz);15266;Sangerhausen;15;ST +1026;6547;Schwenda;15266;Sangerhausen;15;ST +1027;6547;Breitenstein;15266;Sangerhausen;15;ST +1028;6548;Uftrungen;15266;Sangerhausen;15;ST +1029;6548;Rottleberode;15266;Sangerhausen;15;ST +1030;6556;Ichstedt;16065;Kyffhaeuserkreis;16;TH +1031;6556;Ringleben;16065;Kyffhaeuserkreis;16;TH +1032;6556;Voigtstedt;16065;Kyffhaeuserkreis;16;TH +1033;6556;Bretleben;16065;Kyffhaeuserkreis;16;TH +1034;6556;Reinsdorf;16065;Kyffhaeuserkreis;16;TH +1035;6556;Borxleben;16065;Kyffhaeuserkreis;16;TH +1036;6556;Kalbsrieth;16065;Kyffhaeuserkreis;16;TH +1037;6556;Artern;16065;Kyffhaeuserkreis;16;TH +1038;6556;Moenchpfiffel-Nikolausrieth;16065;Kyffhaeuserkreis;16;TH +1039;6556;Heygendorf;16065;Kyffhaeuserkreis;16;TH +1040;6567;Goellingen;16065;Kyffhaeuserkreis;16;TH +1041;6567;Bad Frankenhausen;16065;Kyffhaeuserkreis;16;TH +1042;6567;Steinthaleben;16065;Kyffhaeuserkreis;16;TH +1043;6567;Seega;16065;Kyffhaeuserkreis;16;TH +1044;6567;Esperstedt;16065;Kyffhaeuserkreis;16;TH +1045;6567;Guenserode;16065;Kyffhaeuserkreis;16;TH +1046;6567;Rottleben;16065;Kyffhaeuserkreis;16;TH +1047;6571;Gehofen;16065;Kyffhaeuserkreis;16;TH +1048;6571;Wiehe;16065;Kyffhaeuserkreis;16;TH +1049;6571;Donndorf;16065;Kyffhaeuserkreis;16;TH +1050;6571;Nausitz;16065;Kyffhaeuserkreis;16;TH +1051;6571;Rossleben;16065;Kyffhaeuserkreis;16;TH +1052;6577;Etzleben;16065;Kyffhaeuserkreis;16;TH +1053;6577;Gorsleben;16065;Kyffhaeuserkreis;16;TH +1054;6577;Hauteroda;16065;Kyffhaeuserkreis;16;TH +1055;6577;Oberheldrungen;16065;Kyffhaeuserkreis;16;TH +1056;6577;Hemleben;16065;Kyffhaeuserkreis;16;TH +1057;6577;Heldrungen;16065;Kyffhaeuserkreis;16;TH +1058;6578;Bilzingsleben;16068;Soemmerda;16;TH +1059;6578;Oldisleben;16065;Kyffhaeuserkreis;16;TH +1060;6578;Kannawurf;16068;Soemmerda;16;TH +1061;6618;Utenbach;15256;Burgenlandkreis;15;ST +1062;6618;Schoenburg;15256;Burgenlandkreis;15;ST +1063;6618;Leislau;15256;Burgenlandkreis;15;ST +1064;6618;Janisroda;15256;Burgenlandkreis;15;ST +1065;6618;Wethau;15256;Burgenlandkreis;15;ST +1066;6618;Casekirchen;15256;Burgenlandkreis;15;ST +1067;6618;Priessnitz;15256;Burgenlandkreis;15;ST +1068;6618;Poedelist;15256;Burgenlandkreis;15;ST +1069;6618;Naumburg;15256;Burgenlandkreis;15;ST +1070;6618;Molau;15256;Burgenlandkreis;15;ST +1071;6618;Mertendorf;15256;Burgenlandkreis;15;ST +1072;6618;Loebitz;15256;Burgenlandkreis;15;ST +1073;6618;Goerschen;15256;Burgenlandkreis;15;ST +1074;6618;Gieckau;15256;Burgenlandkreis;15;ST +1075;6628;Taugwitz;15256;Burgenlandkreis;15;ST +1076;6628;Spielberg;15256;Burgenlandkreis;15;ST +1077;6628;Croelpa-Loebschuetz;15256;Burgenlandkreis;15;ST +1078;6628;Moellern;15256;Burgenlandkreis;15;ST +1079;6628;Abtloebnitz;15256;Burgenlandkreis;15;ST +1080;6628;Bad Koesen;15256;Burgenlandkreis;15;ST +1081;6632;Schleberoda;15256;Burgenlandkreis;15;ST +1082;6632;Zeuchfeld;15256;Burgenlandkreis;15;ST +1083;6632;Groest;15261;Merseburg-Querfurt;15;ST +1084;6632;Groessnitz;15256;Burgenlandkreis;15;ST +1085;6632;Freyburg;15256;Burgenlandkreis;15;ST +1086;6632;Ebersroda;15256;Burgenlandkreis;15;ST +1087;6632;Branderoda;15261;Merseburg-Querfurt;15;ST +1088;6632;Baumersroda;15256;Burgenlandkreis;15;ST +1089;6632;Balgstaedt;15256;Burgenlandkreis;15;ST +1090;6632;Gleina;15256;Burgenlandkreis;15;ST +1091;6636;Laucha;15256;Burgenlandkreis;15;ST +1092;6636;Kirchscheidungen;15256;Burgenlandkreis;15;ST +1093;6636;Hirschroda;15256;Burgenlandkreis;15;ST +1094;6636;Weischuetz;15256;Burgenlandkreis;15;ST +1095;6636;Burgscheidungen;15256;Burgenlandkreis;15;ST +1096;6636;Golzen;15256;Burgenlandkreis;15;ST +1097;6638;Karsdorf;15256;Burgenlandkreis;15;ST +1098;6642;Wangen;15256;Burgenlandkreis;15;ST +1099;6642;Wohlmirstedt;15256;Burgenlandkreis;15;ST +1100;6642;Bucha;15256;Burgenlandkreis;15;ST +1101;6642;Nebra;15256;Burgenlandkreis;15;ST +1102;6642;Memleben;15256;Burgenlandkreis;15;ST +1103;6642;Altenroda;15256;Burgenlandkreis;15;ST +1104;6642;Reinsdorf;15256;Burgenlandkreis;15;ST +1105;6647;Thalwinkel;15256;Burgenlandkreis;15;ST +1106;6647;Steinburg;15256;Burgenlandkreis;15;ST +1107;6647;Saubach;15256;Burgenlandkreis;15;ST +1108;6647;Klosterhaeseler;15256;Burgenlandkreis;15;ST +1109;6647;Kahlwinkel;15256;Burgenlandkreis;15;ST +1110;6647;Wischroda;15256;Burgenlandkreis;15;ST +1111;6647;Burkersroda;15256;Burgenlandkreis;15;ST +1112;6647;Billroda;15256;Burgenlandkreis;15;ST +1113;6647;Lossa;15256;Burgenlandkreis;15;ST +1114;6647;Bad Bibra;15256;Burgenlandkreis;15;ST +1115;6648;Tromsdorf;15256;Burgenlandkreis;15;ST +1116;6648;Herrengosserstedt;15256;Burgenlandkreis;15;ST +1117;6648;Eckartsberga;15256;Burgenlandkreis;15;ST +1118;6648;Burgholzhausen;15256;Burgenlandkreis;15;ST +1119;6667;Uichteritz;15268;Weissenfels;15;ST +1120;6667;Tagewerben;15268;Weissenfels;15;ST +1121;6667;Storkau;15268;Weissenfels;15;ST +1122;6667;Stoessen;15256;Burgenlandkreis;15;ST +1123;6667;Leissling;15268;Weissenfels;15;ST +1124;6667;Langendorf;15268;Weissenfels;15;ST +1125;6667;Weissenfels;15268;Weissenfels;15;ST +1126;6667;Groebitz;15268;Weissenfels;15;ST +1127;6667;Burgwerben;15268;Weissenfels;15;ST +1128;6667;Prittitz;15268;Weissenfels;15;ST +1129;6667;Pretzsch;15256;Burgenlandkreis;15;ST +1130;6667;Markwerben;15268;Weissenfels;15;ST +1131;6667;Reichardtswerben;15268;Weissenfels;15;ST +1132;6667;Goseck;15268;Weissenfels;15;ST +1133;6679;Webau;15268;Weissenfels;15;ST +1134;6679;Taucha;15268;Weissenfels;15;ST +1135;6679;Hohenmoelsen;15268;Weissenfels;15;ST +1136;6679;Zorbau;15268;Weissenfels;15;ST +1137;6679;Muschwitz;15268;Weissenfels;15;ST +1138;6679;Granschuetz;15268;Weissenfels;15;ST +1139;6682;Trebnitz;15268;Weissenfels;15;ST +1140;6682;Teuchern;15268;Weissenfels;15;ST +1141;6682;Schelkau;15268;Weissenfels;15;ST +1142;6682;Krauschwitz;15268;Weissenfels;15;ST +1143;6682;Werschen;15268;Weissenfels;15;ST +1144;6682;Groeben;15268;Weissenfels;15;ST +1145;6682;Deuben;15256;Burgenlandkreis;15;ST +1146;6682;Nessa;15268;Weissenfels;15;ST +1147;6686;Starsiedel;15268;Weissenfels;15;ST +1148;6686;Soessen;15268;Weissenfels;15;ST +1149;6686;Roecken;15268;Weissenfels;15;ST +1150;6686;Rippach;15268;Weissenfels;15;ST +1151;6686;Grossgoerschen;15268;Weissenfels;15;ST +1152;6686;Dehlitz;15268;Weissenfels;15;ST +1153;6686;Poserna;15268;Weissenfels;15;ST +1154;6686;Luetzen;15268;Weissenfels;15;ST +1155;6688;Schkortleben;15268;Weissenfels;15;ST +1156;6688;Wengelsdorf;15268;Weissenfels;15;ST +1157;6688;Grosskorbetha;15268;Weissenfels;15;ST +1158;6712;Schellbach;15256;Burgenlandkreis;15;ST +1159;6712;Kretzschau;15256;Burgenlandkreis;15;ST +1160;6712;Koenderitz;15256;Burgenlandkreis;15;ST +1161;6712;Heuckewalde;15256;Burgenlandkreis;15;ST +1162;6712;Haynsburg;15256;Burgenlandkreis;15;ST +1163;6712;Zeitz;15256;Burgenlandkreis;15;ST +1164;6712;Wuerchwitz;15256;Burgenlandkreis;15;ST +1165;6712;Wittgendorf;15256;Burgenlandkreis;15;ST +1166;6712;Drossdorf;15256;Burgenlandkreis;15;ST +1167;6712;Draschwitz;15256;Burgenlandkreis;15;ST +1168;6712;Doeschwitz;15256;Burgenlandkreis;15;ST +1169;6712;Breitenbach;15256;Burgenlandkreis;15;ST +1170;6712;Bornitz;15256;Burgenlandkreis;15;ST +1171;6712;Geussnitz;15256;Burgenlandkreis;15;ST +1172;6712;Bergisdorf;15256;Burgenlandkreis;15;ST +1173;6712;Goebitz;15256;Burgenlandkreis;15;ST +1174;6712;Grana;15256;Burgenlandkreis;15;ST +1175;6721;Waldau;15256;Burgenlandkreis;15;ST +1176;6721;Unterkaka;15256;Burgenlandkreis;15;ST +1177;6721;Osterfeld;15256;Burgenlandkreis;15;ST +1178;6721;Meineweh;15256;Burgenlandkreis;15;ST +1179;6721;Goldschau;15256;Burgenlandkreis;15;ST +1180;6722;Kleinhelmsdorf;15256;Burgenlandkreis;15;ST +1181;6722;Wetterzeube;15256;Burgenlandkreis;15;ST +1182;6722;Weickelsdorf;15256;Burgenlandkreis;15;ST +1183;6722;Droyssig;15256;Burgenlandkreis;15;ST +1184;6724;Spora;15256;Burgenlandkreis;15;ST +1185;6724;Kayna;15256;Burgenlandkreis;15;ST +1186;6724;Weissenborn;15256;Burgenlandkreis;15;ST +1187;6724;Broeckau;15256;Burgenlandkreis;15;ST +1188;6725;Reuden;15256;Burgenlandkreis;15;ST +1189;6725;Profen;15256;Burgenlandkreis;15;ST +1190;6727;Theissen;15256;Burgenlandkreis;15;ST +1191;6727;Doebris;15256;Burgenlandkreis;15;ST +1192;6727;Nonnewitz;15256;Burgenlandkreis;15;ST +1193;6727;Luckenau;15256;Burgenlandkreis;15;ST +1194;6729;Troeglitz;15256;Burgenlandkreis;15;ST +1195;6729;Langendorf;15256;Burgenlandkreis;15;ST +1196;6729;Rehmsdorf;15256;Burgenlandkreis;15;ST +1197;6749;Friedersdorf;15154;Bitterfeld;15;ST +1198;6749;Bitterfeld;15154;Bitterfeld;15;ST +1199;6766;Thalheim;15154;Bitterfeld;15;ST +1200;6766;Roedgen;15154;Bitterfeld;15;ST +1201;6766;Wolfen;15154;Bitterfeld;15;ST +1202;6766;Bobbau;15154;Bitterfeld;15;ST +1203;6773;Uthausen;15171;Wittenberg;15;ST +1204;6773;Selbitz;15171;Wittenberg;15;ST +1205;6773;Schkoena;15171;Wittenberg;15;ST +1206;6773;Rotta;15171;Wittenberg;15;ST +1207;6773;Juedenberg;15171;Wittenberg;15;ST +1208;6773;Groebern;15154;Bitterfeld;15;ST +1209;6773;Radis;15171;Wittenberg;15;ST +1210;6773;Bergwitz;15171;Wittenberg;15;ST +1211;6773;Graefenhainichen;15171;Wittenberg;15;ST +1212;6773;Gossa;15154;Bitterfeld;15;ST +1213;6773;Kemberg;15171;Wittenberg;15;ST +1214;6774;Tornau;15171;Wittenberg;15;ST +1215;6774;Soellichau;15171;Wittenberg;15;ST +1216;6774;Schwemsal;15154;Bitterfeld;15;ST +1217;6774;Schlaitz;15154;Bitterfeld;15;ST +1218;6774;Roesa;15154;Bitterfeld;15;ST +1219;6774;Krina;15154;Bitterfeld;15;ST +1220;6774;Pouch;15154;Bitterfeld;15;ST +1221;6774;Plodda;15154;Bitterfeld;15;ST +1222;6774;Muehlbeck;15154;Bitterfeld;15;ST +1223;6779;Tornau;15154;Bitterfeld;15;ST +1224;6779;Thurland;15154;Bitterfeld;15;ST +1225;6779;Schierau;15154;Bitterfeld;15;ST +1226;6779;Salzfurtkapelle;15154;Bitterfeld;15;ST +1227;6779;Retzau;15154;Bitterfeld;15;ST +1228;6779;Marke;15154;Bitterfeld;15;ST +1229;6779;Raguhn;15154;Bitterfeld;15;ST +1230;6780;Stumsdorf;15154;Bitterfeld;15;ST +1231;6780;Spoeren;15154;Bitterfeld;15;ST +1232;6780;Schrenz;15154;Bitterfeld;15;ST +1233;6780;Grosszoeberitz;15154;Bitterfeld;15;ST +1234;6780;Zoerbig;15154;Bitterfeld;15;ST +1235;6780;Quetzdoelsdorf;15154;Bitterfeld;15;ST +1236;6780;Loeberitz;15154;Bitterfeld;15;ST +1237;6780;Goettnitz;15154;Bitterfeld;15;ST +1238;6780;Heideloh;15154;Bitterfeld;15;ST +1239;6780;Sandersdorf;15154;Bitterfeld;15;ST +1240;6785;Schleesen;15171;Wittenberg;15;ST +1241;6785;Kakau;15151;Anhalt-Zerbst;15;ST +1242;6785;Horstdorf;15151;Anhalt-Zerbst;15;ST +1243;6785;Brandhorst;15151;Anhalt-Zerbst;15;ST +1244;6785;Oranienbaum;15151;Anhalt-Zerbst;15;ST +1245;6786;Vockerode;15151;Anhalt-Zerbst;15;ST +1246;6786;Riesigk;15151;Anhalt-Zerbst;15;ST +1247;6786;Woerlitz;15151;Anhalt-Zerbst;15;ST +1248;6786;Griesen;15151;Anhalt-Zerbst;15;ST +1249;6786;Rehsen;15151;Anhalt-Zerbst;15;ST +1250;6786;Gohrau;15151;Anhalt-Zerbst;15;ST +1251;6791;Zschornewitz;15171;Wittenberg;15;ST +1252;6791;Moehlau;15171;Wittenberg;15;ST +1253;6792;Sandersdorf;15154;Bitterfeld;15;ST +1254;6794;Zscherndorf;15154;Bitterfeld;15;ST +1255;6794;Glebitzsch;15154;Bitterfeld;15;ST +1256;6794;Renneritz;15154;Bitterfeld;15;ST +1257;6794;Ramsin;15154;Bitterfeld;15;ST +1258;6794;Sandersdorf;15154;Bitterfeld;15;ST +1259;6796;Brehna;15154;Bitterfeld;15;ST +1260;6800;Jessnitz;15154;Bitterfeld;15;ST +1261;6800;Altjessnitz;15154;Bitterfeld;15;ST +1262;6803;Greppin;15154;Bitterfeld;15;ST +1263;6804;Burgkemnitz;15154;Bitterfeld;15;ST +1264;6804;Muldenstein;15154;Bitterfeld;15;ST +1265;6808;Holzweissig;15154;Bitterfeld;15;ST +1266;6809;Roitzsch;15154;Bitterfeld;15;ST +1267;6809;Petersroda;15154;Bitterfeld;15;ST +1268;6842;Dessau;15101;Dessau, Stadt;15;ST +1269;6844;Dessau;15101;Dessau, Stadt;15;ST +1270;6846;Dessau;15101;Dessau, Stadt;15;ST +1271;6847;Dessau;15101;Dessau, Stadt;15;ST +1272;6849;Dessau;15101;Dessau, Stadt;15;ST +1273;6862;Thiessen;15151;Anhalt-Zerbst;15;ST +1274;6862;Stackelitz;15151;Anhalt-Zerbst;15;ST +1275;6862;Serno;15151;Anhalt-Zerbst;15;ST +1276;6862;Rosslau;15151;Anhalt-Zerbst;15;ST +1277;6862;Rodleben;15151;Anhalt-Zerbst;15;ST +1278;6862;Jeber-Bergfrieden;15151;Anhalt-Zerbst;15;ST +1279;6862;Hundeluft;15151;Anhalt-Zerbst;15;ST +1280;6862;Brambach;15151;Anhalt-Zerbst;15;ST +1281;6862;Braesen;15151;Anhalt-Zerbst;15;ST +1282;6862;Ragoesen;15151;Anhalt-Zerbst;15;ST +1283;6869;Senst;15151;Anhalt-Zerbst;15;ST +1284;6869;Koeselitz;15151;Anhalt-Zerbst;15;ST +1285;6869;Klieken;15151;Anhalt-Zerbst;15;ST +1286;6869;Zieko;15151;Anhalt-Zerbst;15;ST +1287;6869;Woerpen;15151;Anhalt-Zerbst;15;ST +1288;6869;Griebo;15151;Anhalt-Zerbst;15;ST +1289;6869;Dueben;15151;Anhalt-Zerbst;15;ST +1290;6869;Coswig;15151;Anhalt-Zerbst;15;ST +1291;6869;Cobbelsdorf;15151;Anhalt-Zerbst;15;ST +1292;6869;Buko;15151;Anhalt-Zerbst;15;ST +1293;6869;Moellensdorf;15151;Anhalt-Zerbst;15;ST +1294;6886;Lutherstadt Wittenberg;15171;Wittenberg;15;ST +1295;6888;Zoernigall;15171;Wittenberg;15;ST +1296;6888;Eutzsch;15171;Wittenberg;15;ST +1297;6888;Dietrichsdorf;15171;Wittenberg;15;ST +1298;6888;Dabrun;15171;Wittenberg;15;ST +1299;6888;Muehlanger;15171;Wittenberg;15;ST +1300;6888;Mochau;15171;Wittenberg;15;ST +1301;6888;Abtsdorf;15171;Wittenberg;15;ST +1302;6895;Leetza;15171;Wittenberg;15;ST +1303;6895;Kropstaedt;15171;Wittenberg;15;ST +1304;6895;Zahna;15171;Wittenberg;15;ST +1305;6895;Buelzig;15171;Wittenberg;15;ST +1306;6895;Bossdorf;15171;Wittenberg;15;ST +1307;6895;Rahnsdorf;15171;Wittenberg;15;ST +1308;6896;Straach;15171;Wittenberg;15;ST +1309;6896;Schmilkendorf;15171;Wittenberg;15;ST +1310;6896;Nudersdorf;15171;Wittenberg;15;ST +1311;6901;Wartenburg;15171;Wittenberg;15;ST +1312;6901;Schnellin;15171;Wittenberg;15;ST +1313;6901;Kemberg;15171;Wittenberg;15;ST +1314;6901;Dorna;15171;Wittenberg;15;ST +1315;6901;Rackith;15171;Wittenberg;15;ST +1316;6901;Ateritz;15171;Wittenberg;15;ST +1317;6901;Globig-Bleddin;15171;Wittenberg;15;ST +1318;6905;Korgau;15171;Wittenberg;15;ST +1319;6905;Meuro;15171;Wittenberg;15;ST +1320;6905;Bad Schmiedeberg;15171;Wittenberg;15;ST +1321;6909;Trebitz;15171;Wittenberg;15;ST +1322;6909;Priesitz;15171;Wittenberg;15;ST +1323;6909;Pretzsch/Elbe;15171;Wittenberg;15;ST +1324;6917;Schuetzberg;15171;Wittenberg;15;ST +1325;6917;Kloeden;15171;Wittenberg;15;ST +1326;6917;Jessen (Elster);15171;Wittenberg;15;ST +1327;6917;Rade;15171;Wittenberg;15;ST +1328;6918;Seyda;15171;Wittenberg;15;ST +1329;6918;Zemnick;15171;Wittenberg;15;ST +1330;6918;Gentha;15171;Wittenberg;15;ST +1331;6918;Gadegast;15171;Wittenberg;15;ST +1332;6918;Elster/Elbe;15171;Wittenberg;15;ST +1333;6918;Naundorf bei Seyda;15171;Wittenberg;15;ST +1334;6918;Morxdorf;15171;Wittenberg;15;ST +1335;6918;Mellnitz;15171;Wittenberg;15;ST +1336;6918;Listerfehrda;15171;Wittenberg;15;ST +1337;6922;Lebien;15171;Wittenberg;15;ST +1338;6922;Labrun;15171;Wittenberg;15;ST +1339;6922;Prettin;15171;Wittenberg;15;ST +1340;6922;Plossig;15171;Wittenberg;15;ST +1341;6922;Axien;15171;Wittenberg;15;ST +1342;6925;Gross Naundorf;15171;Wittenberg;15;ST +1343;6925;Bethau;15171;Wittenberg;15;ST +1344;6925;Purzien;15171;Wittenberg;15;ST +1345;6925;Loeben;15171;Wittenberg;15;ST +1346;6925;Annaburg;15171;Wittenberg;15;ST +1347;6926;Kleinkorga;15171;Wittenberg;15;ST +1348;6926;Holzdorf;15171;Wittenberg;15;ST +1349;6926;Buschkuhnsdorf;15171;Wittenberg;15;ST +1350;6926;Premsendorf;15171;Wittenberg;15;ST +1351;6926;Neuerstadt;15171;Wittenberg;15;ST +1352;6926;Moenchenhoefe;15171;Wittenberg;15;ST +1353;6926;Reicho;15171;Wittenberg;15;ST +1354;6928;Linda (Elster);15171;Wittenberg;15;ST +1355;7318;Wittgendorf;16073;Saalfeld-Rudolstadt;16;TH +1356;7318;Arnsgereuth;16073;Saalfeld-Rudolstadt;16;TH +1357;7318;Saalfeld/Saale;16073;Saalfeld-Rudolstadt;16;TH +1358;7330;Probstzella;16073;Saalfeld-Rudolstadt;16;TH +1359;7330;Marktgoelitz;16073;Saalfeld-Rudolstadt;16;TH +1360;7333;Unterwellenborn;16073;Saalfeld-Rudolstadt;16;TH +1361;7334;Gosswitz;16073;Saalfeld-Rudolstadt;16;TH +1362;7334;Kamsdorf;16073;Saalfeld-Rudolstadt;16;TH +1363;7336;Koenitz;16073;Saalfeld-Rudolstadt;16;TH +1364;7336;Birkigt;16073;Saalfeld-Rudolstadt;16;TH +1365;7338;Drognitz;16073;Saalfeld-Rudolstadt;16;TH +1366;7338;Altenbeuthen;16073;Saalfeld-Rudolstadt;16;TH +1367;7338;Hohenwarte;16073;Saalfeld-Rudolstadt;16;TH +1368;7338;Leutenberg;16073;Saalfeld-Rudolstadt;16;TH +1369;7338;Kaulsdorf;16073;Saalfeld-Rudolstadt;16;TH +1370;7343;Wurzbach;16075;Saale-Orla-Kreis;16;TH +1371;7349;Lehesten;16073;Saalfeld-Rudolstadt;16;TH +1372;7356;Lobenstein;16075;Saale-Orla-Kreis;16;TH +1373;7356;Neundorf (bei Lobenstein);16075;Saale-Orla-Kreis;16;TH +1374;7366;Harra;16075;Saale-Orla-Kreis;16;TH +1375;7366;Birkenhuegel;16075;Saale-Orla-Kreis;16;TH +1376;7366;Blankenberg;16075;Saale-Orla-Kreis;16;TH +1377;7366;Pottiga;16075;Saale-Orla-Kreis;16;TH +1378;7366;Schlegel;16075;Saale-Orla-Kreis;16;TH +1379;7366;Blankenstein;16075;Saale-Orla-Kreis;16;TH +1380;7368;Saalburg-Ebersdorf;16075;Saale-Orla-Kreis;16;TH +1381;7368;Remptendorf;16075;Saale-Orla-Kreis;16;TH +1382;7381;Oppurg;16075;Saale-Orla-Kreis;16;TH +1383;7381;Moxa;16075;Saale-Orla-Kreis;16;TH +1384;7381;Wernburg;16075;Saale-Orla-Kreis;16;TH +1385;7381;Doebritz;16075;Saale-Orla-Kreis;16;TH +1386;7381;Solkwitz;16075;Saale-Orla-Kreis;16;TH +1387;7381;Oberoppurg;16075;Saale-Orla-Kreis;16;TH +1388;7381;Paska;16075;Saale-Orla-Kreis;16;TH +1389;7381;Bodelwitz;16075;Saale-Orla-Kreis;16;TH +1390;7381;Poessneck;16075;Saale-Orla-Kreis;16;TH +1391;7381;Nimritz;16075;Saale-Orla-Kreis;16;TH +1392;7381;Langenorla;16075;Saale-Orla-Kreis;16;TH +1393;7387;Lausnitz bei Poessneck;16073;Saalfeld-Rudolstadt;16;TH +1394;7387;Kroelpa;16075;Saale-Orla-Kreis;16;TH +1395;7389;Wilhelmsdorf;16075;Saale-Orla-Kreis;16;TH +1396;7389;Knau;16075;Saale-Orla-Kreis;16;TH +1397;7389;Gertewitz;16075;Saale-Orla-Kreis;16;TH +1398;7389;Goessitz;16075;Saale-Orla-Kreis;16;TH +1399;7389;Bucha;16075;Saale-Orla-Kreis;16;TH +1400;7389;Schmorda;16075;Saale-Orla-Kreis;16;TH +1401;7389;Keila;16075;Saale-Orla-Kreis;16;TH +1402;7389;Ranis;16075;Saale-Orla-Kreis;16;TH +1403;7389;Seisla;16075;Saale-Orla-Kreis;16;TH +1404;7389;Peuschen;16075;Saale-Orla-Kreis;16;TH +1405;7389;Quaschwitz;16075;Saale-Orla-Kreis;16;TH +1406;7389;Grobengereuth;16075;Saale-Orla-Kreis;16;TH +1407;7407;Rudolstadt;16073;Saalfeld-Rudolstadt;16;TH +1408;7407;Heilingen;16073;Saalfeld-Rudolstadt;16;TH +1409;7407;Uhlstaedt-Kirchhasel;16073;Saalfeld-Rudolstadt;16;TH +1410;7407;Remda-Teichel;16073;Saalfeld-Rudolstadt;16;TH +1411;7407;Grosskochberg;16073;Saalfeld-Rudolstadt;16;TH +1412;7422;Rottenbach;16073;Saalfeld-Rudolstadt;16;TH +1413;7422;Saalfelder Hoehe;16073;Saalfeld-Rudolstadt;16;TH +1414;7422;Bad Blankenburg;16073;Saalfeld-Rudolstadt;16;TH +1415;7426;Bechstedt;16073;Saalfeld-Rudolstadt;16;TH +1416;7426;Koenigsee;16073;Saalfeld-Rudolstadt;16;TH +1417;7426;Droebischau;16073;Saalfeld-Rudolstadt;16;TH +1418;7426;Oberhain;16073;Saalfeld-Rudolstadt;16;TH +1419;7426;Allendorf;16073;Saalfeld-Rudolstadt;16;TH +1420;7427;Schwarzburg;16073;Saalfeld-Rudolstadt;16;TH +1421;7429;Doeschnitz;16073;Saalfeld-Rudolstadt;16;TH +1422;7429;Sitzendorf;16073;Saalfeld-Rudolstadt;16;TH +1423;7429;Rohrbach;16073;Saalfeld-Rudolstadt;16;TH +1424;7545;Gera;16052;Gera, Stadt;16;TH +1425;7546;Gera;16052;Gera, Stadt;16;TH +1426;7548;Gera;16052;Gera, Stadt;16;TH +1427;7549;Gera;16052;Gera, Stadt;16;TH +1428;7551;Gera;16052;Gera, Stadt;16;TH +1429;7552;Gera;16052;Gera, Stadt;16;TH +1430;7554;Poelzig;16076;Greiz;16;TH +1431;7554;Brahmenau;16076;Greiz;16;TH +1432;7554;Korbussen;16076;Greiz;16;TH +1433;7554;Bethenhausen;16076;Greiz;16;TH +1434;7554;Kauern;16076;Greiz;16;TH +1435;7554;Hirschfeld;16076;Greiz;16;TH +1436;7554;Schwaara;16076;Greiz;16;TH +1437;7557;Hundhaupten;16076;Greiz;16;TH +1438;7557;Bocka;16076;Greiz;16;TH +1439;7557;Harth-Poellnitz;16076;Greiz;16;TH +1440;7557;Zedlitz;16076;Greiz;16;TH +1441;7557;Crimla;16076;Greiz;16;TH +1442;7570;Schoemberg;16076;Greiz;16;TH +1443;7570;Wuenschendorf;16076;Greiz;16;TH +1444;7570;Harth-Poellnitz;16076;Greiz;16;TH +1445;7570;Hohenoelsen;16076;Greiz;16;TH +1446;7570;Teichwitz;16076;Greiz;16;TH +1447;7570;Weida;16076;Greiz;16;TH +1448;7570;Endschuetz;16076;Greiz;16;TH +1449;7570;Steinsdorf;16076;Greiz;16;TH +1450;7580;Gauern;16076;Greiz;16;TH +1451;7580;Paitzdorf;16076;Greiz;16;TH +1452;7580;Linda bei Weida;16076;Greiz;16;TH +1453;7580;Reichstaedt;16076;Greiz;16;TH +1454;7580;Hilbersdorf;16076;Greiz;16;TH +1455;7580;Rueckersdorf;16076;Greiz;16;TH +1456;7580;Grossenstein;16076;Greiz;16;TH +1457;7580;Braunichswalde;16076;Greiz;16;TH +1458;7580;Ronneburg;16076;Greiz;16;TH +1459;7580;Seelingstaedt;16076;Greiz;16;TH +1460;7586;Bad Koestritz;16076;Greiz;16;TH +1461;7586;Caaschwitz;16076;Greiz;16;TH +1462;7586;Kraftsdorf;16076;Greiz;16;TH +1463;7586;Hartmannsdorf;16076;Greiz;16;TH +1464;7589;Lindenkreuz;16076;Greiz;16;TH +1465;7589;Lederhose;16076;Greiz;16;TH +1466;7589;Harth-Poellnitz;16076;Greiz;16;TH +1467;7589;Schwarzbach;16076;Greiz;16;TH +1468;7589;Muenchenbernsdorf;16076;Greiz;16;TH +1469;7589;Saara;16076;Greiz;16;TH +1470;7607;Heideland;16074;Saale-Holzland-Kreis;16;TH +1471;7607;Hainspitz;16074;Saale-Holzland-Kreis;16;TH +1472;7607;Goesen;16074;Saale-Holzland-Kreis;16;TH +1473;7607;Eisenberg;16074;Saale-Holzland-Kreis;16;TH +1474;7613;Seifartsdorf;16074;Saale-Holzland-Kreis;16;TH +1475;7613;Rauda;16074;Saale-Holzland-Kreis;16;TH +1476;7613;Crossen an der Elster;16074;Saale-Holzland-Kreis;16;TH +1477;7613;Hartmannsdorf;16074;Saale-Holzland-Kreis;16;TH +1478;7613;Walpernhain;16074;Saale-Holzland-Kreis;16;TH +1479;7613;Silbitz;16074;Saale-Holzland-Kreis;16;TH +1480;7616;Graitschen bei Buergel;16074;Saale-Holzland-Kreis;16;TH +1481;7616;Rauschwitz;16074;Saale-Holzland-Kreis;16;TH +1482;7616;Petersberg;16074;Saale-Holzland-Kreis;16;TH +1483;7616;Nausnitz;16074;Saale-Holzland-Kreis;16;TH +1484;7616;Buergel;16074;Saale-Holzland-Kreis;16;TH +1485;7616;Poxdorf;16074;Saale-Holzland-Kreis;16;TH +1486;7616;Serba;16074;Saale-Holzland-Kreis;16;TH +1487;7619;Mertendorf;16074;Saale-Holzland-Kreis;16;TH +1488;7619;Schkoelen;16074;Saale-Holzland-Kreis;16;TH +1489;7629;Reichenbach;16074;Saale-Holzland-Kreis;16;TH +1490;7629;Hermsdorf;16074;Saale-Holzland-Kreis;16;TH +1491;7629;Sankt Gangloff;16074;Saale-Holzland-Kreis;16;TH +1492;7629;Schleifreisen;16074;Saale-Holzland-Kreis;16;TH +1493;7639;Tautenhain;16074;Saale-Holzland-Kreis;16;TH +1494;7639;Weissenborn;16074;Saale-Holzland-Kreis;16;TH +1495;7639;Bad Klosterlausnitz;16074;Saale-Holzland-Kreis;16;TH +1496;7646;Kleinbockedra;16074;Saale-Holzland-Kreis;16;TH +1497;7646;Ruttersdorf-Lotschen;16074;Saale-Holzland-Kreis;16;TH +1498;7646;Moeckern;16074;Saale-Holzland-Kreis;16;TH +1499;7646;Bollberg;16074;Saale-Holzland-Kreis;16;TH +1500;7646;Geisenhain;16074;Saale-Holzland-Kreis;16;TH +1501;7646;Lippersdorf-Erdmannsdorf;16074;Saale-Holzland-Kreis;16;TH +1502;7646;Schoengleina;16074;Saale-Holzland-Kreis;16;TH +1503;7646;Meusebach;16074;Saale-Holzland-Kreis;16;TH +1504;7646;Schloeben;16074;Saale-Holzland-Kreis;16;TH +1505;7646;Grossbockedra;16074;Saale-Holzland-Kreis;16;TH +1506;7646;Rausdorf;16074;Saale-Holzland-Kreis;16;TH +1507;7646;Tautendorf;16074;Saale-Holzland-Kreis;16;TH +1508;7646;Bremsnitz;16074;Saale-Holzland-Kreis;16;TH +1509;7646;Eineborn;16074;Saale-Holzland-Kreis;16;TH +1510;7646;Weissbach;16074;Saale-Holzland-Kreis;16;TH +1511;7646;Rattelsdorf;16074;Saale-Holzland-Kreis;16;TH +1512;7646;Laasdorf;16074;Saale-Holzland-Kreis;16;TH +1513;7646;Bobeck;16074;Saale-Holzland-Kreis;16;TH +1514;7646;Quirla;16074;Saale-Holzland-Kreis;16;TH +1515;7646;Albersdorf;16074;Saale-Holzland-Kreis;16;TH +1516;7646;Stadtroda;16074;Saale-Holzland-Kreis;16;TH +1517;7646;Waltersdorf;16074;Saale-Holzland-Kreis;16;TH +1518;7646;Unterbodnitz;16074;Saale-Holzland-Kreis;16;TH +1519;7646;Troebnitz;16074;Saale-Holzland-Kreis;16;TH +1520;7646;Scheiditz;16074;Saale-Holzland-Kreis;16;TH +1521;7646;Karlsdorf;16074;Saale-Holzland-Kreis;16;TH +1522;7646;Oberbodnitz;16074;Saale-Holzland-Kreis;16;TH +1523;7646;Kleinebersdorf;16074;Saale-Holzland-Kreis;16;TH +1524;7646;Waldeck;16074;Saale-Holzland-Kreis;16;TH +1525;7646;Ottendorf;16074;Saale-Holzland-Kreis;16;TH +1526;7646;Gneus;16074;Saale-Holzland-Kreis;16;TH +1527;7646;Moersdorf;16074;Saale-Holzland-Kreis;16;TH +1528;7646;Tissa;16074;Saale-Holzland-Kreis;16;TH +1529;7646;Renthendorf;16074;Saale-Holzland-Kreis;16;TH +1530;7646;Trockenborn-Wolfersdorf;16074;Saale-Holzland-Kreis;16;TH +1531;7743;Jena;16053;Jena, Stadt;16;TH +1532;7745;Jena;16053;Jena, Stadt;16;TH +1533;7747;Jena;16053;Jena, Stadt;16;TH +1534;7749;Jena;16053;Jena, Stadt;16;TH +1535;7751;Grosspuerschuetz;16074;Saale-Holzland-Kreis;16;TH +1536;7751;Zoellnitz;16074;Saale-Holzland-Kreis;16;TH +1537;7751;Jenaloebnitz;16074;Saale-Holzland-Kreis;16;TH +1538;7751;Sulza;16074;Saale-Holzland-Kreis;16;TH +1539;7751;Grossloebichau;16074;Saale-Holzland-Kreis;16;TH +1540;7751;Golmsdorf;16074;Saale-Holzland-Kreis;16;TH +1541;7751;Bucha;16074;Saale-Holzland-Kreis;16;TH +1542;7751;Milda;16074;Saale-Holzland-Kreis;16;TH +1543;7751;Rothenstein;16074;Saale-Holzland-Kreis;16;TH +1544;7751;Loeberschuetz;16074;Saale-Holzland-Kreis;16;TH +1545;7768;Bibra;16074;Saale-Holzland-Kreis;16;TH +1546;7768;Kahla;16074;Saale-Holzland-Kreis;16;TH +1547;7768;Schoeps;16074;Saale-Holzland-Kreis;16;TH +1548;7768;Reinstaedt;16074;Saale-Holzland-Kreis;16;TH +1549;7768;Orlamuende;16074;Saale-Holzland-Kreis;16;TH +1550;7768;Eichenberg;16074;Saale-Holzland-Kreis;16;TH +1551;7768;Altenberga;16074;Saale-Holzland-Kreis;16;TH +1552;7768;Seitenroda;16074;Saale-Holzland-Kreis;16;TH +1553;7768;Hummelshain;16074;Saale-Holzland-Kreis;16;TH +1554;7768;Lindig;16074;Saale-Holzland-Kreis;16;TH +1555;7768;Gumperda;16074;Saale-Holzland-Kreis;16;TH +1556;7768;Freienorla;16074;Saale-Holzland-Kreis;16;TH +1557;7768;Grosseutersdorf;16074;Saale-Holzland-Kreis;16;TH +1558;7768;Kleineutersdorf;16074;Saale-Holzland-Kreis;16;TH +1559;7774;Frauenpriessnitz;16074;Saale-Holzland-Kreis;16;TH +1560;7774;Thierschneck;16074;Saale-Holzland-Kreis;16;TH +1561;7774;Wichmar;16074;Saale-Holzland-Kreis;16;TH +1562;7774;Camburg;16074;Saale-Holzland-Kreis;16;TH +1563;7778;Tautenburg;16074;Saale-Holzland-Kreis;16;TH +1564;7778;Hainichen;16074;Saale-Holzland-Kreis;16;TH +1565;7778;Dornburg;16074;Saale-Holzland-Kreis;16;TH +1566;7778;Lehesten;16074;Saale-Holzland-Kreis;16;TH +1567;7778;Zimmern;16074;Saale-Holzland-Kreis;16;TH +1568;7778;Dorndorf-Steudnitz;16074;Saale-Holzland-Kreis;16;TH +1569;7778;Neuengoenna;16074;Saale-Holzland-Kreis;16;TH +1570;7806;Neustadt an der Orla;16075;Saale-Orla-Kreis;16;TH +1571;7806;Dreba;16075;Saale-Orla-Kreis;16;TH +1572;7806;Lausnitz bei Neustadt an der Orla;16075;Saale-Orla-Kreis;16;TH +1573;7806;Weira;16075;Saale-Orla-Kreis;16;TH +1574;7819;Linda bei Neustadt an der Orla;16075;Saale-Orla-Kreis;16;TH +1575;7819;Schmieritz;16075;Saale-Orla-Kreis;16;TH +1576;7819;Dreitzsch;16075;Saale-Orla-Kreis;16;TH +1577;7819;Toemmelsdorf;16075;Saale-Orla-Kreis;16;TH +1578;7819;Lemnitz;16075;Saale-Orla-Kreis;16;TH +1579;7819;Mittelpoellnitz;16075;Saale-Orla-Kreis;16;TH +1580;7819;Rosendorf;16075;Saale-Orla-Kreis;16;TH +1581;7819;Pillingsdorf;16075;Saale-Orla-Kreis;16;TH +1582;7819;Miesitz;16075;Saale-Orla-Kreis;16;TH +1583;7819;Geroda;16075;Saale-Orla-Kreis;16;TH +1584;7819;Triptis;16075;Saale-Orla-Kreis;16;TH +1585;7907;Schleiz;16075;Saale-Orla-Kreis;16;TH +1586;7907;Poermitz;16075;Saale-Orla-Kreis;16;TH +1587;7907;Dragensdorf;16075;Saale-Orla-Kreis;16;TH +1588;7907;Plothen;16075;Saale-Orla-Kreis;16;TH +1589;7907;Loehma;16075;Saale-Orla-Kreis;16;TH +1590;7907;Tegau;16075;Saale-Orla-Kreis;16;TH +1591;7907;Goeschitz;16075;Saale-Orla-Kreis;16;TH +1592;7907;Dittersdorf;16075;Saale-Orla-Kreis;16;TH +1593;7907;Oettersdorf;16075;Saale-Orla-Kreis;16;TH +1594;7907;Goerkwitz;16075;Saale-Orla-Kreis;16;TH +1595;7919;Muehltroff;14178;Vogtlandkreis;14;SN +1596;7919;Kirschkau;16075;Saale-Orla-Kreis;16;TH +1597;7922;Tanna;16075;Saale-Orla-Kreis;16;TH +1598;7924;Schoendorf;16075;Saale-Orla-Kreis;16;TH +1599;7924;Volkmannsdorf;16075;Saale-Orla-Kreis;16;TH +1600;7924;Essbach;16075;Saale-Orla-Kreis;16;TH +1601;7924;Crispendorf;16075;Saale-Orla-Kreis;16;TH +1602;7924;Neundorf (bei Schleiz);16075;Saale-Orla-Kreis;16;TH +1603;7924;Ziegenrueck;16075;Saale-Orla-Kreis;16;TH +1604;7926;Gefell;16075;Saale-Orla-Kreis;16;TH +1605;7927;Hirschberg;16075;Saale-Orla-Kreis;16;TH +1606;7929;Saalburg-Ebersdorf;16075;Saale-Orla-Kreis;16;TH +1607;7937;Zeulenroda;16076;Greiz;16;TH +1608;7937;Silberfeld;16076;Greiz;16;TH +1609;7937;Vogtlaendisches Oberland;16076;Greiz;16;TH +1610;7937;Langenwolschendorf;16076;Greiz;16;TH +1611;7937;Zadelsdorf;16076;Greiz;16;TH +1612;7950;Merkendorf;16076;Greiz;16;TH +1613;7950;Goehren-Doehlen;16076;Greiz;16;TH +1614;7950;Staitz;16076;Greiz;16;TH +1615;7950;Wiebelsdorf;16076;Greiz;16;TH +1616;7950;Triebes;16076;Greiz;16;TH +1617;7950;Weissendorf;16076;Greiz;16;TH +1618;7952;Vogtlaendisches Oberland;16076;Greiz;16;TH +1619;7952;Pausa;14178;Vogtlandkreis;14;SN +1620;7955;Braunsdorf;16076;Greiz;16;TH +1621;7955;Auma;16076;Greiz;16;TH +1622;7957;Hain;16076;Greiz;16;TH +1623;7957;Langenwetzendorf;16076;Greiz;16;TH +1624;7958;Hohenleuben;16076;Greiz;16;TH +1625;7973;Greiz;16076;Greiz;16;TH +1626;7980;Wildetaube;16076;Greiz;16;TH +1627;7980;Neumuehle;16076;Greiz;16;TH +1628;7980;Berga/Elster;16076;Greiz;16;TH +1629;7980;Neugernsdorf;16076;Greiz;16;TH +1630;7980;Kuehdorf;16076;Greiz;16;TH +1631;7980;Lunzig;16076;Greiz;16;TH +1632;7985;Elsterberg;14178;Vogtlandkreis;14;SN +1633;7985;Vogtlaendisches Oberland;16076;Greiz;16;TH +1634;7987;Mohlsdorf;16076;Greiz;16;TH +1635;7989;Teichwolframsdorf;16076;Greiz;16;TH +1636;8056;Zwickau;14167;Zwickau, Stadt;14;SN +1637;8058;Zwickau;14167;Zwickau, Stadt;14;SN +1638;8060;Zwickau;14167;Zwickau, Stadt;14;SN +1639;8062;Zwickau;14167;Zwickau, Stadt;14;SN +1640;8064;Zwickau;14167;Zwickau, Stadt;14;SN +1641;8066;Zwickau;14167;Zwickau, Stadt;14;SN +1642;8107;Kirchberg;14193;Zwickauer Land;14;SN +1643;8107;Hartmannsdorf bei Kirchberg;14193;Zwickauer Land;14;SN +1644;8107;Hirschfeld;14193;Zwickauer Land;14;SN +1645;8112;Wilkau-Hasslau;14193;Zwickauer Land;14;SN +1646;8115;Lichtentanne;14193;Zwickauer Land;14;SN +1647;8118;Hartenstein;14193;Zwickauer Land;14;SN +1648;8132;Muelsen;14193;Zwickauer Land;14;SN +1649;8134;Langenweissbach;14193;Zwickauer Land;14;SN +1650;8134;Wildenfels;14193;Zwickauer Land;14;SN +1651;8141;Reinsdorf;14193;Zwickauer Land;14;SN +1652;8144;Hirschfeld;14193;Zwickauer Land;14;SN +1653;8147;Crinitzberg;14193;Zwickauer Land;14;SN +1654;8209;Auerbach/Vogtland;14178;Vogtlandkreis;14;SN +1655;8223;Gruenbach;14178;Vogtlandkreis;14;SN +1656;8223;Werda;14178;Vogtlandkreis;14;SN +1657;8223;Falkenstein/Vogtland;14178;Vogtlandkreis;14;SN +1658;8223;Neustadt/Vogtland;14178;Vogtlandkreis;14;SN +1659;8228;Rodewisch;14178;Vogtlandkreis;14;SN +1660;8233;Treuen;14178;Vogtlandkreis;14;SN +1661;8236;Ellefeld;14178;Vogtlandkreis;14;SN +1662;8237;Steinberg;14178;Vogtlandkreis;14;SN +1663;8239;Bergen;14178;Vogtlandkreis;14;SN +1664;8248;Klingenthal/SN;14178;Vogtlandkreis;14;SN +1665;8258;Markneukirchen;14178;Vogtlandkreis;14;SN +1666;8261;Schoeneck/Vogtland;14178;Vogtlandkreis;14;SN +1667;8262;Tannenbergsthal/Vogtland;14178;Vogtlandkreis;14;SN +1668;8262;Morgenroethe-Rautenkranz;14178;Vogtlandkreis;14;SN +1669;8265;Erlbach;14178;Vogtlandkreis;14;SN +1670;8267;Zwota;14178;Vogtlandkreis;14;SN +1671;8269;Hammerbruecke;14178;Vogtlandkreis;14;SN +1672;8280;Aue;14191;Aue-Schwarzenberg;14;SN +1673;8289;Schneeberg;14191;Aue-Schwarzenberg;14;SN +1674;8294;Loessnitz;14191;Aue-Schwarzenberg;14;SN +1675;8297;Zwoenitz;14188;Stollberg;14;SN +1676;8301;Schlema;14191;Aue-Schwarzenberg;14;SN +1677;8304;Schoenheide;14191;Aue-Schwarzenberg;14;SN +1678;8309;Eibenstock;14191;Aue-Schwarzenberg;14;SN +1679;8312;Lauter/SN;14191;Aue-Schwarzenberg;14;SN +1680;8315;Bernsbach;14191;Aue-Schwarzenberg;14;SN +1681;8321;Zschorlau;14191;Aue-Schwarzenberg;14;SN +1682;8324;Bockau;14191;Aue-Schwarzenberg;14;SN +1683;8326;Sosa;14191;Aue-Schwarzenberg;14;SN +1684;8328;Stuetzengruen;14191;Aue-Schwarzenberg;14;SN +1685;8340;Schwarzenberg/Erzgebirge;14191;Aue-Schwarzenberg;14;SN +1686;8340;Beierfeld;14191;Aue-Schwarzenberg;14;SN +1687;8349;Erlabrunn;14191;Aue-Schwarzenberg;14;SN +1688;8349;Johanngeorgenstadt;14191;Aue-Schwarzenberg;14;SN +1689;8352;Markersbach;14191;Aue-Schwarzenberg;14;SN +1690;8352;Raschau;14191;Aue-Schwarzenberg;14;SN +1691;8352;Poehla;14191;Aue-Schwarzenberg;14;SN +1692;8355;Rittersgruen;14191;Aue-Schwarzenberg;14;SN +1693;8358;Gruenhain;14191;Aue-Schwarzenberg;14;SN +1694;8359;Breitenbrunn/Erzgebirge;14191;Aue-Schwarzenberg;14;SN +1695;8371;Glauchau;14173;Chemnitzer Land;14;SN +1696;8373;Remse;14173;Chemnitzer Land;14;SN +1697;8393;Dennheritz;14193;Zwickauer Land;14;SN +1698;8393;Schoenberg;14173;Chemnitzer Land;14;SN +1699;8393;Meerane;14173;Chemnitzer Land;14;SN +1700;8396;Waldenburg;14173;Chemnitzer Land;14;SN +1701;8396;Oberwiera;14173;Chemnitzer Land;14;SN +1702;8412;Werdau;14193;Zwickauer Land;14;SN +1703;8412;Leubnitz;14178;Vogtlandkreis;14;SN +1704;8427;Fraureuth;14193;Zwickauer Land;14;SN +1705;8428;Langenbernsdorf;14193;Zwickauer Land;14;SN +1706;8451;Crimmitschau;14193;Zwickauer Land;14;SN +1707;8459;Neukirchen/Pleisse;14193;Zwickauer Land;14;SN +1708;8468;Reichenbach/Vogtland;14178;Vogtlandkreis;14;SN +1709;8468;Heinsdorfergrund;14178;Vogtlandkreis;14;SN +1710;8485;Lengenfeld;14178;Vogtlandkreis;14;SN +1711;8491;Netzschkau;14178;Vogtlandkreis;14;SN +1712;8491;Limbach;14178;Vogtlandkreis;14;SN +1713;8496;Neumark;14178;Vogtlandkreis;14;SN +1714;8499;Mylau;14178;Vogtlandkreis;14;SN +1715;8523;Plauen;14166;Plauen, Stadt;14;SN +1716;8525;Plauen;14166;Plauen, Stadt;14;SN +1717;8527;Plauen;14166;Plauen, Stadt;14;SN +1718;8529;Plauen;14166;Plauen, Stadt;14;SN +1719;8538;Reuth;14178;Vogtlandkreis;14;SN +1720;8538;Burgstein;14178;Vogtlandkreis;14;SN +1721;8538;Weischlitz;14178;Vogtlandkreis;14;SN +1722;8539;Mehltheuer;14178;Vogtlandkreis;14;SN +1723;8541;Theuma;14178;Vogtlandkreis;14;SN +1724;8541;Neuensalz;14178;Vogtlandkreis;14;SN +1725;8543;Poehl;14178;Vogtlandkreis;14;SN +1726;8548;Syrau;14178;Vogtlandkreis;14;SN +1727;8606;Boesenbrunn;14178;Vogtlandkreis;14;SN +1728;8606;Triebel/Vogtland;14178;Vogtlandkreis;14;SN +1729;8606;Muehlental;14178;Vogtlandkreis;14;SN +1730;8606;Oelsnitz;14178;Vogtlandkreis;14;SN +1731;8606;Tirpersdorf;14178;Vogtlandkreis;14;SN +1732;8626;Eichigt;14178;Vogtlandkreis;14;SN +1733;8626;Adorf;14178;Vogtlandkreis;14;SN +1734;8645;Bad Elster;14178;Vogtlandkreis;14;SN +1735;8648;Bad Brambach;14178;Vogtlandkreis;14;SN +1736;9111;Chemnitz;14161;Chemnitz, Stadt;14;SN +1737;9112;Chemnitz;14161;Chemnitz, Stadt;14;SN +1738;9113;Chemnitz;14161;Chemnitz, Stadt;14;SN +1739;9114;Chemnitz;14161;Chemnitz, Stadt;14;SN +1740;9116;Chemnitz;14161;Chemnitz, Stadt;14;SN +1741;9117;Chemnitz;14161;Chemnitz, Stadt;14;SN +1742;9119;Chemnitz;14161;Chemnitz, Stadt;14;SN +1743;9120;Chemnitz;14161;Chemnitz, Stadt;14;SN +1744;9122;Chemnitz;14161;Chemnitz, Stadt;14;SN +1745;9123;Chemnitz;14161;Chemnitz, Stadt;14;SN +1746;9125;Chemnitz;14161;Chemnitz, Stadt;14;SN +1747;9126;Chemnitz;14161;Chemnitz, Stadt;14;SN +1748;9127;Chemnitz;14161;Chemnitz, Stadt;14;SN +1749;9130;Chemnitz;14161;Chemnitz, Stadt;14;SN +1750;9131;Chemnitz;14161;Chemnitz, Stadt;14;SN +1751;9212;Limbach-Oberfrohna;14173;Chemnitzer Land;14;SN +1752;9217;Burgstaedt;14182;Mittweida;14;SN +1753;9221;Neukirchen/Erzgebirge;14188;Stollberg;14;SN +1754;9232;Hartmannsdorf;14182;Mittweida;14;SN +1755;9235;Burkhardtsdorf;14188;Stollberg;14;SN +1756;9236;Claussnitz;14182;Mittweida;14;SN +1757;9241;Muehlau;14182;Mittweida;14;SN +1758;9243;Niederfrohna;14173;Chemnitzer Land;14;SN +1759;9244;Lichtenau;14182;Mittweida;14;SN +1760;9249;Taura;14182;Mittweida;14;SN +1761;9306;Wechselburg;14182;Mittweida;14;SN +1762;9306;Erlau;14182;Mittweida;14;SN +1763;9306;Koenigsfeld;14182;Mittweida;14;SN +1764;9306;Zettlitz;14182;Mittweida;14;SN +1765;9306;Seelitz;14182;Mittweida;14;SN +1766;9306;Rochlitz;14182;Mittweida;14;SN +1767;9306;Thalheim/Erzgebirge;14188;Stollberg;14;SN +1768;9306;Koenigshain-Wiederau;14182;Mittweida;14;SN +1769;9322;Penig;14182;Mittweida;14;SN +1770;9326;Geringswalde;14182;Mittweida;14;SN +1771;9328;Lunzenau;14182;Mittweida;14;SN +1772;9337;Callenberg;14173;Chemnitzer Land;14;SN +1773;9337;Hohenstein-Ernstthal;14173;Chemnitzer Land;14;SN +1774;9337;Bernsdorf;14173;Chemnitzer Land;14;SN +1775;9350;Lichtenstein/SN;14173;Chemnitzer Land;14;SN +1776;9353;Oberlungwitz;14173;Chemnitzer Land;14;SN +1777;9355;Gersdorf;14173;Chemnitzer Land;14;SN +1778;9356;Sankt Egidien;14173;Chemnitzer Land;14;SN +1779;9366;Stollberg/Erzgebirge;14188;Stollberg;14;SN +1780;9366;Niederdorf;14188;Stollberg;14;SN +1781;9376;Oelsnitz/Erzgebirge;14188;Stollberg;14;SN +1782;9385;Lugau/Erzgebirge;14188;Stollberg;14;SN +1783;9385;Erlbach-Kirchberg;14188;Stollberg;14;SN +1784;9387;Jahnsdorf/Erzgebirge;14188;Stollberg;14;SN +1785;9390;Gornsdorf;14188;Stollberg;14;SN +1786;9392;Auerbach;14188;Stollberg;14;SN +1787;9394;Hohndorf;14188;Stollberg;14;SN +1788;9395;Hormersdorf;14188;Stollberg;14;SN +1789;9399;Niederwuerschnitz;14188;Stollberg;14;SN +1790;9405;Zschopau;14181;Mittlerer Erzgebirgskreis;14;SN +1791;9405;Gornau/Erzgebirge;14181;Mittlerer Erzgebirgskreis;14;SN +1792;9419;Thum;14171;Annaberg;14;SN +1793;9423;Gelenau/Erzgebirge;14171;Annaberg;14;SN +1794;9427;Ehrenfriedersdorf;14171;Annaberg;14;SN +1795;9429;Wolkenstein;14181;Mittlerer Erzgebirgskreis;14;SN +1796;9430;Drebach;14181;Mittlerer Erzgebirgskreis;14;SN +1797;9430;Venusberg;14181;Mittlerer Erzgebirgskreis;14;SN +1798;9432;Grossolbersdorf;14181;Mittlerer Erzgebirgskreis;14;SN +1799;9435;Scharfenstein;14181;Mittlerer Erzgebirgskreis;14;SN +1800;9437;Waldkirchen/Erzgebirge;14181;Mittlerer Erzgebirgskreis;14;SN +1801;9437;Boernichen/Erzgebirge;14181;Mittlerer Erzgebirgskreis;14;SN +1802;9439;Amtsberg;14181;Mittlerer Erzgebirgskreis;14;SN +1803;9456;Annaberg-Buchholz;14171;Annaberg;14;SN +1804;9456;Mildenau;14171;Annaberg;14;SN +1805;9465;Sehmatal;14171;Annaberg;14;SN +1806;9468;Geyer;14171;Annaberg;14;SN +1807;9468;Tannenberg;14171;Annaberg;14;SN +1808;9471;Koenigswalde;14171;Annaberg;14;SN +1809;9471;Baerenstein;14171;Annaberg;14;SN +1810;9474;Crottendorf;14171;Annaberg;14;SN +1811;9477;Joehstadt;14171;Annaberg;14;SN +1812;9481;Elterlein;14171;Annaberg;14;SN +1813;9481;Scheibenberg;14171;Annaberg;14;SN +1814;9484;Oberwiesenthal;14171;Annaberg;14;SN +1815;9487;Schlettau;14171;Annaberg;14;SN +1816;9488;Wiesa;14171;Annaberg;14;SN +1817;9496;Marienberg;14181;Mittlerer Erzgebirgskreis;14;SN +1818;9496;Pobershau;14181;Mittlerer Erzgebirgskreis;14;SN +1819;9509;Pockau;14181;Mittlerer Erzgebirgskreis;14;SN +1820;9514;Lengefeld;14181;Mittlerer Erzgebirgskreis;14;SN +1821;9517;Zoeblitz;14181;Mittlerer Erzgebirgskreis;14;SN +1822;9518;Grossrueckerswalde;14181;Mittlerer Erzgebirgskreis;14;SN +1823;9526;Pfaffroda;14181;Mittlerer Erzgebirgskreis;14;SN +1824;9526;Heidersdorf;14181;Mittlerer Erzgebirgskreis;14;SN +1825;9526;Olbernhau;14181;Mittlerer Erzgebirgskreis;14;SN +1826;9544;Neuhausen/Erzgebirge;14177;Freiberg;14;SN +1827;9548;Deutschneudorf;14181;Mittlerer Erzgebirgskreis;14;SN +1828;9548;Seiffen/Erzgebirge;14181;Mittlerer Erzgebirgskreis;14;SN +1829;9557;Floeha;14177;Freiberg;14;SN +1830;9569;Falkenau;14177;Freiberg;14;SN +1831;9569;Frankenstein;14177;Freiberg;14;SN +1832;9569;Gahlenz;14177;Freiberg;14;SN +1833;9569;Oederan;14177;Freiberg;14;SN +1834;9573;Leubsdorf;14177;Freiberg;14;SN +1835;9573;Augustusburg;14177;Freiberg;14;SN +1836;9575;Eppendorf;14177;Freiberg;14;SN +1837;9577;Niederwiesa;14177;Freiberg;14;SN +1838;9579;Borstendorf;14181;Mittlerer Erzgebirgskreis;14;SN +1839;9579;Gruenhainichen;14181;Mittlerer Erzgebirgskreis;14;SN +1840;9599;Freiberg;14177;Freiberg;14;SN +1841;9600;Weissenborn/Erzgebirge;14177;Freiberg;14;SN +1842;9600;Oberschoena;14177;Freiberg;14;SN +1843;9600;Niederschoena;14177;Freiberg;14;SN +1844;9603;Grossschirma;14177;Freiberg;14;SN +1845;9618;Brand-Erbisdorf;14177;Freiberg;14;SN +1846;9618;Grosshartmannsdorf;14177;Freiberg;14;SN +1847;9619;Mulda/SN;14177;Freiberg;14;SN +1848;9619;Sayda;14177;Freiberg;14;SN +1849;9619;Dorfchemnitz bei Sayda;14177;Freiberg;14;SN +1850;9623;Rechenberg-Bienenmuehle;14177;Freiberg;14;SN +1851;9623;Frauenstein;14177;Freiberg;14;SN +1852;9627;Bobritzsch;14177;Freiberg;14;SN +1853;9627;Hilbersdorf;14177;Freiberg;14;SN +1854;9629;Reinsberg;14177;Freiberg;14;SN +1855;9633;Halsbruecke;14177;Freiberg;14;SN +1856;9634;Siebenlehn;14177;Freiberg;14;SN +1857;9638;Lichtenberg/Erzgebirge;14177;Freiberg;14;SN +1858;9648;Kriebstein;14182;Mittweida;14;SN +1859;9648;Mittweida;14182;Mittweida;14;SN +1860;9648;Altmittweida;14182;Mittweida;14;SN +1861;9661;Tiefenbach;14182;Mittweida;14;SN +1862;9661;Striegistal;14182;Mittweida;14;SN +1863;9661;Rossau;14182;Mittweida;14;SN +1864;9661;Hainichen;14182;Mittweida;14;SN +1865;9669;Frankenberg/SN;14182;Mittweida;14;SN +1866;10115;BE;11000;BE, Stadt;11;BE +1867;10117;BE;11000;BE, Stadt;11;BE +1868;10119;BE;11000;BE, Stadt;11;BE +1869;10178;BE;11000;BE, Stadt;11;BE +1870;10179;BE;11000;BE, Stadt;11;BE +1871;10243;BE;11000;BE, Stadt;11;BE +1872;10245;BE;11000;BE, Stadt;11;BE +1873;10247;BE;11000;BE, Stadt;11;BE +1874;10249;BE;11000;BE, Stadt;11;BE +1875;10315;BE;11000;BE, Stadt;11;BE +1876;10317;BE;11000;BE, Stadt;11;BE +1877;10318;BE;11000;BE, Stadt;11;BE +1878;10319;BE;11000;BE, Stadt;11;BE +1879;10365;BE;11000;BE, Stadt;11;BE +1880;10367;BE;11000;BE, Stadt;11;BE +1881;10369;BE;11000;BE, Stadt;11;BE +1882;10405;BE;11000;BE, Stadt;11;BE +1883;10407;BE;11000;BE, Stadt;11;BE +1884;10409;BE;11000;BE, Stadt;11;BE +1885;10435;BE;11000;BE, Stadt;11;BE +1886;10437;BE;11000;BE, Stadt;11;BE +1887;10439;BE;11000;BE, Stadt;11;BE +1888;10551;BE;11000;BE, Stadt;11;BE +1889;10553;BE;11000;BE, Stadt;11;BE +1890;10555;BE;11000;BE, Stadt;11;BE +1891;10557;BE;11000;BE, Stadt;11;BE +1892;10559;BE;11000;BE, Stadt;11;BE +1893;10585;BE;11000;BE, Stadt;11;BE +1894;10587;BE;11000;BE, Stadt;11;BE +1895;10589;BE;11000;BE, Stadt;11;BE +1896;10623;BE;11000;BE, Stadt;11;BE +1897;10625;BE;11000;BE, Stadt;11;BE +1898;10627;BE;11000;BE, Stadt;11;BE +1899;10629;BE;11000;BE, Stadt;11;BE +1900;10707;BE;11000;BE, Stadt;11;BE +1901;10709;BE;11000;BE, Stadt;11;BE +1902;10711;BE;11000;BE, Stadt;11;BE +1903;10713;BE;11000;BE, Stadt;11;BE +1904;10715;BE;11000;BE, Stadt;11;BE +1905;10717;BE;11000;BE, Stadt;11;BE +1906;10719;BE;11000;BE, Stadt;11;BE +1907;10777;BE;11000;BE, Stadt;11;BE +1908;10779;BE;11000;BE, Stadt;11;BE +1909;10781;BE;11000;BE, Stadt;11;BE +1910;10783;BE;11000;BE, Stadt;11;BE +1911;10785;BE;11000;BE, Stadt;11;BE +1912;10787;BE;11000;BE, Stadt;11;BE +1913;10789;BE;11000;BE, Stadt;11;BE +1914;10823;BE;11000;BE, Stadt;11;BE +1915;10825;BE;11000;BE, Stadt;11;BE +1916;10827;BE;11000;BE, Stadt;11;BE +1917;10829;BE;11000;BE, Stadt;11;BE +1918;10961;BE;11000;BE, Stadt;11;BE +1919;10963;BE;11000;BE, Stadt;11;BE +1920;10965;BE;11000;BE, Stadt;11;BE +1921;10967;BE;11000;BE, Stadt;11;BE +1922;10969;BE;11000;BE, Stadt;11;BE +1923;10997;BE;11000;BE, Stadt;11;BE +1924;10999;BE;11000;BE, Stadt;11;BE +1925;12043;BE;11000;BE, Stadt;11;BE +1926;12045;BE;11000;BE, Stadt;11;BE +1927;12047;BE;11000;BE, Stadt;11;BE +1928;12049;BE;11000;BE, Stadt;11;BE +1929;12051;BE;11000;BE, Stadt;11;BE +1930;12053;BE;11000;BE, Stadt;11;BE +1931;12055;BE;11000;BE, Stadt;11;BE +1932;12057;BE;11000;BE, Stadt;11;BE +1933;12059;BE;11000;BE, Stadt;11;BE +1934;12099;BE;11000;BE, Stadt;11;BE +1935;12101;BE;11000;BE, Stadt;11;BE +1936;12103;BE;11000;BE, Stadt;11;BE +1937;12105;BE;11000;BE, Stadt;11;BE +1938;12107;BE;11000;BE, Stadt;11;BE +1939;12109;BE;11000;BE, Stadt;11;BE +1940;12157;BE;11000;BE, Stadt;11;BE +1941;12159;BE;11000;BE, Stadt;11;BE +1942;12161;BE;11000;BE, Stadt;11;BE +1943;12163;BE;11000;BE, Stadt;11;BE +1944;12165;BE;11000;BE, Stadt;11;BE +1945;12167;BE;11000;BE, Stadt;11;BE +1946;12169;BE;11000;BE, Stadt;11;BE +1947;12203;BE;11000;BE, Stadt;11;BE +1948;12205;BE;11000;BE, Stadt;11;BE +1949;12207;BE;11000;BE, Stadt;11;BE +1950;12209;BE;11000;BE, Stadt;11;BE +1951;12247;BE;11000;BE, Stadt;11;BE +1952;12249;BE;11000;BE, Stadt;11;BE +1953;12277;BE;11000;BE, Stadt;11;BE +1954;12279;BE;11000;BE, Stadt;11;BE +1955;12305;BE;11000;BE, Stadt;11;BE +1956;12307;BE;11000;BE, Stadt;11;BE +1957;12309;BE;11000;BE, Stadt;11;BE +1958;12347;BE;11000;BE, Stadt;11;BE +1959;12349;BE;11000;BE, Stadt;11;BE +1960;12351;BE;11000;BE, Stadt;11;BE +1961;12353;BE;11000;BE, Stadt;11;BE +1962;12355;BE;11000;BE, Stadt;11;BE +1963;12357;BE;11000;BE, Stadt;11;BE +1964;12359;BE;11000;BE, Stadt;11;BE +1965;12435;BE;11000;BE, Stadt;11;BE +1966;12437;BE;11000;BE, Stadt;11;BE +1967;12439;BE;11000;BE, Stadt;11;BE +1968;12459;BE;11000;BE, Stadt;11;BE +1969;12487;BE;11000;BE, Stadt;11;BE +1970;12489;BE;11000;BE, Stadt;11;BE +1971;12524;BE;11000;BE, Stadt;11;BE +1972;12526;BE;11000;BE, Stadt;11;BE +1973;12527;BE;11000;BE, Stadt;11;BE +1974;12529;BE;11000;BE, Stadt;11;BE +1975;12529;Schoenefeld;12061;Dahme-Spreewald;12;BB +1976;12555;BE;11000;BE, Stadt;11;BE +1977;12557;BE;11000;BE, Stadt;11;BE +1978;12559;BE;11000;BE, Stadt;11;BE +1979;12587;BE;11000;BE, Stadt;11;BE +1980;12589;BE;11000;BE, Stadt;11;BE +1981;12619;BE;11000;BE, Stadt;11;BE +1982;12621;BE;11000;BE, Stadt;11;BE +1983;12623;BE;11000;BE, Stadt;11;BE +1984;12627;BE;11000;BE, Stadt;11;BE +1985;12629;BE;11000;BE, Stadt;11;BE +1986;12679;BE;11000;BE, Stadt;11;BE +1987;12681;BE;11000;BE, Stadt;11;BE +1988;12683;BE;11000;BE, Stadt;11;BE +1989;12685;BE;11000;BE, Stadt;11;BE +1990;12687;BE;11000;BE, Stadt;11;BE +1991;12689;BE;11000;BE, Stadt;11;BE +1992;13051;BE;11000;BE, Stadt;11;BE +1993;13053;BE;11000;BE, Stadt;11;BE +1994;13055;BE;11000;BE, Stadt;11;BE +1995;13057;BE;11000;BE, Stadt;11;BE +1996;13059;BE;11000;BE, Stadt;11;BE +1997;13086;BE;11000;BE, Stadt;11;BE +1998;13088;BE;11000;BE, Stadt;11;BE +1999;13089;BE;11000;BE, Stadt;11;BE +2000;13125;BE;11000;BE, Stadt;11;BE +2001;13127;BE;11000;BE, Stadt;11;BE +2002;13129;BE;11000;BE, Stadt;11;BE +2003;13156;BE;11000;BE, Stadt;11;BE +2004;13158;BE;11000;BE, Stadt;11;BE +2005;13159;BE;11000;BE, Stadt;11;BE +2006;13187;BE;11000;BE, Stadt;11;BE +2007;13189;BE;11000;BE, Stadt;11;BE +2008;13347;BE;11000;BE, Stadt;11;BE +2009;13349;BE;11000;BE, Stadt;11;BE +2010;13351;BE;11000;BE, Stadt;11;BE +2011;13353;BE;11000;BE, Stadt;11;BE +2012;13355;BE;11000;BE, Stadt;11;BE +2013;13357;BE;11000;BE, Stadt;11;BE +2014;13359;BE;11000;BE, Stadt;11;BE +2015;13403;BE;11000;BE, Stadt;11;BE +2016;13405;BE;11000;BE, Stadt;11;BE +2017;13407;BE;11000;BE, Stadt;11;BE +2018;13409;BE;11000;BE, Stadt;11;BE +2019;13435;BE;11000;BE, Stadt;11;BE +2020;13437;BE;11000;BE, Stadt;11;BE +2021;13439;BE;11000;BE, Stadt;11;BE +2022;13465;BE;11000;BE, Stadt;11;BE +2023;13467;BE;11000;BE, Stadt;11;BE +2024;13469;BE;11000;BE, Stadt;11;BE +2025;13503;BE;11000;BE, Stadt;11;BE +2026;13505;BE;11000;BE, Stadt;11;BE +2027;13507;BE;11000;BE, Stadt;11;BE +2028;13509;BE;11000;BE, Stadt;11;BE +2029;13581;BE;11000;BE, Stadt;11;BE +2030;13583;BE;11000;BE, Stadt;11;BE +2031;13585;BE;11000;BE, Stadt;11;BE +2032;13587;BE;11000;BE, Stadt;11;BE +2033;13589;BE;11000;BE, Stadt;11;BE +2034;13591;BE;11000;BE, Stadt;11;BE +2035;13593;BE;11000;BE, Stadt;11;BE +2036;13595;BE;11000;BE, Stadt;11;BE +2037;13597;BE;11000;BE, Stadt;11;BE +2038;13599;BE;11000;BE, Stadt;11;BE +2039;13627;BE;11000;BE, Stadt;11;BE +2040;13629;BE;11000;BE, Stadt;11;BE +2041;14050;BE;11000;BE, Stadt;11;BE +2042;14052;BE;11000;BE, Stadt;11;BE +2043;14053;BE;11000;BE, Stadt;11;BE +2044;14055;BE;11000;BE, Stadt;11;BE +2045;14057;BE;11000;BE, Stadt;11;BE +2046;14059;BE;11000;BE, Stadt;11;BE +2047;14089;BE;11000;BE, Stadt;11;BE +2048;14109;BE;11000;BE, Stadt;11;BE +2049;14129;BE;11000;BE, Stadt;11;BE +2050;14163;BE;11000;BE, Stadt;11;BE +2051;14165;BE;11000;BE, Stadt;11;BE +2052;14167;BE;11000;BE, Stadt;11;BE +2053;14169;BE;11000;BE, Stadt;11;BE +2054;14193;BE;11000;BE, Stadt;11;BE +2055;14195;BE;11000;BE, Stadt;11;BE +2056;14197;BE;11000;BE, Stadt;11;BE +2057;14199;BE;11000;BE, Stadt;11;BE +2058;14467;Potsdam;12054;Potsdam, Stadt;12;BB +2059;14469;Potsdam;12054;Potsdam, Stadt;12;BB +2060;14471;Potsdam;12054;Potsdam, Stadt;12;BB +2061;14473;Potsdam;12054;Potsdam, Stadt;12;BB +2062;14476;Neu Fahrland;12069;Potsdam-Mittelmark;12;BB +2063;14476;Fahrland;12069;Potsdam-Mittelmark;12;BB +2064;14476;Toeplitz;12069;Potsdam-Mittelmark;12;BB +2065;14476;Satzkorn;12069;Potsdam-Mittelmark;12;BB +2066;14476;Uetz-Paaren;12069;Potsdam-Mittelmark;12;BB +2067;14476;Gross Glienicke;12069;Potsdam-Mittelmark;12;BB +2068;14476;Marquardt;12069;Potsdam-Mittelmark;12;BB +2069;14476;Golm;12069;Potsdam-Mittelmark;12;BB +2070;14476;Seeburg;12069;Potsdam-Mittelmark;12;BB +2071;14478;Potsdam;12054;Potsdam, Stadt;12;BB +2072;14480;Potsdam;12054;Potsdam, Stadt;12;BB +2073;14482;Potsdam;12054;Potsdam, Stadt;12;BB +2074;14513;Teltow;12069;Potsdam-Mittelmark;12;BB +2075;14532;Nudow;12069;Potsdam-Mittelmark;12;BB +2076;14532;Stahnsdorf;12069;Potsdam-Mittelmark;12;BB +2077;14532;Philippsthal;12069;Potsdam-Mittelmark;12;BB +2078;14532;Kleinmachnow;12069;Potsdam-Mittelmark;12;BB +2079;14532;Fahlhorst;12069;Potsdam-Mittelmark;12;BB +2080;14542;Schwielowsee;12069;Potsdam-Mittelmark;12;BB +2081;14542;Kloster Lehnin;12069;Potsdam-Mittelmark;12;BB +2082;14542;Werder (Havel);12069;Potsdam-Mittelmark;12;BB +2083;14547;Beelitz;12069;Potsdam-Mittelmark;12;BB +2084;14547;Stuecken;12069;Potsdam-Mittelmark;12;BB +2085;14548;Schwielowsee;12069;Potsdam-Mittelmark;12;BB +2086;14550;Krielow;12069;Potsdam-Mittelmark;12;BB +2087;14550;Derwitz;12069;Potsdam-Mittelmark;12;BB +2088;14550;Bochow;12069;Potsdam-Mittelmark;12;BB +2089;14550;Schmergow;12069;Potsdam-Mittelmark;12;BB +2090;14550;Deetz;12069;Potsdam-Mittelmark;12;BB +2091;14550;Gross Kreutz;12069;Potsdam-Mittelmark;12;BB +2092;14552;Fresdorf;12069;Potsdam-Mittelmark;12;BB +2093;14552;Michendorf;12069;Potsdam-Mittelmark;12;BB +2094;14552;Wildenbruch;12069;Potsdam-Mittelmark;12;BB +2095;14552;Saarmund;12069;Potsdam-Mittelmark;12;BB +2096;14552;Tremsdorf;12069;Potsdam-Mittelmark;12;BB +2097;14554;Seddiner See;12069;Potsdam-Mittelmark;12;BB +2098;14557;Langerwisch;12069;Potsdam-Mittelmark;12;BB +2099;14557;Wilhelmshorst;12069;Potsdam-Mittelmark;12;BB +2100;14558;Bergholz-Rehbruecke;12069;Potsdam-Mittelmark;12;BB +2101;14612;Falkensee;12063;Havelland;12;BB +2102;14621;Schoenwalde;12063;Havelland;12;BB +2103;14624;Dallgow-Doeberitz;12063;Havelland;12;BB +2104;14641;Gross Behnitz;12063;Havelland;12;BB +2105;14641;Paulinenaue;12063;Havelland;12;BB +2106;14641;Wustermark;12063;Havelland;12;BB +2107;14641;Tremmen;12063;Havelland;12;BB +2108;14641;Klein Behnitz;12063;Havelland;12;BB +2109;14641;Tietzow;12063;Havelland;12;BB +2110;14641;Lietzow;12063;Havelland;12;BB +2111;14641;Retzow;12063;Havelland;12;BB +2112;14641;Nauen;12063;Havelland;12;BB +2113;14641;Zeestow;12063;Havelland;12;BB +2114;14641;Pessin;12063;Havelland;12;BB +2115;14641;Pausin;12063;Havelland;12;BB +2116;14641;Braedikow;12063;Havelland;12;BB +2117;14641;Berge;12063;Havelland;12;BB +2118;14641;Bergerdamm;12063;Havelland;12;BB +2119;14641;Wansdorf;12063;Havelland;12;BB +2120;14641;Gruenefeld;12063;Havelland;12;BB +2121;14641;Bredow;12063;Havelland;12;BB +2122;14641;Paaren im Glien;12063;Havelland;12;BB +2123;14641;Ribbeck;12063;Havelland;12;BB +2124;14641;Muehlenberge;12063;Havelland;12;BB +2125;14641;Perwenitz;12063;Havelland;12;BB +2126;14641;Etzin;12063;Havelland;12;BB +2127;14641;Kienberg;12063;Havelland;12;BB +2128;14641;Wachow;12063;Havelland;12;BB +2129;14641;Boernicke;12063;Havelland;12;BB +2130;14641;Selbelang;12063;Havelland;12;BB +2131;14641;Markee;12063;Havelland;12;BB +2132;14641;Falkenrehde;12063;Havelland;12;BB +2133;14656;Brieselang;12063;Havelland;12;BB +2134;14662;Friesack;12063;Havelland;12;BB +2135;14662;Warsow;12063;Havelland;12;BB +2136;14662;Muehlenberge;12063;Havelland;12;BB +2137;14662;Vietznitz;12063;Havelland;12;BB +2138;14669;Ketzin;12063;Havelland;12;BB +2139;14669;Zachow;12063;Havelland;12;BB +2140;14712;Rathenow;12063;Havelland;12;BB +2141;14715;Maerkisch Luch;12063;Havelland;12;BB +2142;14715;Vieritz;12063;Havelland;12;BB +2143;14715;Jerchel;12063;Havelland;12;BB +2144;14715;Grosswudicke;12063;Havelland;12;BB +2145;14715;Nennhausen;12063;Havelland;12;BB +2146;14715;Kriele;12063;Havelland;12;BB +2147;14715;Liepe;12063;Havelland;12;BB +2148;14715;Graeningen;12063;Havelland;12;BB +2149;14715;Buetzer;12063;Havelland;12;BB +2150;14715;Bamme;12063;Havelland;12;BB +2151;14715;Havelaue;12063;Havelland;12;BB +2152;14715;Muetzlitz;12063;Havelland;12;BB +2153;14715;Stechow-Ferchesar;12063;Havelland;12;BB +2154;14715;Nitzahn;12063;Havelland;12;BB +2155;14715;Kotzen;12063;Havelland;12;BB +2156;14715;Zollchow;12063;Havelland;12;BB +2157;14715;Landin;12063;Havelland;12;BB +2158;14715;Milow;12063;Havelland;12;BB +2159;14715;Seeblick;12063;Havelland;12;BB +2160;14715;Moethlitz;12063;Havelland;12;BB +2161;14715;Schollene;15363;Stendal;15;ST +2162;14727;Premnitz;12063;Havelland;12;BB +2163;14727;Doeberitz;12063;Havelland;12;BB +2164;14728;Havelaue;12063;Havelland;12;BB +2165;14728;Gollenberg;12063;Havelland;12;BB +2166;14728;Klessen-Goerne;12063;Havelland;12;BB +2167;14728;Rhinow;12063;Havelland;12;BB +2168;14770;BB an der Havel;12051;BB an der Havel, Stadt;12;BB +2169;14772;BB an der Havel;12051;BB an der Havel, Stadt;12;BB +2170;14774;BB an der Havel;12051;BB an der Havel, Stadt;12;BB +2171;14776;BB an der Havel;12051;BB an der Havel, Stadt;12;BB +2172;14778;Jeserig;12069;Potsdam-Mittelmark;12;BB +2173;14778;Planebruch;12069;Potsdam-Mittelmark;12;BB +2174;14778;Wust;12069;Potsdam-Mittelmark;12;BB +2175;14778;Wollin;12069;Potsdam-Mittelmark;12;BB +2176;14778;Havelsee;12069;Potsdam-Mittelmark;12;BB +2177;14778;Roskow;12069;Potsdam-Mittelmark;12;BB +2178;14778;Wenzlow;12069;Potsdam-Mittelmark;12;BB +2179;14778;Schenkenberg;12069;Potsdam-Mittelmark;12;BB +2180;14778;Kloster Lehnin;12069;Potsdam-Mittelmark;12;BB +2181;14778;Goetz;12069;Potsdam-Mittelmark;12;BB +2182;14778;Paewesin;12069;Potsdam-Mittelmark;12;BB +2183;14778;Gollwitz;12069;Potsdam-Mittelmark;12;BB +2184;14778;Beetzseeheide;12069;Potsdam-Mittelmark;12;BB +2185;14778;Golzow;12069;Potsdam-Mittelmark;12;BB +2186;14778;Trechwitz;12069;Potsdam-Mittelmark;12;BB +2187;14778;Planetal;12069;Potsdam-Mittelmark;12;BB +2188;14778;Beetzsee;12069;Potsdam-Mittelmark;12;BB +2189;14789;Wusterwitz;12069;Potsdam-Mittelmark;12;BB +2190;14789;Bensdorf;12069;Potsdam-Mittelmark;12;BB +2191;14789;Rosenau;12069;Potsdam-Mittelmark;12;BB +2192;14793;Rottstock;12069;Potsdam-Mittelmark;12;BB +2193;14793;Ziesar;12069;Potsdam-Mittelmark;12;BB +2194;14793;Graeben;12069;Potsdam-Mittelmark;12;BB +2195;14793;Buckautal;12069;Potsdam-Mittelmark;12;BB +2196;14797;Kloster Lehnin;12069;Potsdam-Mittelmark;12;BB +2197;14798;Havelsee;12069;Potsdam-Mittelmark;12;BB +2198;14806;Hagelberg;12069;Potsdam-Mittelmark;12;BB +2199;14806;Belzig;12069;Potsdam-Mittelmark;12;BB +2200;14806;Schwanebeck;12069;Potsdam-Mittelmark;12;BB +2201;14806;Planetal;12069;Potsdam-Mittelmark;12;BB +2202;14822;Borkheide;12069;Potsdam-Mittelmark;12;BB +2203;14822;Planebruch;12069;Potsdam-Mittelmark;12;BB +2204;14822;Borkwalde;12069;Potsdam-Mittelmark;12;BB +2205;14822;Linthe;12069;Potsdam-Mittelmark;12;BB +2206;14822;Muehlenfliess;12069;Potsdam-Mittelmark;12;BB +2207;14822;Brueck;12069;Potsdam-Mittelmark;12;BB +2208;14823;Niemegk;12069;Potsdam-Mittelmark;12;BB +2209;14823;Rabenstein/Flaeming;12069;Potsdam-Mittelmark;12;BB +2210;14823;Muehlenfliess;12069;Potsdam-Mittelmark;12;BB +2211;14827;Wiesenburg;12069;Potsdam-Mittelmark;12;BB +2212;14828;Goerzke;12069;Potsdam-Mittelmark;12;BB +2213;14913;Jueterbog;12072;Teltow-Flaeming;12;BB +2214;14913;Nuthe-Urstromtal;12072;Teltow-Flaeming;12;BB +2215;14913;Niedergoersdorf;12072;Teltow-Flaeming;12;BB +2216;14913;Wahlsdorf;12072;Teltow-Flaeming;12;BB +2217;14913;Ihlow;12072;Teltow-Flaeming;12;BB +2218;14913;Niederer Flaeming;12072;Teltow-Flaeming;12;BB +2219;14913;Niebendorf-Heinsdorf;12072;Teltow-Flaeming;12;BB +2220;14913;Herbersdorf;12072;Teltow-Flaeming;12;BB +2221;14913;Hohenseefeld;12072;Teltow-Flaeming;12;BB +2222;14929;Treuenbrietzen;12069;Potsdam-Mittelmark;12;BB +2223;14943;Luehsdorf;12069;Potsdam-Mittelmark;12;BB +2224;14943;Luedersdorf;12072;Teltow-Flaeming;12;BB +2225;14943;Luckenwalde;12072;Teltow-Flaeming;12;BB +2226;14959;Schoenhagen;12072;Teltow-Flaeming;12;BB +2227;14959;Trebbin;12072;Teltow-Flaeming;12;BB +2228;14974;Ludwigsfelde;12072;Teltow-Flaeming;12;BB +2229;14974;Thyrow;12072;Teltow-Flaeming;12;BB +2230;14979;Grossbeeren;12072;Teltow-Flaeming;12;BB +2231;15230;Frankfurt (Oder);12053;Frankfurt (Oder), Stadt;12;BB +2232;15232;Frankfurt (Oder);12053;Frankfurt (Oder), Stadt;12;BB +2233;15234;Frankfurt (Oder);12053;Frankfurt (Oder), Stadt;12;BB +2234;15236;Jacobsdorf;12067;Oder-Spree;12;BB +2235;15236;Treplin;12064;Maerkisch-Oderland;12;BB +2236;15236;Frankfurt (Oder);12053;Frankfurt (Oder), Stadt;12;BB +2237;15295;Ziltendorf;12067;Oder-Spree;12;BB +2238;15295;Wiesenau;12067;Oder-Spree;12;BB +2239;15295;Gross Lindow;12067;Oder-Spree;12;BB +2240;15295;Brieskow-Finkenheerd;12067;Oder-Spree;12;BB +2241;15299;Grunow-Dammendorf;12067;Oder-Spree;12;BB +2242;15299;Muellrose;12067;Oder-Spree;12;BB +2243;15299;Mixdorf;12067;Oder-Spree;12;BB +2244;15306;Vierlinden;12064;Maerkisch-Oderland;12;BB +2245;15306;Gusow-Platkow;12064;Maerkisch-Oderland;12;BB +2246;15306;Falkenhagen;12064;Maerkisch-Oderland;12;BB +2247;15306;Lindendorf;12064;Maerkisch-Oderland;12;BB +2248;15306;Fichtenhoehe;12064;Maerkisch-Oderland;12;BB +2249;15306;Werbig;12064;Maerkisch-Oderland;12;BB +2250;15306;Lietzen;12064;Maerkisch-Oderland;12;BB +2251;15306;Seelow;12064;Maerkisch-Oderland;12;BB +2252;15320;Neutrebbin;12064;Maerkisch-Oderland;12;BB +2253;15320;Neuhardenberg;12064;Maerkisch-Oderland;12;BB +2254;15320;Sietzing;12064;Maerkisch-Oderland;12;BB +2255;15324;Ortwig;12064;Maerkisch-Oderland;12;BB +2256;15324;Gross Neuendorf;12064;Maerkisch-Oderland;12;BB +2257;15324;Neubarnim;12064;Maerkisch-Oderland;12;BB +2258;15324;Gieshof-Zelliner Loose;12064;Maerkisch-Oderland;12;BB +2259;15324;Kienitz;12064;Maerkisch-Oderland;12;BB +2260;15324;Kiehnwerder;12064;Maerkisch-Oderland;12;BB +2261;15324;Letschin;12064;Maerkisch-Oderland;12;BB +2262;15326;Lebus;12064;Maerkisch-Oderland;12;BB +2263;15326;Podelzig;12064;Maerkisch-Oderland;12;BB +2264;15326;Zeschdorf;12064;Maerkisch-Oderland;12;BB +2265;15326;Fichtenhoehe;12064;Maerkisch-Oderland;12;BB +2266;15328;Reitwein;12064;Maerkisch-Oderland;12;BB +2267;15328;Golzow;12064;Maerkisch-Oderland;12;BB +2268;15328;Alt Tucheband;12064;Maerkisch-Oderland;12;BB +2269;15328;Kuestriner Vorland;12064;Maerkisch-Oderland;12;BB +2270;15328;Zechin;12064;Maerkisch-Oderland;12;BB +2271;15328;Bleyen-Genschmar;12064;Maerkisch-Oderland;12;BB +2272;15344;Strausberg;12064;Maerkisch-Oderland;12;BB +2273;15345;Oberbarnim;12064;Maerkisch-Oderland;12;BB +2274;15345;Garzau-Garzin;12064;Maerkisch-Oderland;12;BB +2275;15345;Lichtenow;12064;Maerkisch-Oderland;12;BB +2276;15345;Rehfelde;12064;Maerkisch-Oderland;12;BB +2277;15345;Proetzel;12064;Maerkisch-Oderland;12;BB +2278;15345;Reichenow-Moeglin;12064;Maerkisch-Oderland;12;BB +2279;15345;Zinndorf;12064;Maerkisch-Oderland;12;BB +2280;15345;Petershagen-Eggersdorf;12064;Maerkisch-Oderland;12;BB +2281;15345;Altlandsberg;12064;Maerkisch-Oderland;12;BB +2282;15345;Werder;12064;Maerkisch-Oderland;12;BB +2283;15366;Dahlwitz-Hoppegarten;12064;Maerkisch-Oderland;12;BB +2284;15366;Neuenhagen bei BE;12064;Maerkisch-Oderland;12;BB +2285;15366;Hoenow;12064;Maerkisch-Oderland;12;BB +2286;15366;Muenchehofe;12064;Maerkisch-Oderland;12;BB +2287;15370;Fredersdorf-Vogelsdorf;12064;Maerkisch-Oderland;12;BB +2288;15370;Petershagen-Eggersdorf;12064;Maerkisch-Oderland;12;BB +2289;15374;Muencheberg;12064;Maerkisch-Oderland;12;BB +2290;15377;Oberbarnim;12064;Maerkisch-Oderland;12;BB +2291;15377;Ihlow;12064;Maerkisch-Oderland;12;BB +2292;15377;Maerkische Hoehe;12064;Maerkisch-Oderland;12;BB +2293;15377;Buckow;12064;Maerkisch-Oderland;12;BB +2294;15377;Waldsieversdorf;12064;Maerkisch-Oderland;12;BB +2295;15378;Hennickendorf;12064;Maerkisch-Oderland;12;BB +2296;15378;Herzfelde;12064;Maerkisch-Oderland;12;BB +2297;15517;Fuerstenwalde/Spree;12067;Oder-Spree;12;BB +2298;15518;Gruenheide (Mark);12067;Oder-Spree;12;BB +2299;15518;Rauen;12067;Oder-Spree;12;BB +2300;15518;Briesen (Mark);12067;Oder-Spree;12;BB +2301;15518;Steinhoefel;12067;Oder-Spree;12;BB +2302;15518;Madlitz-Wilmersdorf;12067;Oder-Spree;12;BB +2303;15518;Falkenberg;12067;Oder-Spree;12;BB +2304;15518;Berkenbrueck;12067;Oder-Spree;12;BB +2305;15518;Langewahl;12067;Oder-Spree;12;BB +2306;15526;Bad Saarow;12067;Oder-Spree;12;BB +2307;15526;Reichenwalde;12067;Oder-Spree;12;BB +2308;15526;Rietz-Neuendorf;12067;Oder-Spree;12;BB +2309;15528;Gruenheide (Mark);12067;Oder-Spree;12;BB +2310;15528;Spreenhagen;12067;Oder-Spree;12;BB +2311;15537;Gruenheide (Mark);12067;Oder-Spree;12;BB +2312;15537;Gosen;12067;Oder-Spree;12;BB +2313;15537;Erkner;12067;Oder-Spree;12;BB +2314;15537;Wernsdorf;12061;Dahme-Spreewald;12;BB +2315;15562;Ruedersdorf bei BE;12064;Maerkisch-Oderland;12;BB +2316;15566;Schoeneiche bei BE;12067;Oder-Spree;12;BB +2317;15569;Woltersdorf;12067;Oder-Spree;12;BB +2318;15711;Zeesen;12061;Dahme-Spreewald;12;BB +2319;15711;Koenigs Wusterhausen;12061;Dahme-Spreewald;12;BB +2320;15711;Schenkendorf;12061;Dahme-Spreewald;12;BB +2321;15732;Schulzendorf;12061;Dahme-Spreewald;12;BB +2322;15732;Eichwalde;12061;Dahme-Spreewald;12;BB +2323;15732;Waltersdorf;12061;Dahme-Spreewald;12;BB +2324;15738;Zeuthen;12061;Dahme-Spreewald;12;BB +2325;15741;Motzen;12061;Dahme-Spreewald;12;BB +2326;15741;Paetz;12061;Dahme-Spreewald;12;BB +2327;15741;Bestensee;12061;Dahme-Spreewald;12;BB +2328;15741;Graebendorf;12061;Dahme-Spreewald;12;BB +2329;15745;Wildau;12061;Dahme-Spreewald;12;BB +2330;15746;Gross Koeris;12061;Dahme-Spreewald;12;BB +2331;15748;Muenchehofe;12061;Dahme-Spreewald;12;BB +2332;15748;Maerkisch Buchholz;12061;Dahme-Spreewald;12;BB +2333;15749;Kiekebusch;12061;Dahme-Spreewald;12;BB +2334;15749;Mittenwalde;12061;Dahme-Spreewald;12;BB +2335;15749;Ragow;12061;Dahme-Spreewald;12;BB +2336;15749;Brusendorf;12061;Dahme-Spreewald;12;BB +2337;15749;Gallun;12061;Dahme-Spreewald;12;BB +2338;15751;Niederlehme;12061;Dahme-Spreewald;12;BB +2339;15752;Prieros;12061;Dahme-Spreewald;12;BB +2340;15752;Streganz;12061;Dahme-Spreewald;12;BB +2341;15752;Kolberg;12061;Dahme-Spreewald;12;BB +2342;15754;Blossin;12061;Dahme-Spreewald;12;BB +2343;15754;Senzig;12061;Dahme-Spreewald;12;BB +2344;15754;Dolgenbrodt;12061;Dahme-Spreewald;12;BB +2345;15754;Wolzig;12061;Dahme-Spreewald;12;BB +2346;15754;Bindow;12061;Dahme-Spreewald;12;BB +2347;15754;Gussow;12061;Dahme-Spreewald;12;BB +2348;15754;Dannenreich;12061;Dahme-Spreewald;12;BB +2349;15754;Friedersdorf;12061;Dahme-Spreewald;12;BB +2350;15755;Teupitz;12061;Dahme-Spreewald;12;BB +2351;15755;Schwerin;12061;Dahme-Spreewald;12;BB +2352;15755;Toepchin;12061;Dahme-Spreewald;12;BB +2353;15757;Loepten;12061;Dahme-Spreewald;12;BB +2354;15757;Oderin;12061;Dahme-Spreewald;12;BB +2355;15757;Briesen;12061;Dahme-Spreewald;12;BB +2356;15757;Halbe;12061;Dahme-Spreewald;12;BB +2357;15757;Freidorf;12061;Dahme-Spreewald;12;BB +2358;15758;Kablow;12061;Dahme-Spreewald;12;BB +2359;15758;Zernsdorf;12061;Dahme-Spreewald;12;BB +2360;15806;Kummersdorf-Alexanderdorf;12072;Teltow-Flaeming;12;BB +2361;15806;Kallinchen;12072;Teltow-Flaeming;12;BB +2362;15806;Mellensee;12072;Teltow-Flaeming;12;BB +2363;15806;Gross Machnow;12072;Teltow-Flaeming;12;BB +2364;15806;Zossen;12072;Teltow-Flaeming;12;BB +2365;15806;Schoeneiche;12072;Teltow-Flaeming;12;BB +2366;15806;Naechst Neuendorf;12072;Teltow-Flaeming;12;BB +2367;15806;Nunsdorf;12072;Teltow-Flaeming;12;BB +2368;15806;Rehagen;12072;Teltow-Flaeming;12;BB +2369;15806;Telz;12061;Dahme-Spreewald;12;BB +2370;15806;Gadsdorf;12072;Teltow-Flaeming;12;BB +2371;15806;Glienick;12072;Teltow-Flaeming;12;BB +2372;15806;Gross Schulzendorf;12072;Teltow-Flaeming;12;BB +2373;15806;Saalow;12072;Teltow-Flaeming;12;BB +2374;15827;Dahlewitz;12072;Teltow-Flaeming;12;BB +2375;15827;Blankenfelde;12072;Teltow-Flaeming;12;BB +2376;15831;Wassmannsdorf;12061;Dahme-Spreewald;12;BB +2377;15831;Diepensee;12061;Dahme-Spreewald;12;BB +2378;15831;Juehnsdorf;12072;Teltow-Flaeming;12;BB +2379;15831;Gross Kienitz;12072;Teltow-Flaeming;12;BB +2380;15831;Grossziethen;12061;Dahme-Spreewald;12;BB +2381;15831;Selchow;12061;Dahme-Spreewald;12;BB +2382;15831;Mahlow;12072;Teltow-Flaeming;12;BB +2383;15834;Rangsdorf;12072;Teltow-Flaeming;12;BB +2384;15837;Baruth/Mark;12072;Teltow-Flaeming;12;BB +2385;15838;Sperenberg;12072;Teltow-Flaeming;12;BB +2386;15838;Kummersdorf-Gut;12072;Teltow-Flaeming;12;BB +2387;15838;Klausdorf;12072;Teltow-Flaeming;12;BB +2388;15838;Wuensdorf;12072;Teltow-Flaeming;12;BB +2389;15848;Tauche;12067;Oder-Spree;12;BB +2390;15848;Friedland;12067;Oder-Spree;12;BB +2391;15848;Rietz-Neuendorf;12067;Oder-Spree;12;BB +2392;15848;Speichrow;12061;Dahme-Spreewald;12;BB +2393;15848;Ragow-Merz;12067;Oder-Spree;12;BB +2394;15848;Beeskow;12067;Oder-Spree;12;BB +2395;15848;Plattkow;12061;Dahme-Spreewald;12;BB +2396;15859;Kummersdorf;12067;Oder-Spree;12;BB +2397;15859;Storkow (Mark);12067;Oder-Spree;12;BB +2398;15864;Rietz-Neuendorf;12067;Oder-Spree;12;BB +2399;15864;Diensdorf-Radlow;12067;Oder-Spree;12;BB +2400;15864;Wendisch Rietz;12067;Oder-Spree;12;BB +2401;15868;Friedland;12067;Oder-Spree;12;BB +2402;15868;Leeskow;12061;Dahme-Spreewald;12;BB +2403;15868;Jamlitz;12061;Dahme-Spreewald;12;BB +2404;15868;Lieberose;12061;Dahme-Spreewald;12;BB +2405;15868;Ullersdorf;12061;Dahme-Spreewald;12;BB +2406;15868;Doberburg;12061;Dahme-Spreewald;12;BB +2407;15890;Eisenhuettenstadt;12067;Oder-Spree;12;BB +2408;15890;Schlaubetal;12067;Oder-Spree;12;BB +2409;15890;Siehdichum;12067;Oder-Spree;12;BB +2410;15890;Vogelsang;12067;Oder-Spree;12;BB +2411;15898;Neuzelle;12067;Oder-Spree;12;BB +2412;15898;Neissemuende;12067;Oder-Spree;12;BB +2413;15898;Lawitz;12067;Oder-Spree;12;BB +2414;15907;Luebben (Spreewald);12061;Dahme-Spreewald;12;BB +2415;15910;Wittmannsdorf-Bueckchen;12061;Dahme-Spreewald;12;BB +2416;15910;Pretschen;12061;Dahme-Spreewald;12;BB +2417;15910;Duerrenhofe;12061;Dahme-Spreewald;12;BB +2418;15910;Hohenbrueck-Neu Schadow;12061;Dahme-Spreewald;12;BB +2419;15910;Rietzneuendorf-Staakow;12061;Dahme-Spreewald;12;BB +2420;15910;Unterspreewald;12061;Dahme-Spreewald;12;BB +2421;15910;Schoenwald;12061;Dahme-Spreewald;12;BB +2422;15910;Schuhlen-Wiese;12061;Dahme-Spreewald;12;BB +2423;15910;Alt-Schadow;12061;Dahme-Spreewald;12;BB +2424;15910;Krausnick-Gross Wasserburg;12061;Dahme-Spreewald;12;BB +2425;15910;Schlepzig;12061;Dahme-Spreewald;12;BB +2426;15910;Kuschkow;12061;Dahme-Spreewald;12;BB +2427;15910;Groeditsch;12061;Dahme-Spreewald;12;BB +2428;15913;Dollgen;12061;Dahme-Spreewald;12;BB +2429;15913;Sacrow-Waldow;12061;Dahme-Spreewald;12;BB +2430;15913;Alt Zauche;12061;Dahme-Spreewald;12;BB +2431;15913;Mochow;12061;Dahme-Spreewald;12;BB +2432;15913;Krugau;12061;Dahme-Spreewald;12;BB +2433;15913;Glietz;12061;Dahme-Spreewald;12;BB +2434;15913;Gross Leuthen;12061;Dahme-Spreewald;12;BB +2435;15913;Byhlen;12061;Dahme-Spreewald;12;BB +2436;15913;Caminchen;12061;Dahme-Spreewald;12;BB +2437;15913;Ressen-Zaue;12061;Dahme-Spreewald;12;BB +2438;15913;Lamsfeld-Gross Liebitz;12061;Dahme-Spreewald;12;BB +2439;15913;Laasow;12061;Dahme-Spreewald;12;BB +2440;15913;Leibchel;12061;Dahme-Spreewald;12;BB +2441;15913;Straupitz;12061;Dahme-Spreewald;12;BB +2442;15913;Wusswerk;12061;Dahme-Spreewald;12;BB +2443;15913;Neu Zauche;12061;Dahme-Spreewald;12;BB +2444;15913;Gross Leine;12061;Dahme-Spreewald;12;BB +2445;15913;Byhleguhre;12061;Dahme-Spreewald;12;BB +2446;15913;Jessern;12061;Dahme-Spreewald;12;BB +2447;15913;Klein Leine;12061;Dahme-Spreewald;12;BB +2448;15913;Goyatz;12061;Dahme-Spreewald;12;BB +2449;15913;Butzen;12061;Dahme-Spreewald;12;BB +2450;15913;Briesensee;12061;Dahme-Spreewald;12;BB +2451;15913;Biebersdorf;12061;Dahme-Spreewald;12;BB +2452;15926;Bersteland;12061;Dahme-Spreewald;12;BB +2453;15926;Heideblick;12061;Dahme-Spreewald;12;BB +2454;15926;Luckau;12061;Dahme-Spreewald;12;BB +2455;15926;Duben;12061;Dahme-Spreewald;12;BB +2456;15926;Cahnsdorf;12061;Dahme-Spreewald;12;BB +2457;15926;Schlabendorf;12061;Dahme-Spreewald;12;BB +2458;15926;Goerlsdorf;12061;Dahme-Spreewald;12;BB +2459;15926;Walddrehna;12061;Dahme-Spreewald;12;BB +2460;15936;Dahmetal;12072;Teltow-Flaeming;12;BB +2461;15936;Dahme/Mark;12072;Teltow-Flaeming;12;BB +2462;15936;Steinreich;12061;Dahme-Spreewald;12;BB +2463;15938;Kasel-Golzig;12061;Dahme-Spreewald;12;BB +2464;15938;Steinreich;12061;Dahme-Spreewald;12;BB +2465;15938;Drahnsdorf;12061;Dahme-Spreewald;12;BB +2466;15938;Golssen;12061;Dahme-Spreewald;12;BB +2467;16225;Eberswalde;12060;Barnim;12;BB +2468;16230;Sydower Fliess;12060;Barnim;12;BB +2469;16230;Britz;12060;Barnim;12;BB +2470;16230;Breydin;12060;Barnim;12;BB +2471;16230;Melchow;12060;Barnim;12;BB +2472;16230;Chorin;12060;Barnim;12;BB +2473;16244;Finowfurt;12060;Barnim;12;BB +2474;16244;Altenhof;12060;Barnim;12;BB +2475;16247;Joachimsthal;12060;Barnim;12;BB +2476;16247;Friedrichswalde;12060;Barnim;12;BB +2477;16247;Althuettendorf;12060;Barnim;12;BB +2478;16247;Neugrimnitz;12060;Barnim;12;BB +2479;16247;Ziethen;12060;Barnim;12;BB +2480;16248;Lunow-Stolzenhagen;12060;Barnim;12;BB +2481;16248;Parsteinsee;12060;Barnim;12;BB +2482;16248;Hohenfinow;12060;Barnim;12;BB +2483;16248;Oderberg;12060;Barnim;12;BB +2484;16248;Boelkendorf;12073;Uckermark;12;BB +2485;16248;Liepe;12060;Barnim;12;BB +2486;16248;Hohensaaten;12060;Barnim;12;BB +2487;16248;Niederfinow;12060;Barnim;12;BB +2488;16259;Heckelberg-Brunow;12064;Maerkisch-Oderland;12;BB +2489;16259;Hoehenland;12064;Maerkisch-Oderland;12;BB +2490;16259;Schiffmuehle;12064;Maerkisch-Oderland;12;BB +2491;16259;Oderaue;12064;Maerkisch-Oderland;12;BB +2492;16259;Beiersdorf-Freudenberg;12064;Maerkisch-Oderland;12;BB +2493;16259;Neulewin;12064;Maerkisch-Oderland;12;BB +2494;16259;Falkenberg;12064;Maerkisch-Oderland;12;BB +2495;16259;Tiefensee;12060;Barnim;12;BB +2496;16259;Bad Freienwalde;12064;Maerkisch-Oderland;12;BB +2497;16259;Neuenhagen;12064;Maerkisch-Oderland;12;BB +2498;16259;Hohenwutzen;12064;Maerkisch-Oderland;12;BB +2499;16259;Altglietzen;12064;Maerkisch-Oderland;12;BB +2500;16259;Bralitz;12064;Maerkisch-Oderland;12;BB +2501;16269;Wriezener Hoehe;12064;Maerkisch-Oderland;12;BB +2502;16269;Bliesdorf;12064;Maerkisch-Oderland;12;BB +2503;16269;Wriezen;12064;Maerkisch-Oderland;12;BB +2504;16278;Schoeneberg;12073;Uckermark;12;BB +2505;16278;Stolpe/Oder;12073;Uckermark;12;BB +2506;16278;Neukuenkendorf;12073;Uckermark;12;BB +2507;16278;Frauenhagen;12073;Uckermark;12;BB +2508;16278;Muerow;12073;Uckermark;12;BB +2509;16278;Bruchhagen;12073;Uckermark;12;BB +2510;16278;Wilmersdorf;12073;Uckermark;12;BB +2511;16278;Crussow;12073;Uckermark;12;BB +2512;16278;Wolletz;12073;Uckermark;12;BB +2513;16278;Welsow;12073;Uckermark;12;BB +2514;16278;Mark Landin;12073;Uckermark;12;BB +2515;16278;Biesenbrow;12073;Uckermark;12;BB +2516;16278;Kerkow;12073;Uckermark;12;BB +2517;16278;Angermuende;12073;Uckermark;12;BB +2518;16278;Herzsprung;12073;Uckermark;12;BB +2519;16278;Goerlsdorf;12073;Uckermark;12;BB +2520;16278;Guenterberg;12073;Uckermark;12;BB +2521;16278;Greiffenberg;12073;Uckermark;12;BB +2522;16278;Gellmersdorf;12073;Uckermark;12;BB +2523;16278;Steinhoefel;12073;Uckermark;12;BB +2524;16278;Schmargendorf;12073;Uckermark;12;BB +2525;16278;Schmiedeberg;12073;Uckermark;12;BB +2526;16278;Pinnow;12073;Uckermark;12;BB +2527;16303;Schwedt/Oder;12073;Uckermark;12;BB +2528;16306;Gross Pinnow;12073;Uckermark;12;BB +2529;16306;Casekow;12073;Uckermark;12;BB +2530;16306;Hohenselchow;12073;Uckermark;12;BB +2531;16306;Wartin;12073;Uckermark;12;BB +2532;16306;Schoenow;12073;Uckermark;12;BB +2533;16306;Vierraden;12073;Uckermark;12;BB +2534;16306;Luckow-Petershagen;12073;Uckermark;12;BB +2535;16306;Stendell;12073;Uckermark;12;BB +2536;16306;Biesendahlshof;12073;Uckermark;12;BB +2537;16306;Zichow;12073;Uckermark;12;BB +2538;16306;Berkholz-Meyenburg;12073;Uckermark;12;BB +2539;16306;Woltersdorf;12073;Uckermark;12;BB +2540;16306;Friedrichsthal;12073;Uckermark;12;BB +2541;16306;Blumberg;12073;Uckermark;12;BB +2542;16306;Welsebruch;12073;Uckermark;12;BB +2543;16306;Passow;12073;Uckermark;12;BB +2544;16307;Geesow;12073;Uckermark;12;BB +2545;16307;Neurochlitz;12073;Uckermark;12;BB +2546;16307;Mescherin;12073;Uckermark;12;BB +2547;16307;Gartz (Oder);12073;Uckermark;12;BB +2548;16307;Schoenfeld;12073;Uckermark;12;BB +2549;16307;Radekow;12073;Uckermark;12;BB +2550;16307;Hohenreinkendorf;12073;Uckermark;12;BB +2551;16307;Rosow;12073;Uckermark;12;BB +2552;16307;Tantow;12073;Uckermark;12;BB +2553;16321;Bernau;12060;Barnim;12;BB +2554;16321;Danewitz;12060;Barnim;12;BB +2555;16321;Lindenberg;12060;Barnim;12;BB +2556;16321;Ruednitz;12060;Barnim;12;BB +2557;16321;Schoenow;12060;Barnim;12;BB +2558;16321;Lobetal;12060;Barnim;12;BB +2559;16321;Boernicke;12060;Barnim;12;BB +2560;16341;Schwanebeck;12060;Barnim;12;BB +2561;16341;Zepernick;12060;Barnim;12;BB +2562;16348;Marienwerder;12060;Barnim;12;BB +2563;16348;Wandlitz;12060;Barnim;12;BB +2564;16348;Klosterfelde;12060;Barnim;12;BB +2565;16348;Zerpenschleuse;12060;Barnim;12;BB +2566;16348;Stolzenhagen;12060;Barnim;12;BB +2567;16348;Gross Schoenebeck (Schorfheide);12060;Barnim;12;BB +2568;16348;Prenden;12060;Barnim;12;BB +2569;16348;Ruhlsdorf;12060;Barnim;12;BB +2570;16352;Schoenerlinde;12060;Barnim;12;BB +2571;16352;Basdorf;12060;Barnim;12;BB +2572;16352;Schoenwalde;12060;Barnim;12;BB +2573;16356;Werneuchen;12060;Barnim;12;BB +2574;16356;Seefeld;12060;Barnim;12;BB +2575;16356;Blumberg;12060;Barnim;12;BB +2576;16356;Krummensee;12060;Barnim;12;BB +2577;16356;Eiche;12060;Barnim;12;BB +2578;16356;Wilmersdorf;12060;Barnim;12;BB +2579;16356;Ahrensfelde;12060;Barnim;12;BB +2580;16356;Schoenfeld;12060;Barnim;12;BB +2581;16356;Hirschfelde;12060;Barnim;12;BB +2582;16356;Mehrow;12060;Barnim;12;BB +2583;16359;Biesenthal;12060;Barnim;12;BB +2584;16359;Lanke;12060;Barnim;12;BB +2585;16515;Nassenheide;12065;Oberhavel;12;BB +2586;16515;Wensickendorf;12065;Oberhavel;12;BB +2587;16515;Freienhagen;12065;Oberhavel;12;BB +2588;16515;Oranienburg;12065;Oberhavel;12;BB +2589;16515;Friedrichsthal;12065;Oberhavel;12;BB +2590;16515;Schmachtenhagen;12065;Oberhavel;12;BB +2591;16515;Neuholland;12065;Oberhavel;12;BB +2592;16515;Zehlendorf;12065;Oberhavel;12;BB +2593;16515;Malz;12065;Oberhavel;12;BB +2594;16515;Zuehlsdorf;12065;Oberhavel;12;BB +2595;16540;Hohen Neuendorf;12065;Oberhavel;12;BB +2596;16540;Stolpe;12065;Oberhavel;12;BB +2597;16547;Birkenwerder;12065;Oberhavel;12;BB +2598;16548;Glienicke/Nordbahn;12065;Oberhavel;12;BB +2599;16552;Schildow;12065;Oberhavel;12;BB +2600;16559;Liebenthal;12065;Oberhavel;12;BB +2601;16559;Kreuzbruch;12065;Oberhavel;12;BB +2602;16559;Liebenwalde;12065;Oberhavel;12;BB +2603;16559;Hammer;12065;Oberhavel;12;BB +2604;16565;Lehnitz;12065;Oberhavel;12;BB +2605;16567;Muehlenbeck;12065;Oberhavel;12;BB +2606;16567;Schoenfliess;12065;Oberhavel;12;BB +2607;16727;Velten;12065;Oberhavel;12;BB +2608;16727;Oberkraemer;12065;Oberhavel;12;BB +2609;16761;Hennigsdorf;12065;Oberhavel;12;BB +2610;16766;Kremmen;12065;Oberhavel;12;BB +2611;16766;Oberkraemer;12065;Oberhavel;12;BB +2612;16767;Germendorf;12065;Oberhavel;12;BB +2613;16767;Leegebruch;12065;Oberhavel;12;BB +2614;16775;Schulzendorf;12065;Oberhavel;12;BB +2615;16775;Blumenow;12065;Oberhavel;12;BB +2616;16775;Burgwall;12065;Oberhavel;12;BB +2617;16775;Kappe;12065;Oberhavel;12;BB +2618;16775;Badingen;12065;Oberhavel;12;BB +2619;16775;Loewenberger Land;12065;Oberhavel;12;BB +2620;16775;Zabelsdorf;12065;Oberhavel;12;BB +2621;16775;Marienthal;12065;Oberhavel;12;BB +2622;16775;Schoenermark;12065;Oberhavel;12;BB +2623;16775;Grosswoltersdorf;12065;Oberhavel;12;BB +2624;16775;Bredereiche;12065;Oberhavel;12;BB +2625;16775;Krewelin;12065;Oberhavel;12;BB +2626;16775;Tornow;12065;Oberhavel;12;BB +2627;16775;Barsdorf;12065;Oberhavel;12;BB +2628;16775;Mildenberg;12065;Oberhavel;12;BB +2629;16775;Klein-Mutz;12065;Oberhavel;12;BB +2630;16775;Roennebeck;12065;Oberhavel;12;BB +2631;16775;Gransee;12065;Oberhavel;12;BB +2632;16775;Stechlin;12065;Oberhavel;12;BB +2633;16775;Sonnenberg;12065;Oberhavel;12;BB +2634;16792;Kurtschlag;12065;Oberhavel;12;BB +2635;16792;Zehdenick;12065;Oberhavel;12;BB +2636;16792;Wesendorf;12065;Oberhavel;12;BB +2637;16798;Steinfoerde;12065;Oberhavel;12;BB +2638;16798;Altthymen;12065;Oberhavel;12;BB +2639;16798;Himmelpfort;12065;Oberhavel;12;BB +2640;16798;Fuerstenberg/Havel;12065;Oberhavel;12;BB +2641;16798;Zootzen;12065;Oberhavel;12;BB +2642;16816;Neuruppin;12068;Ostprignitz-Ruppin;12;BB +2643;16818;Walsleben;12068;Ostprignitz-Ruppin;12;BB +2644;16818;Dabergotz;12068;Ostprignitz-Ruppin;12;BB +2645;16818;Storbeck-Frankendorf;12068;Ostprignitz-Ruppin;12;BB +2646;16818;Temnitzquell;12068;Ostprignitz-Ruppin;12;BB +2647;16818;Maerkisch Linden;12068;Ostprignitz-Ruppin;12;BB +2648;16831;Rheinsberg;12068;Ostprignitz-Ruppin;12;BB +2649;16833;Fehrbellin;12068;Ostprignitz-Ruppin;12;BB +2650;16835;Ruethnick;12068;Ostprignitz-Ruppin;12;BB +2651;16835;Lindow (Mark);12068;Ostprignitz-Ruppin;12;BB +2652;16835;Herzberg;12068;Ostprignitz-Ruppin;12;BB +2653;16845;Grossderschau;12063;Havelland;12;BB +2654;16845;Temnitztal;12068;Ostprignitz-Ruppin;12;BB +2655;16845;Neustadt (Dosse);12068;Ostprignitz-Ruppin;12;BB +2656;16845;Maerkisch Linden;12068;Ostprignitz-Ruppin;12;BB +2657;16845;Breddin;12068;Ostprignitz-Ruppin;12;BB +2658;16845;Dreetz;12068;Ostprignitz-Ruppin;12;BB +2659;16845;Sieversdorf-Hohenofen;12068;Ostprignitz-Ruppin;12;BB +2660;16845;Stuedenitz-Schoenermark;12068;Ostprignitz-Ruppin;12;BB +2661;16845;Zernitz-Lohm;12068;Ostprignitz-Ruppin;12;BB +2662;16866;Gross Welle;12070;Prignitz;12;BB +2663;16866;Gumtow;12070;Prignitz;12;BB +2664;16866;Granzow;12070;Prignitz;12;BB +2665;16866;Kolrep;12070;Prignitz;12;BB +2666;16866;Demerthin;12070;Prignitz;12;BB +2667;16866;Goerike;12070;Prignitz;12;BB +2668;16866;Doellen;12070;Prignitz;12;BB +2669;16866;Dannenwalde;12070;Prignitz;12;BB +2670;16866;Schoenhagen;12070;Prignitz;12;BB +2671;16866;Wutike;12070;Prignitz;12;BB +2672;16866;Kunow;12070;Prignitz;12;BB +2673;16866;Vehlin;12070;Prignitz;12;BB +2674;16866;Barenthin;12070;Prignitz;12;BB +2675;16866;Vehlow;12070;Prignitz;12;BB +2676;16866;Schrepkow;12070;Prignitz;12;BB +2677;16866;Kyritz;12068;Ostprignitz-Ruppin;12;BB +2678;16868;Wusterhausen (Dosse);12068;Ostprignitz-Ruppin;12;BB +2679;16909;Wittstock/Dosse;12068;Ostprignitz-Ruppin;12;BB +2680;16909;Heiligengrabe;12068;Ostprignitz-Ruppin;12;BB +2681;16928;Tuechen;12070;Prignitz;12;BB +2682;16928;Gross Pankow;12070;Prignitz;12;BB +2683;16928;Gross Woltersdorf;12070;Prignitz;12;BB +2684;16928;Kuhbier;12070;Prignitz;12;BB +2685;16928;Falkenhagen;12070;Prignitz;12;BB +2686;16928;Buchholz;12070;Prignitz;12;BB +2687;16928;Sadenbeck;12070;Prignitz;12;BB +2688;16928;Kehrberg;12070;Prignitz;12;BB +2689;16928;Steffenshagen;12070;Prignitz;12;BB +2690;16928;Wilmersdorf;12070;Prignitz;12;BB +2691;16928;Klein Woltersdorf;12070;Prignitz;12;BB +2692;16928;Beveringen;12070;Prignitz;12;BB +2693;16928;Kuhsdorf;12070;Prignitz;12;BB +2694;16928;Schoenebeck;12070;Prignitz;12;BB +2695;16928;Hoppenrade;12070;Prignitz;12;BB +2696;16928;Helle;12070;Prignitz;12;BB +2697;16928;Mesendorf;12070;Prignitz;12;BB +2698;16928;Boddin-Langnow;12070;Prignitz;12;BB +2699;16928;Pritzwalk;12070;Prignitz;12;BB +2700;16928;Lindenberg;12070;Prignitz;12;BB +2701;16928;Kemnitz;12070;Prignitz;12;BB +2702;16928;Vettin;12070;Prignitz;12;BB +2703;16928;Alt Kruessow;12070;Prignitz;12;BB +2704;16928;Gerdshagen;12070;Prignitz;12;BB +2705;16945;Meyenburg;12070;Prignitz;12;BB +2706;16945;Marienfliess;12070;Prignitz;12;BB +2707;16945;Kuemmernitztal;12070;Prignitz;12;BB +2708;16945;Halenbeck-Rohlsdorf;12070;Prignitz;12;BB +2709;16949;Putlitz;12070;Prignitz;12;BB +2710;16949;Triglitz;12070;Prignitz;12;BB +2711;17033;NeuBB;13002;NeuBB;13;MV +2712;17034;NeuBB;13002;NeuBB;13;MV +2713;17036;NeuBB;13002;NeuBB;13;MV +2714;17039;Neuenkirchen;13055;Mecklenburg-Strelitz;13;MV +2715;17039;Neverin;13055;Mecklenburg-Strelitz;13;MV +2716;17039;Zirzow;13055;Mecklenburg-Strelitz;13;MV +2717;17039;Neddemin;13055;Mecklenburg-Strelitz;13;MV +2718;17039;Warlin;13055;Mecklenburg-Strelitz;13;MV +2719;17039;Sponholz;13055;Mecklenburg-Strelitz;13;MV +2720;17039;Staven;13055;Mecklenburg-Strelitz;13;MV +2721;17039;Wulkenzin;13055;Mecklenburg-Strelitz;13;MV +2722;17039;Trollenhagen;13055;Mecklenburg-Strelitz;13;MV +2723;17039;Woggersin;13055;Mecklenburg-Strelitz;13;MV +2724;17039;Brunn;13055;Mecklenburg-Strelitz;13;MV +2725;17039;Blankenhof;13055;Mecklenburg-Strelitz;13;MV +2726;17039;Beseritz;13055;Mecklenburg-Strelitz;13;MV +2727;17087;Altentreptow;13052;Demmin;13;MV +2728;17089;Grapzow;13052;Demmin;13;MV +2729;17089;Siedenbollentin;13052;Demmin;13;MV +2730;17089;Gnevkow;13052;Demmin;13;MV +2731;17089;Burow;13052;Demmin;13;MV +2732;17089;Bartow;13052;Demmin;13;MV +2733;17089;Breest;13052;Demmin;13;MV +2734;17089;Grischow;13052;Demmin;13;MV +2735;17089;Golchen;13052;Demmin;13;MV +2736;17089;Werder;13052;Demmin;13;MV +2737;17089;Gueltz;13052;Demmin;13;MV +2738;17091;Gross Teetzleben;13052;Demmin;13;MV +2739;17091;Knorrendorf;13052;Demmin;13;MV +2740;17091;Wolde;13052;Demmin;13;MV +2741;17091;Rosenow;13052;Demmin;13;MV +2742;17091;Tuetzpatz;13052;Demmin;13;MV +2743;17091;Kriesow;13052;Demmin;13;MV +2744;17091;Altenhagen;13052;Demmin;13;MV +2745;17091;Wildberg;13052;Demmin;13;MV +2746;17091;Pripsleben;13052;Demmin;13;MV +2747;17091;Breesen;13052;Demmin;13;MV +2748;17091;Roeckwitz;13052;Demmin;13;MV +2749;17091;Moelln;13052;Demmin;13;MV +2750;17094;Cammin;13055;Mecklenburg-Strelitz;13;MV +2751;17094;Burg Stargard;13055;Mecklenburg-Strelitz;13;MV +2752;17094;Coelpin;13055;Mecklenburg-Strelitz;13;MV +2753;17094;Lindetal;13055;Mecklenburg-Strelitz;13;MV +2754;17094;Gross Nemerow;13055;Mecklenburg-Strelitz;13;MV +2755;17094;Holldorf;13055;Mecklenburg-Strelitz;13;MV +2756;17094;Pragsdorf;13055;Mecklenburg-Strelitz;13;MV +2757;17094;Teschendorf;13055;Mecklenburg-Strelitz;13;MV +2758;17098;Friedland;13055;Mecklenburg-Strelitz;13;MV +2759;17099;Brohm;13055;Mecklenburg-Strelitz;13;MV +2760;17099;Eichhorst;13055;Mecklenburg-Strelitz;13;MV +2761;17099;Schwanbeck;13055;Mecklenburg-Strelitz;13;MV +2762;17099;Glienke;13055;Mecklenburg-Strelitz;13;MV +2763;17099;Datzetal;13055;Mecklenburg-Strelitz;13;MV +2764;17099;Genzkow;13055;Mecklenburg-Strelitz;13;MV +2765;17109;Demmin;13052;Demmin;13;MV +2766;17111;Utzedel;13052;Demmin;13;MV +2767;17111;Beestland;13052;Demmin;13;MV +2768;17111;Sanzkow;13052;Demmin;13;MV +2769;17111;Wotenick;13052;Demmin;13;MV +2770;17111;Kletzin;13052;Demmin;13;MV +2771;17111;Meesiger;13052;Demmin;13;MV +2772;17111;Hohenbollentin;13052;Demmin;13;MV +2773;17111;Warrenzin;13052;Demmin;13;MV +2774;17111;Quitzerow;13052;Demmin;13;MV +2775;17111;Teusin;13052;Demmin;13;MV +2776;17111;Kentzlin;13052;Demmin;13;MV +2777;17111;Sommersdorf;13052;Demmin;13;MV +2778;17111;Borrentin;13052;Demmin;13;MV +2779;17111;Beggerow;13052;Demmin;13;MV +2780;17111;Lindenberg;13052;Demmin;13;MV +2781;17111;Hohenmocker;13052;Demmin;13;MV +2782;17111;Sarow;13052;Demmin;13;MV +2783;17111;Schoenfeld;13052;Demmin;13;MV +2784;17111;Upost;13052;Demmin;13;MV +2785;17111;Hohenbruenzow;13052;Demmin;13;MV +2786;17111;Nossendorf;13052;Demmin;13;MV +2787;17111;Siedenbruenzow;13052;Demmin;13;MV +2788;17121;Sassen;13052;Demmin;13;MV +2789;17121;Loitz;13052;Demmin;13;MV +2790;17121;Trantow;13052;Demmin;13;MV +2791;17121;Goermin;13052;Demmin;13;MV +2792;17121;Wuestenfelde;13052;Demmin;13;MV +2793;17121;Duevier;13052;Demmin;13;MV +2794;17126;Jarmen;13052;Demmin;13;MV +2795;17129;Ploetz;13052;Demmin;13;MV +2796;17129;Kruckow;13052;Demmin;13;MV +2797;17129;Alt Tellin;13052;Demmin;13;MV +2798;17129;Schmarsow;13052;Demmin;13;MV +2799;17129;Daberkow;13052;Demmin;13;MV +2800;17129;Tutow;13052;Demmin;13;MV +2801;17129;Bentzin;13052;Demmin;13;MV +2802;17129;Voelschow;13052;Demmin;13;MV +2803;17139;Duckow;13052;Demmin;13;MV +2804;17139;Faulenrost;13052;Demmin;13;MV +2805;17139;Basedow;13052;Demmin;13;MV +2806;17139;Remplin;13052;Demmin;13;MV +2807;17139;Gielow;13052;Demmin;13;MV +2808;17139;Kummerow;13052;Demmin;13;MV +2809;17139;Malchin;13052;Demmin;13;MV +2810;17139;Schwinkendorf;13056;Mueritz;13;MV +2811;17153;Grammentin;13052;Demmin;13;MV +2812;17153;Reuterstadt Stavenhagen;13052;Demmin;13;MV +2813;17153;Briggow;13052;Demmin;13;MV +2814;17153;Bredenfelde;13052;Demmin;13;MV +2815;17153;Guelzow;13052;Demmin;13;MV +2816;17153;Zettemin;13052;Demmin;13;MV +2817;17153;Kittendorf;13052;Demmin;13;MV +2818;17153;Ritzerow;13052;Demmin;13;MV +2819;17153;Ivenack;13052;Demmin;13;MV +2820;17153;Juergenstorf;13052;Demmin;13;MV +2821;17154;Neukalen;13052;Demmin;13;MV +2822;17159;Wagun;13052;Demmin;13;MV +2823;17159;Zarnekow;13052;Demmin;13;MV +2824;17159;Brudersdorf;13052;Demmin;13;MV +2825;17159;Stubbendorf;13052;Demmin;13;MV +2826;17159;Dargun;13052;Demmin;13;MV +2827;17166;Teterow;13053;Guestrow;13;MV +2828;17166;Dalkendorf;13053;Guestrow;13;MV +2829;17166;Gross Wokern;13053;Guestrow;13;MV +2830;17166;Buelow;13053;Guestrow;13;MV +2831;17166;Dahmen;13053;Guestrow;13;MV +2832;17166;Bristow;13053;Guestrow;13;MV +2833;17166;Hohen Demzin;13053;Guestrow;13;MV +2834;17166;Gross Roge;13053;Guestrow;13;MV +2835;17166;Alt Suehrkow;13053;Guestrow;13;MV +2836;17168;Thuerkow;13053;Guestrow;13;MV +2837;17168;Neu Heinde;13053;Guestrow;13;MV +2838;17168;Poggelow;13053;Guestrow;13;MV +2839;17168;Lelkendorf;13053;Guestrow;13;MV +2840;17168;Sukow-Marienhof;13053;Guestrow;13;MV +2841;17168;Matgendorf;13053;Guestrow;13;MV +2842;17168;Warnkenhagen;13053;Guestrow;13;MV +2843;17168;Remlin;13053;Guestrow;13;MV +2844;17168;Levitzow;13053;Guestrow;13;MV +2845;17168;Joerdenstorf;13053;Guestrow;13;MV +2846;17168;Gross Wuestenfelde;13053;Guestrow;13;MV +2847;17168;Prebberede;13053;Guestrow;13;MV +2848;17179;Luehburg;13053;Guestrow;13;MV +2849;17179;Boddin;13053;Guestrow;13;MV +2850;17179;Walkendorf;13053;Guestrow;13;MV +2851;17179;Wasdow;13053;Guestrow;13;MV +2852;17179;Altkalen;13053;Guestrow;13;MV +2853;17179;Behren-Luebchin;13053;Guestrow;13;MV +2854;17179;Gnoien;13053;Guestrow;13;MV +2855;17179;Finkenthal;13053;Guestrow;13;MV +2856;17192;Alt Schoenau;13056;Mueritz;13;MV +2857;17192;Torgelow am See;13056;Mueritz;13;MV +2858;17192;Gross Dratow;13056;Mueritz;13;MV +2859;17192;Waren (Mueritz);13056;Mueritz;13;MV +2860;17192;Schloen;13056;Mueritz;13;MV +2861;17192;Klink;13056;Mueritz;13;MV +2862;17192;Gross Plasten;13056;Mueritz;13;MV +2863;17192;Gross Gievitz;13056;Mueritz;13;MV +2864;17192;Kargow;13056;Mueritz;13;MV +2865;17192;Varchentin;13056;Mueritz;13;MV +2866;17192;Lansen;13056;Mueritz;13;MV +2867;17194;Hinrichshagen;13056;Mueritz;13;MV +2868;17194;Lupendorf;13056;Mueritz;13;MV +2869;17194;Neu Gaarz;13056;Mueritz;13;MV +2870;17194;Vollrathsruhe;13056;Mueritz;13;MV +2871;17194;Jabel;13056;Mueritz;13;MV +2872;17194;Grabowhoefe;13056;Mueritz;13;MV +2873;17194;Moltzow;13056;Mueritz;13;MV +2874;17194;Vielist;13056;Mueritz;13;MV +2875;17194;Hohen Wangelin;13056;Mueritz;13;MV +2876;17194;Klocksin;13056;Mueritz;13;MV +2877;17207;Bollewick;13056;Mueritz;13;MV +2878;17207;Roebel/Mueritz;13056;Mueritz;13;MV +2879;17207;Kambs;13056;Mueritz;13;MV +2880;17207;Ludorf;13056;Mueritz;13;MV +2881;17207;Gotthun;13056;Mueritz;13;MV +2882;17207;Gross Kelle;13056;Mueritz;13;MV +2883;17209;Vipperow;13056;Mueritz;13;MV +2884;17209;Rogeez;13056;Mueritz;13;MV +2885;17209;Sietow;13056;Mueritz;13;MV +2886;17209;Melz;13056;Mueritz;13;MV +2887;17209;Zislow;13056;Mueritz;13;MV +2888;17209;Priborn;13056;Mueritz;13;MV +2889;17209;Buetow;13056;Mueritz;13;MV +2890;17209;Leizen;13056;Mueritz;13;MV +2891;17209;Walow;13056;Mueritz;13;MV +2892;17209;Grabow-Below;13056;Mueritz;13;MV +2893;17209;Fincken;13056;Mueritz;13;MV +2894;17209;Satow;13056;Mueritz;13;MV +2895;17209;Massow;13056;Mueritz;13;MV +2896;17209;Jaebetz;13056;Mueritz;13;MV +2897;17209;Stuer;13056;Mueritz;13;MV +2898;17209;Zepkow;13056;Mueritz;13;MV +2899;17209;Minzow;13056;Mueritz;13;MV +2900;17209;Kieve;13056;Mueritz;13;MV +2901;17209;Altenhof;13056;Mueritz;13;MV +2902;17209;Wredenhagen;13056;Mueritz;13;MV +2903;17209;Buchholz;13056;Mueritz;13;MV +2904;17213;Goehren-Lebbin;13056;Mueritz;13;MV +2905;17213;Kogel;13056;Mueritz;13;MV +2906;17213;Penkow;13056;Mueritz;13;MV +2907;17213;Malchow;13056;Mueritz;13;MV +2908;17213;Adamshoffnung;13056;Mueritz;13;MV +2909;17213;Gruessow;13056;Mueritz;13;MV +2910;17213;Lexow;13056;Mueritz;13;MV +2911;17214;Silz;13056;Mueritz;13;MV +2912;17214;Alt Schwerin;13056;Mueritz;13;MV +2913;17214;Nossentiner Huette;13056;Mueritz;13;MV +2914;17217;Alt Rehse;13056;Mueritz;13;MV +2915;17217;Lapitz;13056;Mueritz;13;MV +2916;17217;Klein Lukow;13056;Mueritz;13;MV +2917;17217;Mollenstorf;13056;Mueritz;13;MV +2918;17217;Gross Vielen;13056;Mueritz;13;MV +2919;17217;Krukow;13056;Mueritz;13;MV +2920;17217;Puchow;13056;Mueritz;13;MV +2921;17217;Mallin;13056;Mueritz;13;MV +2922;17217;Penzlin;13056;Mueritz;13;MV +2923;17219;Marihn;13056;Mueritz;13;MV +2924;17219;Moellenhagen;13056;Mueritz;13;MV +2925;17219;Gross Flotow;13056;Mueritz;13;MV +2926;17219;Ankershagen;13056;Mueritz;13;MV +2927;17235;Neustrelitz;13055;Mecklenburg-Strelitz;13;MV +2928;17237;Carpin;13055;Mecklenburg-Strelitz;13;MV +2929;17237;Gruenow;13055;Mecklenburg-Strelitz;13;MV +2930;17237;Wokuhl-Dabelow;13055;Mecklenburg-Strelitz;13;MV +2931;17237;Blankensee;13055;Mecklenburg-Strelitz;13;MV +2932;17237;Kratzeburg;13055;Mecklenburg-Strelitz;13;MV +2933;17237;Blumenholz;13055;Mecklenburg-Strelitz;13;MV +2934;17237;Godendorf;13055;Mecklenburg-Strelitz;13;MV +2935;17237;Userin;13055;Mecklenburg-Strelitz;13;MV +2936;17237;Moellenbeck;13055;Mecklenburg-Strelitz;13;MV +2937;17237;Klein Vielen;13055;Mecklenburg-Strelitz;13;MV +2938;17237;Watzkendorf;13055;Mecklenburg-Strelitz;13;MV +2939;17237;Hohenzieritz;13055;Mecklenburg-Strelitz;13;MV +2940;17248;Rechlin;13056;Mueritz;13;MV +2941;17248;Laerz;13056;Mueritz;13;MV +2942;17252;Diemitz;13055;Mecklenburg-Strelitz;13;MV +2943;17252;Mirow;13055;Mecklenburg-Strelitz;13;MV +2944;17252;Schwarz;13056;Mueritz;13;MV +2945;17252;Roggentin;13055;Mecklenburg-Strelitz;13;MV +2946;17255;Wustrow;13055;Mecklenburg-Strelitz;13;MV +2947;17255;Wesenberg;13055;Mecklenburg-Strelitz;13;MV +2948;17255;Priepert;13055;Mecklenburg-Strelitz;13;MV +2949;17258;Feldberger Seenlandschaft;13055;Mecklenburg-Strelitz;13;MV +2950;17259;Feldberger Seenlandschaft;13055;Mecklenburg-Strelitz;13;MV +2951;17268;Gerswalde;12073;Uckermark;12;BB +2952;17268;Petznick;12073;Uckermark;12;BB +2953;17268;Hammelspring;12073;Uckermark;12;BB +2954;17268;Boitzenburger Land;12073;Uckermark;12;BB +2955;17268;Flieth-Stegelitz;12073;Uckermark;12;BB +2956;17268;Temmen-Ringenwalde;12073;Uckermark;12;BB +2957;17268;Densow;12073;Uckermark;12;BB +2958;17268;Grunewald;12073;Uckermark;12;BB +2959;17268;Roeddelin;12073;Uckermark;12;BB +2960;17268;Vietmannsdorf;12073;Uckermark;12;BB +2961;17268;Templin;12073;Uckermark;12;BB +2962;17268;Klosterwalde;12073;Uckermark;12;BB +2963;17268;Gandenitz;12073;Uckermark;12;BB +2964;17268;Herzfelde;12073;Uckermark;12;BB +2965;17268;Beutel;12073;Uckermark;12;BB +2966;17268;Milmersdorf;12073;Uckermark;12;BB +2967;17268;Mittenwalde;12073;Uckermark;12;BB +2968;17268;Gross Doelln;12073;Uckermark;12;BB +2969;17268;Gollin;12073;Uckermark;12;BB +2970;17268;Storkow;12073;Uckermark;12;BB +2971;17279;Lychen;12073;Uckermark;12;BB +2972;17291;Carmzow-Wallmow;12073;Uckermark;12;BB +2973;17291;Prenzlau;12073;Uckermark;12;BB +2974;17291;Goeritz;12073;Uckermark;12;BB +2975;17291;Schenkenberg;12073;Uckermark;12;BB +2976;17291;Uckerfelde;12073;Uckermark;12;BB +2977;17291;Randowtal;12073;Uckermark;12;BB +2978;17291;Oberuckersee;12073;Uckermark;12;BB +2979;17291;Gruenow;12073;Uckermark;12;BB +2980;17291;Gramzow;12073;Uckermark;12;BB +2981;17291;Schoenfeld;12073;Uckermark;12;BB +2982;17291;Nordwestuckermark;12073;Uckermark;12;BB +2983;17309;Krugsdorf;13062;Uecker-Randow;13;MV +2984;17309;Papendorf;13062;Uecker-Randow;13;MV +2985;17309;Fahrenwalde;13062;Uecker-Randow;13;MV +2986;17309;Pasewalk;13062;Uecker-Randow;13;MV +2987;17309;Marienthal;13062;Uecker-Randow;13;MV +2988;17309;Nieden;13062;Uecker-Randow;13;MV +2989;17309;Viereck;13062;Uecker-Randow;13;MV +2990;17309;Belling;13062;Uecker-Randow;13;MV +2991;17309;Damerow;13062;Uecker-Randow;13;MV +2992;17309;Zerrenthin;13062;Uecker-Randow;13;MV +2993;17309;Jatznick;13062;Uecker-Randow;13;MV +2994;17309;Zuesedom;13062;Uecker-Randow;13;MV +2995;17309;Rollwitz;13062;Uecker-Randow;13;MV +2996;17309;Polzow;13062;Uecker-Randow;13;MV +2997;17309;Schoenwalde;13062;Uecker-Randow;13;MV +2998;17309;Koblentz;13062;Uecker-Randow;13;MV +2999;17309;Brietzig;13062;Uecker-Randow;13;MV +3000;17321;Ploewen;13062;Uecker-Randow;13;MV +3001;17321;Ramin;13062;Uecker-Randow;13;MV +3002;17321;Bergholz;13062;Uecker-Randow;13;MV +3003;17321;Glashuette;13062;Uecker-Randow;13;MV +3004;17321;Loecknitz;13062;Uecker-Randow;13;MV +3005;17321;Rothenklempenow;13062;Uecker-Randow;13;MV +3006;17322;Glasow;13062;Uecker-Randow;13;MV +3007;17322;Pampow;13062;Uecker-Randow;13;MV +3008;17322;Rossow;13062;Uecker-Randow;13;MV +3009;17322;Grambow;13062;Uecker-Randow;13;MV +3010;17322;Mewegen;13062;Uecker-Randow;13;MV +3011;17322;Blankensee;13062;Uecker-Randow;13;MV +3012;17322;Bismark;13062;Uecker-Randow;13;MV +3013;17322;Boock;13062;Uecker-Randow;13;MV +3014;17322;Lebehn;13062;Uecker-Randow;13;MV +3015;17326;Bruessow;12073;Uckermark;12;BB +3016;17328;Wollin;13062;Uecker-Randow;13;MV +3017;17328;Penkun;13062;Uecker-Randow;13;MV +3018;17329;Krackow;13062;Uecker-Randow;13;MV +3019;17329;Nadrensee;13062;Uecker-Randow;13;MV +3020;17335;Strasburg;13062;Uecker-Randow;13;MV +3021;17337;Uckerland;12073;Uckermark;12;BB +3022;17337;Klein Luckow;13062;Uecker-Randow;13;MV +3023;17337;Gross Luckow;13062;Uecker-Randow;13;MV +3024;17337;Galenbeck;13055;Mecklenburg-Strelitz;13;MV +3025;17337;Blumenhagen;13062;Uecker-Randow;13;MV +3026;17337;Schoenhausen;13055;Mecklenburg-Strelitz;13;MV +3027;17348;Neu Kaebelich;13055;Mecklenburg-Strelitz;13;MV +3028;17348;Lindetal;13055;Mecklenburg-Strelitz;13;MV +3029;17348;Gross Daberkow;13055;Mecklenburg-Strelitz;13;MV +3030;17348;Mildenitz;13055;Mecklenburg-Strelitz;13;MV +3031;17348;Petersdorf;13055;Mecklenburg-Strelitz;13;MV +3032;17348;Woldegk;13055;Mecklenburg-Strelitz;13;MV +3033;17349;Neetzka;13055;Mecklenburg-Strelitz;13;MV +3034;17349;Kublank;13055;Mecklenburg-Strelitz;13;MV +3035;17349;Helpt;13055;Mecklenburg-Strelitz;13;MV +3036;17349;Schoenbeck;13055;Mecklenburg-Strelitz;13;MV +3037;17349;Gross Miltzow;13055;Mecklenburg-Strelitz;13;MV +3038;17349;Lindetal;13055;Mecklenburg-Strelitz;13;MV +3039;17349;Voigtsdorf;13055;Mecklenburg-Strelitz;13;MV +3040;17358;Hammer;13062;Uecker-Randow;13;MV +3041;17358;Torgelow-Hollaenderei;13062;Uecker-Randow;13;MV +3042;17358;Torgelow;13062;Uecker-Randow;13;MV +3043;17367;Eggesin;13062;Uecker-Randow;13;MV +3044;17373;Ueckermuende;13062;Uecker-Randow;13;MV +3045;17375;Ahlbeck;13062;Uecker-Randow;13;MV +3046;17375;Hintersee;13062;Uecker-Randow;13;MV +3047;17375;Moenkebude;13062;Uecker-Randow;13;MV +3048;17375;Grambin;13062;Uecker-Randow;13;MV +3049;17375;Meiersberg;13062;Uecker-Randow;13;MV +3050;17375;Liepgarten;13062;Uecker-Randow;13;MV +3051;17375;Leopoldshagen;13062;Uecker-Randow;13;MV +3052;17375;Luckow;13062;Uecker-Randow;13;MV +3053;17375;Vogelsang-Warsin;13062;Uecker-Randow;13;MV +3054;17375;Altwarp;13062;Uecker-Randow;13;MV +3055;17379;Wilhelmsburg;13062;Uecker-Randow;13;MV +3056;17379;Neuendorf A;13059;Ostvorpommern;13;MV +3057;17379;Rothemuehl;13062;Uecker-Randow;13;MV +3058;17379;Luebs;13062;Uecker-Randow;13;MV +3059;17379;Wietstock;13059;Ostvorpommern;13;MV +3060;17379;Heinrichswalde;13062;Uecker-Randow;13;MV +3061;17379;Heinrichsruh;13062;Uecker-Randow;13;MV +3062;17379;Altwigshagen;13062;Uecker-Randow;13;MV +3063;17379;Ferdinandshof;13062;Uecker-Randow;13;MV +3064;17389;Anklam;13059;Ostvorpommern;13;MV +3065;17390;Gross Polzin;13059;Ostvorpommern;13;MV +3066;17390;Schmatzin;13059;Ostvorpommern;13;MV +3067;17390;Murchin;13059;Ostvorpommern;13;MV +3068;17390;Rubkow;13059;Ostvorpommern;13;MV +3069;17390;Klein Buenzow;13059;Ostvorpommern;13;MV +3070;17390;Ziethen;13059;Ostvorpommern;13;MV +3071;17391;Postlow;13059;Ostvorpommern;13;MV +3072;17391;Iven;13059;Ostvorpommern;13;MV +3073;17391;Liepen;13059;Ostvorpommern;13;MV +3074;17391;Steinmocker;13059;Ostvorpommern;13;MV +3075;17391;Medow;13059;Ostvorpommern;13;MV +3076;17391;Krien;13059;Ostvorpommern;13;MV +3077;17391;Nerdin;13059;Ostvorpommern;13;MV +3078;17391;Neuendorf B;13059;Ostvorpommern;13;MV +3079;17391;Krusenfelde;13059;Ostvorpommern;13;MV +3080;17391;Neetzow;13059;Ostvorpommern;13;MV +3081;17391;Stolpe;13059;Ostvorpommern;13;MV +3082;17392;Pelsin;13059;Ostvorpommern;13;MV +3083;17392;Blesewitz;13059;Ostvorpommern;13;MV +3084;17392;Zinzow;13059;Ostvorpommern;13;MV +3085;17392;Spantekow;13059;Ostvorpommern;13;MV +3086;17392;Neuenkirchen;13059;Ostvorpommern;13;MV +3087;17392;Boldekow;13059;Ostvorpommern;13;MV +3088;17392;Butzow;13059;Ostvorpommern;13;MV +3089;17392;Putzar;13059;Ostvorpommern;13;MV +3090;17392;Drewelow;13059;Ostvorpommern;13;MV +3091;17392;Japenzin;13059;Ostvorpommern;13;MV +3092;17392;Sarnow;13059;Ostvorpommern;13;MV +3093;17398;Rossin;13059;Ostvorpommern;13;MV +3094;17398;Rathebur;13059;Ostvorpommern;13;MV +3095;17398;Bargischow;13059;Ostvorpommern;13;MV +3096;17398;Ducherow;13059;Ostvorpommern;13;MV +3097;17398;Loewitz;13059;Ostvorpommern;13;MV +3098;17398;Schwerinsburg;13059;Ostvorpommern;13;MV +3099;17398;Bugewitz;13059;Ostvorpommern;13;MV +3100;17398;Neu Kosenow;13059;Ostvorpommern;13;MV +3101;17406;Stolpe auf Usedom;13059;Ostvorpommern;13;MV +3102;17406;Rankwitz;13059;Ostvorpommern;13;MV +3103;17406;Usedom;13059;Ostvorpommern;13;MV +3104;17406;Morgenitz;13059;Ostvorpommern;13;MV +3105;17419;Garz;13059;Ostvorpommern;13;MV +3106;17419;Dargen;13059;Ostvorpommern;13;MV +3107;17419;Ahlbeck;13059;Ostvorpommern;13;MV +3108;17419;Zirchow;13059;Ostvorpommern;13;MV +3109;17419;Kamminke;13059;Ostvorpommern;13;MV +3110;17419;Korswandt;13059;Ostvorpommern;13;MV +3111;17424;Heringsdorf;13059;Ostvorpommern;13;MV +3112;17429;Mellenthin;13059;Ostvorpommern;13;MV +3113;17429;Benz;13059;Ostvorpommern;13;MV +3114;17429;Pudagla;13059;Ostvorpommern;13;MV +3115;17429;Bansin;13059;Ostvorpommern;13;MV +3116;17429;Neppermin;13059;Ostvorpommern;13;MV +3117;17438;Wolgast;13059;Ostvorpommern;13;MV +3118;17440;Kroeslin;13059;Ostvorpommern;13;MV +3119;17440;Zemitz;13059;Ostvorpommern;13;MV +3120;17440;Buggenhagen;13059;Ostvorpommern;13;MV +3121;17440;Hohendorf;13059;Ostvorpommern;13;MV +3122;17440;Pulow;13059;Ostvorpommern;13;MV +3123;17440;Buddenhagen;13059;Ostvorpommern;13;MV +3124;17440;Krummin;13059;Ostvorpommern;13;MV +3125;17440;Lassan;13059;Ostvorpommern;13;MV +3126;17440;Sauzin;13059;Ostvorpommern;13;MV +3127;17440;Luetow;13059;Ostvorpommern;13;MV +3128;17440;Gross Ernsthof;13059;Ostvorpommern;13;MV +3129;17449;Peenemuende;13059;Ostvorpommern;13;MV +3130;17449;Karlshagen;13059;Ostvorpommern;13;MV +3131;17449;Moelschow;13059;Ostvorpommern;13;MV +3132;17449;Trassenheide;13059;Ostvorpommern;13;MV +3133;17454;Zinnowitz;13059;Ostvorpommern;13;MV +3134;17459;Zempin;13059;Ostvorpommern;13;MV +3135;17459;Koserow;13059;Ostvorpommern;13;MV +3136;17459;Loddin;13059;Ostvorpommern;13;MV +3137;17459;ckeritz;13059;Ostvorpommern;13;MV +3138;17489;Greifswald;13001;Greifswald;13;MV +3139;17491;Greifswald;13001;Greifswald;13;MV +3140;17493;Greifswald;13001;Greifswald;13;MV +3141;17495;Ranzin;13059;Ostvorpommern;13;MV +3142;17495;Luehmannsdorf;13059;Ostvorpommern;13;MV +3143;17495;Zuessow;13059;Ostvorpommern;13;MV +3144;17495;Karlsburg;13059;Ostvorpommern;13;MV +3145;17495;Gross Kiesow;13059;Ostvorpommern;13;MV +3146;17495;Wrangelsburg;13059;Ostvorpommern;13;MV +3147;17498;Wackerow;13059;Ostvorpommern;13;MV +3148;17498;Dargelin;13059;Ostvorpommern;13;MV +3149;17498;Behrenhoff;13059;Ostvorpommern;13;MV +3150;17498;Levenhagen;13059;Ostvorpommern;13;MV +3151;17498;Weitenhagen;13059;Ostvorpommern;13;MV +3152;17498;Mesekenhagen;13059;Ostvorpommern;13;MV +3153;17498;Neuenkirchen;13059;Ostvorpommern;13;MV +3154;17498;Hinrichshagen;13059;Ostvorpommern;13;MV +3155;17498;Diedrichshagen;13059;Ostvorpommern;13;MV +3156;17498;Dersekow;13059;Ostvorpommern;13;MV +3157;17506;Koelzin;13059;Ostvorpommern;13;MV +3158;17506;Luessow;13059;Ostvorpommern;13;MV +3159;17506;Breechen;13059;Ostvorpommern;13;MV +3160;17506;Bandelin;13059;Ostvorpommern;13;MV +3161;17506;Gribow;13059;Ostvorpommern;13;MV +3162;17506;Guetzkow;13059;Ostvorpommern;13;MV +3163;17506;Kammin;13059;Ostvorpommern;13;MV +3164;17509;Wusterhusen;13059;Ostvorpommern;13;MV +3165;17509;Neu Boltenhagen;13059;Ostvorpommern;13;MV +3166;17509;Kemnitz;13059;Ostvorpommern;13;MV +3167;17509;Hanshagen;13059;Ostvorpommern;13;MV +3168;17509;Rubenow;13059;Ostvorpommern;13;MV +3169;17509;Bruenzow;13059;Ostvorpommern;13;MV +3170;17509;Lubmin;13059;Ostvorpommern;13;MV +3171;17509;Katzow;13059;Ostvorpommern;13;MV +3172;17509;Loissin;13059;Ostvorpommern;13;MV +3173;18055;Rostock;13003;Rostock;13;MV +3174;18057;Rostock;13003;Rostock;13;MV +3175;18059;Rostock;13003;Rostock;13;MV +3176;18059;Ziesendorf;13051;Bad Doberan;13;MV +3177;18059;Poelchow;13051;Bad Doberan;13;MV +3178;18059;Papendorf;13051;Bad Doberan;13;MV +3179;18069;Rostock;13003;Rostock;13;MV +3180;18069;Lambrechtshagen;13051;Bad Doberan;13;MV +3181;18106;Rostock;13003;Rostock;13;MV +3182;18107;Elmenhorst-Lichtenhagen;13051;Bad Doberan;13;MV +3183;18107;Rostock;13003;Rostock;13;MV +3184;18109;Rostock;13003;Rostock;13;MV +3185;18119;Rostock;13003;Rostock;13;MV +3186;18146;Rostock;13003;Rostock;13;MV +3187;18147;Rostock;13003;Rostock;13;MV +3188;18181;Seeheilbad Graal-Mueritz;13051;Bad Doberan;13;MV +3189;18182;Roevershagen;13051;Bad Doberan;13;MV +3190;18182;Blankenhagen;13051;Bad Doberan;13;MV +3191;18182;Moenchhagen;13051;Bad Doberan;13;MV +3192;18182;Bentwisch;13051;Bad Doberan;13;MV +3193;18182;Gelbensande;13051;Bad Doberan;13;MV +3194;18184;Poppendorf;13051;Bad Doberan;13;MV +3195;18184;Hohenfelde;13051;Bad Doberan;13;MV +3196;18184;Broderstorf;13051;Bad Doberan;13;MV +3197;18184;Klein Kussewitz;13051;Bad Doberan;13;MV +3198;18184;Thulendorf;13051;Bad Doberan;13;MV +3199;18184;Steinfeld;13051;Bad Doberan;13;MV +3200;18184;Mandelshagen;13051;Bad Doberan;13;MV +3201;18184;Roggentin;13051;Bad Doberan;13;MV +3202;18190;Sanitz;13051;Bad Doberan;13;MV +3203;18195;Grammow;13051;Bad Doberan;13;MV +3204;18195;Selpin;13051;Bad Doberan;13;MV +3205;18195;Zarnewanz;13051;Bad Doberan;13;MV +3206;18195;Cammin;13051;Bad Doberan;13;MV +3207;18195;Tessin;13051;Bad Doberan;13;MV +3208;18195;Thelkow;13051;Bad Doberan;13;MV +3209;18195;Gnewitz;13051;Bad Doberan;13;MV +3210;18195;Stubbendorf;13051;Bad Doberan;13;MV +3211;18195;Nustrow;13051;Bad Doberan;13;MV +3212;18196;Dummerstorf;13051;Bad Doberan;13;MV +3213;18196;Prisannewitz;13051;Bad Doberan;13;MV +3214;18196;Kavelstorf;13051;Bad Doberan;13;MV +3215;18196;Damm;13051;Bad Doberan;13;MV +3216;18196;Kessin;13051;Bad Doberan;13;MV +3217;18196;Lieblingshof;13051;Bad Doberan;13;MV +3218;18198;Kritzmow;13051;Bad Doberan;13;MV +3219;18198;Staebelow;13051;Bad Doberan;13;MV +3220;18209;Steffenshagen;13051;Bad Doberan;13;MV +3221;18209;Bad Doberan;13051;Bad Doberan;13;MV +3222;18209;Wittenbeck;13051;Bad Doberan;13;MV +3223;18209;Reddelich;13051;Bad Doberan;13;MV +3224;18209;Bartenshagen-Parkentin;13051;Bad Doberan;13;MV +3225;18211;Retschow;13051;Bad Doberan;13;MV +3226;18211;Boergerende-Rethwisch;13051;Bad Doberan;13;MV +3227;18211;Nienhagen;13051;Bad Doberan;13;MV +3228;18211;Admannshagen-Bargeshagen;13051;Bad Doberan;13;MV +3229;18225;Kuehlungsborn;13051;Bad Doberan;13;MV +3230;18230;Biendorf;13051;Bad Doberan;13;MV +3231;18230;Bastorf;13051;Bad Doberan;13;MV +3232;18230;Rerik;13051;Bad Doberan;13;MV +3233;18230;Jennewitz;13051;Bad Doberan;13;MV +3234;18233;Alt Bukow;13051;Bad Doberan;13;MV +3235;18233;Karin;13051;Bad Doberan;13;MV +3236;18233;Kamin;13051;Bad Doberan;13;MV +3237;18233;Neubukow;13051;Bad Doberan;13;MV +3238;18233;Krempin;13051;Bad Doberan;13;MV +3239;18233;Pepelow;13051;Bad Doberan;13;MV +3240;18233;Rakow;13051;Bad Doberan;13;MV +3241;18233;Ravensberg;13051;Bad Doberan;13;MV +3242;18233;Westenbruegge;13051;Bad Doberan;13;MV +3243;18233;Kirch Mulsow;13051;Bad Doberan;13;MV +3244;18236;Altenhagen;13051;Bad Doberan;13;MV +3245;18236;Kroepelin;13051;Bad Doberan;13;MV +3246;18236;Schmadebeck;13051;Bad Doberan;13;MV +3247;18239;Boelkow;13051;Bad Doberan;13;MV +3248;18239;Radegast;13051;Bad Doberan;13;MV +3249;18239;Heiligenhagen;13051;Bad Doberan;13;MV +3250;18239;Satow;13051;Bad Doberan;13;MV +3251;18239;Hanstorf;13051;Bad Doberan;13;MV +3252;18239;Reinshagen;13051;Bad Doberan;13;MV +3253;18246;Klein Belitz;13053;Guestrow;13;MV +3254;18246;Baumgarten;13053;Guestrow;13;MV +3255;18246;Juergenshagen;13053;Guestrow;13;MV +3256;18246;Steinhagen;13053;Guestrow;13;MV +3257;18246;Zepelin;13053;Guestrow;13;MV +3258;18246;Neuendorf;13053;Guestrow;13;MV +3259;18246;Buetzow;13053;Guestrow;13;MV +3260;18246;Ruehn;13053;Guestrow;13;MV +3261;18249;Tarnow;13053;Guestrow;13;MV +3262;18249;Dreetz;13053;Guestrow;13;MV +3263;18249;Bernitt;13053;Guestrow;13;MV +3264;18249;Penzin;13053;Guestrow;13;MV +3265;18249;Warnow;13053;Guestrow;13;MV +3266;18258;Wiendorf;13051;Bad Doberan;13;MV +3267;18258;Rukieten;13051;Bad Doberan;13;MV +3268;18258;Benitz;13051;Bad Doberan;13;MV +3269;18258;Schwaan;13051;Bad Doberan;13;MV +3270;18258;Broebberow;13051;Bad Doberan;13;MV +3271;18258;Kassow;13051;Bad Doberan;13;MV +3272;18258;Vorbeck;13051;Bad Doberan;13;MV +3273;18273;Guestrow;13053;Guestrow;13;MV +3274;18276;Mistorf;13053;Guestrow;13;MV +3275;18276;Guelzow;13053;Guestrow;13;MV +3276;18276;Zehna;13053;Guestrow;13;MV +3277;18276;Kuhs;13053;Guestrow;13;MV +3278;18276;Recknitz;13053;Guestrow;13;MV +3279;18276;Buelow;13053;Guestrow;13;MV +3280;18276;Muehl Rosin;13053;Guestrow;13;MV +3281;18276;Reimershagen;13053;Guestrow;13;MV +3282;18276;Glasewitz;13053;Guestrow;13;MV +3283;18276;Lohmen;13053;Guestrow;13;MV +3284;18276;Gross Schwiesow;13053;Guestrow;13;MV +3285;18276;Gutow;13053;Guestrow;13;MV +3286;18276;Klein Upahl;13053;Guestrow;13;MV +3287;18276;Pruezen;13053;Guestrow;13;MV +3288;18276;Luessow;13053;Guestrow;13;MV +3289;18279;Lalendorf;13053;Guestrow;13;MV +3290;18279;Langhagen;13053;Guestrow;13;MV +3291;18279;Plaaz;13053;Guestrow;13;MV +3292;18279;Wattmannshagen;13053;Guestrow;13;MV +3293;18292;Dobbin-Linstow;13053;Guestrow;13;MV +3294;18292;Hoppenrade;13053;Guestrow;13;MV +3295;18292;Kuchelmiss;13053;Guestrow;13;MV +3296;18292;Bellin;13053;Guestrow;13;MV +3297;18292;Krakow am See;13053;Guestrow;13;MV +3298;18299;Diekhof;13053;Guestrow;13;MV +3299;18299;Wardow;13053;Guestrow;13;MV +3300;18299;Dolgen;13053;Guestrow;13;MV +3301;18299;Poelitz;13053;Guestrow;13;MV +3302;18299;Hohen Sprenz;13053;Guestrow;13;MV +3303;18299;Laage;13053;Guestrow;13;MV +3304;18299;Weitendorf;13053;Guestrow;13;MV +3305;18299;Alt Kaetwin;13053;Guestrow;13;MV +3306;18299;Liessow;13053;Guestrow;13;MV +3307;18311;Ribnitz-Damgarten;13057;Nordvorpommern;13;MV +3308;18314;Luedershagen;13057;Nordvorpommern;13;MV +3309;18314;Kenz-Kuestrow;13057;Nordvorpommern;13;MV +3310;18314;Bartelshagen II;13057;Nordvorpommern;13;MV +3311;18314;Divitz-Spoldershagen;13057;Nordvorpommern;13;MV +3312;18314;Loebnitz;13057;Nordvorpommern;13;MV +3313;18317;Saal;13057;Nordvorpommern;13;MV +3314;18320;Schlemmin;13057;Nordvorpommern;13;MV +3315;18320;Trinwillershagen;13057;Nordvorpommern;13;MV +3316;18320;Ahrenshagen-Daskow;13057;Nordvorpommern;13;MV +3317;18320;Dettmannsdorf;13057;Nordvorpommern;13;MV +3318;18334;Breesen;13057;Nordvorpommern;13;MV +3319;18334;Schulenberg;13057;Nordvorpommern;13;MV +3320;18334;Semlow;13057;Nordvorpommern;13;MV +3321;18334;Langsdorf;13057;Nordvorpommern;13;MV +3322;18334;Eixen;13057;Nordvorpommern;13;MV +3323;18334;Boehlendorf;13057;Nordvorpommern;13;MV +3324;18334;Bad Suelze;13057;Nordvorpommern;13;MV +3325;18337;Marlow;13057;Nordvorpommern;13;MV +3326;18347;Wustrow;13057;Nordvorpommern;13;MV +3327;18347;Dierhagen;13057;Nordvorpommern;13;MV +3328;18347;Ahrenshoop;13057;Nordvorpommern;13;MV +3329;18356;Pruchten;13057;Nordvorpommern;13;MV +3330;18356;Fuhlendorf;13057;Nordvorpommern;13;MV +3331;18356;Barth;13057;Nordvorpommern;13;MV +3332;18374;Zingst;13057;Nordvorpommern;13;MV +3333;18375;Wieck;13057;Nordvorpommern;13;MV +3334;18375;Prerow;13057;Nordvorpommern;13;MV +3335;18375;Born am Darss;13057;Nordvorpommern;13;MV +3336;18435;Stralsund;13005;Stralsund;13;MV +3337;18437;Stralsund;13005;Stralsund;13;MV +3338;18439;Stralsund;13005;Stralsund;13;MV +3339;18442;Kummerow;13057;Nordvorpommern;13;MV +3340;18442;Neu Bartelshagen;13057;Nordvorpommern;13;MV +3341;18442;Jakobsdorf;13057;Nordvorpommern;13;MV +3342;18442;Luessow;13057;Nordvorpommern;13;MV +3343;18442;Gross Kordshagen;13057;Nordvorpommern;13;MV +3344;18442;Wendorf;13057;Nordvorpommern;13;MV +3345;18442;Niepars;13057;Nordvorpommern;13;MV +3346;18442;Pantelitz;13057;Nordvorpommern;13;MV +3347;18442;Steinhagen;13057;Nordvorpommern;13;MV +3348;18445;Prohn;13057;Nordvorpommern;13;MV +3349;18445;Gross Mohrdorf;13057;Nordvorpommern;13;MV +3350;18445;Kramerhof;13057;Nordvorpommern;13;MV +3351;18445;Klausdorf;13057;Nordvorpommern;13;MV +3352;18445;Altenpleen;13057;Nordvorpommern;13;MV +3353;18445;Preetz;13057;Nordvorpommern;13;MV +3354;18461;Richtenberg;13057;Nordvorpommern;13;MV +3355;18461;Gremersdorf-Buchholz;13057;Nordvorpommern;13;MV +3356;18461;Weitenhagen;13057;Nordvorpommern;13;MV +3357;18461;Franzburg;13057;Nordvorpommern;13;MV +3358;18461;Millienhagen-Oebelitz;13057;Nordvorpommern;13;MV +3359;18465;Hugoldsdorf;13057;Nordvorpommern;13;MV +3360;18465;Drechow;13057;Nordvorpommern;13;MV +3361;18465;Tribsees;13057;Nordvorpommern;13;MV +3362;18469;Karnin;13057;Nordvorpommern;13;MV +3363;18469;Velgast;13057;Nordvorpommern;13;MV +3364;18507;Grimmen;13057;Nordvorpommern;13;MV +3365;18510;Elmenhorst;13057;Nordvorpommern;13;MV +3366;18510;Stoltenhagen;13057;Nordvorpommern;13;MV +3367;18510;Zarrendorf;13057;Nordvorpommern;13;MV +3368;18510;Wittenhagen;13057;Nordvorpommern;13;MV +3369;18510;Papenhagen;13057;Nordvorpommern;13;MV +3370;18510;Behnkendorf;13057;Nordvorpommern;13;MV +3371;18513;Gransebieth;13057;Nordvorpommern;13;MV +3372;18513;Wendisch Baggendorf;13057;Nordvorpommern;13;MV +3373;18513;Grammendorf;13057;Nordvorpommern;13;MV +3374;18513;Splietsdorf;13057;Nordvorpommern;13;MV +3375;18513;Glewitz;13057;Nordvorpommern;13;MV +3376;18513;Deyelsdorf;13057;Nordvorpommern;13;MV +3377;18516;Suederholz;13057;Nordvorpommern;13;MV +3378;18519;Brandshagen;13057;Nordvorpommern;13;MV +3379;18519;Horst;13057;Nordvorpommern;13;MV +3380;18519;Miltzow;13057;Nordvorpommern;13;MV +3381;18519;Wilmshagen;13057;Nordvorpommern;13;MV +3382;18519;Reinberg;13057;Nordvorpommern;13;MV +3383;18519;Kirchdorf;13057;Nordvorpommern;13;MV +3384;18528;Lietzow;13061;Ruegen;13;MV +3385;18528;Bergen auf Ruegen;13061;Ruegen;13;MV +3386;18528;Thesenvitz;13061;Ruegen;13;MV +3387;18528;Buschvitz;13061;Ruegen;13;MV +3388;18528;Patzig;13061;Ruegen;13;MV +3389;18528;Zirkow;13061;Ruegen;13;MV +3390;18528;Sehlen;13061;Ruegen;13;MV +3391;18528;Parchtitz;13061;Ruegen;13;MV +3392;18528;Ralswiek;13061;Ruegen;13;MV +3393;18528;Rappin;13061;Ruegen;13;MV +3394;18546;Sassnitz;13061;Ruegen;13;MV +3395;18551;Sagard;13061;Ruegen;13;MV +3396;18551;Lohme;13061;Ruegen;13;MV +3397;18551;Glowe;13061;Ruegen;13;MV +3398;18556;Dranske;13061;Ruegen;13;MV +3399;18556;Putgarten;13061;Ruegen;13;MV +3400;18556;Altenkirchen;13061;Ruegen;13;MV +3401;18556;Wiek;13061;Ruegen;13;MV +3402;18556;Breege;13061;Ruegen;13;MV +3403;18565;Insel Hiddensee;13061;Ruegen;13;MV +3404;18569;Schaprode;13061;Ruegen;13;MV +3405;18569;Gingst;13061;Ruegen;13;MV +3406;18569;Ummanz;13061;Ruegen;13;MV +3407;18569;Trent;13061;Ruegen;13;MV +3408;18569;Kluis;13061;Ruegen;13;MV +3409;18569;Neuenkirchen;13061;Ruegen;13;MV +3410;18573;Altefaehr;13061;Ruegen;13;MV +3411;18573;Dreschvitz;13061;Ruegen;13;MV +3412;18573;Rambin;13061;Ruegen;13;MV +3413;18573;Samtens;13061;Ruegen;13;MV +3414;18574;Poseritz;13061;Ruegen;13;MV +3415;18574;Garz;13061;Ruegen;13;MV +3416;18574;Gustow;13061;Ruegen;13;MV +3417;18574;Karnitz;13061;Ruegen;13;MV +3418;18574;Zudar;13061;Ruegen;13;MV +3419;18581;Putbus;13061;Ruegen;13;MV +3420;18586;Middelhagen;13061;Ruegen;13;MV +3421;18586;Thiessow;13061;Ruegen;13;MV +3422;18586;Baabe;13061;Ruegen;13;MV +3423;18586;Goehren;13061;Ruegen;13;MV +3424;18586;Lancken-Granitz;13061;Ruegen;13;MV +3425;18586;Gager;13061;Ruegen;13;MV +3426;18586;Sellin;13061;Ruegen;13;MV +3427;18609;Binz;13061;Ruegen;13;MV +3428;19053;Schwerin;13004;Schwerin;13;MV +3429;19055;Schwerin;13004;Schwerin;13;MV +3430;19057;Schwerin;13004;Schwerin;13;MV +3431;19059;Schwerin;13004;Schwerin;13;MV +3432;19061;Schwerin;13004;Schwerin;13;MV +3433;19063;Schwerin;13004;Schwerin;13;MV +3434;19065;Gneven;13060;Parchim;13;MV +3435;19065;Pinnow;13060;Parchim;13;MV +3436;19065;Godern;13060;Parchim;13;MV +3437;19065;Raben Steinfeld;13060;Parchim;13;MV +3438;19067;Leezen;13060;Parchim;13;MV +3439;19067;Retgendorf;13060;Parchim;13;MV +3440;19067;Langen Bruetz;13060;Parchim;13;MV +3441;19067;Rubow;13060;Parchim;13;MV +3442;19067;Cambs;13060;Parchim;13;MV +3443;19069;Zickhusen;13058;Nordwestmecklenburg;13;MV +3444;19069;Pingelshagen;13058;Nordwestmecklenburg;13;MV +3445;19069;Boeken;13058;Nordwestmecklenburg;13;MV +3446;19069;Alt Meteln;13058;Nordwestmecklenburg;13;MV +3447;19069;Seehof;13058;Nordwestmecklenburg;13;MV +3448;19069;Klein Trebbow;13058;Nordwestmecklenburg;13;MV +3449;19071;Dalberg-Wendelstorf;13058;Nordwestmecklenburg;13;MV +3450;19071;Bruesewitz;13058;Nordwestmecklenburg;13;MV +3451;19071;Grambow;13058;Nordwestmecklenburg;13;MV +3452;19071;Cramonshagen;13058;Nordwestmecklenburg;13;MV +3453;19073;Klein Rogahn;13054;Ludwigslust;13;MV +3454;19073;Wittenfoerden;13054;Ludwigslust;13;MV +3455;19073;Schossin;13054;Ludwigslust;13;MV +3456;19073;Stralendorf;13054;Ludwigslust;13;MV +3457;19073;Duemmer;13054;Ludwigslust;13;MV +3458;19073;Zuelow;13054;Ludwigslust;13;MV +3459;19075;Warsow;13054;Ludwigslust;13;MV +3460;19075;Pampow;13054;Ludwigslust;13;MV +3461;19075;Holthusen;13054;Ludwigslust;13;MV +3462;19077;Rastow;13054;Ludwigslust;13;MV +3463;19077;Suelstorf;13054;Ludwigslust;13;MV +3464;19077;Luebesse;13054;Ludwigslust;13;MV +3465;19077;Uelitz;13054;Ludwigslust;13;MV +3466;19079;Sukow;13060;Parchim;13;MV +3467;19079;Goldenstaedt;13060;Parchim;13;MV +3468;19079;Banzkow;13060;Parchim;13;MV +3469;19086;Plate;13060;Parchim;13;MV +3470;19089;Ruthenbeck;13060;Parchim;13;MV +3471;19089;Buelow;13060;Parchim;13;MV +3472;19089;Gaedebehn;13060;Parchim;13;MV +3473;19089;Crivitz;13060;Parchim;13;MV +3474;19089;Barnin;13060;Parchim;13;MV +3475;19089;Tramm;13060;Parchim;13;MV +3476;19089;Demen;13060;Parchim;13;MV +3477;19089;Goehren;13060;Parchim;13;MV +3478;19089;Zapel;13060;Parchim;13;MV +3479;19089;Wessin;13060;Parchim;13;MV +3480;19205;Pokrent;13058;Nordwestmecklenburg;13;MV +3481;19205;Kneese;13058;Nordwestmecklenburg;13;MV +3482;19205;Gadebusch;13058;Nordwestmecklenburg;13;MV +3483;19205;Roggendorf;13058;Nordwestmecklenburg;13;MV +3484;19205;Roegnitz;13058;Nordwestmecklenburg;13;MV +3485;19205;Veelboeken;13058;Nordwestmecklenburg;13;MV +3486;19205;Muehlen Eichsen;13058;Nordwestmecklenburg;13;MV +3487;19205;Dragun;13058;Nordwestmecklenburg;13;MV +3488;19205;Krembz;13058;Nordwestmecklenburg;13;MV +3489;19209;Luetzow;13058;Nordwestmecklenburg;13;MV +3490;19209;Badow;13058;Nordwestmecklenburg;13;MV +3491;19209;Perlin;13058;Nordwestmecklenburg;13;MV +3492;19209;Renzow;13058;Nordwestmecklenburg;13;MV +3493;19209;Gottesgabe;13058;Nordwestmecklenburg;13;MV +3494;19217;Wedendorf;13058;Nordwestmecklenburg;13;MV +3495;19217;Gross Molzahn;13058;Nordwestmecklenburg;13;MV +3496;19217;Rieps;13058;Nordwestmecklenburg;13;MV +3497;19217;Nesow;13058;Nordwestmecklenburg;13;MV +3498;19217;Holdorf;13058;Nordwestmecklenburg;13;MV +3499;19217;Demern;13058;Nordwestmecklenburg;13;MV +3500;19217;Buelow;13058;Nordwestmecklenburg;13;MV +3501;19217;Rehna;13058;Nordwestmecklenburg;13;MV +3502;19217;Thandorf;13058;Nordwestmecklenburg;13;MV +3503;19217;Koechelstorf;13058;Nordwestmecklenburg;13;MV +3504;19217;Loewitz;13058;Nordwestmecklenburg;13;MV +3505;19217;Dechow;13058;Nordwestmecklenburg;13;MV +3506;19217;Schlagsdorf;13058;Nordwestmecklenburg;13;MV +3507;19217;Vitense;13058;Nordwestmecklenburg;13;MV +3508;19217;Utecht;13058;Nordwestmecklenburg;13;MV +3509;19217;Carlow;13058;Nordwestmecklenburg;13;MV +3510;19217;Gross Ruenz;13058;Nordwestmecklenburg;13;MV +3511;19230;Kuhstorf;13054;Ludwigslust;13;MV +3512;19230;Moraas;13054;Ludwigslust;13;MV +3513;19230;Picher;13054;Ludwigslust;13;MV +3514;19230;Alt Zachun;13054;Ludwigslust;13;MV +3515;19230;Huelseburg;13054;Ludwigslust;13;MV +3516;19230;Kirch Jesar;13054;Ludwigslust;13;MV +3517;19230;Belsch;13054;Ludwigslust;13;MV +3518;19230;Bandenitz;13054;Ludwigslust;13;MV +3519;19230;Hoort;13054;Ludwigslust;13;MV +3520;19230;Paetow;13054;Ludwigslust;13;MV +3521;19230;Pritzier;13054;Ludwigslust;13;MV +3522;19230;Bobzin;13054;Ludwigslust;13;MV +3523;19230;Bresegard;13054;Ludwigslust;13;MV +3524;19230;Hagenow;13054;Ludwigslust;13;MV +3525;19230;Setzin;13054;Ludwigslust;13;MV +3526;19230;Warlitz;13054;Ludwigslust;13;MV +3527;19230;Strohkirchen;13054;Ludwigslust;13;MV +3528;19230;Redefin;13054;Ludwigslust;13;MV +3529;19230;Gammelin;13054;Ludwigslust;13;MV +3530;19230;Gross Krams;13054;Ludwigslust;13;MV +3531;19230;Toddin;13054;Ludwigslust;13;MV +3532;19243;Parum;13054;Ludwigslust;13;MV +3533;19243;Luckwitz;13054;Ludwigslust;13;MV +3534;19243;Karft;13054;Ludwigslust;13;MV +3535;19243;Tessin bei Wittenburg;13054;Ludwigslust;13;MV +3536;19243;Dreiluetzow;13054;Ludwigslust;13;MV +3537;19243;Dodow;13054;Ludwigslust;13;MV +3538;19243;Koerchow;13054;Ludwigslust;13;MV +3539;19243;Waschow;13054;Ludwigslust;13;MV +3540;19243;Droennewitz;13054;Ludwigslust;13;MV +3541;19243;Wittenburg;13054;Ludwigslust;13;MV +3542;19243;Boddin;13054;Ludwigslust;13;MV +3543;19243;Lehsen;13054;Ludwigslust;13;MV +3544;19246;Valluhn;13054;Ludwigslust;13;MV +3545;19246;Neuhof;13054;Ludwigslust;13;MV +3546;19246;Zarrentin;13054;Ludwigslust;13;MV +3547;19246;Luettow;13054;Ludwigslust;13;MV +3548;19246;Camin;13054;Ludwigslust;13;MV +3549;19246;Kogel;13054;Ludwigslust;13;MV +3550;19246;Lassahn;13054;Ludwigslust;13;MV +3551;19246;Bantin;13054;Ludwigslust;13;MV +3552;19249;Goesslow;13054;Ludwigslust;13;MV +3553;19249;Jessenitz;13054;Ludwigslust;13;MV +3554;19249;Luebtheen;13054;Ludwigslust;13;MV +3555;19249;Garlitz;13054;Ludwigslust;13;MV +3556;19258;Boizenburg;13054;Ludwigslust;13;MV +3557;19258;Gresse;13054;Ludwigslust;13;MV +3558;19258;Wiebendorf;13054;Ludwigslust;13;MV +3559;19258;Klein Bengerstorf;13054;Ludwigslust;13;MV +3560;19258;Schwanheide;13054;Ludwigslust;13;MV +3561;19258;Tessin bei Boizenburg;13054;Ludwigslust;13;MV +3562;19258;Nostorf;13054;Ludwigslust;13;MV +3563;19258;Gallin;13054;Ludwigslust;13;MV +3564;19258;Neu Guelze;13054;Ludwigslust;13;MV +3565;19258;Greven;13054;Ludwigslust;13;MV +3566;19258;Besitz;13054;Ludwigslust;13;MV +3567;19260;Vellahn;13054;Ludwigslust;13;MV +3568;19260;Rodenwalde;13054;Ludwigslust;13;MV +3569;19260;Bennin;13054;Ludwigslust;13;MV +3570;19260;Dersenow;13054;Ludwigslust;13;MV +3571;19260;Banzin;13054;Ludwigslust;13;MV +3572;19260;Kloddram;13054;Ludwigslust;13;MV +3573;19273;Teldau;13054;Ludwigslust;13;MV +3574;19273;Melkof;13054;Ludwigslust;13;MV +3575;19273;Brahlstorf;13054;Ludwigslust;13;MV +3576;19273;Amt Neuhaus;3355;Lueneburg;3;NI +3577;19288;Lueblow;13054;Ludwigslust;13;MV +3578;19288;Fahrbinde;13054;Ludwigslust;13;MV +3579;19288;Goehlen;13054;Ludwigslust;13;MV +3580;19288;Alt Krenzlin;13054;Ludwigslust;13;MV +3581;19288;Leussow;13054;Ludwigslust;13;MV +3582;19288;Woebbelin;13054;Ludwigslust;13;MV +3583;19288;Kummer;13054;Ludwigslust;13;MV +3584;19288;Ludwigslust;13054;Ludwigslust;13;MV +3585;19288;Gross Laasch;13054;Ludwigslust;13;MV +3586;19288;Warlow;13054;Ludwigslust;13;MV +3587;19288;Glaisin;13054;Ludwigslust;13;MV +3588;19294;Grebs;13054;Ludwigslust;13;MV +3589;19294;Malliss;13054;Ludwigslust;13;MV +3590;19294;Malk Goehren;13054;Ludwigslust;13;MV +3591;19294;Gorlosen;13054;Ludwigslust;13;MV +3592;19294;Bresegard;13054;Ludwigslust;13;MV +3593;19294;Neu Kaliss;13054;Ludwigslust;13;MV +3594;19294;Dadow;13054;Ludwigslust;13;MV +3595;19294;Eldena;13054;Ludwigslust;13;MV +3596;19294;Karenz;13054;Ludwigslust;13;MV +3597;19294;Karstaedt;13054;Ludwigslust;13;MV +3598;19294;Krinitz;13054;Ludwigslust;13;MV +3599;19294;Niendorf an der Roegnitz;13054;Ludwigslust;13;MV +3600;19300;Grabow;13054;Ludwigslust;13;MV +3601;19300;Milow;13054;Ludwigslust;13;MV +3602;19300;Kremmin;13054;Ludwigslust;13;MV +3603;19300;Balow;13054;Ludwigslust;13;MV +3604;19300;Muchow;13054;Ludwigslust;13;MV +3605;19300;Werle;13054;Ludwigslust;13;MV +3606;19300;Prislich;13054;Ludwigslust;13;MV +3607;19300;Zierzow;13054;Ludwigslust;13;MV +3608;19300;Moellenbeck;13054;Ludwigslust;13;MV +3609;19300;Steesow;13054;Ludwigslust;13;MV +3610;19303;Woosmer;13054;Ludwigslust;13;MV +3611;19303;Heidhof;13054;Ludwigslust;13;MV +3612;19303;Doemitz;13054;Ludwigslust;13;MV +3613;19303;Tewswoos;13054;Ludwigslust;13;MV +3614;19303;Rueterberg;13054;Ludwigslust;13;MV +3615;19303;Vielank;13054;Ludwigslust;13;MV +3616;19303;Polz;13054;Ludwigslust;13;MV +3617;19306;Neustadt-Glewe;13054;Ludwigslust;13;MV +3618;19306;Brenz;13054;Ludwigslust;13;MV +3619;19306;Blievenstorf;13054;Ludwigslust;13;MV +3620;19309;Besandten;12070;Prignitz;12;BB +3621;19309;Eldenburg;12070;Prignitz;12;BB +3622;19309;Lanz;12070;Prignitz;12;BB +3623;19309;Mellen;12070;Prignitz;12;BB +3624;19309;Wootz;12070;Prignitz;12;BB +3625;19309;Lenzen (Elbe);12070;Prignitz;12;BB +3626;19322;Wittenberge;12070;Prignitz;12;BB +3627;19322;Ruehstaedt;12070;Prignitz;12;BB +3628;19322;Weisen;12070;Prignitz;12;BB +3629;19322;Cumlosen;12070;Prignitz;12;BB +3630;19322;Breese;12070;Prignitz;12;BB +3631;19322;Gross Breese;12070;Prignitz;12;BB +3632;19336;Viesecke;12070;Prignitz;12;BB +3633;19336;Bad Wilsnack;12070;Prignitz;12;BB +3634;19336;Legde/Quitzoebel;12070;Prignitz;12;BB +3635;19336;Kletzke;12070;Prignitz;12;BB +3636;19339;Netzow;12070;Prignitz;12;BB +3637;19339;Bendelin;12070;Prignitz;12;BB +3638;19339;Gloewen;12070;Prignitz;12;BB +3639;19348;Pirow;12070;Prignitz;12;BB +3640;19348;Berge;12070;Prignitz;12;BB +3641;19348;Perleberg;12070;Prignitz;12;BB +3642;19348;Retzin;12070;Prignitz;12;BB +3643;19348;Nebelin;12070;Prignitz;12;BB +3644;19348;Wolfshagen;12070;Prignitz;12;BB +3645;19348;Kleinow;12070;Prignitz;12;BB +3646;19348;Guelitz-Reetz;12070;Prignitz;12;BB +3647;19348;Baek;12070;Prignitz;12;BB +3648;19348;Klein Gottschow;12070;Prignitz;12;BB +3649;19348;Krampfer;12070;Prignitz;12;BB +3650;19357;Dambeck;13054;Ludwigslust;13;MV +3651;19357;Garlin;12070;Prignitz;12;BB +3652;19357;Proettlin;12070;Prignitz;12;BB +3653;19357;Karstaedt;12070;Prignitz;12;BB +3654;19357;Boberow;12070;Prignitz;12;BB +3655;19357;Mankmuss;12070;Prignitz;12;BB +3656;19370;Parchim;13060;Parchim;13;MV +3657;19372;Stralendorf;13060;Parchim;13;MV +3658;19372;Karrenzin;13060;Parchim;13;MV +3659;19372;Gross Godems;13060;Parchim;13;MV +3660;19372;Matzlow-Garwitz;13060;Parchim;13;MV +3661;19372;Rom;13060;Parchim;13;MV +3662;19372;Ziegendorf;13060;Parchim;13;MV +3663;19372;Stolpe;13060;Parchim;13;MV +3664;19372;Brunow;13054;Ludwigslust;13;MV +3665;19372;Spornitz;13060;Parchim;13;MV +3666;19372;Herzfeld;13060;Parchim;13;MV +3667;19374;Severin;13060;Parchim;13;MV +3668;19374;Raduhn;13060;Parchim;13;MV +3669;19374;Grebbin;13060;Parchim;13;MV +3670;19374;Gross Niendorf;13060;Parchim;13;MV +3671;19374;Friedrichsruhe;13060;Parchim;13;MV +3672;19374;Zoelkow;13060;Parchim;13;MV +3673;19374;Damm;13060;Parchim;13;MV +3674;19374;Domsuehl;13060;Parchim;13;MV +3675;19374;Klinken;13060;Parchim;13;MV +3676;19374;Mestlin;13060;Parchim;13;MV +3677;19374;Herzberg;13060;Parchim;13;MV +3678;19376;Suckow;13060;Parchim;13;MV +3679;19376;Siggelkow;13060;Parchim;13;MV +3680;19376;Tessenow;13060;Parchim;13;MV +3681;19376;Marnitz;13060;Parchim;13;MV +3682;19386;Broock;13060;Parchim;13;MV +3683;19386;Kreien;13060;Parchim;13;MV +3684;19386;Passow;13060;Parchim;13;MV +3685;19386;Granzin;13060;Parchim;13;MV +3686;19386;Lutheran;13060;Parchim;13;MV +3687;19386;Gischow;13060;Parchim;13;MV +3688;19386;Gallin-Kuppentin;13060;Parchim;13;MV +3689;19386;Werder;13060;Parchim;13;MV +3690;19386;Kritzow;13060;Parchim;13;MV +3691;19386;Karbow-Vietluebbe;13060;Parchim;13;MV +3692;19386;Luebz;13060;Parchim;13;MV +3693;19386;Wahlstorf;13060;Parchim;13;MV +3694;19395;Plau am See;13060;Parchim;13;MV +3695;19395;Karow;13060;Parchim;13;MV +3696;19395;Retzow;13060;Parchim;13;MV +3697;19395;Wendisch Priborn;13060;Parchim;13;MV +3698;19395;Gnevsdorf;13060;Parchim;13;MV +3699;19395;Ganzlin;13060;Parchim;13;MV +3700;19395;Barkow;13060;Parchim;13;MV +3701;19395;Plauerhagen;13060;Parchim;13;MV +3702;19399;Neu Poserin;13060;Parchim;13;MV +3703;19399;Dobbertin;13060;Parchim;13;MV +3704;19399;Techentin;13060;Parchim;13;MV +3705;19399;Diestelow;13060;Parchim;13;MV +3706;19399;Goldberg;13060;Parchim;13;MV +3707;19399;Wendisch Waren;13060;Parchim;13;MV +3708;19399;Langenhagen;13060;Parchim;13;MV +3709;19406;Dabel;13060;Parchim;13;MV +3710;19406;Hohen Pritz;13060;Parchim;13;MV +3711;19406;Witzin;13060;Parchim;13;MV +3712;19406;Borkow;13060;Parchim;13;MV +3713;19406;Kobrow;13060;Parchim;13;MV +3714;19406;Sternberg;13060;Parchim;13;MV +3715;19406;Gross Goernow;13060;Parchim;13;MV +3716;19406;Mustin;13060;Parchim;13;MV +3717;19412;Blankenberg;13060;Parchim;13;MV +3718;19412;Langen Jarchow;13060;Parchim;13;MV +3719;19412;Weitendorf;13060;Parchim;13;MV +3720;19412;Kuhlen;13060;Parchim;13;MV +3721;19412;Wendorf;13060;Parchim;13;MV +3722;19412;Zahrensdorf;13060;Parchim;13;MV +3723;19412;Brueel;13060;Parchim;13;MV +3724;19417;Bibow;13058;Nordwestmecklenburg;13;MV +3725;19417;Gross Labenz;13058;Nordwestmecklenburg;13;MV +3726;19417;Ventschow;13058;Nordwestmecklenburg;13;MV +3727;19417;Jesendorf;13058;Nordwestmecklenburg;13;MV +3728;19417;Warin;13058;Nordwestmecklenburg;13;MV +3729;20095;HH;2000;HH, Freie und Hansestadt;2;HH +3730;20095;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3731;20097;HH;2000;HH, Freie und Hansestadt;2;HH +3732;20097;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3733;20099;HH;2000;HH, Freie und Hansestadt;2;HH +3734;20099;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3735;20144;HH;2000;HH, Freie und Hansestadt;2;HH +3736;20144;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3737;20146;HH;2000;HH, Freie und Hansestadt;2;HH +3738;20146;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3739;20148;HH;2000;HH, Freie und Hansestadt;2;HH +3740;20148;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3741;20149;HH;2000;HH, Freie und Hansestadt;2;HH +3742;20149;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3743;20249;HH;2000;HH, Freie und Hansestadt;2;HH +3744;20249;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3745;20251;HH;2000;HH, Freie und Hansestadt;2;HH +3746;20251;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3747;20253;HH;2000;HH, Freie und Hansestadt;2;HH +3748;20253;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3749;20255;HH;2000;HH, Freie und Hansestadt;2;HH +3750;20255;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3751;20257;HH;2000;HH, Freie und Hansestadt;2;HH +3752;20257;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3753;20259;HH;2000;HH, Freie und Hansestadt;2;HH +3754;20259;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3755;20354;HH;2000;HH, Freie und Hansestadt;2;HH +3756;20354;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3757;20355;HH;2000;HH, Freie und Hansestadt;2;HH +3758;20355;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3759;20357;HH;2000;HH, Freie und Hansestadt;2;HH +3760;20357;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3761;20359;HH;2000;HH, Freie und Hansestadt;2;HH +3762;20359;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3763;20457;HH;2000;HH, Freie und Hansestadt;2;HH +3764;20457;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3765;20459;HH;2000;HH, Freie und Hansestadt;2;HH +3766;20459;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3767;20535;HH;2000;HH, Freie und Hansestadt;2;HH +3768;20535;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3769;20537;HH;2000;HH, Freie und Hansestadt;2;HH +3770;20537;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3771;20539;HH;2000;HH, Freie und Hansestadt;2;HH +3772;20539;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3773;21029;HH;2000;HH, Freie und Hansestadt;2;HH +3774;21029;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3775;21031;HH;2000;HH, Freie und Hansestadt;2;HH +3776;21031;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3777;21033;HH;2000;HH, Freie und Hansestadt;2;HH +3778;21033;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3779;21035;HH;2000;HH, Freie und Hansestadt;2;HH +3780;21035;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3781;21037;HH;2000;HH, Freie und Hansestadt;2;HH +3782;21037;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3783;21039;HH;2000;HH, Freie und Hansestadt;2;HH +3784;21039;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3785;21039;Boernsen;1053;Herzogtum Lauenburg;1;SH +3786;21039;Escheburg;1053;Herzogtum Lauenburg;1;SH +3787;21073;HH;2000;HH, Freie und Hansestadt;2;HH +3788;21073;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3789;21075;HH;2000;HH, Freie und Hansestadt;2;HH +3790;21075;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3791;21077;HH;2000;HH, Freie und Hansestadt;2;HH +3792;21077;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3793;21079;HH;2000;HH, Freie und Hansestadt;2;HH +3794;21079;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3795;21107;HH;2000;HH, Freie und Hansestadt;2;HH +3796;21107;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3797;21109;HH;2000;HH, Freie und Hansestadt;2;HH +3798;21109;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3799;21129;HH;2000;HH, Freie und Hansestadt;2;HH +3800;21129;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3801;21147;HH;2000;HH, Freie und Hansestadt;2;HH +3802;21147;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3803;21149;HH;2000;HH, Freie und Hansestadt;2;HH +3804;21149;Hampuri;2000;HH, Freie und Hansestadt;2;HH +3805;21217;Seevetal;3353;Harburg;3;NI +3806;21218;Seevetal;3353;Harburg;3;NI +3807;21220;Seevetal;3353;Harburg;3;NI +3808;21224;Rosengarten;3353;Harburg;3;NI +3809;21227;Bendestorf;3353;Harburg;3;NI +3810;21228;Harmstorf;3353;Harburg;3;NI +3811;21244;Buchholz in der Nordheide;3353;Harburg;3;NI +3812;21255;Koenigsmoor;3353;Harburg;3;NI +3813;21255;Tostedt;3353;Harburg;3;NI +3814;21255;Dohren;3353;Harburg;3;NI +3815;21255;Kakenstorf;3353;Harburg;3;NI +3816;21255;Wistedt;3353;Harburg;3;NI +3817;21256;Handeloh;3353;Harburg;3;NI +3818;21258;Heidenau;3353;Harburg;3;NI +3819;21259;Otter;3353;Harburg;3;NI +3820;21261;Welle;3353;Harburg;3;NI +3821;21266;Jesteburg;3353;Harburg;3;NI +3822;21271;Asendorf;3353;Harburg;3;NI +3823;21271;Hanstedt;3353;Harburg;3;NI +3824;21272;Egestorf;3353;Harburg;3;NI +3825;21274;Undeloh;3353;Harburg;3;NI +3826;21279;Wenzendorf;3353;Harburg;3;NI +3827;21279;Hollenstedt;3353;Harburg;3;NI +3828;21279;Drestedt;3353;Harburg;3;NI +3829;21279;Appel;3353;Harburg;3;NI +3830;21335;Lueneburg;3355;Lueneburg;3;NI +3831;21337;Lueneburg;3355;Lueneburg;3;NI +3832;21339;Lueneburg;3355;Lueneburg;3;NI +3833;21354;Bleckede;3355;Lueneburg;3;NI +3834;21357;Barum;3355;Lueneburg;3;NI +3835;21357;Wittorf;3355;Lueneburg;3;NI +3836;21357;Bardowick;3355;Lueneburg;3;NI +3837;21358;Mechtersen;3355;Lueneburg;3;NI +3838;21360;Voegelsen;3355;Lueneburg;3;NI +3839;21365;Adendorf;3355;Lueneburg;3;NI +3840;21368;Dahlenburg;3355;Lueneburg;3;NI +3841;21368;Dahlem;3355;Lueneburg;3;NI +3842;21368;Boitze;3355;Lueneburg;3;NI +3843;21369;Nahrendorf;3355;Lueneburg;3;NI +3844;21371;Tosterglope;3355;Lueneburg;3;NI +3845;21376;Goedenstorf;3353;Harburg;3;NI +3846;21376;Eyendorf;3353;Harburg;3;NI +3847;21376;Salzhausen;3353;Harburg;3;NI +3848;21376;Garlstorf;3353;Harburg;3;NI +3849;21379;Luedersburg;3355;Lueneburg;3;NI +3850;21379;Rullstorf;3355;Lueneburg;3;NI +3851;21379;Scharnebeck;3355;Lueneburg;3;NI +3852;21379;Echem;3355;Lueneburg;3;NI +3853;21380;Artlenburg;3355;Lueneburg;3;NI +3854;21382;Brietlingen;3355;Lueneburg;3;NI +3855;21385;Amelinghausen;3355;Lueneburg;3;NI +3856;21385;Rehlingen;3355;Lueneburg;3;NI +3857;21385;Oldendorf (Luhe);3355;Lueneburg;3;NI +3858;21386;Betzendorf;3355;Lueneburg;3;NI +3859;21388;Soderstorf;3355;Lueneburg;3;NI +3860;21391;Dachtmissen;3355;Lueneburg;3;NI +3861;21391;Reppenstedt;3355;Lueneburg;3;NI +3862;21394;Westergellersen;3355;Lueneburg;3;NI +3863;21394;Kirchgellersen;3355;Lueneburg;3;NI +3864;21394;Heiligenthal;3355;Lueneburg;3;NI +3865;21394;Suedergellersen;3355;Lueneburg;3;NI +3866;21395;Tespe;3353;Harburg;3;NI +3867;21397;Barendorf;3355;Lueneburg;3;NI +3868;21397;Vastorf;3355;Lueneburg;3;NI +3869;21398;Neetze;3355;Lueneburg;3;NI +3870;21400;Reinstorf;3355;Lueneburg;3;NI +3871;21401;Thomasburg;3355;Lueneburg;3;NI +3872;21403;Wendisch Evern;3355;Lueneburg;3;NI +3873;21406;Barnstedt;3355;Lueneburg;3;NI +3874;21406;Melbeck;3355;Lueneburg;3;NI +3875;21407;Deutsch Evern;3355;Lueneburg;3;NI +3876;21409;Embsen;3355;Lueneburg;3;NI +3877;21423;Drage;3353;Harburg;3;NI +3878;21423;Winsen (Luhe);3353;Harburg;3;NI +3879;21435;Stelle;3353;Harburg;3;NI +3880;21436;Marschacht;3353;Harburg;3;NI +3881;21438;Brackel;3353;Harburg;3;NI +3882;21439;Marxen;3353;Harburg;3;NI +3883;21441;Garstedt;3353;Harburg;3;NI +3884;21442;Toppenstedt;3353;Harburg;3;NI +3885;21444;Vierhoefen;3353;Harburg;3;NI +3886;21445;Wulfsen;3353;Harburg;3;NI +3887;21447;Handorf;3355;Lueneburg;3;NI +3888;21449;Radbruch;3355;Lueneburg;3;NI +3889;21465;Wentorf bei HH;1053;Herzogtum Lauenburg;1;SH +3890;21465;Reinbek;1062;Stormarn;1;SH +3891;21481;Buchhorst;1053;Herzogtum Lauenburg;1;SH +3892;21481;Schnakenbek;1053;Herzogtum Lauenburg;1;SH +3893;21481;Lauenburg/Elbe;1053;Herzogtum Lauenburg;1;SH +3894;21483;Luetau;1053;Herzogtum Lauenburg;1;SH +3895;21483;Kruezen;1053;Herzogtum Lauenburg;1;SH +3896;21483;Lanze;1053;Herzogtum Lauenburg;1;SH +3897;21483;Wangelau;1053;Herzogtum Lauenburg;1;SH +3898;21483;Juliusburg;1053;Herzogtum Lauenburg;1;SH +3899;21483;Guelzow;1053;Herzogtum Lauenburg;1;SH +3900;21483;Basedow;1053;Herzogtum Lauenburg;1;SH +3901;21483;Dalldorf;1053;Herzogtum Lauenburg;1;SH +3902;21483;Krukow;1053;Herzogtum Lauenburg;1;SH +3903;21493;Gross Pampau;1053;Herzogtum Lauenburg;1;SH +3904;21493;Fuhlenhagen;1053;Herzogtum Lauenburg;1;SH +3905;21493;Schretstaken;1053;Herzogtum Lauenburg;1;SH +3906;21493;Moehnsen;1053;Herzogtum Lauenburg;1;SH +3907;21493;Grabau;1053;Herzogtum Lauenburg;1;SH +3908;21493;Sahms;1053;Herzogtum Lauenburg;1;SH +3909;21493;Elmenhorst;1053;Herzogtum Lauenburg;1;SH +3910;21493;Basthorst;1053;Herzogtum Lauenburg;1;SH +3911;21493;Muehlenrade;1053;Herzogtum Lauenburg;1;SH +3912;21493;Grove;1053;Herzogtum Lauenburg;1;SH +3913;21493;Schwarzenbek;1053;Herzogtum Lauenburg;1;SH +3914;21493;Talkau;1053;Herzogtum Lauenburg;1;SH +3915;21493;Havekost;1053;Herzogtum Lauenburg;1;SH +3916;21502;Worth;1053;Herzogtum Lauenburg;1;SH +3917;21502;Geesthacht;1053;Herzogtum Lauenburg;1;SH +3918;21502;Hamwarde;1053;Herzogtum Lauenburg;1;SH +3919;21502;Wiershop;1053;Herzogtum Lauenburg;1;SH +3920;21509;Glinde;1062;Stormarn;1;SH +3921;21514;Kankelau;1053;Herzogtum Lauenburg;1;SH +3922;21514;Goettin;1053;Herzogtum Lauenburg;1;SH +3923;21514;Buechen;1053;Herzogtum Lauenburg;1;SH +3924;21514;Broethen;1053;Herzogtum Lauenburg;1;SH +3925;21514;Siebeneichen;1053;Herzogtum Lauenburg;1;SH +3926;21514;Fitzen;1053;Herzogtum Lauenburg;1;SH +3927;21514;Witzeeze;1053;Herzogtum Lauenburg;1;SH +3928;21514;Roseburg;1053;Herzogtum Lauenburg;1;SH +3929;21514;Klein Pampau;1053;Herzogtum Lauenburg;1;SH +3930;21514;Hornbek;1053;Herzogtum Lauenburg;1;SH +3931;21514;Guester;1053;Herzogtum Lauenburg;1;SH +3932;21514;Langenlehsten;1053;Herzogtum Lauenburg;1;SH +3933;21516;Woltersdorf;1053;Herzogtum Lauenburg;1;SH +3934;21516;Schulendorf;1053;Herzogtum Lauenburg;1;SH +3935;21516;Tramm;1053;Herzogtum Lauenburg;1;SH +3936;21516;Muessen;1053;Herzogtum Lauenburg;1;SH +3937;21521;Aumuehle;1053;Herzogtum Lauenburg;1;SH +3938;21521;Wohltorf;1053;Herzogtum Lauenburg;1;SH +3939;21521;Dassendorf;1053;Herzogtum Lauenburg;1;SH +3940;21522;Hittbergen;3355;Lueneburg;3;NI +3941;21522;Hohnstorf (Elbe);3355;Lueneburg;3;NI +3942;21524;Brunstorf;1053;Herzogtum Lauenburg;1;SH +3943;21526;Hohenhorn;1053;Herzogtum Lauenburg;1;SH +3944;21527;Kollow;1053;Herzogtum Lauenburg;1;SH +3945;21529;Kroeppelshagen-Fahrendorf;1053;Herzogtum Lauenburg;1;SH +3946;21614;Buxtehude;3359;Stade;3;NI +3947;21629;Neu Wulmstorf;3353;Harburg;3;NI +3948;21635;Jork;3359;Stade;3;NI +3949;21640;Nottensdorf;3359;Stade;3;NI +3950;21640;Neuenkirchen;3359;Stade;3;NI +3951;21640;Bliedersdorf;3359;Stade;3;NI +3952;21640;Horneburg;3359;Stade;3;NI +3953;21641;Apensen;3359;Stade;3;NI +3954;21643;Beckdorf;3359;Stade;3;NI +3955;21644;Sauensiek;3359;Stade;3;NI +3956;21646;Halvesbostel;3353;Harburg;3;NI +3957;21647;Moisburg;3353;Harburg;3;NI +3958;21649;Regesbostel;3353;Harburg;3;NI +3959;21680;Stade;3359;Stade;3;NI +3960;21682;Stade;3359;Stade;3;NI +3961;21683;Stade;3359;Stade;3;NI +3962;21684;Stade;3359;Stade;3;NI +3963;21684;Agathenburg;3359;Stade;3;NI +3964;21698;Harsefeld;3359;Stade;3;NI +3965;21698;Brest;3359;Stade;3;NI +3966;21698;Bargstedt;3359;Stade;3;NI +3967;21702;Ahlerstedt;3359;Stade;3;NI +3968;21706;Drochtersen;3359;Stade;3;NI +3969;21709;Burweg;3359;Stade;3;NI +3970;21709;Himmelpforten;3359;Stade;3;NI +3971;21709;Duedenbuettel;3359;Stade;3;NI +3972;21710;Engelschoff;3359;Stade;3;NI +3973;21712;Grossenwoerden;3359;Stade;3;NI +3974;21714;Hammah;3359;Stade;3;NI +3975;21717;Deinste;3359;Stade;3;NI +3976;21717;Fredenbeck;3359;Stade;3;NI +3977;21720;Steinkirchen;3359;Stade;3;NI +3978;21720;Guderhandviertel;3359;Stade;3;NI +3979;21720;Mittelnkirchen;3359;Stade;3;NI +3980;21720;Gruenendeich;3359;Stade;3;NI +3981;21723;Hollern-Twielenfleth;3359;Stade;3;NI +3982;21726;Kranenburg;3359;Stade;3;NI +3983;21726;Oldendorf;3359;Stade;3;NI +3984;21726;Heinbockel;3359;Stade;3;NI +3985;21727;Estorf;3359;Stade;3;NI +3986;21729;Freiburg (Elbe);3359;Stade;3;NI +3987;21730;Balje;3359;Stade;3;NI +3988;21732;Krummendeich;3359;Stade;3;NI +3989;21734;Oederquart;3359;Stade;3;NI +3990;21737;Wischhafen;3359;Stade;3;NI +3991;21739;Dollern;3359;Stade;3;NI +3992;21745;Hemmoor;3352;Cuxhaven;3;NI +3993;21755;Hechthausen;3352;Cuxhaven;3;NI +3994;21756;Osten;3352;Cuxhaven;3;NI +3995;21762;Osterbruch;3352;Cuxhaven;3;NI +3996;21762;Otterndorf;3352;Cuxhaven;3;NI +3997;21763;Neuenkirchen;3352;Cuxhaven;3;NI +3998;21765;Nordleda;3352;Cuxhaven;3;NI +3999;21769;Hollnseth;3352;Cuxhaven;3;NI +4000;21769;Armstorf;3352;Cuxhaven;3;NI +4001;21769;Lamstedt;3352;Cuxhaven;3;NI +4002;21770;Mittelstenahe;3352;Cuxhaven;3;NI +4003;21772;Stinstedt;3352;Cuxhaven;3;NI +4004;21775;Odisheim;3352;Cuxhaven;3;NI +4005;21775;Ihlienworth;3352;Cuxhaven;3;NI +4006;21775;Steinau;3352;Cuxhaven;3;NI +4007;21776;Wanna;3352;Cuxhaven;3;NI +4008;21781;Cadenberge;3352;Cuxhaven;3;NI +4009;21782;Buelkau;3352;Cuxhaven;3;NI +4010;21784;Geversdorf;3352;Cuxhaven;3;NI +4011;21785;Belum;3352;Cuxhaven;3;NI +4012;21785;Neuhaus an der Oste;3352;Cuxhaven;3;NI +4013;21787;Oberndorf;3352;Cuxhaven;3;NI +4014;21789;Wingst;3352;Cuxhaven;3;NI +4015;22041;HH;2000;HH, Freie und Hansestadt;2;HH +4016;22041;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4017;22043;HH;2000;HH, Freie und Hansestadt;2;HH +4018;22043;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4019;22045;HH;2000;HH, Freie und Hansestadt;2;HH +4020;22045;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4021;22047;HH;2000;HH, Freie und Hansestadt;2;HH +4022;22047;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4023;22049;HH;2000;HH, Freie und Hansestadt;2;HH +4024;22049;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4025;22081;HH;2000;HH, Freie und Hansestadt;2;HH +4026;22081;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4027;22083;HH;2000;HH, Freie und Hansestadt;2;HH +4028;22083;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4029;22085;HH;2000;HH, Freie und Hansestadt;2;HH +4030;22085;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4031;22087;HH;2000;HH, Freie und Hansestadt;2;HH +4032;22087;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4033;22089;HH;2000;HH, Freie und Hansestadt;2;HH +4034;22089;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4035;22111;HH;2000;HH, Freie und Hansestadt;2;HH +4036;22111;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4037;22113;HH;2000;HH, Freie und Hansestadt;2;HH +4038;22113;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4039;22113;Oststeinbek;1062;Stormarn;1;SH +4040;22115;HH;2000;HH, Freie und Hansestadt;2;HH +4041;22115;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4042;22117;HH;2000;HH, Freie und Hansestadt;2;HH +4043;22117;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4044;22119;HH;2000;HH, Freie und Hansestadt;2;HH +4045;22119;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4046;22143;HH;2000;HH, Freie und Hansestadt;2;HH +4047;22143;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4048;22145;HH;2000;HH, Freie und Hansestadt;2;HH +4049;22145;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4050;22145;Braak;1062;Stormarn;1;SH +4051;22145;Stapelfeld;1062;Stormarn;1;SH +4052;22147;HH;2000;HH, Freie und Hansestadt;2;HH +4053;22147;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4054;22149;HH;2000;HH, Freie und Hansestadt;2;HH +4055;22149;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4056;22159;HH;2000;HH, Freie und Hansestadt;2;HH +4057;22159;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4058;22175;HH;2000;HH, Freie und Hansestadt;2;HH +4059;22175;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4060;22177;HH;2000;HH, Freie und Hansestadt;2;HH +4061;22177;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4062;22179;HH;2000;HH, Freie und Hansestadt;2;HH +4063;22179;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4064;22297;HH;2000;HH, Freie und Hansestadt;2;HH +4065;22297;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4066;22299;HH;2000;HH, Freie und Hansestadt;2;HH +4067;22299;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4068;22301;HH;2000;HH, Freie und Hansestadt;2;HH +4069;22301;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4070;22303;HH;2000;HH, Freie und Hansestadt;2;HH +4071;22303;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4072;22305;HH;2000;HH, Freie und Hansestadt;2;HH +4073;22305;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4074;22307;HH;2000;HH, Freie und Hansestadt;2;HH +4075;22307;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4076;22309;HH;2000;HH, Freie und Hansestadt;2;HH +4077;22309;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4078;22335;HH;2000;HH, Freie und Hansestadt;2;HH +4079;22335;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4080;22337;HH;2000;HH, Freie und Hansestadt;2;HH +4081;22337;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4082;22339;HH;2000;HH, Freie und Hansestadt;2;HH +4083;22339;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4084;22359;HH;2000;HH, Freie und Hansestadt;2;HH +4085;22359;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4086;22391;HH;2000;HH, Freie und Hansestadt;2;HH +4087;22391;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4088;22393;HH;2000;HH, Freie und Hansestadt;2;HH +4089;22393;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4090;22395;HH;2000;HH, Freie und Hansestadt;2;HH +4091;22395;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4092;22397;HH;2000;HH, Freie und Hansestadt;2;HH +4093;22397;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4094;22399;HH;2000;HH, Freie und Hansestadt;2;HH +4095;22399;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4096;22415;HH;2000;HH, Freie und Hansestadt;2;HH +4097;22415;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4098;22417;HH;2000;HH, Freie und Hansestadt;2;HH +4099;22417;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4100;22419;HH;2000;HH, Freie und Hansestadt;2;HH +4101;22419;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4102;22453;HH;2000;HH, Freie und Hansestadt;2;HH +4103;22453;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4104;22455;HH;2000;HH, Freie und Hansestadt;2;HH +4105;22455;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4106;22457;HH;2000;HH, Freie und Hansestadt;2;HH +4107;22457;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4108;22459;HH;2000;HH, Freie und Hansestadt;2;HH +4109;22459;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4110;22523;HH;2000;HH, Freie und Hansestadt;2;HH +4111;22523;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4112;22525;HH;2000;HH, Freie und Hansestadt;2;HH +4113;22525;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4114;22527;HH;2000;HH, Freie und Hansestadt;2;HH +4115;22527;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4116;22529;HH;2000;HH, Freie und Hansestadt;2;HH +4117;22529;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4118;22547;HH;2000;HH, Freie und Hansestadt;2;HH +4119;22547;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4120;22549;HH;2000;HH, Freie und Hansestadt;2;HH +4121;22549;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4122;22559;HH;2000;HH, Freie und Hansestadt;2;HH +4123;22559;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4124;22587;HH;2000;HH, Freie und Hansestadt;2;HH +4125;22587;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4126;22589;HH;2000;HH, Freie und Hansestadt;2;HH +4127;22589;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4128;22605;HH;2000;HH, Freie und Hansestadt;2;HH +4129;22605;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4130;22607;HH;2000;HH, Freie und Hansestadt;2;HH +4131;22607;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4132;22609;HH;2000;HH, Freie und Hansestadt;2;HH +4133;22609;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4134;22761;HH;2000;HH, Freie und Hansestadt;2;HH +4135;22761;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4136;22763;HH;2000;HH, Freie und Hansestadt;2;HH +4137;22763;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4138;22765;HH;2000;HH, Freie und Hansestadt;2;HH +4139;22765;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4140;22767;HH;2000;HH, Freie und Hansestadt;2;HH +4141;22767;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4142;22769;HH;2000;HH, Freie und Hansestadt;2;HH +4143;22769;Hampuri;2000;HH, Freie und Hansestadt;2;HH +4144;22844;Norderstedt;1060;Segeberg;1;SH +4145;22846;Norderstedt;1060;Segeberg;1;SH +4146;22848;Norderstedt;1060;Segeberg;1;SH +4147;22850;Norderstedt;1060;Segeberg;1;SH +4148;22851;Norderstedt;1060;Segeberg;1;SH +4149;22869;Schenefeld;1056;Pinneberg;1;SH +4150;22880;Wedel;1056;Pinneberg;1;SH +4151;22885;Barsbuettel;1062;Stormarn;1;SH +4152;22889;Tangstedt;1062;Stormarn;1;SH +4153;22926;Ahrensburg;1062;Stormarn;1;SH +4154;22927;Grosshansdorf;1062;Stormarn;1;SH +4155;22929;Hamfelde in Holstein;1062;Stormarn;1;SH +4156;22929;Hamfelde in Lauenburg;1053;Herzogtum Lauenburg;1;SH +4157;22929;Rausdorf;1062;Stormarn;1;SH +4158;22929;Koethel;1053;Herzogtum Lauenburg;1;SH +4159;22929;Delingsdorf;1062;Stormarn;1;SH +4160;22929;Kasseburg;1053;Herzogtum Lauenburg;1;SH +4161;22929;Schoenberg;1053;Herzogtum Lauenburg;1;SH +4162;22929;Hammoor;1062;Stormarn;1;SH +4163;22941;Bargteheide;1062;Stormarn;1;SH +4164;22941;Jersbek;1062;Stormarn;1;SH +4165;22946;Hohenfelde;1062;Stormarn;1;SH +4166;22946;Trittau;1062;Stormarn;1;SH +4167;22946;Brunsbek;1062;Stormarn;1;SH +4168;22946;Grande;1062;Stormarn;1;SH +4169;22946;Dahmker;1053;Herzogtum Lauenburg;1;SH +4170;22946;Grossensee;1062;Stormarn;1;SH +4171;22949;Ammersbek;1062;Stormarn;1;SH +4172;22952;Luetjensee;1062;Stormarn;1;SH +4173;22955;Hoisdorf;1062;Stormarn;1;SH +4174;22956;Groenwohld;1062;Stormarn;1;SH +4175;22958;Kuddewoerde;1053;Herzogtum Lauenburg;1;SH +4176;22959;Linau;1053;Herzogtum Lauenburg;1;SH +4177;22962;Siek;1062;Stormarn;1;SH +4178;22964;Steinburg;1062;Stormarn;1;SH +4179;22965;Todendorf;1062;Stormarn;1;SH +4180;22967;Tremsbuettel;1062;Stormarn;1;SH +4181;22969;Witzhave;1062;Stormarn;1;SH +4182;23552;Luebeck;1003;Luebeck, Hansestadt;1;SH +4183;23554;Luebeck;1003;Luebeck, Hansestadt;1;SH +4184;23556;Luebeck;1003;Luebeck, Hansestadt;1;SH +4185;23558;Luebeck;1003;Luebeck, Hansestadt;1;SH +4186;23560;Luebeck;1003;Luebeck, Hansestadt;1;SH +4187;23562;Luebeck;1003;Luebeck, Hansestadt;1;SH +4188;23564;Luebeck;1003;Luebeck, Hansestadt;1;SH +4189;23566;Luebeck;1003;Luebeck, Hansestadt;1;SH +4190;23568;Luebeck;1003;Luebeck, Hansestadt;1;SH +4191;23569;Luebeck;1003;Luebeck, Hansestadt;1;SH +4192;23570;Luebeck;1003;Luebeck, Hansestadt;1;SH +4193;23611;Bad Schwartau;1055;Ostholstein;1;SH +4194;23617;Stockelsdorf;1055;Ostholstein;1;SH +4195;23619;Rehhorst;1062;Stormarn;1;SH +4196;23619;Moenkhagen;1062;Stormarn;1;SH +4197;23619;Zarpen;1062;Stormarn;1;SH +4198;23619;Hamberge;1062;Stormarn;1;SH +4199;23619;Heilshoop;1062;Stormarn;1;SH +4200;23619;Badendorf;1062;Stormarn;1;SH +4201;23623;Ahrensboek;1055;Ostholstein;1;SH +4202;23626;Ratekau;1055;Ostholstein;1;SH +4203;23627;Gross Groenau;1053;Herzogtum Lauenburg;1;SH +4204;23627;Gross Sarau;1053;Herzogtum Lauenburg;1;SH +4205;23628;Krummesse;1053;Herzogtum Lauenburg;1;SH +4206;23628;Klempau;1053;Herzogtum Lauenburg;1;SH +4207;23669;Timmendorfer Strand;1055;Ostholstein;1;SH +4208;23683;Scharbeutz;1055;Ostholstein;1;SH +4209;23684;Scharbeutz;1055;Ostholstein;1;SH +4210;23701;Suesel;1055;Ostholstein;1;SH +4211;23701;Eutin;1055;Ostholstein;1;SH +4212;23714;Kirchnuechel;1057;Ploen;1;SH +4213;23714;Malente;1055;Ostholstein;1;SH +4214;23715;Bosau;1055;Ostholstein;1;SH +4215;23717;Kasseedorf;1055;Ostholstein;1;SH +4216;23719;Glasau;1060;Segeberg;1;SH +4217;23730;Schashagen;1055;Ostholstein;1;SH +4218;23730;Neustadt in Holstein;1055;Ostholstein;1;SH +4219;23730;Sierksdorf;1055;Ostholstein;1;SH +4220;23730;Altenkrempe;1055;Ostholstein;1;SH +4221;23738;Lensahn;1055;Ostholstein;1;SH +4222;23738;Beschendorf;1055;Ostholstein;1;SH +4223;23738;Manhagen;1055;Ostholstein;1;SH +4224;23738;Kabelhorst;1055;Ostholstein;1;SH +4225;23738;Riepsdorf;1055;Ostholstein;1;SH +4226;23738;Harmsdorf;1055;Ostholstein;1;SH +4227;23738;Damlos;1055;Ostholstein;1;SH +4228;23743;Groemitz;1055;Ostholstein;1;SH +4229;23744;Schoenwalde am Bungsberg;1055;Ostholstein;1;SH +4230;23746;Kellenhusen;1055;Ostholstein;1;SH +4231;23747;Dahme;1055;Ostholstein;1;SH +4232;23749;Grube;1055;Ostholstein;1;SH +4233;23758;Goehl;1055;Ostholstein;1;SH +4234;23758;Wangels;1055;Ostholstein;1;SH +4235;23758;Oldenburg in Holstein;1055;Ostholstein;1;SH +4236;23758;Gremersdorf;1055;Ostholstein;1;SH +4237;23769;Fehmarn;1055;Ostholstein;1;SH +4238;23774;Heiligenhafen;1055;Ostholstein;1;SH +4239;23775;Grossenbrode;1055;Ostholstein;1;SH +4240;23777;Heringsdorf;1055;Ostholstein;1;SH +4241;23779;Neukirchen;1055;Ostholstein;1;SH +4242;23795;Stipsdorf;1060;Segeberg;1;SH +4243;23795;Bad Segeberg;1060;Segeberg;1;SH +4244;23795;Fahrenkrug;1060;Segeberg;1;SH +4245;23795;Gross Roennau;1060;Segeberg;1;SH +4246;23795;Weede;1060;Segeberg;1;SH +4247;23795;Negernboetel;1060;Segeberg;1;SH +4248;23795;Moezen;1060;Segeberg;1;SH +4249;23795;Hoegersdorf;1060;Segeberg;1;SH +4250;23795;Schwissel;1060;Segeberg;1;SH +4251;23795;Klein Roennau;1060;Segeberg;1;SH +4252;23795;Traventhal;1060;Segeberg;1;SH +4253;23795;Klein Gladebruegge;1060;Segeberg;1;SH +4254;23795;Schieren;1060;Segeberg;1;SH +4255;23795;Schackendorf;1060;Segeberg;1;SH +4256;23812;Wahlstedt;1060;Segeberg;1;SH +4257;23813;Nehms;1060;Segeberg;1;SH +4258;23813;Blunk;1060;Segeberg;1;SH +4259;23815;Geschendorf;1060;Segeberg;1;SH +4260;23815;Strukdorf;1060;Segeberg;1;SH +4261;23815;Westerrade;1060;Segeberg;1;SH +4262;23816;Neversdorf;1060;Segeberg;1;SH +4263;23816;Gross Niendorf;1060;Segeberg;1;SH +4264;23816;Leezen;1060;Segeberg;1;SH +4265;23816;Bebensee;1060;Segeberg;1;SH +4266;23818;Neuengoers;1060;Segeberg;1;SH +4267;23820;Pronstorf;1060;Segeberg;1;SH +4268;23821;Rohlstorf;1060;Segeberg;1;SH +4269;23823;Seedorf;1060;Segeberg;1;SH +4270;23824;Tensfeld;1060;Segeberg;1;SH +4271;23824;Damsdorf;1060;Segeberg;1;SH +4272;23826;Fredesdorf;1060;Segeberg;1;SH +4273;23826;Bark;1060;Segeberg;1;SH +4274;23826;Todesfelde;1060;Segeberg;1;SH +4275;23827;Travenhorst;1060;Segeberg;1;SH +4276;23827;Krems II;1060;Segeberg;1;SH +4277;23827;Wensin;1060;Segeberg;1;SH +4278;23829;Wittenborn;1060;Segeberg;1;SH +4279;23829;Kuekels;1060;Segeberg;1;SH +4280;23843;Bad Oldesloe;1062;Stormarn;1;SH +4281;23843;Travenbrueck;1062;Stormarn;1;SH +4282;23843;Ruempel;1062;Stormarn;1;SH +4283;23843;Neritz;1062;Stormarn;1;SH +4284;23845;Bahrenhof;1060;Segeberg;1;SH +4285;23845;Wakendorf I;1060;Segeberg;1;SH +4286;23845;Buehnsdorf;1060;Segeberg;1;SH +4287;23845;Seth;1060;Segeberg;1;SH +4288;23845;Grabau;1062;Stormarn;1;SH +4289;23845;Oering;1060;Segeberg;1;SH +4290;23845;Dreggers;1060;Segeberg;1;SH +4291;23845;Itzstedt;1060;Segeberg;1;SH +4292;23847;Lasbek;1062;Stormarn;1;SH +4293;23847;Poelitz;1062;Stormarn;1;SH +4294;23847;Westerau;1062;Stormarn;1;SH +4295;23847;Steinhorst;1053;Herzogtum Lauenburg;1;SH +4296;23847;Schiphorst;1053;Herzogtum Lauenburg;1;SH +4297;23847;Schuerensoehlen;1053;Herzogtum Lauenburg;1;SH +4298;23847;Bliestorf;1053;Herzogtum Lauenburg;1;SH +4299;23847;Rethwisch;1062;Stormarn;1;SH +4300;23847;Sierksrade;1053;Herzogtum Lauenburg;1;SH +4301;23847;Kastorf;1053;Herzogtum Lauenburg;1;SH +4302;23847;Gross Boden;1053;Herzogtum Lauenburg;1;SH +4303;23847;Duechelsdorf;1053;Herzogtum Lauenburg;1;SH +4304;23847;Meddewade;1062;Stormarn;1;SH +4305;23847;Stubben;1053;Herzogtum Lauenburg;1;SH +4306;23847;Grinau;1053;Herzogtum Lauenburg;1;SH +4307;23847;Siebenbaeumen;1053;Herzogtum Lauenburg;1;SH +4308;23858;Feldhorst;1062;Stormarn;1;SH +4309;23858;Reinfeld (Holstein);1062;Stormarn;1;SH +4310;23858;Barnitz;1062;Stormarn;1;SH +4311;23858;Wesenberg;1062;Stormarn;1;SH +4312;23858;Heidekamp;1062;Stormarn;1;SH +4313;23860;Gross Schenkenberg;1053;Herzogtum Lauenburg;1;SH +4314;23860;Klein Wesenberg;1062;Stormarn;1;SH +4315;23863;Nienwohld;1062;Stormarn;1;SH +4316;23863;Kayhude;1060;Segeberg;1;SH +4317;23863;Bargfeld-Stegen;1062;Stormarn;1;SH +4318;23866;Nahe;1060;Segeberg;1;SH +4319;23867;Suelfeld;1060;Segeberg;1;SH +4320;23869;Elmenhorst;1062;Stormarn;1;SH +4321;23879;Moelln;1053;Herzogtum Lauenburg;1;SH +4322;23881;Baelau;1053;Herzogtum Lauenburg;1;SH +4323;23881;Niendorf an der Stecknitz;1053;Herzogtum Lauenburg;1;SH +4324;23881;Koberg;1053;Herzogtum Lauenburg;1;SH +4325;23881;Borstorf;1053;Herzogtum Lauenburg;1;SH +4326;23881;Breitenfelde;1053;Herzogtum Lauenburg;1;SH +4327;23881;Alt Moelln;1053;Herzogtum Lauenburg;1;SH +4328;23881;Lankau;1053;Herzogtum Lauenburg;1;SH +4329;23883;Sterley;1053;Herzogtum Lauenburg;1;SH +4330;23883;Brunsmark;1053;Herzogtum Lauenburg;1;SH +4331;23883;Seedorf;1053;Herzogtum Lauenburg;1;SH +4332;23883;Klein Zecher;1053;Herzogtum Lauenburg;1;SH +4333;23883;Grambek;1053;Herzogtum Lauenburg;1;SH +4334;23883;Horst;1053;Herzogtum Lauenburg;1;SH +4335;23883;Lehmrade;1053;Herzogtum Lauenburg;1;SH +4336;23883;Hollenbek;1053;Herzogtum Lauenburg;1;SH +4337;23896;Walksfelde;1053;Herzogtum Lauenburg;1;SH +4338;23896;Ritzerau;1053;Herzogtum Lauenburg;1;SH +4339;23896;Poggensee;1053;Herzogtum Lauenburg;1;SH +4340;23896;Panten;1053;Herzogtum Lauenburg;1;SH +4341;23896;Nusse;1053;Herzogtum Lauenburg;1;SH +4342;23898;Labenz;1053;Herzogtum Lauenburg;1;SH +4343;23898;Sirksfelde;1053;Herzogtum Lauenburg;1;SH +4344;23898;Luechow;1053;Herzogtum Lauenburg;1;SH +4345;23898;Wentorf;1053;Herzogtum Lauenburg;1;SH +4346;23898;Sandesneben;1053;Herzogtum Lauenburg;1;SH +4347;23898;Kuehsen;1053;Herzogtum Lauenburg;1;SH +4348;23898;Klinkrade;1053;Herzogtum Lauenburg;1;SH +4349;23898;Duvensee;1053;Herzogtum Lauenburg;1;SH +4350;23899;Besenthal;1053;Herzogtum Lauenburg;1;SH +4351;23899;Gudow;1053;Herzogtum Lauenburg;1;SH +4352;23909;Mechow;1053;Herzogtum Lauenburg;1;SH +4353;23909;Fredeburg;1053;Herzogtum Lauenburg;1;SH +4354;23909;Giesensdorf;1053;Herzogtum Lauenburg;1;SH +4355;23909;Albsfelde;1053;Herzogtum Lauenburg;1;SH +4356;23909;Roemnitz;1053;Herzogtum Lauenburg;1;SH +4357;23909;Baek;1053;Herzogtum Lauenburg;1;SH +4358;23909;Ratzeburg;1053;Herzogtum Lauenburg;1;SH +4359;23911;Mustin;1053;Herzogtum Lauenburg;1;SH +4360;23911;Salem;1053;Herzogtum Lauenburg;1;SH +4361;23911;Pogeez;1053;Herzogtum Lauenburg;1;SH +4362;23911;Buchholz;1053;Herzogtum Lauenburg;1;SH +4363;23911;Ziethen;1053;Herzogtum Lauenburg;1;SH +4364;23911;Kulpin;1053;Herzogtum Lauenburg;1;SH +4365;23911;Kittlitz;1053;Herzogtum Lauenburg;1;SH +4366;23911;Harmsdorf;1053;Herzogtum Lauenburg;1;SH +4367;23911;Schmilau;1053;Herzogtum Lauenburg;1;SH +4368;23911;Einhaus;1053;Herzogtum Lauenburg;1;SH +4369;23911;Gross Disnack;1053;Herzogtum Lauenburg;1;SH +4370;23919;Berkenthin;1053;Herzogtum Lauenburg;1;SH +4371;23919;Goeldenitz;1053;Herzogtum Lauenburg;1;SH +4372;23919;Niendorf;1053;Herzogtum Lauenburg;1;SH +4373;23919;Behlendorf;1053;Herzogtum Lauenburg;1;SH +4374;23919;Rondeshagen;1053;Herzogtum Lauenburg;1;SH +4375;23923;Schoenberg;13058;Nordwestmecklenburg;13;MV +4376;23923;Niendorf;13058;Nordwestmecklenburg;13;MV +4377;23923;Roduchelstorf;13058;Nordwestmecklenburg;13;MV +4378;23923;Gross Siemz;13058;Nordwestmecklenburg;13;MV +4379;23923;Selmsdorf;13058;Nordwestmecklenburg;13;MV +4380;23923;Lockwisch;13058;Nordwestmecklenburg;13;MV +4381;23923;Luedersdorf;13058;Nordwestmecklenburg;13;MV +4382;23923;Menzendorf;13058;Nordwestmecklenburg;13;MV +4383;23936;Bernstorf;13058;Nordwestmecklenburg;13;MV +4384;23936;Upahl;13058;Nordwestmecklenburg;13;MV +4385;23936;Papenhusen;13058;Nordwestmecklenburg;13;MV +4386;23936;Mallentin;13058;Nordwestmecklenburg;13;MV +4387;23936;Plueschow;13058;Nordwestmecklenburg;13;MV +4388;23936;Warnow;13058;Nordwestmecklenburg;13;MV +4389;23936;Testorf-Steinfort;13058;Nordwestmecklenburg;13;MV +4390;23936;Grieben;13058;Nordwestmecklenburg;13;MV +4391;23936;Hanshagen;13058;Nordwestmecklenburg;13;MV +4392;23936;Roggenstorf;13058;Nordwestmecklenburg;13;MV +4393;23936;Rueting;13058;Nordwestmecklenburg;13;MV +4394;23936;Boerzow;13058;Nordwestmecklenburg;13;MV +4395;23936;Grevesmuehlen;13058;Nordwestmecklenburg;13;MV +4396;23942;Kalkhorst;13058;Nordwestmecklenburg;13;MV +4397;23942;Poetenitz;13058;Nordwestmecklenburg;13;MV +4398;23942;Harkensee;13058;Nordwestmecklenburg;13;MV +4399;23942;Dassow;13058;Nordwestmecklenburg;13;MV +4400;23946;Boltenhagen;13058;Nordwestmecklenburg;13;MV +4401;23948;Moor-Rolofshagen;13058;Nordwestmecklenburg;13;MV +4402;23948;Damshagen;13058;Nordwestmecklenburg;13;MV +4403;23948;Kluetz;13058;Nordwestmecklenburg;13;MV +4404;23948;Elmenhorst;13058;Nordwestmecklenburg;13;MV +4405;23948;Gross Walmstorf;13058;Nordwestmecklenburg;13;MV +4406;23966;Wismar;13006;Wismar;13;MV +4407;23968;Barnekow;13058;Nordwestmecklenburg;13;MV +4408;23968;Gramkow;13058;Nordwestmecklenburg;13;MV +4409;23968;Zierow;13058;Nordwestmecklenburg;13;MV +4410;23968;Wismar;13006;Wismar;13;MV +4411;23968;Gaegelow;13058;Nordwestmecklenburg;13;MV +4412;23970;Wismar;13006;Wismar;13;MV +4413;23970;Benz;13058;Nordwestmecklenburg;13;MV +4414;23972;Schimm;13058;Nordwestmecklenburg;13;MV +4415;23972;Dorf Mecklenburg;13058;Nordwestmecklenburg;13;MV +4416;23972;Gross Stieten;13058;Nordwestmecklenburg;13;MV +4417;23972;Metelsdorf;13058;Nordwestmecklenburg;13;MV +4418;23972;Luebow;13058;Nordwestmecklenburg;13;MV +4419;23974;Neuburg;13058;Nordwestmecklenburg;13;MV +4420;23974;Hornstorf;13058;Nordwestmecklenburg;13;MV +4421;23974;Krusenhagen;13058;Nordwestmecklenburg;13;MV +4422;23974;Blowatz;13058;Nordwestmecklenburg;13;MV +4423;23974;Boiensdorf;13058;Nordwestmecklenburg;13;MV +4424;23992;Zurow;13058;Nordwestmecklenburg;13;MV +4425;23992;Neukloster;13058;Nordwestmecklenburg;13;MV +4426;23992;Glasin;13058;Nordwestmecklenburg;13;MV +4427;23992;Luebberstorf;13058;Nordwestmecklenburg;13;MV +4428;23992;Passee;13058;Nordwestmecklenburg;13;MV +4429;23992;Zuesow;13058;Nordwestmecklenburg;13;MV +4430;23996;Gross Krankow;13058;Nordwestmecklenburg;13;MV +4431;23996;Bobitz;13058;Nordwestmecklenburg;13;MV +4432;23996;Beidendorf;13058;Nordwestmecklenburg;13;MV +4433;23996;Bad Kleinen;13058;Nordwestmecklenburg;13;MV +4434;23996;Hohen Viecheln;13058;Nordwestmecklenburg;13;MV +4435;23999;Insel Poel;13058;Nordwestmecklenburg;13;MV +4436;24103;Kiel;1002;Kiel;1;SH +4437;24105;Kiel;1002;Kiel;1;SH +4438;24106;Kiel;1002;Kiel;1;SH +4439;24107;Kiel;1002;Kiel;1;SH +4440;24107;Quarnbek;1058;Rendsburg-Eckernfoerde;1;SH +4441;24107;Ottendorf;1058;Rendsburg-Eckernfoerde;1;SH +4442;24109;Kiel;1002;Kiel;1;SH +4443;24109;Melsdorf;1058;Rendsburg-Eckernfoerde;1;SH +4444;24111;Kiel;1002;Kiel;1;SH +4445;24113;Kiel;1002;Kiel;1;SH +4446;24113;Molfsee;1058;Rendsburg-Eckernfoerde;1;SH +4447;24114;Kiel;1002;Kiel;1;SH +4448;24116;Kiel;1002;Kiel;1;SH +4449;24118;Kiel;1002;Kiel;1;SH +4450;24119;Kronshagen;1058;Rendsburg-Eckernfoerde;1;SH +4451;24143;Kiel;1002;Kiel;1;SH +4452;24145;Kiel;1002;Kiel;1;SH +4453;24146;Kiel;1002;Kiel;1;SH +4454;24147;Kiel;1002;Kiel;1;SH +4455;24147;Klausdorf;1057;Ploen;1;SH +4456;24148;Kiel;1002;Kiel;1;SH +4457;24149;Kiel;1002;Kiel;1;SH +4458;24159;Kiel;1002;Kiel;1;SH +4459;24161;Altenholz;1058;Rendsburg-Eckernfoerde;1;SH +4460;24211;Lehmkuhlen;1057;Ploen;1;SH +4461;24211;Kuehren;1057;Ploen;1;SH +4462;24211;Pohnsdorf;1057;Ploen;1;SH +4463;24211;Honigsee;1057;Ploen;1;SH +4464;24211;Schellhorn;1057;Ploen;1;SH +4465;24211;Preetz;1057;Ploen;1;SH +4466;24211;Postfeld;1057;Ploen;1;SH +4467;24211;Rastorf;1057;Ploen;1;SH +4468;24211;Wahlstorf;1057;Ploen;1;SH +4469;24214;Neudorf-Bornstein;1058;Rendsburg-Eckernfoerde;1;SH +4470;24214;Gettorf;1058;Rendsburg-Eckernfoerde;1;SH +4471;24214;Tuettendorf;1058;Rendsburg-Eckernfoerde;1;SH +4472;24214;Lindau;1058;Rendsburg-Eckernfoerde;1;SH +4473;24214;Neuwittenbek;1058;Rendsburg-Eckernfoerde;1;SH +4474;24214;Schinkel;1058;Rendsburg-Eckernfoerde;1;SH +4475;24214;Noer;1058;Rendsburg-Eckernfoerde;1;SH +4476;24217;Hoehndorf;1057;Ploen;1;SH +4477;24217;Wisch;1057;Ploen;1;SH +4478;24217;Schoenberg (Holstein);1057;Ploen;1;SH +4479;24217;Krokau;1057;Ploen;1;SH +4480;24217;Krummbek;1057;Ploen;1;SH +4481;24217;Barsbek;1057;Ploen;1;SH +4482;24217;Stakendorf;1057;Ploen;1;SH +4483;24217;Fiefbergen;1057;Ploen;1;SH +4484;24217;Bendfeld;1057;Ploen;1;SH +4485;24220;Boksee;1057;Ploen;1;SH +4486;24220;Boehnhusen;1058;Rendsburg-Eckernfoerde;1;SH +4487;24220;Flintbek;1058;Rendsburg-Eckernfoerde;1;SH +4488;24220;Techelsdorf;1058;Rendsburg-Eckernfoerde;1;SH +4489;24220;Schoenhorst;1058;Rendsburg-Eckernfoerde;1;SH +4490;24223;Raisdorf;1057;Ploen;1;SH +4491;24226;Heikendorf;1057;Ploen;1;SH +4492;24229;Strande;1058;Rendsburg-Eckernfoerde;1;SH +4493;24229;Schwedeneck;1058;Rendsburg-Eckernfoerde;1;SH +4494;24229;Daenischenhagen;1058;Rendsburg-Eckernfoerde;1;SH +4495;24232;Schoenkirchen;1057;Ploen;1;SH +4496;24232;Dobersdorf;1057;Ploen;1;SH +4497;24235;Laboe;1057;Ploen;1;SH +4498;24235;Lutterbek;1057;Ploen;1;SH +4499;24235;Stein;1057;Ploen;1;SH +4500;24235;Wendtorf;1057;Ploen;1;SH +4501;24235;Brodersdorf;1057;Ploen;1;SH +4502;24238;Lammershagen;1057;Ploen;1;SH +4503;24238;Selent;1057;Ploen;1;SH +4504;24238;Martensrade;1057;Ploen;1;SH +4505;24238;Mucheln;1057;Ploen;1;SH +4506;24239;Achterwehr;1058;Rendsburg-Eckernfoerde;1;SH +4507;24241;Schierensee;1058;Rendsburg-Eckernfoerde;1;SH +4508;24241;Soeren;1058;Rendsburg-Eckernfoerde;1;SH +4509;24241;Grevenkrug;1058;Rendsburg-Eckernfoerde;1;SH +4510;24241;Schmalstede;1058;Rendsburg-Eckernfoerde;1;SH +4511;24241;Reesdorf;1058;Rendsburg-Eckernfoerde;1;SH +4512;24241;Blumenthal;1058;Rendsburg-Eckernfoerde;1;SH +4513;24242;Felde;1058;Rendsburg-Eckernfoerde;1;SH +4514;24244;Felm;1058;Rendsburg-Eckernfoerde;1;SH +4515;24245;Klein Barkau;1057;Ploen;1;SH +4516;24245;Barmissen;1057;Ploen;1;SH +4517;24245;Kirchbarkau;1057;Ploen;1;SH +4518;24245;Grossbarkau;1057;Ploen;1;SH +4519;24247;Rodenbek;1058;Rendsburg-Eckernfoerde;1;SH +4520;24247;Mielkendorf;1058;Rendsburg-Eckernfoerde;1;SH +4521;24248;Moenkeberg;1057;Ploen;1;SH +4522;24250;Warnau;1057;Ploen;1;SH +4523;24250;Nettelsee;1057;Ploen;1;SH +4524;24250;Loeptin;1057;Ploen;1;SH +4525;24250;Bothkamp;1057;Ploen;1;SH +4526;24251;Osdorf;1058;Rendsburg-Eckernfoerde;1;SH +4527;24253;Probsteierhagen;1057;Ploen;1;SH +4528;24253;Fahren;1057;Ploen;1;SH +4529;24253;Prasdorf;1057;Ploen;1;SH +4530;24253;Passade;1057;Ploen;1;SH +4531;24254;Rumohr;1058;Rendsburg-Eckernfoerde;1;SH +4532;24256;Fargau-Pratjau;1057;Ploen;1;SH +4533;24256;Stoltenberg;1057;Ploen;1;SH +4534;24256;Schlesen;1057;Ploen;1;SH +4535;24257;Hohenfelde;1057;Ploen;1;SH +4536;24257;Schwartbuck;1057;Ploen;1;SH +4537;24257;Koehn;1057;Ploen;1;SH +4538;24259;Westensee;1058;Rendsburg-Eckernfoerde;1;SH +4539;24306;Wittmoldt;1057;Ploen;1;SH +4540;24306;Lebrade;1057;Ploen;1;SH +4541;24306;Boesdorf;1057;Ploen;1;SH +4542;24306;Ploen;1057;Ploen;1;SH +4543;24306;Rathjensdorf;1057;Ploen;1;SH +4544;24321;Hohwacht;1057;Ploen;1;SH +4545;24321;Klamp;1057;Ploen;1;SH +4546;24321;Luetjenburg;1057;Ploen;1;SH +4547;24321;Troendel;1057;Ploen;1;SH +4548;24321;Giekau;1057;Ploen;1;SH +4549;24321;Panker;1057;Ploen;1;SH +4550;24321;Helmstorf;1057;Ploen;1;SH +4551;24321;Behrensdorf;1057;Ploen;1;SH +4552;24326;Doernick;1057;Ploen;1;SH +4553;24326;Ascheberg;1057;Ploen;1;SH +4554;24326;Stocksee;1060;Segeberg;1;SH +4555;24326;Dersau;1057;Ploen;1;SH +4556;24326;Nehmten;1057;Ploen;1;SH +4557;24326;Kaluebbe;1057;Ploen;1;SH +4558;24327;Hoegsdorf;1057;Ploen;1;SH +4559;24327;Kletkamp;1057;Ploen;1;SH +4560;24327;Blekendorf;1057;Ploen;1;SH +4561;24329;Grebin;1057;Ploen;1;SH +4562;24329;Dannau;1057;Ploen;1;SH +4563;24329;Rantzau;1057;Ploen;1;SH +4564;24340;Altenhof;1058;Rendsburg-Eckernfoerde;1;SH +4565;24340;Windeby;1058;Rendsburg-Eckernfoerde;1;SH +4566;24340;Goosefeld;1058;Rendsburg-Eckernfoerde;1;SH +4567;24340;Gammelby;1058;Rendsburg-Eckernfoerde;1;SH +4568;24340;Eckernfoerde;1058;Rendsburg-Eckernfoerde;1;SH +4569;24351;Damp;1058;Rendsburg-Eckernfoerde;1;SH +4570;24351;Thumby;1058;Rendsburg-Eckernfoerde;1;SH +4571;24354;Kosel;1058;Rendsburg-Eckernfoerde;1;SH +4572;24354;Rieseby;1058;Rendsburg-Eckernfoerde;1;SH +4573;24357;Fleckeby;1058;Rendsburg-Eckernfoerde;1;SH +4574;24357;Hummelfeld;1058;Rendsburg-Eckernfoerde;1;SH +4575;24357;Gueby;1058;Rendsburg-Eckernfoerde;1;SH +4576;24358;Huetten;1058;Rendsburg-Eckernfoerde;1;SH +4577;24358;Bistensee;1058;Rendsburg-Eckernfoerde;1;SH +4578;24358;Ascheffel;1058;Rendsburg-Eckernfoerde;1;SH +4579;24360;Barkelsby;1058;Rendsburg-Eckernfoerde;1;SH +4580;24361;Holzbunge;1058;Rendsburg-Eckernfoerde;1;SH +4581;24361;Damendorf;1058;Rendsburg-Eckernfoerde;1;SH +4582;24361;Haby;1058;Rendsburg-Eckernfoerde;1;SH +4583;24361;Gross Wittensee;1058;Rendsburg-Eckernfoerde;1;SH +4584;24361;Klein Wittensee;1058;Rendsburg-Eckernfoerde;1;SH +4585;24363;Holtsee;1058;Rendsburg-Eckernfoerde;1;SH +4586;24364;Holzdorf;1058;Rendsburg-Eckernfoerde;1;SH +4587;24366;Loose;1058;Rendsburg-Eckernfoerde;1;SH +4588;24367;Osterby;1058;Rendsburg-Eckernfoerde;1;SH +4589;24369;Waabs;1058;Rendsburg-Eckernfoerde;1;SH +4590;24376;Hasselberg;1059;Schleswig-Flensburg;1;SH +4591;24376;Rabel;1059;Schleswig-Flensburg;1;SH +4592;24376;Groedersby;1059;Schleswig-Flensburg;1;SH +4593;24376;Kappeln;1059;Schleswig-Flensburg;1;SH +4594;24376;Arnis;1059;Schleswig-Flensburg;1;SH +4595;24392;Norderbrarup;1059;Schleswig-Flensburg;1;SH +4596;24392;Dollrottfeld;1059;Schleswig-Flensburg;1;SH +4597;24392;Wagersrott;1059;Schleswig-Flensburg;1;SH +4598;24392;Brebel;1059;Schleswig-Flensburg;1;SH +4599;24392;Kiesby;1059;Schleswig-Flensburg;1;SH +4600;24392;Scheggerott;1059;Schleswig-Flensburg;1;SH +4601;24392;Suederbrarup;1059;Schleswig-Flensburg;1;SH +4602;24392;Nottfeld;1059;Schleswig-Flensburg;1;SH +4603;24392;Boren;1059;Schleswig-Flensburg;1;SH +4604;24392;Ekenis;1059;Schleswig-Flensburg;1;SH +4605;24392;Saustrup;1059;Schleswig-Flensburg;1;SH +4606;24395;Gelting;1059;Schleswig-Flensburg;1;SH +4607;24395;Rabenholz;1059;Schleswig-Flensburg;1;SH +4608;24395;Pommerby;1059;Schleswig-Flensburg;1;SH +4609;24395;Nieby;1059;Schleswig-Flensburg;1;SH +4610;24395;Stangheck;1059;Schleswig-Flensburg;1;SH +4611;24395;Kronsgaard;1059;Schleswig-Flensburg;1;SH +4612;24395;Niesgrau;1059;Schleswig-Flensburg;1;SH +4613;24398;Winnemark;1058;Rendsburg-Eckernfoerde;1;SH +4614;24398;Doerphof;1058;Rendsburg-Eckernfoerde;1;SH +4615;24398;Karby;1058;Rendsburg-Eckernfoerde;1;SH +4616;24398;Brodersby;1058;Rendsburg-Eckernfoerde;1;SH +4617;24401;Boeel;1059;Schleswig-Flensburg;1;SH +4618;24402;Esgrus;1059;Schleswig-Flensburg;1;SH +4619;24404;Maasholm;1059;Schleswig-Flensburg;1;SH +4620;24405;Ruegge;1059;Schleswig-Flensburg;1;SH +4621;24405;Mohrkirch;1059;Schleswig-Flensburg;1;SH +4622;24407;Rabenkirchen-Faulueck;1059;Schleswig-Flensburg;1;SH +4623;24407;Oersberg;1059;Schleswig-Flensburg;1;SH +4624;24409;Stoltebuell;1059;Schleswig-Flensburg;1;SH +4625;24534;Neumuenster;1004;Neumuenster, Stadt;1;SH +4626;24536;Tasdorf;1057;Ploen;1;SH +4627;24536;Neumuenster;1004;Neumuenster, Stadt;1;SH +4628;24537;Neumuenster;1004;Neumuenster, Stadt;1;SH +4629;24539;Neumuenster;1004;Neumuenster, Stadt;1;SH +4630;24558;Wakendorf II;1060;Segeberg;1;SH +4631;24558;Henstedt-Ulzburg;1060;Segeberg;1;SH +4632;24568;Kattendorf;1060;Segeberg;1;SH +4633;24568;Kaltenkirchen;1060;Segeberg;1;SH +4634;24568;Nuetzen;1060;Segeberg;1;SH +4635;24568;Oersdorf;1060;Segeberg;1;SH +4636;24568;Winsen;1060;Segeberg;1;SH +4637;24576;Bad Bramstedt;1060;Segeberg;1;SH +4638;24576;Hagen;1060;Segeberg;1;SH +4639;24576;Hitzhusen;1060;Segeberg;1;SH +4640;24576;Weddelbrook;1060;Segeberg;1;SH +4641;24576;Bimoehlen;1060;Segeberg;1;SH +4642;24576;Moenkloh;1060;Segeberg;1;SH +4643;24582;Gross Buchwald;1058;Rendsburg-Eckernfoerde;1;SH +4644;24582;Bruegge;1058;Rendsburg-Eckernfoerde;1;SH +4645;24582;Bissee;1058;Rendsburg-Eckernfoerde;1;SH +4646;24582;Schoenbek;1058;Rendsburg-Eckernfoerde;1;SH +4647;24582;Hoffeld;1058;Rendsburg-Eckernfoerde;1;SH +4648;24582;Wattenbek;1058;Rendsburg-Eckernfoerde;1;SH +4649;24582;Bordesholm;1058;Rendsburg-Eckernfoerde;1;SH +4650;24582;Muehbrook;1058;Rendsburg-Eckernfoerde;1;SH +4651;24589;Daetgen;1058;Rendsburg-Eckernfoerde;1;SH +4652;24589;Nortorf;1058;Rendsburg-Eckernfoerde;1;SH +4653;24589;Ellerdorf;1058;Rendsburg-Eckernfoerde;1;SH +4654;24589;Eisendorf;1058;Rendsburg-Eckernfoerde;1;SH +4655;24589;Borgdorf-Seedorf;1058;Rendsburg-Eckernfoerde;1;SH +4656;24589;Schuelp bei Nortorf;1058;Rendsburg-Eckernfoerde;1;SH +4657;24594;Heinkenborstel;1058;Rendsburg-Eckernfoerde;1;SH +4658;24594;Meezen;1058;Rendsburg-Eckernfoerde;1;SH +4659;24594;Jahrsdorf;1058;Rendsburg-Eckernfoerde;1;SH +4660;24594;Grauel;1058;Rendsburg-Eckernfoerde;1;SH +4661;24594;Tappendorf;1058;Rendsburg-Eckernfoerde;1;SH +4662;24594;Rade bei Hohenwestedt;1058;Rendsburg-Eckernfoerde;1;SH +4663;24594;Wapelfeld;1058;Rendsburg-Eckernfoerde;1;SH +4664;24594;Hohenwestedt;1058;Rendsburg-Eckernfoerde;1;SH +4665;24594;Remmels;1058;Rendsburg-Eckernfoerde;1;SH +4666;24594;Nindorf;1058;Rendsburg-Eckernfoerde;1;SH +4667;24594;Moerel;1058;Rendsburg-Eckernfoerde;1;SH +4668;24598;Latendorf;1060;Segeberg;1;SH +4669;24598;Heidmuehlen;1060;Segeberg;1;SH +4670;24598;Boostedt;1060;Segeberg;1;SH +4671;24601;Stolpe;1057;Ploen;1;SH +4672;24601;Belau;1057;Ploen;1;SH +4673;24601;Ruhwinkel;1057;Ploen;1;SH +4674;24601;Wankendorf;1057;Ploen;1;SH +4675;24610;Trappenkamp;1060;Segeberg;1;SH +4676;24610;Goennebek;1060;Segeberg;1;SH +4677;24613;Wiedenborstel;1061;Steinburg;1;SH +4678;24613;Aukrug;1058;Rendsburg-Eckernfoerde;1;SH +4679;24616;Brokstedt;1061;Steinburg;1;SH +4680;24616;Borstel;1060;Segeberg;1;SH +4681;24616;Hasenkrug;1060;Segeberg;1;SH +4682;24616;Sarlhusen;1061;Steinburg;1;SH +4683;24616;Willenscharen;1061;Steinburg;1;SH +4684;24616;Hardebek;1060;Segeberg;1;SH +4685;24616;Armstedt;1060;Segeberg;1;SH +4686;24619;Bornhoeved;1060;Segeberg;1;SH +4687;24619;Rendswuehren;1057;Ploen;1;SH +4688;24619;Tarbek;1060;Segeberg;1;SH +4689;24620;Boenebuettel;1057;Ploen;1;SH +4690;24622;Gnutz;1058;Rendsburg-Eckernfoerde;1;SH +4691;24623;Grossenaspe;1060;Segeberg;1;SH +4692;24625;Grossharrie;1057;Ploen;1;SH +4693;24625;Negenharrie;1058;Rendsburg-Eckernfoerde;1;SH +4694;24626;Gross Kummerfeld;1060;Segeberg;1;SH +4695;24628;Hartenholm;1060;Segeberg;1;SH +4696;24629;Kisdorf;1060;Segeberg;1;SH +4697;24631;Langwedel;1058;Rendsburg-Eckernfoerde;1;SH +4698;24632;Lentfoehrden;1060;Segeberg;1;SH +4699;24632;Heidmoor;1060;Segeberg;1;SH +4700;24634;Arpsdorf;1058;Rendsburg-Eckernfoerde;1;SH +4701;24634;Padenstedt;1058;Rendsburg-Eckernfoerde;1;SH +4702;24635;Daldorf;1060;Segeberg;1;SH +4703;24635;Rickling;1060;Segeberg;1;SH +4704;24637;Schillsdorf;1057;Ploen;1;SH +4705;24638;Schmalensee;1060;Segeberg;1;SH +4706;24640;Schmalfeld;1060;Segeberg;1;SH +4707;24640;Hasenmoor;1060;Segeberg;1;SH +4708;24641;Stuvenborn;1060;Segeberg;1;SH +4709;24641;Huettblek;1060;Segeberg;1;SH +4710;24641;Sievershuetten;1060;Segeberg;1;SH +4711;24643;Struvenhuetten;1060;Segeberg;1;SH +4712;24644;Timmaspe;1058;Rendsburg-Eckernfoerde;1;SH +4713;24644;Krogaspe;1058;Rendsburg-Eckernfoerde;1;SH +4714;24644;Loop;1058;Rendsburg-Eckernfoerde;1;SH +4715;24646;Warder;1058;Rendsburg-Eckernfoerde;1;SH +4716;24647;Ehndorf;1058;Rendsburg-Eckernfoerde;1;SH +4717;24647;Wasbek;1058;Rendsburg-Eckernfoerde;1;SH +4718;24649;Wiemersdorf;1060;Segeberg;1;SH +4719;24649;Fuhlendorf;1060;Segeberg;1;SH +4720;24768;Rendsburg;1058;Rendsburg-Eckernfoerde;1;SH +4721;24782;Rickert;1058;Rendsburg-Eckernfoerde;1;SH +4722;24782;Buedelsdorf;1058;Rendsburg-Eckernfoerde;1;SH +4723;24783;Osterroenfeld;1058;Rendsburg-Eckernfoerde;1;SH +4724;24784;Westerroenfeld;1058;Rendsburg-Eckernfoerde;1;SH +4725;24787;Fockbek;1058;Rendsburg-Eckernfoerde;1;SH +4726;24790;Schuelldorf;1058;Rendsburg-Eckernfoerde;1;SH +4727;24790;Schacht-Audorf;1058;Rendsburg-Eckernfoerde;1;SH +4728;24790;Hassmoor;1058;Rendsburg-Eckernfoerde;1;SH +4729;24790;Rade bei Rendsburg;1058;Rendsburg-Eckernfoerde;1;SH +4730;24790;Ostenfeld;1058;Rendsburg-Eckernfoerde;1;SH +4731;24791;Alt Duvenstedt;1058;Rendsburg-Eckernfoerde;1;SH +4732;24793;Brammer;1058;Rendsburg-Eckernfoerde;1;SH +4733;24793;Bargstedt;1058;Rendsburg-Eckernfoerde;1;SH +4734;24793;Oldenhuetten;1058;Rendsburg-Eckernfoerde;1;SH +4735;24794;Borgstedt;1058;Rendsburg-Eckernfoerde;1;SH +4736;24794;Neu Duvenstedt;1058;Rendsburg-Eckernfoerde;1;SH +4737;24794;Buensdorf;1058;Rendsburg-Eckernfoerde;1;SH +4738;24796;Bovenau;1058;Rendsburg-Eckernfoerde;1;SH +4739;24796;Krummwisch;1058;Rendsburg-Eckernfoerde;1;SH +4740;24796;Bredenbek;1058;Rendsburg-Eckernfoerde;1;SH +4741;24797;Hoersten;1058;Rendsburg-Eckernfoerde;1;SH +4742;24797;Breiholz;1058;Rendsburg-Eckernfoerde;1;SH +4743;24799;Koenigshuegel;1058;Rendsburg-Eckernfoerde;1;SH +4744;24799;Friedrichsgraben;1058;Rendsburg-Eckernfoerde;1;SH +4745;24799;Christiansholm;1058;Rendsburg-Eckernfoerde;1;SH +4746;24799;Meggerdorf;1059;Schleswig-Flensburg;1;SH +4747;24799;Friedrichsholm;1058;Rendsburg-Eckernfoerde;1;SH +4748;24800;Elsdorf-Westermuehlen;1058;Rendsburg-Eckernfoerde;1;SH +4749;24802;Emkendorf;1058;Rendsburg-Eckernfoerde;1;SH +4750;24802;Gross Vollstedt;1058;Rendsburg-Eckernfoerde;1;SH +4751;24802;Bokel;1058;Rendsburg-Eckernfoerde;1;SH +4752;24803;Tielen;1059;Schleswig-Flensburg;1;SH +4753;24803;Erfde;1059;Schleswig-Flensburg;1;SH +4754;24805;Hamdorf;1058;Rendsburg-Eckernfoerde;1;SH +4755;24805;Prinzenmoor;1058;Rendsburg-Eckernfoerde;1;SH +4756;24806;Bargstall;1058;Rendsburg-Eckernfoerde;1;SH +4757;24806;Sophienhamm;1058;Rendsburg-Eckernfoerde;1;SH +4758;24806;Hohn;1058;Rendsburg-Eckernfoerde;1;SH +4759;24806;Lohe-Foehrden;1058;Rendsburg-Eckernfoerde;1;SH +4760;24808;Jevenstedt;1058;Rendsburg-Eckernfoerde;1;SH +4761;24809;Nuebbel;1058;Rendsburg-Eckernfoerde;1;SH +4762;24811;Ahlefeld;1058;Rendsburg-Eckernfoerde;1;SH +4763;24811;Owschlag;1058;Rendsburg-Eckernfoerde;1;SH +4764;24811;Brekendorf;1058;Rendsburg-Eckernfoerde;1;SH +4765;24813;Schuelp bei Rendsburg;1058;Rendsburg-Eckernfoerde;1;SH +4766;24814;Sehestedt;1058;Rendsburg-Eckernfoerde;1;SH +4767;24816;Hamweddel;1058;Rendsburg-Eckernfoerde;1;SH +4768;24816;Luhnstedt;1058;Rendsburg-Eckernfoerde;1;SH +4769;24816;Stafstedt;1058;Rendsburg-Eckernfoerde;1;SH +4770;24816;Brinjahe;1058;Rendsburg-Eckernfoerde;1;SH +4771;24817;Tetenhusen;1059;Schleswig-Flensburg;1;SH +4772;24819;Nienborstel;1058;Rendsburg-Eckernfoerde;1;SH +4773;24819;Haale;1058;Rendsburg-Eckernfoerde;1;SH +4774;24819;Embuehren;1058;Rendsburg-Eckernfoerde;1;SH +4775;24819;Todenbuettel;1058;Rendsburg-Eckernfoerde;1;SH +4776;24837;Schleswig;1059;Schleswig-Flensburg;1;SH +4777;24848;Alt Bennebek;1059;Schleswig-Flensburg;1;SH +4778;24848;Klein Bennebek;1059;Schleswig-Flensburg;1;SH +4779;24848;Klein Rheide;1059;Schleswig-Flensburg;1;SH +4780;24848;Kropp;1059;Schleswig-Flensburg;1;SH +4781;24850;Huesby;1059;Schleswig-Flensburg;1;SH +4782;24850;Luerschau;1059;Schleswig-Flensburg;1;SH +4783;24850;Schuby;1059;Schleswig-Flensburg;1;SH +4784;24852;Suederhackstedt;1059;Schleswig-Flensburg;1;SH +4785;24852;Eggebek;1059;Schleswig-Flensburg;1;SH +4786;24852;Langstedt;1059;Schleswig-Flensburg;1;SH +4787;24852;Sollerup;1059;Schleswig-Flensburg;1;SH +4788;24855;Bollingstedt;1059;Schleswig-Flensburg;1;SH +4789;24855;Juebek;1059;Schleswig-Flensburg;1;SH +4790;24857;Fahrdorf;1059;Schleswig-Flensburg;1;SH +4791;24857;Borgwedel;1059;Schleswig-Flensburg;1;SH +4792;24860;Uelsby;1059;Schleswig-Flensburg;1;SH +4793;24860;Klappholz;1059;Schleswig-Flensburg;1;SH +4794;24860;Boeklund;1059;Schleswig-Flensburg;1;SH +4795;24861;Bergenhusen;1059;Schleswig-Flensburg;1;SH +4796;24863;Boerm;1059;Schleswig-Flensburg;1;SH +4797;24864;Goltoft;1059;Schleswig-Flensburg;1;SH +4798;24864;Brodersby;1059;Schleswig-Flensburg;1;SH +4799;24866;Busdorf;1059;Schleswig-Flensburg;1;SH +4800;24867;Dannewerk;1059;Schleswig-Flensburg;1;SH +4801;24869;Doerpstedt;1059;Schleswig-Flensburg;1;SH +4802;24870;Ellingstedt;1059;Schleswig-Flensburg;1;SH +4803;24872;Gross Rheide;1059;Schleswig-Flensburg;1;SH +4804;24873;Havetoft;1059;Schleswig-Flensburg;1;SH +4805;24875;Havetoftloit;1059;Schleswig-Flensburg;1;SH +4806;24876;Hollingstedt;1059;Schleswig-Flensburg;1;SH +4807;24878;Jagel;1059;Schleswig-Flensburg;1;SH +4808;24878;Lottorf;1059;Schleswig-Flensburg;1;SH +4809;24879;Idstedt;1059;Schleswig-Flensburg;1;SH +4810;24879;Neuberend;1059;Schleswig-Flensburg;1;SH +4811;24881;Nuebel;1059;Schleswig-Flensburg;1;SH +4812;24882;Schaalby;1059;Schleswig-Flensburg;1;SH +4813;24884;Geltorf;1059;Schleswig-Flensburg;1;SH +4814;24884;Selk;1059;Schleswig-Flensburg;1;SH +4815;24885;Sieverstedt;1059;Schleswig-Flensburg;1;SH +4816;24887;Silberstedt;1059;Schleswig-Flensburg;1;SH +4817;24888;Steinfeld;1059;Schleswig-Flensburg;1;SH +4818;24888;Loit;1059;Schleswig-Flensburg;1;SH +4819;24890;Stolk;1059;Schleswig-Flensburg;1;SH +4820;24890;Suederfahrenstedt;1059;Schleswig-Flensburg;1;SH +4821;24891;Schnarup-Thumby;1059;Schleswig-Flensburg;1;SH +4822;24891;Struxdorf;1059;Schleswig-Flensburg;1;SH +4823;24893;Taarstedt;1059;Schleswig-Flensburg;1;SH +4824;24894;Twedt;1059;Schleswig-Flensburg;1;SH +4825;24894;Tolk;1059;Schleswig-Flensburg;1;SH +4826;24896;Treia;1059;Schleswig-Flensburg;1;SH +4827;24897;Ulsnis;1059;Schleswig-Flensburg;1;SH +4828;24899;Wohlde;1059;Schleswig-Flensburg;1;SH +4829;24937;Flensburg;1001;Flensburg, Stadt;1;SH +4830;24937;Flensborg;1001;Flensburg, Stadt;1;SH +4831;24939;Flensburg;1001;Flensburg, Stadt;1;SH +4832;24939;Flensborg;1001;Flensburg, Stadt;1;SH +4833;24941;Flensburg;1001;Flensburg, Stadt;1;SH +4834;24941;Flensborg;1001;Flensburg, Stadt;1;SH +4835;24941;Jarplund-Weding;1059;Schleswig-Flensburg;1;SH +4836;24943;Flensburg;1001;Flensburg, Stadt;1;SH +4837;24943;Flensborg;1001;Flensburg, Stadt;1;SH +4838;24943;Tastrup;1059;Schleswig-Flensburg;1;SH +4839;24944;Flensburg;1001;Flensburg, Stadt;1;SH +4840;24944;Flensborg;1001;Flensburg, Stadt;1;SH +4841;24955;Harrislee;1059;Schleswig-Flensburg;1;SH +4842;24960;Gluecksburg;1059;Schleswig-Flensburg;1;SH +4843;24960;Munkbrarup;1059;Schleswig-Flensburg;1;SH +4844;24963;Jerrishoe;1059;Schleswig-Flensburg;1;SH +4845;24963;Tarp;1059;Schleswig-Flensburg;1;SH +4846;24966;Soerup;1059;Schleswig-Flensburg;1;SH +4847;24969;Grossenwiehe;1059;Schleswig-Flensburg;1;SH +4848;24969;Lindewitt;1059;Schleswig-Flensburg;1;SH +4849;24972;Quern;1059;Schleswig-Flensburg;1;SH +4850;24972;Steinbergkirche;1059;Schleswig-Flensburg;1;SH +4851;24972;Steinberg;1059;Schleswig-Flensburg;1;SH +4852;24975;Ausacker;1059;Schleswig-Flensburg;1;SH +4853;24975;Maasbuell;1059;Schleswig-Flensburg;1;SH +4854;24975;Huerup;1059;Schleswig-Flensburg;1;SH +4855;24975;Husby;1059;Schleswig-Flensburg;1;SH +4856;24977;Westerholz;1059;Schleswig-Flensburg;1;SH +4857;24977;Langballig;1059;Schleswig-Flensburg;1;SH +4858;24977;Grundhof;1059;Schleswig-Flensburg;1;SH +4859;24977;Ringsberg;1059;Schleswig-Flensburg;1;SH +4860;24980;Schafflund;1059;Schleswig-Flensburg;1;SH +4861;24980;Hoerup;1059;Schleswig-Flensburg;1;SH +4862;24980;Wallsbuell;1059;Schleswig-Flensburg;1;SH +4863;24980;Nordhackstedt;1059;Schleswig-Flensburg;1;SH +4864;24980;Meyn;1059;Schleswig-Flensburg;1;SH +4865;24983;Handewitt;1059;Schleswig-Flensburg;1;SH +4866;24986;Ruede;1059;Schleswig-Flensburg;1;SH +4867;24986;Satrup;1059;Schleswig-Flensburg;1;SH +4868;24988;Sankelmark;1059;Schleswig-Flensburg;1;SH +4869;24988;Oeversee;1059;Schleswig-Flensburg;1;SH +4870;24989;Dollerup;1059;Schleswig-Flensburg;1;SH +4871;24991;Grosssolt;1059;Schleswig-Flensburg;1;SH +4872;24991;Freienwill;1059;Schleswig-Flensburg;1;SH +4873;24992;Janneby;1059;Schleswig-Flensburg;1;SH +4874;24992;Joerl;1059;Schleswig-Flensburg;1;SH +4875;24994;Weesby;1059;Schleswig-Flensburg;1;SH +4876;24994;Jardelund;1059;Schleswig-Flensburg;1;SH +4877;24994;Osterby;1059;Schleswig-Flensburg;1;SH +4878;24994;Medelby;1059;Schleswig-Flensburg;1;SH +4879;24994;Boexlund;1059;Schleswig-Flensburg;1;SH +4880;24994;Holt;1059;Schleswig-Flensburg;1;SH +4881;24996;Ahneby;1059;Schleswig-Flensburg;1;SH +4882;24996;Sterup;1059;Schleswig-Flensburg;1;SH +4883;24997;Wanderup;1059;Schleswig-Flensburg;1;SH +4884;24999;Wees;1059;Schleswig-Flensburg;1;SH +4885;25335;Altenmoor;1061;Steinburg;1;SH +4886;25335;Elmshorn;1056;Pinneberg;1;SH +4887;25335;Bokholt-Hanredder;1056;Pinneberg;1;SH +4888;25335;Neuendorf bei Elmshorn;1061;Steinburg;1;SH +4889;25335;Raa-Besenbek;1056;Pinneberg;1;SH +4890;25336;Klein Nordende;1056;Pinneberg;1;SH +4891;25336;Elmshorn;1056;Pinneberg;1;SH +4892;25337;Elmshorn;1056;Pinneberg;1;SH +4893;25337;Seeth-Ekholt;1056;Pinneberg;1;SH +4894;25337;Koelln-Reisiek;1056;Pinneberg;1;SH +4895;25348;Blomesche Wildnis;1061;Steinburg;1;SH +4896;25348;Engelbrechtsche Wildnis;1061;Steinburg;1;SH +4897;25348;Glueckstadt;1061;Steinburg;1;SH +4898;25355;Barmstedt;1056;Pinneberg;1;SH +4899;25355;Bullenkuhlen;1056;Pinneberg;1;SH +4900;25355;Heede;1056;Pinneberg;1;SH +4901;25355;Bevern;1056;Pinneberg;1;SH +4902;25355;Lutzhorn;1056;Pinneberg;1;SH +4903;25355;Gross Offenseth-Aspern;1056;Pinneberg;1;SH +4904;25358;Sommerland;1061;Steinburg;1;SH +4905;25358;Hohenfelde;1061;Steinburg;1;SH +4906;25358;Horst (Holstein);1061;Steinburg;1;SH +4907;25361;Suederau;1061;Steinburg;1;SH +4908;25361;Elskop;1061;Steinburg;1;SH +4909;25361;Krempe;1061;Steinburg;1;SH +4910;25361;Grevenkop;1061;Steinburg;1;SH +4911;25364;Brande-Hoernerkirchen;1056;Pinneberg;1;SH +4912;25364;Westerhorn;1056;Pinneberg;1;SH +4913;25364;Osterhorn;1056;Pinneberg;1;SH +4914;25364;Bokel;1056;Pinneberg;1;SH +4915;25365;Klein Offenseth-Sparrieshoop;1056;Pinneberg;1;SH +4916;25368;Kiebitzreihe;1061;Steinburg;1;SH +4917;25370;Seester;1056;Pinneberg;1;SH +4918;25371;Seestermuehe;1056;Pinneberg;1;SH +4919;25373;Ellerhoop;1056;Pinneberg;1;SH +4920;25376;Borsfleth;1061;Steinburg;1;SH +4921;25376;Krempdorf;1061;Steinburg;1;SH +4922;25377;Kollmar;1061;Steinburg;1;SH +4923;25379;Herzhorn;1061;Steinburg;1;SH +4924;25421;Pinneberg;1056;Pinneberg;1;SH +4925;25436;Tornesch;1056;Pinneberg;1;SH +4926;25436;Neuendeich;1056;Pinneberg;1;SH +4927;25436;Uetersen;1056;Pinneberg;1;SH +4928;25436;Heidgraben;1056;Pinneberg;1;SH +4929;25436;Gross Nordende;1056;Pinneberg;1;SH +4930;25436;Moorrege;1056;Pinneberg;1;SH +4931;25451;Quickborn;1056;Pinneberg;1;SH +4932;25462;Rellingen;1056;Pinneberg;1;SH +4933;25469;Halstenbek;1056;Pinneberg;1;SH +4934;25474;Ellerbek;1056;Pinneberg;1;SH +4935;25474;Hasloh;1056;Pinneberg;1;SH +4936;25474;Boenningstedt;1056;Pinneberg;1;SH +4937;25479;Ellerau;1060;Segeberg;1;SH +4938;25482;Appen;1056;Pinneberg;1;SH +4939;25485;Langeln;1056;Pinneberg;1;SH +4940;25485;Bilsen;1056;Pinneberg;1;SH +4941;25485;Hemdingen;1056;Pinneberg;1;SH +4942;25486;Alveslohe;1060;Segeberg;1;SH +4943;25488;Holm;1056;Pinneberg;1;SH +4944;25489;Haseldorf;1056;Pinneberg;1;SH +4945;25489;Haselau;1056;Pinneberg;1;SH +4946;25491;Hetlingen;1056;Pinneberg;1;SH +4947;25492;Heist;1056;Pinneberg;1;SH +4948;25494;Borstel-Hohenraden;1056;Pinneberg;1;SH +4949;25495;Kummerfeld;1056;Pinneberg;1;SH +4950;25497;Prisdorf;1056;Pinneberg;1;SH +4951;25499;Tangstedt;1056;Pinneberg;1;SH +4952;25524;Bekmuende;1061;Steinburg;1;SH +4953;25524;Heiligenstedtenerkamp;1061;Steinburg;1;SH +4954;25524;Itzehoe;1061;Steinburg;1;SH +4955;25524;Kollmoor;1061;Steinburg;1;SH +4956;25524;Oelixdorf;1061;Steinburg;1;SH +4957;25524;Heiligenstedten;1061;Steinburg;1;SH +4958;25524;Breitenburg;1061;Steinburg;1;SH +4959;25541;Brunsbuettel;1051;Dithmarschen;1;SH +4960;25548;Stoerkathen;1061;Steinburg;1;SH +4961;25548;Wittenbergen;1061;Steinburg;1;SH +4962;25548;Kellinghusen;1061;Steinburg;1;SH +4963;25548;Muehlenbarbek;1061;Steinburg;1;SH +4964;25548;Rosdorf;1061;Steinburg;1;SH +4965;25548;Auufer;1061;Steinburg;1;SH +4966;25548;Oeschebuettel;1061;Steinburg;1;SH +4967;25551;Peissen;1061;Steinburg;1;SH +4968;25551;Schlotfeld;1061;Steinburg;1;SH +4969;25551;Lockstedt;1061;Steinburg;1;SH +4970;25551;Winseldorf;1061;Steinburg;1;SH +4971;25551;Silzen;1061;Steinburg;1;SH +4972;25551;Lohbarbek;1061;Steinburg;1;SH +4973;25551;Hohenlockstedt;1061;Steinburg;1;SH +4974;25554;Landrecht;1061;Steinburg;1;SH +4975;25554;Stoerdorf;1061;Steinburg;1;SH +4976;25554;Moorhusen;1061;Steinburg;1;SH +4977;25554;Bekdorf;1061;Steinburg;1;SH +4978;25554;Dammfleth;1061;Steinburg;1;SH +4979;25554;Kleve;1061;Steinburg;1;SH +4980;25554;Nortorf;1061;Steinburg;1;SH +4981;25554;Wilster;1061;Steinburg;1;SH +4982;25554;Krummendiek;1061;Steinburg;1;SH +4983;25554;Neuendorf-SNbande;1061;Steinburg;1;SH +4984;25554;Neuendorf bei Wilster;1061;Steinburg;1;SH +4985;25554;SNbande;1061;Steinburg;1;SH +4986;25557;Seefeld;1058;Rendsburg-Eckernfoerde;1;SH +4987;25557;Hanerau-Hademarschen;1058;Rendsburg-Eckernfoerde;1;SH +4988;25557;Steenfeld;1058;Rendsburg-Eckernfoerde;1;SH +4989;25557;Gokels;1058;Rendsburg-Eckernfoerde;1;SH +4990;25557;Oldenbuettel;1058;Rendsburg-Eckernfoerde;1;SH +4991;25557;Bendorf;1058;Rendsburg-Eckernfoerde;1;SH +4992;25557;Beldorf;1058;Rendsburg-Eckernfoerde;1;SH +4993;25557;Thaden;1058;Rendsburg-Eckernfoerde;1;SH +4994;25560;Aasbuettel;1061;Steinburg;1;SH +4995;25560;Bokhorst;1061;Steinburg;1;SH +4996;25560;Agethorst;1061;Steinburg;1;SH +4997;25560;Kaisborstel;1061;Steinburg;1;SH +4998;25560;Poeschendorf;1061;Steinburg;1;SH +4999;25560;Puls;1061;Steinburg;1;SH +5000;25560;Warringholz;1061;Steinburg;1;SH +5001;25560;Oldenborstel;1061;Steinburg;1;SH +5002;25560;Siezbuettel;1061;Steinburg;1;SH +5003;25560;Hadenfeld;1061;Steinburg;1;SH +5004;25560;Schenefeld;1061;Steinburg;1;SH +5005;25563;Wulfsmoor;1061;Steinburg;1;SH +5006;25563;Hingstheide;1061;Steinburg;1;SH +5007;25563;Wrist;1061;Steinburg;1;SH +5008;25563;Quarnstedt;1061;Steinburg;1;SH +5009;25563;Foehrden-Barl;1060;Segeberg;1;SH +5010;25566;Laegerdorf;1061;Steinburg;1;SH +5011;25566;Rethwisch;1061;Steinburg;1;SH +5012;25569;Hodorf;1061;Steinburg;1;SH +5013;25569;Kremperheide;1061;Steinburg;1;SH +5014;25569;Bahrenfleth;1061;Steinburg;1;SH +5015;25569;Krempermoor;1061;Steinburg;1;SH +5016;25572;Sankt Margarethen;1061;Steinburg;1;SH +5017;25572;Ecklak;1061;Steinburg;1;SH +5018;25572;Kudensee;1061;Steinburg;1;SH +5019;25572;Aebtissinwisch;1061;Steinburg;1;SH +5020;25572;Landscheide;1061;Steinburg;1;SH +5021;25572;Buettel;1061;Steinburg;1;SH +5022;25573;Beidenfleth;1061;Steinburg;1;SH +5023;25575;Beringstedt;1058;Rendsburg-Eckernfoerde;1;SH +5024;25576;Brokdorf;1061;Steinburg;1;SH +5025;25578;Neuenbrook;1061;Steinburg;1;SH +5026;25578;Daegeling;1061;Steinburg;1;SH +5027;25579;Fitzbek;1061;Steinburg;1;SH +5028;25579;Rade;1061;Steinburg;1;SH +5029;25581;Poyenberg;1061;Steinburg;1;SH +5030;25581;Hennstedt;1061;Steinburg;1;SH +5031;25582;Looft;1061;Steinburg;1;SH +5032;25582;Drage;1061;Steinburg;1;SH +5033;25582;Kaaks;1061;Steinburg;1;SH +5034;25582;Hohenaspe;1061;Steinburg;1;SH +5035;25584;Besdorf;1061;Steinburg;1;SH +5036;25584;Holstenniendorf;1061;Steinburg;1;SH +5037;25585;Tackesdorf;1058;Rendsburg-Eckernfoerde;1;SH +5038;25585;Luetjenwestedt;1058;Rendsburg-Eckernfoerde;1;SH +5039;25587;Muensterdorf;1061;Steinburg;1;SH +5040;25588;Oldendorf;1061;Steinburg;1;SH +5041;25588;Huje;1061;Steinburg;1;SH +5042;25588;Mehlbek;1061;Steinburg;1;SH +5043;25590;Osterstedt;1058;Rendsburg-Eckernfoerde;1;SH +5044;25591;Ottenbuettel;1061;Steinburg;1;SH +5045;25593;Reher;1061;Steinburg;1;SH +5046;25593;Christinenthal;1061;Steinburg;1;SH +5047;25594;Vaale;1061;Steinburg;1;SH +5048;25594;Nutteln;1061;Steinburg;1;SH +5049;25594;Vaalermoor;1061;Steinburg;1;SH +5050;25596;Gribbohm;1061;Steinburg;1;SH +5051;25596;Bokelrehm;1061;Steinburg;1;SH +5052;25596;Wacken;1061;Steinburg;1;SH +5053;25596;Nienbuettel;1061;Steinburg;1;SH +5054;25597;Breitenberg;1061;Steinburg;1;SH +5055;25597;Westermoor;1061;Steinburg;1;SH +5056;25597;Moordiek;1061;Steinburg;1;SH +5057;25597;Kronsmoor;1061;Steinburg;1;SH +5058;25597;Moordorf;1061;Steinburg;1;SH +5059;25599;Wewelsfleth;1061;Steinburg;1;SH +5060;25693;Sankt Michaelisdonn;1051;Dithmarschen;1;SH +5061;25693;Volsemenhusen;1051;Dithmarschen;1;SH +5062;25693;Gudendorf;1051;Dithmarschen;1;SH +5063;25693;Trennewurth;1051;Dithmarschen;1;SH +5064;25704;Nindorf;1051;Dithmarschen;1;SH +5065;25704;Elpersbuettel;1051;Dithmarschen;1;SH +5066;25704;Nordermeldorf;1051;Dithmarschen;1;SH +5067;25704;Wolmersdorf;1051;Dithmarschen;1;SH +5068;25704;Meldorf;1051;Dithmarschen;1;SH +5069;25704;Epenwoehrden;1051;Dithmarschen;1;SH +5070;25704;Bargenstedt;1051;Dithmarschen;1;SH +5071;25709;Marne;1051;Dithmarschen;1;SH +5072;25709;Marnerdeich;1051;Dithmarschen;1;SH +5073;25709;Helse;1051;Dithmarschen;1;SH +5074;25709;Kronprinzenkoog;1051;Dithmarschen;1;SH +5075;25709;Kaiser-Wilhelm-Koog;1051;Dithmarschen;1;SH +5076;25709;Diekhusen-Fahrstedt;1051;Dithmarschen;1;SH +5077;25712;Kuden;1051;Dithmarschen;1;SH +5078;25712;Hochdonn;1051;Dithmarschen;1;SH +5079;25712;Burg (Dithmarschen);1051;Dithmarschen;1;SH +5080;25712;Grossenrade;1051;Dithmarschen;1;SH +5081;25712;Quickborn;1051;Dithmarschen;1;SH +5082;25712;Buchholz;1051;Dithmarschen;1;SH +5083;25712;Brickeln;1051;Dithmarschen;1;SH +5084;25715;Averlak;1051;Dithmarschen;1;SH +5085;25715;Ramhusen;1051;Dithmarschen;1;SH +5086;25715;Eddelak;1051;Dithmarschen;1;SH +5087;25715;Dingen;1051;Dithmarschen;1;SH +5088;25718;Friedrichskoog;1051;Dithmarschen;1;SH +5089;25719;Busenwurth;1051;Dithmarschen;1;SH +5090;25719;Barlt;1051;Dithmarschen;1;SH +5091;25721;Eggstedt;1051;Dithmarschen;1;SH +5092;25724;Neufeld;1051;Dithmarschen;1;SH +5093;25724;Neufelderkoog;1051;Dithmarschen;1;SH +5094;25724;Schmedeswurth;1051;Dithmarschen;1;SH +5095;25725;Schafstedt;1051;Dithmarschen;1;SH +5096;25725;Bornholt;1058;Rendsburg-Eckernfoerde;1;SH +5097;25727;Frestedt;1051;Dithmarschen;1;SH +5098;25727;Suederhastedt;1051;Dithmarschen;1;SH +5099;25727;Krumstedt;1051;Dithmarschen;1;SH +5100;25729;Windbergen;1051;Dithmarschen;1;SH +5101;25746;Ostrohe;1051;Dithmarschen;1;SH +5102;25746;Lohe-Rickelshof;1051;Dithmarschen;1;SH +5103;25746;Heide;1051;Dithmarschen;1;SH +5104;25746;Norderwoehrden;1051;Dithmarschen;1;SH +5105;25746;Wesseln;1051;Dithmarschen;1;SH +5106;25761;Hedwigenkoog;1051;Dithmarschen;1;SH +5107;25761;Oesterdeichstrich;1051;Dithmarschen;1;SH +5108;25761;Warwerort;1051;Dithmarschen;1;SH +5109;25761;Westerdeichstrich;1051;Dithmarschen;1;SH +5110;25761;Buesum;1051;Dithmarschen;1;SH +5111;25761;Buesumer Deichhausen;1051;Dithmarschen;1;SH +5112;25764;Oesterwurth;1051;Dithmarschen;1;SH +5113;25764;Friedrichsgabekoog;1051;Dithmarschen;1;SH +5114;25764;Wesselburen;1051;Dithmarschen;1;SH +5115;25764;Suederdeich;1051;Dithmarschen;1;SH +5116;25764;Schuelp;1051;Dithmarschen;1;SH +5117;25764;Hillgroven;1051;Dithmarschen;1;SH +5118;25764;Norddeich;1051;Dithmarschen;1;SH +5119;25764;Wesselburener-Deichhausen;1051;Dithmarschen;1;SH +5120;25764;Hellschen-Heringsand-Unterschaar;1051;Dithmarschen;1;SH +5121;25764;Wesselburenerkoog;1051;Dithmarschen;1;SH +5122;25764;Reinsbuettel;1051;Dithmarschen;1;SH +5123;25767;Arkebek;1051;Dithmarschen;1;SH +5124;25767;Osterrade;1051;Dithmarschen;1;SH +5125;25767;Offenbuettel;1051;Dithmarschen;1;SH +5126;25767;Bunsoh;1051;Dithmarschen;1;SH +5127;25767;Tensbuettel-Roest;1051;Dithmarschen;1;SH +5128;25767;Wennbuettel;1051;Dithmarschen;1;SH +5129;25767;Albersdorf;1051;Dithmarschen;1;SH +5130;25770;Hemmingstedt;1051;Dithmarschen;1;SH +5131;25770;Lieth;1051;Dithmarschen;1;SH +5132;25774;Hemme;1051;Dithmarschen;1;SH +5133;25774;Lehe;1051;Dithmarschen;1;SH +5134;25774;Krempel;1051;Dithmarschen;1;SH +5135;25774;Lunden;1051;Dithmarschen;1;SH +5136;25774;Karolinenkoog;1051;Dithmarschen;1;SH +5137;25774;Groven;1051;Dithmarschen;1;SH +5138;25776;Schlichting;1051;Dithmarschen;1;SH +5139;25776;Sankt Annen;1051;Dithmarschen;1;SH +5140;25776;Rehm-Flehde-Bargen;1051;Dithmarschen;1;SH +5141;25779;Kleve;1051;Dithmarschen;1;SH +5142;25779;Hennstedt;1051;Dithmarschen;1;SH +5143;25779;Haegen;1051;Dithmarschen;1;SH +5144;25779;Bergewoehrden;1051;Dithmarschen;1;SH +5145;25779;Wiemerstedt;1051;Dithmarschen;1;SH +5146;25779;Suederheistedt;1051;Dithmarschen;1;SH +5147;25779;Norderheistedt;1051;Dithmarschen;1;SH +5148;25779;Gluesing;1051;Dithmarschen;1;SH +5149;25779;Fedderingen;1051;Dithmarschen;1;SH +5150;25782;Suederdorf;1051;Dithmarschen;1;SH +5151;25782;Gaushorn;1051;Dithmarschen;1;SH +5152;25782;Westerborstel;1051;Dithmarschen;1;SH +5153;25782;Welmbuettel;1051;Dithmarschen;1;SH +5154;25782;Hoevede;1051;Dithmarschen;1;SH +5155;25782;Schalkholz;1051;Dithmarschen;1;SH +5156;25782;Tellingstedt;1051;Dithmarschen;1;SH +5157;25782;Schrum;1051;Dithmarschen;1;SH +5158;25785;Sarzbuettel;1051;Dithmarschen;1;SH +5159;25785;Odderade;1051;Dithmarschen;1;SH +5160;25785;Nordhastedt;1051;Dithmarschen;1;SH +5161;25786;Dellstedt;1051;Dithmarschen;1;SH +5162;25788;Hollingstedt;1051;Dithmarschen;1;SH +5163;25788;Wallen;1051;Dithmarschen;1;SH +5164;25788;Delve;1051;Dithmarschen;1;SH +5165;25791;Linden;1051;Dithmarschen;1;SH +5166;25791;Barkenholm;1051;Dithmarschen;1;SH +5167;25792;Neuenkirchen;1051;Dithmarschen;1;SH +5168;25792;Struebbel;1051;Dithmarschen;1;SH +5169;25794;Doerpling;1051;Dithmarschen;1;SH +5170;25794;Tielenhemme;1051;Dithmarschen;1;SH +5171;25794;Pahlen;1051;Dithmarschen;1;SH +5172;25795;Stelle-Wittenwurth;1051;Dithmarschen;1;SH +5173;25795;Weddingstedt;1051;Dithmarschen;1;SH +5174;25797;Woehrden;1051;Dithmarschen;1;SH +5175;25799;Wrohm;1051;Dithmarschen;1;SH +5176;25813;Schwesing;1054;Nordfriesland;1;SH +5177;25813;Husum;1054;Nordfriesland;1;SH +5178;25813;Suedermarsch;1054;Nordfriesland;1;SH +5179;25813;Simonsberg;1054;Nordfriesland;1;SH +5180;25821;Almdorf;1054;Nordfriesland;1;SH +5181;25821;Breklum;1054;Nordfriesland;1;SH +5182;25821;Reussenkoege;1054;Nordfriesland;1;SH +5183;25821;Vollstedt;1054;Nordfriesland;1;SH +5184;25821;Bredstedt;1054;Nordfriesland;1;SH +5185;25821;Struckum;1054;Nordfriesland;1;SH +5186;25821;Soennebuell;1054;Nordfriesland;1;SH +5187;25826;Sankt Peter-Ording;1054;Nordfriesland;1;SH +5188;25832;Toenning;1054;Nordfriesland;1;SH +5189;25832;Kotzenbuell;1054;Nordfriesland;1;SH +5190;25836;Welt;1054;Nordfriesland;1;SH +5191;25836;Katharinenheerd;1054;Nordfriesland;1;SH +5192;25836;Garding;1054;Nordfriesland;1;SH +5193;25836;Grothusenkoog;1054;Nordfriesland;1;SH +5194;25836;Poppenbuell;1054;Nordfriesland;1;SH +5195;25836;Kirchspiel Garding;1054;Nordfriesland;1;SH +5196;25836;Osterhever;1054;Nordfriesland;1;SH +5197;25836;Vollerwiek;1054;Nordfriesland;1;SH +5198;25840;Koldenbuettel;1054;Nordfriesland;1;SH +5199;25840;Friedrichstadt;1054;Nordfriesland;1;SH +5200;25842;Langenhorn;1054;Nordfriesland;1;SH +5201;25842;Bargum;1054;Nordfriesland;1;SH +5202;25842;Luetjenholm;1054;Nordfriesland;1;SH +5203;25842;Ockholm;1054;Nordfriesland;1;SH +5204;25845;Nordstrand;1054;Nordfriesland;1;SH +5205;25845;Elisabeth-Sophien-Koog;1054;Nordfriesland;1;SH +5206;25849;Pellworm;1054;Nordfriesland;1;SH +5207;25850;Bondelum;1054;Nordfriesland;1;SH +5208;25850;Behrendorf;1054;Nordfriesland;1;SH +5209;25852;Bordelum;1054;Nordfriesland;1;SH +5210;25853;Ahrenshoeft;1054;Nordfriesland;1;SH +5211;25853;Drelsdorf;1054;Nordfriesland;1;SH +5212;25853;Bohmstedt;1054;Nordfriesland;1;SH +5213;25855;Haselund;1054;Nordfriesland;1;SH +5214;25856;Hattstedt;1054;Nordfriesland;1;SH +5215;25856;Wobbenbuell;1054;Nordfriesland;1;SH +5216;25856;Hattstedtermarsch;1054;Nordfriesland;1;SH +5217;25858;Hoegel;1054;Nordfriesland;1;SH +5218;25859;Hooge;1054;Nordfriesland;1;SH +5219;25860;Horstedt;1054;Nordfriesland;1;SH +5220;25860;Olderup;1054;Nordfriesland;1;SH +5221;25860;Arlewatt;1054;Nordfriesland;1;SH +5222;25862;Goldebek;1054;Nordfriesland;1;SH +5223;25862;Kolkerheide;1054;Nordfriesland;1;SH +5224;25862;Goldelund;1054;Nordfriesland;1;SH +5225;25862;Joldelund;1054;Nordfriesland;1;SH +5226;25863;Langeness;1054;Nordfriesland;1;SH +5227;25864;Loewenstedt;1054;Nordfriesland;1;SH +5228;25866;Mildstedt;1054;Nordfriesland;1;SH +5229;25868;Norderstapel;1059;Schleswig-Flensburg;1;SH +5230;25869;Groede;1054;Nordfriesland;1;SH +5231;25870;Norderfriedrichskoog;1054;Nordfriesland;1;SH +5232;25870;Oldenswort;1054;Nordfriesland;1;SH +5233;25872;Ostenfeld;1054;Nordfriesland;1;SH +5234;25872;Wittbek;1054;Nordfriesland;1;SH +5235;25873;Oldersbek;1054;Nordfriesland;1;SH +5236;25873;Rantrum;1054;Nordfriesland;1;SH +5237;25875;Schobuell;1054;Nordfriesland;1;SH +5238;25876;Wisch;1054;Nordfriesland;1;SH +5239;25876;Suederhoeft;1054;Nordfriesland;1;SH +5240;25876;Ramstedt;1054;Nordfriesland;1;SH +5241;25876;Fresendelf;1054;Nordfriesland;1;SH +5242;25876;Schwabstedt;1054;Nordfriesland;1;SH +5243;25876;Hude;1054;Nordfriesland;1;SH +5244;25878;Drage;1054;Nordfriesland;1;SH +5245;25878;Seeth;1054;Nordfriesland;1;SH +5246;25879;Suederstapel;1059;Schleswig-Flensburg;1;SH +5247;25881;Augustenkoog;1054;Nordfriesland;1;SH +5248;25881;Westerhever;1054;Nordfriesland;1;SH +5249;25881;Tuemlauer Koog;1054;Nordfriesland;1;SH +5250;25881;Tating;1054;Nordfriesland;1;SH +5251;25882;Tetenbuell;1054;Nordfriesland;1;SH +5252;25884;Sollwitt;1054;Nordfriesland;1;SH +5253;25884;Vioel;1054;Nordfriesland;1;SH +5254;25884;Norstedt;1054;Nordfriesland;1;SH +5255;25885;Ahrenvioelfeld;1054;Nordfriesland;1;SH +5256;25885;Ahrenvioel;1054;Nordfriesland;1;SH +5257;25885;Immenstedt;1051;Dithmarschen;1;SH +5258;25885;Oster-Ohrstedt;1054;Nordfriesland;1;SH +5259;25885;Wester-Ohrstedt;1054;Nordfriesland;1;SH +5260;25887;Winnert;1054;Nordfriesland;1;SH +5261;25889;Witzwort;1054;Nordfriesland;1;SH +5262;25889;Uelvesbuell;1054;Nordfriesland;1;SH +5263;25899;Galmsbuell;1054;Nordfriesland;1;SH +5264;25899;Niebuell;1054;Nordfriesland;1;SH +5265;25899;Bosbuell;1054;Nordfriesland;1;SH +5266;25899;Dagebuell;1054;Nordfriesland;1;SH +5267;25899;Klixbuell;1054;Nordfriesland;1;SH +5268;25917;Enge-Sande;1054;Nordfriesland;1;SH +5269;25917;Stadum;1054;Nordfriesland;1;SH +5270;25917;Tinningstedt;1054;Nordfriesland;1;SH +5271;25917;Leck;1054;Nordfriesland;1;SH +5272;25917;Sprakebuell;1054;Nordfriesland;1;SH +5273;25917;Achtrup;1054;Nordfriesland;1;SH +5274;25920;Stedesand;1054;Nordfriesland;1;SH +5275;25920;Risum-Lindholm;1054;Nordfriesland;1;SH +5276;25923;Humptrup;1054;Nordfriesland;1;SH +5277;25923;Braderup;1054;Nordfriesland;1;SH +5278;25923;Ellhoeft;1054;Nordfriesland;1;SH +5279;25923;Suederluegum;1054;Nordfriesland;1;SH +5280;25923;Lexgaard;1054;Nordfriesland;1;SH +5281;25923;Holm;1054;Nordfriesland;1;SH +5282;25923;Uphusum;1054;Nordfriesland;1;SH +5283;25924;Rodenaes;1054;Nordfriesland;1;SH +5284;25924;Emmelsbuell-Horsbuell;1054;Nordfriesland;1;SH +5285;25924;Klanxbuell;1054;Nordfriesland;1;SH +5286;25924;Friedrich-Wilhelm-Luebke-Koog;1054;Nordfriesland;1;SH +5287;25926;Karlum;1054;Nordfriesland;1;SH +5288;25926;Ladelund;1054;Nordfriesland;1;SH +5289;25926;Bramstedtlund;1054;Nordfriesland;1;SH +5290;25926;Westre;1054;Nordfriesland;1;SH +5291;25927;Aventoft;1054;Nordfriesland;1;SH +5292;25927;Neukirchen;1054;Nordfriesland;1;SH +5293;25938;Dunsum;1054;Nordfriesland;1;SH +5294;25938;Midlum;1054;Nordfriesland;1;SH +5295;25938;Oevenum;1054;Nordfriesland;1;SH +5296;25938;Suederende;1054;Nordfriesland;1;SH +5297;25938;Oldsum;1054;Nordfriesland;1;SH +5298;25938;Wyk auf Foehr;1054;Nordfriesland;1;SH +5299;25938;Alkersum;1054;Nordfriesland;1;SH +5300;25938;Wrixum;1054;Nordfriesland;1;SH +5301;25938;Borgsum;1054;Nordfriesland;1;SH +5302;25938;Nieblum;1054;Nordfriesland;1;SH +5303;25938;Witsum;1054;Nordfriesland;1;SH +5304;25938;Utersum;1054;Nordfriesland;1;SH +5305;25946;Wittduen;1054;Nordfriesland;1;SH +5306;25946;Nebel;1054;Nordfriesland;1;SH +5307;25946;Norddorf;1054;Nordfriesland;1;SH +5308;25980;Rantum;1054;Nordfriesland;1;SH +5309;25980;Westerland;1054;Nordfriesland;1;SH +5310;25980;Sylt-Ost;1054;Nordfriesland;1;SH +5311;25992;List;1054;Nordfriesland;1;SH +5312;25996;Wenningstedt;1054;Nordfriesland;1;SH +5313;25997;Hoernum;1054;Nordfriesland;1;SH +5314;25999;Kampen;1054;Nordfriesland;1;SH +5315;26121;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5316;26122;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5317;26123;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5318;26125;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5319;26127;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5320;26129;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5321;26131;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5322;26133;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5323;26135;Oldenburg (Oldenburg);3403;Oldenburg (Oldenburg), Stadt;3;NI +5324;26160;Bad Zwischenahn;3451;Ammerland;3;NI +5325;26169;Friesoythe;3453;Cloppenburg;3;NI +5326;26180;Rastede;3451;Ammerland;3;NI +5327;26188;Edewecht;3451;Ammerland;3;NI +5328;26197;Grossenkneten;3458;Oldenburg;3;NI +5329;26203;Wardenburg;3458;Oldenburg;3;NI +5330;26209;Hatten;3458;Oldenburg;3;NI +5331;26215;Wiefelstede;3451;Ammerland;3;NI +5332;26219;Boesel;3453;Cloppenburg;3;NI +5333;26316;Varel;3455;Friesland;3;NI +5334;26340;Zetel;3455;Friesland;3;NI +5335;26345;Bockhorn;3455;Friesland;3;NI +5336;26349;Jade;3461;Wesermarsch;3;NI +5337;26382;Wilhelmshaven;3405;Wilhelmshaven, Stadt;3;NI +5338;26384;Wilhelmshaven;3405;Wilhelmshaven, Stadt;3;NI +5339;26386;Wilhelmshaven;3405;Wilhelmshaven, Stadt;3;NI +5340;26388;Wilhelmshaven;3405;Wilhelmshaven, Stadt;3;NI +5341;26389;Wilhelmshaven;3405;Wilhelmshaven, Stadt;3;NI +5342;26409;Wittmund;3462;Wittmund;3;NI +5343;26419;Schortens;3455;Friesland;3;NI +5344;26427;Dunum;3462;Wittmund;3;NI +5345;26427;Esens;3462;Wittmund;3;NI +5346;26427;Stedesdorf;3462;Wittmund;3;NI +5347;26427;Werdum;3462;Wittmund;3;NI +5348;26427;Neuharlingersiel;3462;Wittmund;3;NI +5349;26427;Holtgast;3462;Wittmund;3;NI +5350;26427;Moorweg;3462;Wittmund;3;NI +5351;26434;Wangerland;3455;Friesland;3;NI +5352;26441;Jever;3455;Friesland;3;NI +5353;26446;Friedeburg;3462;Wittmund;3;NI +5354;26452;Sande;3455;Friesland;3;NI +5355;26465;Langeoog;3462;Wittmund;3;NI +5356;26474;Spiekeroog;3462;Wittmund;3;NI +5357;26486;Wangerooge;3455;Friesland;3;NI +5358;26487;Blomberg;3462;Wittmund;3;NI +5359;26487;Neuschoo;3462;Wittmund;3;NI +5360;26489;Ochtersum;3462;Wittmund;3;NI +5361;26506;Norden;3452;Aurich;3;NI +5362;26524;Hagermarsch;3452;Aurich;3;NI +5363;26524;Hage;3452;Aurich;3;NI +5364;26524;Luetetsburg;3452;Aurich;3;NI +5365;26524;Halbemond;3452;Aurich;3;NI +5366;26524;Berumbur;3452;Aurich;3;NI +5367;26529;Wirdum;3452;Aurich;3;NI +5368;26529;Marienhafe;3452;Aurich;3;NI +5369;26529;Upgant-Schott;3452;Aurich;3;NI +5370;26529;Rechtsupweg;3452;Aurich;3;NI +5371;26529;Osteel;3452;Aurich;3;NI +5372;26529;Leezdorf;3452;Aurich;3;NI +5373;26532;Grossheide;3452;Aurich;3;NI +5374;26548;Norderney;3452;Aurich;3;NI +5375;26553;Dornum;3452;Aurich;3;NI +5376;26556;Utarp;3462;Wittmund;3;NI +5377;26556;Westerholt;3462;Wittmund;3;NI +5378;26556;Nenndorf;3462;Wittmund;3;NI +5379;26556;Schweindorf;3462;Wittmund;3;NI +5380;26556;Eversmeer;3462;Wittmund;3;NI +5381;26571;Juist;3452;Aurich;3;NI +5382;26579;Baltrum;3452;Aurich;3;NI +5383;26603;Aurich;3452;Aurich;3;NI +5384;26605;Aurich;3452;Aurich;3;NI +5385;26607;Aurich;3452;Aurich;3;NI +5386;26624;Suedbrookmerland;3452;Aurich;3;NI +5387;26629;Grossefehn;3452;Aurich;3;NI +5388;26632;Ihlow;3452;Aurich;3;NI +5389;26639;Wiesmoor;3452;Aurich;3;NI +5390;26655;Westerstede;3451;Ammerland;3;NI +5391;26670;Uplengen;3457;Leer;3;NI +5392;26676;Barssel;3453;Cloppenburg;3;NI +5393;26683;Saterland;3453;Cloppenburg;3;NI +5394;26689;Apen;3451;Ammerland;3;NI +5395;26721;Emden;3402;Emden, Stadt;3;NI +5396;26723;Emden;3402;Emden, Stadt;3;NI +5397;26725;Emden;3402;Emden, Stadt;3;NI +5398;26736;Krummhoern;3452;Aurich;3;NI +5399;26757;Borkum;3457;Leer;3;NI +5400;26759;Hinte;3452;Aurich;3;NI +5401;26789;Leer (Ostfriesland);3457;Leer;3;NI +5402;26802;Moormerland;3457;Leer;3;NI +5403;26810;Westoverledingen;3457;Leer;3;NI +5404;26817;Rhauderfehn;3457;Leer;3;NI +5405;26826;Weener;3457;Leer;3;NI +5406;26831;Bunde;3457;Leer;3;NI +5407;26831;Bunderhee;3457;Leer;3;NI +5408;26831;Boen;3457;Leer;3;NI +5409;26831;Wymeer;3457;Leer;3;NI +5410;26831;Dollart;3457;Leer;3;NI +5411;26835;Holtland;3457;Leer;3;NI +5412;26835;Firrel;3457;Leer;3;NI +5413;26835;Hesel;3457;Leer;3;NI +5414;26835;Brinkum;3457;Leer;3;NI +5415;26835;Schwerinsdorf;3457;Leer;3;NI +5416;26835;Neukamperfehn;3457;Leer;3;NI +5417;26842;Ostrhauderfehn;3457;Leer;3;NI +5418;26844;Jemgum;3457;Leer;3;NI +5419;26845;Nortmoor;3457;Leer;3;NI +5420;26847;Detern;3457;Leer;3;NI +5421;26849;Filsum;3457;Leer;3;NI +5422;26871;Papenburg;3454;Emsland;3;NI +5423;26892;Wippingen;3454;Emsland;3;NI +5424;26892;Kluse;3454;Emsland;3;NI +5425;26892;Lehe;3454;Emsland;3;NI +5426;26892;Heede;3454;Emsland;3;NI +5427;26892;Doerpen;3454;Emsland;3;NI +5428;26897;Esterwegen;3454;Emsland;3;NI +5429;26897;Breddenberg;3454;Emsland;3;NI +5430;26897;Hilkenbrook;3454;Emsland;3;NI +5431;26897;Bockhorst;3454;Emsland;3;NI +5432;26899;Rhede;3454;Emsland;3;NI +5433;26901;Rastdorf;3454;Emsland;3;NI +5434;26901;Lorup;3454;Emsland;3;NI +5435;26903;Surwold;3454;Emsland;3;NI +5436;26904;Boerger;3454;Emsland;3;NI +5437;26906;Dersum;3454;Emsland;3;NI +5438;26907;Walchum;3454;Emsland;3;NI +5439;26909;Neuboerger;3454;Emsland;3;NI +5440;26909;Neulehe;3454;Emsland;3;NI +5441;26919;Brake;3461;Wesermarsch;3;NI +5442;26931;Elsfleth;3461;Wesermarsch;3;NI +5443;26935;Stadland;3461;Wesermarsch;3;NI +5444;26936;Stadland;3461;Wesermarsch;3;NI +5445;26937;Stadland;3461;Wesermarsch;3;NI +5446;26939;Ovelgoenne;3461;Wesermarsch;3;NI +5447;26954;Nordenham;3461;Wesermarsch;3;NI +5448;26969;Butjadingen;3461;Wesermarsch;3;NI +5449;27211;Bassum;3251;Diepholz;3;NI +5450;27232;Sulingen;3251;Diepholz;3;NI +5451;27239;Twistringen;3251;Diepholz;3;NI +5452;27243;Kirchseelte;3458;Oldenburg;3;NI +5453;27243;Prinzhoefte;3458;Oldenburg;3;NI +5454;27243;Gross Ippener;3458;Oldenburg;3;NI +5455;27243;Colnrade;3458;Oldenburg;3;NI +5456;27243;Winkelsett;3458;Oldenburg;3;NI +5457;27243;Harpstedt;3458;Oldenburg;3;NI +5458;27243;Beckeln;3458;Oldenburg;3;NI +5459;27243;Duensen;3458;Oldenburg;3;NI +5460;27245;Kirchdorf;3251;Diepholz;3;NI +5461;27245;Barenburg;3251;Diepholz;3;NI +5462;27245;Bahrenborstel;3251;Diepholz;3;NI +5463;27246;Borstel;3251;Diepholz;3;NI +5464;27248;Ehrenburg;3251;Diepholz;3;NI +5465;27249;Mellinghausen;3251;Diepholz;3;NI +5466;27249;Maasen;3251;Diepholz;3;NI +5467;27251;Scholen;3251;Diepholz;3;NI +5468;27251;Neuenkirchen;3251;Diepholz;3;NI +5469;27252;Schwafoerden;3251;Diepholz;3;NI +5470;27254;Siedenburg;3251;Diepholz;3;NI +5471;27254;Staffhorst;3251;Diepholz;3;NI +5472;27257;Affinghausen;3251;Diepholz;3;NI +5473;27257;Sudwalde;3251;Diepholz;3;NI +5474;27259;Freistatt;3251;Diepholz;3;NI +5475;27259;Wehrbleck;3251;Diepholz;3;NI +5476;27259;Varrel;3251;Diepholz;3;NI +5477;27283;Verden (Aller);3361;Verden;3;NI +5478;27299;Langwedel;3361;Verden;3;NI +5479;27305;Engeln;3251;Diepholz;3;NI +5480;27305;Suestedt;3251;Diepholz;3;NI +5481;27305;Bruchhausen-Vilsen;3251;Diepholz;3;NI +5482;27308;Kirchlinteln;3361;Verden;3;NI +5483;27313;Doerverden;3361;Verden;3;NI +5484;27318;Hilgermissen;3256;Nienburg (Weser);3;NI +5485;27318;Hoya;3256;Nienburg (Weser);3;NI +5486;27318;Hoyerhagen;3256;Nienburg (Weser);3;NI +5487;27321;Emtinghausen;3361;Verden;3;NI +5488;27321;Thedinghausen;3361;Verden;3;NI +5489;27321;Morsum;3361;Verden;3;NI +5490;27324;Haemelhausen;3256;Nienburg (Weser);3;NI +5491;27324;Gandesbergen;3256;Nienburg (Weser);3;NI +5492;27324;Hassel (Weser);3256;Nienburg (Weser);3;NI +5493;27324;Eystrup;3256;Nienburg (Weser);3;NI +5494;27327;Martfeld;3251;Diepholz;3;NI +5495;27327;Schwarme;3251;Diepholz;3;NI +5496;27330;Asendorf;3251;Diepholz;3;NI +5497;27333;Warpe;3256;Nienburg (Weser);3;NI +5498;27333;Buecken;3256;Nienburg (Weser);3;NI +5499;27333;Schweringen;3256;Nienburg (Weser);3;NI +5500;27336;Rethem (Aller);3358;Soltau-Fallingbostel;3;NI +5501;27336;Frankenfeld;3358;Soltau-Fallingbostel;3;NI +5502;27336;Haeuslingen;3358;Soltau-Fallingbostel;3;NI +5503;27337;Blender;3361;Verden;3;NI +5504;27339;Riede;3361;Verden;3;NI +5505;27356;Rotenburg (Wuemme);3357;Rotenburg (Wuemme);3;NI +5506;27367;Hassendorf;3357;Rotenburg (Wuemme);3;NI +5507;27367;Hellwege;3357;Rotenburg (Wuemme);3;NI +5508;27367;Sottrum;3357;Rotenburg (Wuemme);3;NI +5509;27367;Boetersen;3357;Rotenburg (Wuemme);3;NI +5510;27367;Horstedt;3357;Rotenburg (Wuemme);3;NI +5511;27367;Ahausen;3357;Rotenburg (Wuemme);3;NI +5512;27367;Reessum;3357;Rotenburg (Wuemme);3;NI +5513;27374;Visselhoevede;3357;Rotenburg (Wuemme);3;NI +5514;27383;Scheessel;3357;Rotenburg (Wuemme);3;NI +5515;27386;Hemslingen;3357;Rotenburg (Wuemme);3;NI +5516;27386;Hemsbuende;3357;Rotenburg (Wuemme);3;NI +5517;27386;Kirchwalsede;3357;Rotenburg (Wuemme);3;NI +5518;27386;Bothel;3357;Rotenburg (Wuemme);3;NI +5519;27386;Brockel;3357;Rotenburg (Wuemme);3;NI +5520;27386;Westerwalsede;3357;Rotenburg (Wuemme);3;NI +5521;27389;Stemmen;3357;Rotenburg (Wuemme);3;NI +5522;27389;Lauenbrueck;3357;Rotenburg (Wuemme);3;NI +5523;27389;Vahlde;3357;Rotenburg (Wuemme);3;NI +5524;27389;Helvesiek;3357;Rotenburg (Wuemme);3;NI +5525;27389;Fintel;3357;Rotenburg (Wuemme);3;NI +5526;27404;Zeven;3357;Rotenburg (Wuemme);3;NI +5527;27404;Ostereistedt;3357;Rotenburg (Wuemme);3;NI +5528;27404;Elsdorf;3357;Rotenburg (Wuemme);3;NI +5529;27404;Rhade;3357;Rotenburg (Wuemme);3;NI +5530;27404;Seedorf;3357;Rotenburg (Wuemme);3;NI +5531;27404;Heeslingen;3357;Rotenburg (Wuemme);3;NI +5532;27404;Gyhum;3357;Rotenburg (Wuemme);3;NI +5533;27412;Tarmstedt;3357;Rotenburg (Wuemme);3;NI +5534;27412;Westertimke;3357;Rotenburg (Wuemme);3;NI +5535;27412;Kirchtimke;3357;Rotenburg (Wuemme);3;NI +5536;27412;Hepstedt;3357;Rotenburg (Wuemme);3;NI +5537;27412;Breddorf;3357;Rotenburg (Wuemme);3;NI +5538;27412;Buelstedt;3357;Rotenburg (Wuemme);3;NI +5539;27412;Vorwerk;3357;Rotenburg (Wuemme);3;NI +5540;27412;Wilstedt;3357;Rotenburg (Wuemme);3;NI +5541;27419;Lengenbostel;3357;Rotenburg (Wuemme);3;NI +5542;27419;Klein Meckelsen;3357;Rotenburg (Wuemme);3;NI +5543;27419;Sittensen;3357;Rotenburg (Wuemme);3;NI +5544;27419;Gross Meckelsen;3357;Rotenburg (Wuemme);3;NI +5545;27419;Wohnste;3357;Rotenburg (Wuemme);3;NI +5546;27419;Vierden;3357;Rotenburg (Wuemme);3;NI +5547;27419;Kalbe;3357;Rotenburg (Wuemme);3;NI +5548;27419;Hamersen;3357;Rotenburg (Wuemme);3;NI +5549;27419;Tiste;3357;Rotenburg (Wuemme);3;NI +5550;27432;Bremervoerde;3357;Rotenburg (Wuemme);3;NI +5551;27432;Alfstedt;3357;Rotenburg (Wuemme);3;NI +5552;27432;Hipstedt;3357;Rotenburg (Wuemme);3;NI +5553;27432;Oerel;3357;Rotenburg (Wuemme);3;NI +5554;27432;Basdahl;3357;Rotenburg (Wuemme);3;NI +5555;27432;Ebersdorf;3357;Rotenburg (Wuemme);3;NI +5556;27442;Gnarrenburg;3357;Rotenburg (Wuemme);3;NI +5557;27446;Deinstedt;3357;Rotenburg (Wuemme);3;NI +5558;27446;Sandbostel;3357;Rotenburg (Wuemme);3;NI +5559;27446;Farven;3357;Rotenburg (Wuemme);3;NI +5560;27446;Selsingen;3357;Rotenburg (Wuemme);3;NI +5561;27446;Anderlingen;3357;Rotenburg (Wuemme);3;NI +5562;27449;Kutenholz;3359;Stade;3;NI +5563;27472;Cuxhaven;3352;Cuxhaven;3;NI +5564;27474;Cuxhaven;3352;Cuxhaven;3;NI +5565;27476;Cuxhaven;3352;Cuxhaven;3;NI +5566;27478;Cuxhaven;3352;Cuxhaven;3;NI +5567;27498;Helgoland;1056;Pinneberg;1;SH +5568;27568;Bremerhaven;4012;Bremerhaven, Stadt;4;HB +5569;27570;Bremerhaven;4012;Bremerhaven, Stadt;4;HB +5570;27572;Bremerhaven;4012;Bremerhaven, Stadt;4;HB +5571;27574;Bremerhaven;4012;Bremerhaven, Stadt;4;HB +5572;27576;Bremerhaven;4012;Bremerhaven, Stadt;4;HB +5573;27578;Bremerhaven;4012;Bremerhaven, Stadt;4;HB +5574;27580;Bremerhaven;4012;Bremerhaven, Stadt;4;HB +5575;27607;Langen;3352;Cuxhaven;3;NI +5576;27612;Loxstedt;3352;Cuxhaven;3;NI +5577;27616;Beverstedt;3352;Cuxhaven;3;NI +5578;27616;Frelsdorf;3352;Cuxhaven;3;NI +5579;27616;Heerstedt;3352;Cuxhaven;3;NI +5580;27616;Hollen;3352;Cuxhaven;3;NI +5581;27616;Stubben;3352;Cuxhaven;3;NI +5582;27616;Kirchwistedt;3352;Cuxhaven;3;NI +5583;27616;Lunestedt;3352;Cuxhaven;3;NI +5584;27616;Appeln;3352;Cuxhaven;3;NI +5585;27616;Bokel;3352;Cuxhaven;3;NI +5586;27619;Schiffdorf;3352;Cuxhaven;3;NI +5587;27624;Floegeln;3352;Cuxhaven;3;NI +5588;27624;Koehlen;3352;Cuxhaven;3;NI +5589;27624;Ringstedt;3352;Cuxhaven;3;NI +5590;27624;Drangstedt;3352;Cuxhaven;3;NI +5591;27624;Kuehrstedt;3352;Cuxhaven;3;NI +5592;27624;Lintig;3352;Cuxhaven;3;NI +5593;27624;Elmlohe;3352;Cuxhaven;3;NI +5594;27624;Bad Bederkesa;3352;Cuxhaven;3;NI +5595;27628;Sandstedt;3352;Cuxhaven;3;NI +5596;27628;Driftsethe;3352;Cuxhaven;3;NI +5597;27628;Uthlede;3352;Cuxhaven;3;NI +5598;27628;Wulsbuettel;3352;Cuxhaven;3;NI +5599;27628;Hagen im Bremischen;3352;Cuxhaven;3;NI +5600;27628;Bramstedt;3352;Cuxhaven;3;NI +5601;27632;Padingbuettel;3352;Cuxhaven;3;NI +5602;27632;Misselwarden;3352;Cuxhaven;3;NI +5603;27632;Cappel;3352;Cuxhaven;3;NI +5604;27632;Dorum;3352;Cuxhaven;3;NI +5605;27632;Mulsum;3352;Cuxhaven;3;NI +5606;27632;Midlum;3352;Cuxhaven;3;NI +5607;27637;Nordholz;3352;Cuxhaven;3;NI +5608;27638;Wremen;3352;Cuxhaven;3;NI +5609;27711;Osterholz-Scharmbeck;3356;Osterholz;3;NI +5610;27721;Ritterhude;3356;Osterholz;3;NI +5611;27726;Worpswede;3356;Osterholz;3;NI +5612;27729;Axstedt;3356;Osterholz;3;NI +5613;27729;Luebberstedt;3356;Osterholz;3;NI +5614;27729;Holste;3356;Osterholz;3;NI +5615;27729;Vollersode;3356;Osterholz;3;NI +5616;27729;Hambergen;3356;Osterholz;3;NI +5617;27749;Delmenhorst;3401;Delmenhorst, Stadt;3;NI +5618;27751;Delmenhorst;3401;Delmenhorst, Stadt;3;NI +5619;27753;Delmenhorst;3401;Delmenhorst, Stadt;3;NI +5620;27755;Delmenhorst;3401;Delmenhorst, Stadt;3;NI +5621;27777;Ganderkesee;3458;Oldenburg;3;NI +5622;27793;Wildeshausen;3458;Oldenburg;3;NI +5623;27798;Hude (Oldenburg);3458;Oldenburg;3;NI +5624;27801;Doetlingen;3458;Oldenburg;3;NI +5625;27804;Berne;3461;Wesermarsch;3;NI +5626;27809;Lemwerder;3461;Wesermarsch;3;NI +5627;28195;HB;4011;HB, Stadt;4;HB +5628;28197;HB;4011;HB, Stadt;4;HB +5629;28199;HB;4011;HB, Stadt;4;HB +5630;28201;HB;4011;HB, Stadt;4;HB +5631;28203;HB;4011;HB, Stadt;4;HB +5632;28205;HB;4011;HB, Stadt;4;HB +5633;28207;HB;4011;HB, Stadt;4;HB +5634;28209;HB;4011;HB, Stadt;4;HB +5635;28211;HB;4011;HB, Stadt;4;HB +5636;28213;HB;4011;HB, Stadt;4;HB +5637;28215;HB;4011;HB, Stadt;4;HB +5638;28217;HB;4011;HB, Stadt;4;HB +5639;28219;HB;4011;HB, Stadt;4;HB +5640;28237;HB;4011;HB, Stadt;4;HB +5641;28239;HB;4011;HB, Stadt;4;HB +5642;28259;HB;4011;HB, Stadt;4;HB +5643;28277;HB;4011;HB, Stadt;4;HB +5644;28279;HB;4011;HB, Stadt;4;HB +5645;28307;HB;4011;HB, Stadt;4;HB +5646;28309;HB;4011;HB, Stadt;4;HB +5647;28325;HB;4011;HB, Stadt;4;HB +5648;28327;HB;4011;HB, Stadt;4;HB +5649;28329;HB;4011;HB, Stadt;4;HB +5650;28355;HB;4011;HB, Stadt;4;HB +5651;28357;HB;4011;HB, Stadt;4;HB +5652;28359;HB;4011;HB, Stadt;4;HB +5653;28717;HB;4011;HB, Stadt;4;HB +5654;28719;HB;4011;HB, Stadt;4;HB +5655;28755;HB;4011;HB, Stadt;4;HB +5656;28757;HB;4011;HB, Stadt;4;HB +5657;28759;HB;4011;HB, Stadt;4;HB +5658;28777;HB;4011;HB, Stadt;4;HB +5659;28779;HB;4011;HB, Stadt;4;HB +5660;28790;Schwanewede;3356;Osterholz;3;NI +5661;28816;Stuhr;3251;Diepholz;3;NI +5662;28832;Achim;3361;Verden;3;NI +5663;28844;Weyhe;3251;Diepholz;3;NI +5664;28857;Syke;3251;Diepholz;3;NI +5665;28865;Lilienthal;3356;Osterholz;3;NI +5666;28870;Ottersberg;3361;Verden;3;NI +5667;28876;Oyten;3361;Verden;3;NI +5668;28879;Grasberg;3356;Osterholz;3;NI +5669;29221;Celle;3351;Celle;3;NI +5670;29223;Celle;3351;Celle;3;NI +5671;29225;Celle;3351;Celle;3;NI +5672;29227;Celle;3351;Celle;3;NI +5673;29229;Celle;3351;Celle;3;NI +5674;29303;Bergen;3351;Celle;3;NI +5675;29308;Winsen (Aller);3351;Celle;3;NI +5676;29313;Hambuehren;3351;Celle;3;NI +5677;29320;Hermannsburg;3351;Celle;3;NI +5678;29323;Wietze;3351;Celle;3;NI +5679;29328;Fassberg;3351;Celle;3;NI +5680;29331;Lachendorf;3351;Celle;3;NI +5681;29336;Nienhagen;3351;Celle;3;NI +5682;29339;Wathlingen;3351;Celle;3;NI +5683;29342;Wienhausen;3351;Celle;3;NI +5684;29345;Unterluess;3351;Celle;3;NI +5685;29348;Eschede;3351;Celle;3;NI +5686;29348;Scharnhorst;3351;Celle;3;NI +5687;29351;Eldingen;3351;Celle;3;NI +5688;29352;Adelheidsdorf;3351;Celle;3;NI +5689;29353;Ahnsbeck;3351;Celle;3;NI +5690;29355;Beedenbostel;3351;Celle;3;NI +5691;29356;Broeckel;3351;Celle;3;NI +5692;29358;Eicklingen;3351;Celle;3;NI +5693;29359;Habighorst;3351;Celle;3;NI +5694;29361;Hoefer;3351;Celle;3;NI +5695;29362;Hohne;3351;Celle;3;NI +5696;29364;Langlingen;3351;Celle;3;NI +5697;29365;Sprakensehl;3151;Gifhorn;3;NI +5698;29367;Steinhorst;3151;Gifhorn;3;NI +5699;29369;Ummern;3151;Gifhorn;3;NI +5700;29378;Wittingen;3151;Gifhorn;3;NI +5701;29379;Wittingen;3151;Gifhorn;3;NI +5702;29386;Obernholz;3151;Gifhorn;3;NI +5703;29386;Dedelstorf;3151;Gifhorn;3;NI +5704;29386;Hankensbuettel;3151;Gifhorn;3;NI +5705;29389;Bad Bodenteich;3360;Uelzen;3;NI +5706;29392;Wesendorf;3151;Gifhorn;3;NI +5707;29393;Gross Oesingen;3151;Gifhorn;3;NI +5708;29394;Lueder;3360;Uelzen;3;NI +5709;29396;Schoenewoerde;3151;Gifhorn;3;NI +5710;29399;Wahrenholz;3151;Gifhorn;3;NI +5711;29410;Salzwedel;15370;Altmarkkreis Salzwedel;15;ST +5712;29410;Chueden;15370;Altmarkkreis Salzwedel;15;ST +5713;29413;Wallstawe;15370;Altmarkkreis Salzwedel;15;ST +5714;29413;Tylsen;15370;Altmarkkreis Salzwedel;15;ST +5715;29413;Seebenau;15370;Altmarkkreis Salzwedel;15;ST +5716;29413;Langenapel;15370;Altmarkkreis Salzwedel;15;ST +5717;29413;Lagendorf;15370;Altmarkkreis Salzwedel;15;ST +5718;29413;Henningen;15370;Altmarkkreis Salzwedel;15;ST +5719;29413;Ellenberg;15370;Altmarkkreis Salzwedel;15;ST +5720;29413;Flecken Diesdorf;15370;Altmarkkreis Salzwedel;15;ST +5721;29413;Daehre;15370;Altmarkkreis Salzwedel;15;ST +5722;29413;Bornsen;15370;Altmarkkreis Salzwedel;15;ST +5723;29413;Bonese;15370;Altmarkkreis Salzwedel;15;ST +5724;29413;Osterwohle;15370;Altmarkkreis Salzwedel;15;ST +5725;29413;Neuekrug;15370;Altmarkkreis Salzwedel;15;ST +5726;29413;Mehmke;15370;Altmarkkreis Salzwedel;15;ST +5727;29413;Gieseritz;15370;Altmarkkreis Salzwedel;15;ST +5728;29416;Stappenbeck;15370;Altmarkkreis Salzwedel;15;ST +5729;29416;Vissum;15370;Altmarkkreis Salzwedel;15;ST +5730;29416;Valfitz;15370;Altmarkkreis Salzwedel;15;ST +5731;29416;Steinitz;15370;Altmarkkreis Salzwedel;15;ST +5732;29416;Siedenlangenbeck;15370;Altmarkkreis Salzwedel;15;ST +5733;29416;Riebau;15370;Altmarkkreis Salzwedel;15;ST +5734;29416;Kuhfelde;15370;Altmarkkreis Salzwedel;15;ST +5735;29416;Klein Gartz;15370;Altmarkkreis Salzwedel;15;ST +5736;29416;Kerkau;15370;Altmarkkreis Salzwedel;15;ST +5737;29416;Kaulitz;15370;Altmarkkreis Salzwedel;15;ST +5738;29416;Jeggeleben;15370;Altmarkkreis Salzwedel;15;ST +5739;29416;Winterfeld;15370;Altmarkkreis Salzwedel;15;ST +5740;29416;Wieblitz-Eversdorf;15370;Altmarkkreis Salzwedel;15;ST +5741;29416;Fleetmark;15370;Altmarkkreis Salzwedel;15;ST +5742;29416;Chueden;15370;Altmarkkreis Salzwedel;15;ST +5743;29416;Binde;15370;Altmarkkreis Salzwedel;15;ST +5744;29416;Bierstedt;15370;Altmarkkreis Salzwedel;15;ST +5745;29416;Rademin;15370;Altmarkkreis Salzwedel;15;ST +5746;29416;Pueggen;15370;Altmarkkreis Salzwedel;15;ST +5747;29416;Pretzier;15370;Altmarkkreis Salzwedel;15;ST +5748;29416;Mechau;15370;Altmarkkreis Salzwedel;15;ST +5749;29416;Liesten;15370;Altmarkkreis Salzwedel;15;ST +5750;29416;Altensalzwedel;15370;Altmarkkreis Salzwedel;15;ST +5751;29416;Benkendorf;15370;Altmarkkreis Salzwedel;15;ST +5752;29416;Gischau;15370;Altmarkkreis Salzwedel;15;ST +5753;29439;Luechow;3354;Luechow-Dannenberg;3;NI +5754;29451;Dannenberg (Elbe);3354;Luechow-Dannenberg;3;NI +5755;29456;Hitzacker;3354;Luechow-Dannenberg;3;NI +5756;29459;Clenze;3354;Luechow-Dannenberg;3;NI +5757;29462;Wustrow;3354;Luechow-Dannenberg;3;NI +5758;29465;Schnega;3354;Luechow-Dannenberg;3;NI +5759;29468;Bergen (Dumme);3354;Luechow-Dannenberg;3;NI +5760;29471;Gartow;3354;Luechow-Dannenberg;3;NI +5761;29472;Damnatz;3354;Luechow-Dannenberg;3;NI +5762;29473;Goehrde;3354;Luechow-Dannenberg;3;NI +5763;29475;Gorleben;3354;Luechow-Dannenberg;3;NI +5764;29476;Gusborn;3354;Luechow-Dannenberg;3;NI +5765;29478;Hoehbeck;3354;Luechow-Dannenberg;3;NI +5766;29479;Jameln;3354;Luechow-Dannenberg;3;NI +5767;29481;Karwitz;3354;Luechow-Dannenberg;3;NI +5768;29482;Kuesten;3354;Luechow-Dannenberg;3;NI +5769;29484;Langendorf;3354;Luechow-Dannenberg;3;NI +5770;29485;Lemgow;3354;Luechow-Dannenberg;3;NI +5771;29487;Luckau;3354;Luechow-Dannenberg;3;NI +5772;29488;Luebbow;3354;Luechow-Dannenberg;3;NI +5773;29490;Neu Darchau;3354;Luechow-Dannenberg;3;NI +5774;29491;Prezelle;3354;Luechow-Dannenberg;3;NI +5775;29493;Schnackenburg;3354;Luechow-Dannenberg;3;NI +5776;29494;Trebel;3354;Luechow-Dannenberg;3;NI +5777;29496;Waddeweitz;3354;Luechow-Dannenberg;3;NI +5778;29497;Woltersdorf;3354;Luechow-Dannenberg;3;NI +5779;29499;Zernien;3354;Luechow-Dannenberg;3;NI +5780;29525;Uelzen;3360;Uelzen;3;NI +5781;29549;Bad Bevensen;3360;Uelzen;3;NI +5782;29553;Bienenbuettel;3360;Uelzen;3;NI +5783;29556;Suderburg;3360;Uelzen;3;NI +5784;29559;Wrestedt;3360;Uelzen;3;NI +5785;29562;Suhlendorf;3360;Uelzen;3;NI +5786;29565;Wriedel;3360;Uelzen;3;NI +5787;29568;Wieren;3360;Uelzen;3;NI +5788;29571;Rosche;3360;Uelzen;3;NI +5789;29574;Ebstorf;3360;Uelzen;3;NI +5790;29575;Altenmedingen;3360;Uelzen;3;NI +5791;29576;Barum;3360;Uelzen;3;NI +5792;29578;Eimke;3360;Uelzen;3;NI +5793;29579;Emmendorf;3360;Uelzen;3;NI +5794;29581;Gerdau;3360;Uelzen;3;NI +5795;29582;Hanstedt I;3360;Uelzen;3;NI +5796;29584;Himbergen;3360;Uelzen;3;NI +5797;29585;Jelmstorf;3360;Uelzen;3;NI +5798;29587;Natendorf;3360;Uelzen;3;NI +5799;29588;Oetzen;3360;Uelzen;3;NI +5800;29590;Raetzlingen;3360;Uelzen;3;NI +5801;29591;Roemstedt;3360;Uelzen;3;NI +5802;29593;Schwienau;3360;Uelzen;3;NI +5803;29594;Soltendieck;3360;Uelzen;3;NI +5804;29596;Stadensen;3360;Uelzen;3;NI +5805;29597;Stoetze;3360;Uelzen;3;NI +5806;29599;Weste;3360;Uelzen;3;NI +5807;29614;Soltau;3358;Soltau-Fallingbostel;3;NI +5808;29633;Munster;3358;Soltau-Fallingbostel;3;NI +5809;29640;Schneverdingen;3358;Soltau-Fallingbostel;3;NI +5810;29643;Neuenkirchen;3358;Soltau-Fallingbostel;3;NI +5811;29646;Bispingen;3358;Soltau-Fallingbostel;3;NI +5812;29649;Wietzendorf;3358;Soltau-Fallingbostel;3;NI +5813;29664;Walsrode;3358;Soltau-Fallingbostel;3;NI +5814;29683;Fallingbostel;3358;Soltau-Fallingbostel;3;NI +5815;29690;Buchholz (Aller);3358;Soltau-Fallingbostel;3;NI +5816;29690;Gilten;3358;Soltau-Fallingbostel;3;NI +5817;29690;Grethem;3358;Soltau-Fallingbostel;3;NI +5818;29690;Lindwedel;3358;Soltau-Fallingbostel;3;NI +5819;29690;Essel;3358;Soltau-Fallingbostel;3;NI +5820;29690;Schwarmstedt;3358;Soltau-Fallingbostel;3;NI +5821;29693;Hodenhagen;3358;Soltau-Fallingbostel;3;NI +5822;29693;Boehme;3358;Soltau-Fallingbostel;3;NI +5823;29693;Eickeloh;3358;Soltau-Fallingbostel;3;NI +5824;29693;Hademstorf;3358;Soltau-Fallingbostel;3;NI +5825;29693;Ahlden (Aller);3358;Soltau-Fallingbostel;3;NI +5826;29699;Bomlitz;3358;Soltau-Fallingbostel;3;NI +5827;30159;Hannover;3241;Region Hannover;3;NI +5828;30161;Hannover;3241;Region Hannover;3;NI +5829;30163;Hannover;3241;Region Hannover;3;NI +5830;30165;Hannover;3241;Region Hannover;3;NI +5831;30167;Hannover;3241;Region Hannover;3;NI +5832;30169;Hannover;3241;Region Hannover;3;NI +5833;30171;Hannover;3241;Region Hannover;3;NI +5834;30173;Hannover;3241;Region Hannover;3;NI +5835;30175;Hannover;3241;Region Hannover;3;NI +5836;30177;Hannover;3241;Region Hannover;3;NI +5837;30179;Hannover;3241;Region Hannover;3;NI +5838;30419;Hannover;3241;Region Hannover;3;NI +5839;30449;Hannover;3241;Region Hannover;3;NI +5840;30451;Hannover;3241;Region Hannover;3;NI +5841;30453;Hannover;3241;Region Hannover;3;NI +5842;30455;Hannover;3241;Region Hannover;3;NI +5843;30457;Hannover;3241;Region Hannover;3;NI +5844;30459;Hannover;3241;Region Hannover;3;NI +5845;30519;Hannover;3241;Region Hannover;3;NI +5846;30521;Hannover;3241;Region Hannover;3;NI +5847;30539;Hannover;3241;Region Hannover;3;NI +5848;30559;Hannover;3241;Region Hannover;3;NI +5849;30625;Hannover;3241;Region Hannover;3;NI +5850;30627;Hannover;3241;Region Hannover;3;NI +5851;30629;Hannover;3241;Region Hannover;3;NI +5852;30655;Hannover;3241;Region Hannover;3;NI +5853;30657;Hannover;3241;Region Hannover;3;NI +5854;30659;Hannover;3241;Region Hannover;3;NI +5855;30669;Hannover;3241;Region Hannover;3;NI +5856;30823;Garbsen;3241;Region Hannover;3;NI +5857;30826;Garbsen;3241;Region Hannover;3;NI +5858;30827;Garbsen;3241;Region Hannover;3;NI +5859;30851;Langenhagen;3241;Region Hannover;3;NI +5860;30853;Langenhagen;3241;Region Hannover;3;NI +5861;30855;Langenhagen;3241;Region Hannover;3;NI +5862;30880;Laatzen;3241;Region Hannover;3;NI +5863;30890;Barsinghausen;3241;Region Hannover;3;NI +5864;30900;Wedemark;3241;Region Hannover;3;NI +5865;30916;Isernhagen;3241;Region Hannover;3;NI +5866;30926;Seelze;3241;Region Hannover;3;NI +5867;30938;Burgwedel;3241;Region Hannover;3;NI +5868;30952;Ronnenberg;3241;Region Hannover;3;NI +5869;30966;Hemmingen;3241;Region Hannover;3;NI +5870;30974;Wennigsen;3241;Region Hannover;3;NI +5871;30982;Pattensen;3241;Region Hannover;3;NI +5872;30989;Gehrden;3241;Region Hannover;3;NI +5873;31008;Elze;3254;Hildesheim;3;NI +5874;31020;Salzhemmendorf;3252;Hameln-Pyrmont;3;NI +5875;31028;Gronau (Leine);3254;Hildesheim;3;NI +5876;31029;Banteln;3254;Hildesheim;3;NI +5877;31032;Betheln;3254;Hildesheim;3;NI +5878;31033;Brueggen;3254;Hildesheim;3;NI +5879;31035;Despetal;3254;Hildesheim;3;NI +5880;31036;Eime;3254;Hildesheim;3;NI +5881;31039;Rheden;3254;Hildesheim;3;NI +5882;31061;Alfeld (Leine);3254;Hildesheim;3;NI +5883;31073;Delligsen;3255;Holzminden;3;NI +5884;31079;Westfeld;3254;Hildesheim;3;NI +5885;31079;Sibbesse;3254;Hildesheim;3;NI +5886;31079;Almstedt;3254;Hildesheim;3;NI +5887;31079;Eberholzen;3254;Hildesheim;3;NI +5888;31079;Adenstedt;3254;Hildesheim;3;NI +5889;31084;Freden (Leine);3254;Hildesheim;3;NI +5890;31085;Everode;3254;Hildesheim;3;NI +5891;31087;Landwehr;3254;Hildesheim;3;NI +5892;31088;Winzenburg;3254;Hildesheim;3;NI +5893;31089;Duingen;3254;Hildesheim;3;NI +5894;31091;Coppengrave;3254;Hildesheim;3;NI +5895;31093;Hoyershausen;3254;Hildesheim;3;NI +5896;31094;Marienhagen;3254;Hildesheim;3;NI +5897;31096;Weenzen;3254;Hildesheim;3;NI +5898;31097;Harbarnsen;3254;Hildesheim;3;NI +5899;31099;Woltershausen;3254;Hildesheim;3;NI +5900;31134;Hildesheim;3254;Hildesheim;3;NI +5901;31135;Hildesheim;3254;Hildesheim;3;NI +5902;31137;Hildesheim;3254;Hildesheim;3;NI +5903;31139;Hildesheim;3254;Hildesheim;3;NI +5904;31141;Hildesheim;3254;Hildesheim;3;NI +5905;31157;Sarstedt;3254;Hildesheim;3;NI +5906;31162;Bad Salzdetfurth;3254;Hildesheim;3;NI +5907;31167;Bockenem;3254;Hildesheim;3;NI +5908;31171;Nordstemmen;3254;Hildesheim;3;NI +5909;31174;Schellerten;3254;Hildesheim;3;NI +5910;31177;Harsum;3254;Hildesheim;3;NI +5911;31180;Giesen;3254;Hildesheim;3;NI +5912;31185;Soehlde;3254;Hildesheim;3;NI +5913;31188;Holle;3254;Hildesheim;3;NI +5914;31191;Algermissen;3254;Hildesheim;3;NI +5915;31195;Neuhof;3254;Hildesheim;3;NI +5916;31195;Lamspringe;3254;Hildesheim;3;NI +5917;31196;Sehlem;3254;Hildesheim;3;NI +5918;31199;Diekholzen;3254;Hildesheim;3;NI +5919;31224;Peine;3157;Peine;3;NI +5920;31226;Peine;3157;Peine;3;NI +5921;31228;Peine;3157;Peine;3;NI +5922;31234;Edemissen;3157;Peine;3;NI +5923;31241;Ilsede;3157;Peine;3;NI +5924;31246;Lahstedt;3157;Peine;3;NI +5925;31249;Hohenhameln;3157;Peine;3;NI +5926;31275;Lehrte;3241;Region Hannover;3;NI +5927;31303;Burgdorf;3241;Region Hannover;3;NI +5928;31311;Uetze;3241;Region Hannover;3;NI +5929;31319;Sehnde;3241;Region Hannover;3;NI +5930;31515;Wunstorf;3241;Region Hannover;3;NI +5931;31535;Neustadt am Ruebenberge;3241;Region Hannover;3;NI +5932;31542;Bad Nenndorf;3257;Schaumburg;3;NI +5933;31547;Rehburg-Loccum;3256;Nienburg (Weser);3;NI +5934;31552;Apelern;3257;Schaumburg;3;NI +5935;31552;Rodenberg;3257;Schaumburg;3;NI +5936;31553;SNhagen;3257;Schaumburg;3;NI +5937;31553;Auhagen;3257;Schaumburg;3;NI +5938;31555;Suthfeld;3257;Schaumburg;3;NI +5939;31556;Woelpinghausen;3257;Schaumburg;3;NI +5940;31558;Hagenburg;3257;Schaumburg;3;NI +5941;31559;Haste;3257;Schaumburg;3;NI +5942;31559;Hohnhorst;3257;Schaumburg;3;NI +5943;31582;Nienburg (Weser);3256;Nienburg (Weser);3;NI +5944;31592;Stolzenau;3256;Nienburg (Weser);3;NI +5945;31595;Steyerberg;3256;Nienburg (Weser);3;NI +5946;31600;Uchte;3256;Nienburg (Weser);3;NI +5947;31603;Diepenau;3256;Nienburg (Weser);3;NI +5948;31604;Raddestorf;3256;Nienburg (Weser);3;NI +5949;31606;Warmsen;3256;Nienburg (Weser);3;NI +5950;31608;Marklohe;3256;Nienburg (Weser);3;NI +5951;31609;Balge;3256;Nienburg (Weser);3;NI +5952;31613;Wietzen;3256;Nienburg (Weser);3;NI +5953;31618;Liebenau;3256;Nienburg (Weser);3;NI +5954;31619;Binnen;3256;Nienburg (Weser);3;NI +5955;31621;Pennigsehl;3256;Nienburg (Weser);3;NI +5956;31622;Heemsen;3256;Nienburg (Weser);3;NI +5957;31623;Drakenburg;3256;Nienburg (Weser);3;NI +5958;31626;Hassbergen;3256;Nienburg (Weser);3;NI +5959;31627;Rohrsen;3256;Nienburg (Weser);3;NI +5960;31628;Landesbergen;3256;Nienburg (Weser);3;NI +5961;31629;Estorf;3256;Nienburg (Weser);3;NI +5962;31632;Husum;3256;Nienburg (Weser);3;NI +5963;31633;Leese;3256;Nienburg (Weser);3;NI +5964;31634;Steimbke;3256;Nienburg (Weser);3;NI +5965;31636;Linsburg;3256;Nienburg (Weser);3;NI +5966;31637;Rodewald;3256;Nienburg (Weser);3;NI +5967;31638;Stoeckse;3256;Nienburg (Weser);3;NI +5968;31655;Stadthagen;3257;Schaumburg;3;NI +5969;31675;Bueckeburg;3257;Schaumburg;3;NI +5970;31683;Obernkirchen;3257;Schaumburg;3;NI +5971;31688;Nienstaedt;3257;Schaumburg;3;NI +5972;31691;Helpsen;3257;Schaumburg;3;NI +5973;31691;Seggebruch;3257;Schaumburg;3;NI +5974;31693;Hespe;3257;Schaumburg;3;NI +5975;31698;Lindhorst;3257;Schaumburg;3;NI +5976;31699;Beckedorf;3257;Schaumburg;3;NI +5977;31700;Heuerssen;3257;Schaumburg;3;NI +5978;31702;Luedersfeld;3257;Schaumburg;3;NI +5979;31707;Heessen;3257;Schaumburg;3;NI +5980;31707;Bad Eilsen;3257;Schaumburg;3;NI +5981;31708;Ahnsen;3257;Schaumburg;3;NI +5982;31710;Buchholz;3257;Schaumburg;3;NI +5983;31711;Luhden;3257;Schaumburg;3;NI +5984;31712;Niedernwoehren;3257;Schaumburg;3;NI +5985;31714;Lauenhagen;3257;Schaumburg;3;NI +5986;31715;Meerbeck;3257;Schaumburg;3;NI +5987;31717;Nordsehl;3257;Schaumburg;3;NI +5988;31718;Pollhagen;3257;Schaumburg;3;NI +5989;31719;Wiedensahl;3257;Schaumburg;3;NI +5990;31737;Rinteln;3257;Schaumburg;3;NI +5991;31749;Auetal;3257;Schaumburg;3;NI +5992;31785;Hameln;3252;Hameln-Pyrmont;3;NI +5993;31787;Hameln;3252;Hameln-Pyrmont;3;NI +5994;31789;Hameln;3252;Hameln-Pyrmont;3;NI +5995;31812;Bad Pyrmont;3252;Hameln-Pyrmont;3;NI +5996;31832;Springe;3241;Region Hannover;3;NI +5997;31840;Hessisch Oldendorf;3252;Hameln-Pyrmont;3;NI +5998;31848;Bad Muender am Deister;3252;Hameln-Pyrmont;3;NI +5999;31855;Aerzen;3252;Hameln-Pyrmont;3;NI +6000;31860;Emmerthal;3252;Hameln-Pyrmont;3;NI +6001;31863;Coppenbruegge;3252;Hameln-Pyrmont;3;NI +6002;31867;Lauenau;3257;Schaumburg;3;NI +6003;31867;Pohle;3257;Schaumburg;3;NI +6004;31867;Huelsede;3257;Schaumburg;3;NI +6005;31867;Messenkamp;3257;Schaumburg;3;NI +6006;31868;Ottenstein;3255;Holzminden;3;NI +6007;32049;Herford;5758;Herford;5;NW +6008;32051;Herford;5758;Herford;5;NW +6009;32052;Herford;5758;Herford;5;NW +6010;32105;Bad Salzuflen;5766;Lippe;5;NW +6011;32107;Bad Salzuflen;5766;Lippe;5;NW +6012;32108;Bad Salzuflen;5766;Lippe;5;NW +6013;32120;Hiddenhausen;5758;Herford;5;NW +6014;32130;Enger;5758;Herford;5;NW +6015;32139;Spenge;5758;Herford;5;NW +6016;32257;Buende;5758;Herford;5;NW +6017;32278;Kirchlengern;5758;Herford;5;NW +6018;32289;Roedinghausen;5758;Herford;5;NW +6019;32312;Luebbecke;5770;Minden-Luebbecke;5;NW +6020;32339;Espelkamp;5770;Minden-Luebbecke;5;NW +6021;32351;Stemwede;5770;Minden-Luebbecke;5;NW +6022;32361;Preussisch Oldendorf;5770;Minden-Luebbecke;5;NW +6023;32369;Rahden;5770;Minden-Luebbecke;5;NW +6024;32423;Minden;5770;Minden-Luebbecke;5;NW +6025;32425;Minden;5770;Minden-Luebbecke;5;NW +6026;32427;Minden;5770;Minden-Luebbecke;5;NW +6027;32429;Minden;5770;Minden-Luebbecke;5;NW +6028;32457;Porta Westfalica;5770;Minden-Luebbecke;5;NW +6029;32469;Petershagen;5770;Minden-Luebbecke;5;NW +6030;32479;Hille;5770;Minden-Luebbecke;5;NW +6031;32545;Bad Oeynhausen;5770;Minden-Luebbecke;5;NW +6032;32547;Bad Oeynhausen;5770;Minden-Luebbecke;5;NW +6033;32549;Bad Oeynhausen;5770;Minden-Luebbecke;5;NW +6034;32584;Loehne;5758;Herford;5;NW +6035;32602;Vlotho;5758;Herford;5;NW +6036;32609;Huellhorst;5770;Minden-Luebbecke;5;NW +6037;32657;Lemgo;5766;Lippe;5;NW +6038;32676;Luegde;5766;Lippe;5;NW +6039;32683;Barntrup;5766;Lippe;5;NW +6040;32689;Kalletal;5766;Lippe;5;NW +6041;32694;Doerentrup;5766;Lippe;5;NW +6042;32699;Extertal;5766;Lippe;5;NW +6043;32756;Detmold;5766;Lippe;5;NW +6044;32758;Detmold;5766;Lippe;5;NW +6045;32760;Detmold;5766;Lippe;5;NW +6046;32791;Lage;5766;Lippe;5;NW +6047;32805;Horn-Bad Meinberg;5766;Lippe;5;NW +6048;32816;Schieder-Schwalenberg;5766;Lippe;5;NW +6049;32825;Blomberg;5766;Lippe;5;NW +6050;32832;Augustdorf;5766;Lippe;5;NW +6051;32839;Steinheim;5762;Hoexter;5;NW +6052;33014;Bad Driburg;5762;Hoexter;5;NW +6053;33034;Brakel;5762;Hoexter;5;NW +6054;33039;Nieheim;5762;Hoexter;5;NW +6055;33098;Paderborn;5774;Paderborn;5;NW +6056;33100;Paderborn;5774;Paderborn;5;NW +6057;33102;Paderborn;5774;Paderborn;5;NW +6058;33104;Paderborn;5774;Paderborn;5;NW +6059;33106;Paderborn;5774;Paderborn;5;NW +6060;33129;Delbrueck;5774;Paderborn;5;NW +6061;33142;Bueren;5774;Paderborn;5;NW +6062;33154;Salzkotten;5774;Paderborn;5;NW +6063;33161;Hoevelhof;5774;Paderborn;5;NW +6064;33165;Lichtenau;5774;Paderborn;5;NW +6065;33175;Bad Lippspringe;5774;Paderborn;5;NW +6066;33178;Borchen;5774;Paderborn;5;NW +6067;33181;Bad Wuennenberg;5774;Paderborn;5;NW +6068;33184;Altenbeken;5774;Paderborn;5;NW +6069;33189;Schlangen;5766;Lippe;5;NW +6070;33330;Guetersloh;5754;Guetersloh;5;NW +6071;33332;Guetersloh;5754;Guetersloh;5;NW +6072;33334;Guetersloh;5754;Guetersloh;5;NW +6073;33335;Guetersloh;5754;Guetersloh;5;NW +6074;33378;Rheda-Wiedenbrueck;5754;Guetersloh;5;NW +6075;33397;Rietberg;5754;Guetersloh;5;NW +6076;33415;Verl;5754;Guetersloh;5;NW +6077;33428;Harsewinkel;5754;Guetersloh;5;NW +6078;33442;Herzebrock-Clarholz;5754;Guetersloh;5;NW +6079;33449;Langenberg;5754;Guetersloh;5;NW +6080;33602;Bielefeld;5711;Bielefeld, Stadt;5;NW +6081;33604;Bielefeld;5711;Bielefeld, Stadt;5;NW +6082;33605;Bielefeld;5711;Bielefeld, Stadt;5;NW +6083;33607;Bielefeld;5711;Bielefeld, Stadt;5;NW +6084;33609;Bielefeld;5711;Bielefeld, Stadt;5;NW +6085;33611;Bielefeld;5711;Bielefeld, Stadt;5;NW +6086;33613;Bielefeld;5711;Bielefeld, Stadt;5;NW +6087;33615;Bielefeld;5711;Bielefeld, Stadt;5;NW +6088;33617;Bielefeld;5711;Bielefeld, Stadt;5;NW +6089;33619;Bielefeld;5711;Bielefeld, Stadt;5;NW +6090;33647;Bielefeld;5711;Bielefeld, Stadt;5;NW +6091;33649;Bielefeld;5711;Bielefeld, Stadt;5;NW +6092;33659;Bielefeld;5711;Bielefeld, Stadt;5;NW +6093;33689;Bielefeld;5711;Bielefeld, Stadt;5;NW +6094;33699;Bielefeld;5711;Bielefeld, Stadt;5;NW +6095;33719;Bielefeld;5711;Bielefeld, Stadt;5;NW +6096;33729;Bielefeld;5711;Bielefeld, Stadt;5;NW +6097;33739;Bielefeld;5711;Bielefeld, Stadt;5;NW +6098;33758;Schloss Holte-Stukenbrock;5754;Guetersloh;5;NW +6099;33775;Versmold;5754;Guetersloh;5;NW +6100;33790;Halle;5754;Guetersloh;5;NW +6101;33803;Steinhagen;5754;Guetersloh;5;NW +6102;33813;Oerlinghausen;5766;Lippe;5;NW +6103;33818;Leopoldshoehe;5766;Lippe;5;NW +6104;33824;Werther;5754;Guetersloh;5;NW +6105;33829;Borgholzhausen;5754;Guetersloh;5;NW +6106;34117;Kassel;6611;Kassel, Stadt;6;HE +6107;34119;Kassel;6611;Kassel, Stadt;6;HE +6108;34121;Kassel;6611;Kassel, Stadt;6;HE +6109;34123;Kassel;6611;Kassel, Stadt;6;HE +6110;34125;Kassel;6611;Kassel, Stadt;6;HE +6111;34127;Kassel;6611;Kassel, Stadt;6;HE +6112;34128;Kassel;6611;Kassel, Stadt;6;HE +6113;34130;Kassel;6611;Kassel, Stadt;6;HE +6114;34131;Kassel;6611;Kassel, Stadt;6;HE +6115;34132;Kassel;6611;Kassel, Stadt;6;HE +6116;34134;Kassel;6611;Kassel, Stadt;6;HE +6117;34212;Melsungen;6634;Schwalm-Eder-Kreis;6;HE +6118;34225;Baunatal;6633;Kassel;6;HE +6119;34233;Fuldatal;6633;Kassel;6;HE +6120;34246;Vellmar;6633;Kassel;6;HE +6121;34253;Lohfelden;6633;Kassel;6;HE +6122;34260;Kaufungen;6633;Kassel;6;HE +6123;34266;Niestetal;6633;Kassel;6;HE +6124;34270;Schauenburg;6633;Kassel;6;HE +6125;34277;Fuldabrueck;6633;Kassel;6;HE +6126;34281;Gudensberg;6634;Schwalm-Eder-Kreis;6;HE +6127;34286;Spangenberg;6634;Schwalm-Eder-Kreis;6;HE +6128;34289;Zierenberg;6633;Kassel;6;HE +6129;34292;Ahnatal;6633;Kassel;6;HE +6130;34295;Edermuende;6634;Schwalm-Eder-Kreis;6;HE +6131;34298;Helsa;6633;Kassel;6;HE +6132;34302;Guxhagen;6634;Schwalm-Eder-Kreis;6;HE +6133;34305;Niedenstein;6634;Schwalm-Eder-Kreis;6;HE +6134;34308;Bad Emstal;6633;Kassel;6;HE +6135;34311;Naumburg;6633;Kassel;6;HE +6136;34314;Espenau;6633;Kassel;6;HE +6137;34317;Habichtswald;6633;Kassel;6;HE +6138;34320;Soehrewald;6633;Kassel;6;HE +6139;34323;Malsfeld;6634;Schwalm-Eder-Kreis;6;HE +6140;34326;Morschen;6634;Schwalm-Eder-Kreis;6;HE +6141;34327;Koerle;6634;Schwalm-Eder-Kreis;6;HE +6142;34329;Nieste;6633;Kassel;6;HE +6143;34346;Hannoversch Muenden;3152;Goettingen;3;NI +6144;34355;Staufenberg;3152;Goettingen;3;NI +6145;34359;Reinhardshagen;6633;Kassel;6;HE +6146;34369;Hofgeismar;6633;Kassel;6;HE +6147;34376;Immenhausen;6633;Kassel;6;HE +6148;34379;Calden;6633;Kassel;6;HE +6149;34385;Bad Karlshafen;6633;Kassel;6;HE +6150;34388;Trendelburg;6633;Kassel;6;HE +6151;34393;Grebenstein;6633;Kassel;6;HE +6152;34396;Liebenau;6633;Kassel;6;HE +6153;34399;Oberweser;6633;Kassel;6;HE +6154;34414;Warburg;5762;Hoexter;5;NW +6155;34431;Marsberg;5958;Hochsauerlandkreis;5;NW +6156;34434;Borgentreich;5762;Hoexter;5;NW +6157;34439;Willebadessen;5762;Hoexter;5;NW +6158;34454;Bad Arolsen;6635;Waldeck-Frankenberg;6;HE +6159;34466;Wolfhagen;6633;Kassel;6;HE +6160;34471;Volkmarsen;6635;Waldeck-Frankenberg;6;HE +6161;34474;Diemelstadt;6635;Waldeck-Frankenberg;6;HE +6162;34477;Twistetal;6635;Waldeck-Frankenberg;6;HE +6163;34479;Breuna;6633;Kassel;6;HE +6164;34497;Korbach;6635;Waldeck-Frankenberg;6;HE +6165;34508;Willingen (Upland);6635;Waldeck-Frankenberg;6;HE +6166;34513;Waldeck;6635;Waldeck-Frankenberg;6;HE +6167;34516;Voehl;6635;Waldeck-Frankenberg;6;HE +6168;34519;Diemelsee;6635;Waldeck-Frankenberg;6;HE +6169;34537;Bad Wildungen;6635;Waldeck-Frankenberg;6;HE +6170;34549;Edertal;6635;Waldeck-Frankenberg;6;HE +6171;34560;Fritzlar;6634;Schwalm-Eder-Kreis;6;HE +6172;34576;Homberg (Efze);6634;Schwalm-Eder-Kreis;6;HE +6173;34582;Borken;6634;Schwalm-Eder-Kreis;6;HE +6174;34587;Felsberg;6634;Schwalm-Eder-Kreis;6;HE +6175;34590;Wabern;6634;Schwalm-Eder-Kreis;6;HE +6176;34593;Knuellwald;6634;Schwalm-Eder-Kreis;6;HE +6177;34596;Bad Zwesten;6634;Schwalm-Eder-Kreis;6;HE +6178;34599;Neuental;6634;Schwalm-Eder-Kreis;6;HE +6179;34613;Schwalmstadt;6634;Schwalm-Eder-Kreis;6;HE +6180;34621;Frielendorf;6634;Schwalm-Eder-Kreis;6;HE +6181;34626;Neukirchen;6634;Schwalm-Eder-Kreis;6;HE +6182;34628;Willingshausen;6634;Schwalm-Eder-Kreis;6;HE +6183;34630;Gilserberg;6634;Schwalm-Eder-Kreis;6;HE +6184;34632;Jesberg;6634;Schwalm-Eder-Kreis;6;HE +6185;34633;Ottrau;6634;Schwalm-Eder-Kreis;6;HE +6186;34637;Schrecksbach;6634;Schwalm-Eder-Kreis;6;HE +6187;34639;Schwarzenborn;6634;Schwalm-Eder-Kreis;6;HE +6188;35037;Marburg;6534;Marburg-Biedenkopf;6;HE +6189;35039;Marburg;6534;Marburg-Biedenkopf;6;HE +6190;35041;Marburg;6534;Marburg-Biedenkopf;6;HE +6191;35043;Marburg;6534;Marburg-Biedenkopf;6;HE +6192;35066;Frankenberg (Eder);6635;Waldeck-Frankenberg;6;HE +6193;35075;Gladenbach;6534;Marburg-Biedenkopf;6;HE +6194;35080;Bad Endbach;6534;Marburg-Biedenkopf;6;HE +6195;35083;Wetter;6534;Marburg-Biedenkopf;6;HE +6196;35085;Ebsdorfergrund;6534;Marburg-Biedenkopf;6;HE +6197;35088;Battenberg (Eder);6635;Waldeck-Frankenberg;6;HE +6198;35091;Coelbe;6534;Marburg-Biedenkopf;6;HE +6199;35094;Lahntal;6534;Marburg-Biedenkopf;6;HE +6200;35096;Weimar;6534;Marburg-Biedenkopf;6;HE +6201;35099;Burgwald;6635;Waldeck-Frankenberg;6;HE +6202;35102;Lohra;6534;Marburg-Biedenkopf;6;HE +6203;35104;Lichtenfels;6635;Waldeck-Frankenberg;6;HE +6204;35108;Allendorf (Eder);6635;Waldeck-Frankenberg;6;HE +6205;35110;Frankenau;6635;Waldeck-Frankenberg;6;HE +6206;35112;Fronhausen;6534;Marburg-Biedenkopf;6;HE +6207;35114;Haina (Kloster);6635;Waldeck-Frankenberg;6;HE +6208;35116;Hatzfeld (Eder);6635;Waldeck-Frankenberg;6;HE +6209;35117;Muenchhausen;6534;Marburg-Biedenkopf;6;HE +6210;35119;Rosenthal;6635;Waldeck-Frankenberg;6;HE +6211;35216;Biedenkopf;6534;Marburg-Biedenkopf;6;HE +6212;35232;Dautphetal;6534;Marburg-Biedenkopf;6;HE +6213;35236;Breidenbach;6534;Marburg-Biedenkopf;6;HE +6214;35239;Steffenberg;6534;Marburg-Biedenkopf;6;HE +6215;35260;Stadtallendorf;6534;Marburg-Biedenkopf;6;HE +6216;35274;Kirchhain;6534;Marburg-Biedenkopf;6;HE +6217;35279;Neustadt (HE);6534;Marburg-Biedenkopf;6;HE +6218;35282;Rauschenberg;6534;Marburg-Biedenkopf;6;HE +6219;35285;Gemuenden (Wohra);6635;Waldeck-Frankenberg;6;HE +6220;35287;Amoeneburg;6534;Marburg-Biedenkopf;6;HE +6221;35288;Wohratal;6534;Marburg-Biedenkopf;6;HE +6222;35305;Gruenberg;6531;Giessen;6;HE +6223;35315;Homberg (Ohm);6535;Vogelsbergkreis;6;HE +6224;35321;Laubach;6531;Giessen;6;HE +6225;35325;Muecke;6535;Vogelsbergkreis;6;HE +6226;35327;Ulrichstein;6535;Vogelsbergkreis;6;HE +6227;35329;Gemuenden (Felda);6535;Vogelsbergkreis;6;HE +6228;35390;Giessen;6531;Giessen;6;HE +6229;35392;Giessen;6531;Giessen;6;HE +6230;35394;Giessen;6531;Giessen;6;HE +6231;35396;Giessen;6531;Giessen;6;HE +6232;35398;Giessen;6531;Giessen;6;HE +6233;35410;Hungen;6531;Giessen;6;HE +6234;35415;Pohlheim;6531;Giessen;6;HE +6235;35418;Buseck;6531;Giessen;6;HE +6236;35423;Lich;6531;Giessen;6;HE +6237;35428;Langgoens;6531;Giessen;6;HE +6238;35435;Wettenberg;6531;Giessen;6;HE +6239;35440;Linden;6531;Giessen;6;HE +6240;35444;Biebertal;6531;Giessen;6;HE +6241;35447;Reiskirchen;6531;Giessen;6;HE +6242;35452;Heuchelheim;6531;Giessen;6;HE +6243;35457;Lollar;6531;Giessen;6;HE +6244;35460;Staufenberg;6531;Giessen;6;HE +6245;35463;Fernwald;6531;Giessen;6;HE +6246;35466;Rabenau;6531;Giessen;6;HE +6247;35469;Allendorf (Lumda);6531;Giessen;6;HE +6248;35510;Butzbach;6440;Wetteraukreis;6;HE +6249;35516;Muenzenberg;6440;Wetteraukreis;6;HE +6250;35519;Rockenberg;6440;Wetteraukreis;6;HE +6251;35576;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6252;35578;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6253;35579;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6254;35580;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6255;35581;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6256;35582;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6257;35583;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6258;35584;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6259;35585;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6260;35586;Wetzlar;6532;Lahn-Dill-Kreis;6;HE +6261;35606;Solms;6532;Lahn-Dill-Kreis;6;HE +6262;35614;Asslar;6532;Lahn-Dill-Kreis;6;HE +6263;35619;Braunfels;6532;Lahn-Dill-Kreis;6;HE +6264;35625;Huettenberg;6532;Lahn-Dill-Kreis;6;HE +6265;35630;Ehringshausen;6532;Lahn-Dill-Kreis;6;HE +6266;35633;Lahnau;6532;Lahn-Dill-Kreis;6;HE +6267;35638;Leun;6532;Lahn-Dill-Kreis;6;HE +6268;35641;Schoeffengrund;6532;Lahn-Dill-Kreis;6;HE +6269;35644;Hohenahr;6532;Lahn-Dill-Kreis;6;HE +6270;35647;Waldsolms;6532;Lahn-Dill-Kreis;6;HE +6271;35649;Bischoffen;6532;Lahn-Dill-Kreis;6;HE +6272;35683;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6273;35684;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6274;35685;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6275;35686;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6276;35687;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6277;35688;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6278;35689;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6279;35690;Dillenburg;6532;Lahn-Dill-Kreis;6;HE +6280;35708;Haiger;6532;Lahn-Dill-Kreis;6;HE +6281;35713;Eschenburg;6532;Lahn-Dill-Kreis;6;HE +6282;35716;Dietzhoelztal;6532;Lahn-Dill-Kreis;6;HE +6283;35719;Angelburg;6534;Marburg-Biedenkopf;6;HE +6284;35745;Herborn;6532;Lahn-Dill-Kreis;6;HE +6285;35753;Greifenstein;6532;Lahn-Dill-Kreis;6;HE +6286;35756;Mittenaar;6532;Lahn-Dill-Kreis;6;HE +6287;35759;Driedorf;6532;Lahn-Dill-Kreis;6;HE +6288;35764;Sinn;6532;Lahn-Dill-Kreis;6;HE +6289;35767;Breitscheid;6532;Lahn-Dill-Kreis;6;HE +6290;35768;Siegbach;6532;Lahn-Dill-Kreis;6;HE +6291;35781;Weilburg;6533;Limburg-Weilburg;6;HE +6292;35789;Weilmuenster;6533;Limburg-Weilburg;6;HE +6293;35792;Loehnberg;6533;Limburg-Weilburg;6;HE +6294;35794;Mengerskirchen;6533;Limburg-Weilburg;6;HE +6295;35796;Weinbach;6533;Limburg-Weilburg;6;HE +6296;35799;Merenberg;6533;Limburg-Weilburg;6;HE +6297;36037;Fulda;6631;Fulda;6;HE +6298;36039;Fulda;6631;Fulda;6;HE +6299;36041;Fulda;6631;Fulda;6;HE +6300;36043;Fulda;6631;Fulda;6;HE +6301;36088;Huenfeld;6631;Fulda;6;HE +6302;36093;Kuenzell;6631;Fulda;6;HE +6303;36100;Petersberg;6631;Fulda;6;HE +6304;36103;Flieden;6631;Fulda;6;HE +6305;36110;Schlitz;6535;Vogelsbergkreis;6;HE +6306;36115;Ehrenberg;6631;Fulda;6;HE +6307;36115;Hilders;6631;Fulda;6;HE +6308;36119;Neuhof;6631;Fulda;6;HE +6309;36124;Eichenzell;6631;Fulda;6;HE +6310;36129;Gersfeld;6631;Fulda;6;HE +6311;36132;Eiterfeld;6631;Fulda;6;HE +6312;36137;Grossenlueder;6631;Fulda;6;HE +6313;36142;Tann;6631;Fulda;6;HE +6314;36145;Hofbieber;6631;Fulda;6;HE +6315;36148;Kalbach;6631;Fulda;6;HE +6316;36151;Burghaun;6631;Fulda;6;HE +6317;36154;Hosenfeld;6631;Fulda;6;HE +6318;36157;Ebersburg;6631;Fulda;6;HE +6319;36160;Dipperz;6631;Fulda;6;HE +6320;36163;Poppenhausen;6631;Fulda;6;HE +6321;36166;Haunetal;6632;Hersfeld-Rotenburg;6;HE +6322;36167;Nuesttal;6631;Fulda;6;HE +6323;36169;Rasdorf;6631;Fulda;6;HE +6324;36179;Bebra;6632;Hersfeld-Rotenburg;6;HE +6325;36199;Rotenburg an der Fulda;6632;Hersfeld-Rotenburg;6;HE +6326;36205;Sontra;6636;Werra-Meissner-Kreis;6;HE +6327;36208;Wildeck;6632;Hersfeld-Rotenburg;6;HE +6328;36211;Alheim;6632;Hersfeld-Rotenburg;6;HE +6329;36214;Nentershausen;6632;Hersfeld-Rotenburg;6;HE +6330;36217;Ronshausen;6632;Hersfeld-Rotenburg;6;HE +6331;36219;Cornberg;6632;Hersfeld-Rotenburg;6;HE +6332;36251;Ludwigsau;6632;Hersfeld-Rotenburg;6;HE +6333;36251;Bad Hersfeld;6632;Hersfeld-Rotenburg;6;HE +6334;36266;Heringen (Werra);6632;Hersfeld-Rotenburg;6;HE +6335;36269;Philippsthal (Werra);6632;Hersfeld-Rotenburg;6;HE +6336;36272;Niederaula;6632;Hersfeld-Rotenburg;6;HE +6337;36275;Kirchheim;6632;Hersfeld-Rotenburg;6;HE +6338;36277;Schenklengsfeld;6632;Hersfeld-Rotenburg;6;HE +6339;36280;Oberaula;6634;Schwalm-Eder-Kreis;6;HE +6340;36282;Hauneck;6632;Hersfeld-Rotenburg;6;HE +6341;36284;Hohenroda;6632;Hersfeld-Rotenburg;6;HE +6342;36286;Neuenstein;6632;Hersfeld-Rotenburg;6;HE +6343;36287;Breitenbach am Herzberg;6632;Hersfeld-Rotenburg;6;HE +6344;36289;Friedewald;6632;Hersfeld-Rotenburg;6;HE +6345;36304;Alsfeld;6535;Vogelsbergkreis;6;HE +6346;36318;Schwalmtal;6535;Vogelsbergkreis;6;HE +6347;36320;Kirtorf;6535;Vogelsbergkreis;6;HE +6348;36323;Grebenau;6535;Vogelsbergkreis;6;HE +6349;36325;Feldatal;6535;Vogelsbergkreis;6;HE +6350;36326;Antrifttal;6535;Vogelsbergkreis;6;HE +6351;36329;Romrod;6535;Vogelsbergkreis;6;HE +6352;36341;Lauterbach;6535;Vogelsbergkreis;6;HE +6353;36355;Grebenhain;6535;Vogelsbergkreis;6;HE +6354;36358;Herbstein;6535;Vogelsbergkreis;6;HE +6355;36364;Bad Salzschlirf;6631;Fulda;6;HE +6356;36367;Wartenberg;6535;Vogelsbergkreis;6;HE +6357;36369;Lautertal;6535;Vogelsbergkreis;6;HE +6358;36381;Schluechtern;6435;Main-Kinzig-Kreis;6;HE +6359;36391;Sinntal;6435;Main-Kinzig-Kreis;6;HE +6360;36396;Steinau an der Strasse;6435;Main-Kinzig-Kreis;6;HE +6361;36399;Freiensteinau;6535;Vogelsbergkreis;6;HE +6362;36404;Martinroda;16063;Wartburgkreis;16;TH +6363;36404;Voelkershausen;16063;Wartburgkreis;16;TH +6364;36404;Woelferbuett;16063;Wartburgkreis;16;TH +6365;36404;Oechsen;16063;Wartburgkreis;16;TH +6366;36404;Vacha;16063;Wartburgkreis;16;TH +6367;36414;Unterbreizbach;16063;Wartburgkreis;16;TH +6368;36419;Rockenstuhl;16063;Wartburgkreis;16;TH +6369;36419;Geisa;16063;Wartburgkreis;16;TH +6370;36419;Schleid;16063;Wartburgkreis;16;TH +6371;36419;Gerstengrund;16063;Wartburgkreis;16;TH +6372;36419;Buttlar;16063;Wartburgkreis;16;TH +6373;36433;Leimbach;16063;Wartburgkreis;16;TH +6374;36433;Immelborn;16063;Wartburgkreis;16;TH +6375;36433;Moorgrund;16063;Wartburgkreis;16;TH +6376;36433;Bad Salzungen;16063;Wartburgkreis;16;TH +6377;36448;Steinbach;16063;Wartburgkreis;16;TH +6378;36448;Bad Liebenstein;16063;Wartburgkreis;16;TH +6379;36448;Schweina;16063;Wartburgkreis;16;TH +6380;36452;Neidhartshausen;16063;Wartburgkreis;16;TH +6381;36452;Kaltennordheim;16063;Wartburgkreis;16;TH +6382;36452;Diedorf;16063;Wartburgkreis;16;TH +6383;36452;Zella;16063;Wartburgkreis;16;TH +6384;36452;Empfertshausen;16063;Wartburgkreis;16;TH +6385;36452;Kaltenlengsfeld;16063;Wartburgkreis;16;TH +6386;36452;Brunnhartshausen;16063;Wartburgkreis;16;TH +6387;36452;Klings;16063;Wartburgkreis;16;TH +6388;36452;Fischbach/Rhoen;16063;Wartburgkreis;16;TH +6389;36452;Andenhausen;16063;Wartburgkreis;16;TH +6390;36456;Barchfeld;16063;Wartburgkreis;16;TH +6391;36457;Stadtlengsfeld;16063;Wartburgkreis;16;TH +6392;36457;Urnshausen;16063;Wartburgkreis;16;TH +6393;36457;Weilar;16063;Wartburgkreis;16;TH +6394;36460;Frauensee;16063;Wartburgkreis;16;TH +6395;36460;Merkers-Kieselbach;16063;Wartburgkreis;16;TH +6396;36460;Dorndorf;16063;Wartburgkreis;16;TH +6397;36466;Dermbach;16063;Wartburgkreis;16;TH +6398;36466;Wiesenthal;16063;Wartburgkreis;16;TH +6399;36469;Tiefenort;16063;Wartburgkreis;16;TH +6400;37073;Goettingen;3152;Goettingen;3;NI +6401;37075;Goettingen;3152;Goettingen;3;NI +6402;37077;Goettingen;3152;Goettingen;3;NI +6403;37079;Goettingen;3152;Goettingen;3;NI +6404;37081;Goettingen;3152;Goettingen;3;NI +6405;37083;Goettingen;3152;Goettingen;3;NI +6406;37085;Goettingen;3152;Goettingen;3;NI +6407;37115;Duderstadt;3152;Goettingen;3;NI +6408;37120;Bovenden;3152;Goettingen;3;NI +6409;37124;Rosdorf;3152;Goettingen;3;NI +6410;37127;Scheden;3152;Goettingen;3;NI +6411;37127;Buehren;3152;Goettingen;3;NI +6412;37127;Niemetal;3152;Goettingen;3;NI +6413;37127;Dransfeld;3152;Goettingen;3;NI +6414;37127;Juehnde;3152;Goettingen;3;NI +6415;37130;Gleichen;3152;Goettingen;3;NI +6416;37133;Friedland;3152;Goettingen;3;NI +6417;37136;Landolfshausen;3152;Goettingen;3;NI +6418;37136;Seulingen;3152;Goettingen;3;NI +6419;37136;Seeburg;3152;Goettingen;3;NI +6420;37136;Ebergoetzen;3152;Goettingen;3;NI +6421;37136;Waake;3152;Goettingen;3;NI +6422;37139;Adelebsen;3152;Goettingen;3;NI +6423;37154;Northeim;3155;Northeim;3;NI +6424;37170;Uslar;3155;Northeim;3;NI +6425;37176;Noerten-Hardenberg;3155;Northeim;3;NI +6426;37181;Hardegsen;3155;Northeim;3;NI +6427;37186;Moringen;3155;Northeim;3;NI +6428;37191;Katlenburg-Lindau;3155;Northeim;3;NI +6429;37194;Wahlsburg;6633;Kassel;6;HE +6430;37194;Bodenfelde;3155;Northeim;3;NI +6431;37197;Hattorf am Harz;3156;Osterode am Harz;3;NI +6432;37199;Wulften;3156;Osterode am Harz;3;NI +6433;37213;Witzenhausen;6636;Werra-Meissner-Kreis;6;HE +6434;37214;Witzenhausen;6636;Werra-Meissner-Kreis;6;HE +6435;37215;Witzenhausen;6636;Werra-Meissner-Kreis;6;HE +6436;37216;Witzenhausen;6636;Werra-Meissner-Kreis;6;HE +6437;37217;Witzenhausen;6636;Werra-Meissner-Kreis;6;HE +6438;37218;Witzenhausen;6636;Werra-Meissner-Kreis;6;HE +6439;37235;Hessisch Lichtenau;6636;Werra-Meissner-Kreis;6;HE +6440;37242;Bad Sooden-Allendorf;6636;Werra-Meissner-Kreis;6;HE +6441;37247;Grossalmerode;6636;Werra-Meissner-Kreis;6;HE +6442;37249;Neu-Eichenberg;6636;Werra-Meissner-Kreis;6;HE +6443;37269;Eschwege;6636;Werra-Meissner-Kreis;6;HE +6444;37276;Meinhard;6636;Werra-Meissner-Kreis;6;HE +6445;37281;Wanfried;6636;Werra-Meissner-Kreis;6;HE +6446;37284;Waldkappel;6636;Werra-Meissner-Kreis;6;HE +6447;37287;Wehretal;6636;Werra-Meissner-Kreis;6;HE +6448;37290;Meissner;6636;Werra-Meissner-Kreis;6;HE +6449;37293;Herleshausen;6636;Werra-Meissner-Kreis;6;HE +6450;37296;Ringgau;6636;Werra-Meissner-Kreis;6;HE +6451;37297;Berkatal;6636;Werra-Meissner-Kreis;6;HE +6452;37299;Weissenborn;6636;Werra-Meissner-Kreis;6;HE +6453;37308;Steinbach;16061;Eichsfeld;16;TH +6454;37308;Reinholterode;16061;Eichsfeld;16;TH +6455;37308;Glasehausen;16061;Eichsfeld;16;TH +6456;37308;Krombach;16061;Eichsfeld;16;TH +6457;37308;Hohes Kreuz;16061;Eichsfeld;16;TH +6458;37308;Heilbad Heiligenstadt;16061;Eichsfeld;16;TH +6459;37308;Sickerode;16061;Eichsfeld;16;TH +6460;37308;Volkerode;16061;Eichsfeld;16;TH +6461;37308;Wiesenfeld;16061;Eichsfeld;16;TH +6462;37308;Schimberg;16061;Eichsfeld;16;TH +6463;37308;Heuthen;16061;Eichsfeld;16;TH +6464;37308;Wingerode;16061;Eichsfeld;16;TH +6465;37308;Kella;16061;Eichsfeld;16;TH +6466;37308;Bodenrode-Westhausen;16061;Eichsfeld;16;TH +6467;37308;Geismar;16061;Eichsfeld;16;TH +6468;37308;Pfaffschwende;16061;Eichsfeld;16;TH +6469;37308;Geisleden;16061;Eichsfeld;16;TH +6470;37318;Schachtebich;16061;Eichsfeld;16;TH +6471;37318;Bernterode (bei Heilbad Heiligenstadt);16061;Eichsfeld;16;TH +6472;37318;Lutter;16061;Eichsfeld;16;TH +6473;37318;Rohrberg;16061;Eichsfeld;16;TH +6474;37318;Kirchgandern;16061;Eichsfeld;16;TH +6475;37318;Thalwenden;16061;Eichsfeld;16;TH +6476;37318;Hohengandern;16061;Eichsfeld;16;TH +6477;37318;Wahlhausen;16061;Eichsfeld;16;TH +6478;37318;Mackenrode;16061;Eichsfeld;16;TH +6479;37318;Freienhagen;16061;Eichsfeld;16;TH +6480;37318;Fretterode;16061;Eichsfeld;16;TH +6481;37318;Gerbershausen;16061;Eichsfeld;16;TH +6482;37318;Schoenhagen;16061;Eichsfeld;16;TH +6483;37318;Uder;16061;Eichsfeld;16;TH +6484;37318;Wuestheuterode;16061;Eichsfeld;16;TH +6485;37318;Eichstruth;16061;Eichsfeld;16;TH +6486;37318;Steinheuterode;16061;Eichsfeld;16;TH +6487;37318;Lenterode;16061;Eichsfeld;16;TH +6488;37318;Bornhagen;16061;Eichsfeld;16;TH +6489;37318;Marth;16061;Eichsfeld;16;TH +6490;37318;Lindewerra;16061;Eichsfeld;16;TH +6491;37318;Asbach-Sickenberg;16061;Eichsfeld;16;TH +6492;37318;Rustenfelde;16061;Eichsfeld;16;TH +6493;37318;Burgwalde;16061;Eichsfeld;16;TH +6494;37318;Arenshausen;16061;Eichsfeld;16;TH +6495;37318;Birkenfelde;16061;Eichsfeld;16;TH +6496;37318;Schwobfeld;16061;Eichsfeld;16;TH +6497;37318;Dieterode;16061;Eichsfeld;16;TH +6498;37318;Roehrig;16061;Eichsfeld;16;TH +6499;37318;Dietzenrode-Vatterode;16061;Eichsfeld;16;TH +6500;37327;Kallmerode;16061;Eichsfeld;16;TH +6501;37327;Leinefelde;16061;Eichsfeld;16;TH +6502;37327;Breitenbach;16061;Eichsfeld;16;TH +6503;37327;Hausen;16061;Eichsfeld;16;TH +6504;37339;Wehnde;16061;Eichsfeld;16;TH +6505;37339;Haynrode;16061;Eichsfeld;16;TH +6506;37339;Brehme;16061;Eichsfeld;16;TH +6507;37339;Teistungen;16061;Eichsfeld;16;TH +6508;37339;Wintzingerode;16061;Eichsfeld;16;TH +6509;37339;BEgerode;16061;Eichsfeld;16;TH +6510;37339;Worbis;16061;Eichsfeld;16;TH +6511;37339;Ferna;16061;Eichsfeld;16;TH +6512;37339;Gernrode;16061;Eichsfeld;16;TH +6513;37339;Kirchworbis;16061;Eichsfeld;16;TH +6514;37339;Tastungen;16061;Eichsfeld;16;TH +6515;37339;Breitenworbis;16061;Eichsfeld;16;TH +6516;37339;Hundeshagen;16061;Eichsfeld;16;TH +6517;37339;Buhla;16061;Eichsfeld;16;TH +6518;37339;Ecklingerode;16061;Eichsfeld;16;TH +6519;37345;Stoeckey;16061;Eichsfeld;16;TH +6520;37345;Bockelnhagen;16061;Eichsfeld;16;TH +6521;37345;Steinrode;16061;Eichsfeld;16;TH +6522;37345;Grossbodungen;16061;Eichsfeld;16;TH +6523;37345;Silkerode;16061;Eichsfeld;16;TH +6524;37345;Neustadt;16061;Eichsfeld;16;TH +6525;37345;Juetzenbach;16061;Eichsfeld;16;TH +6526;37345;Weissenborn-Luederode;16061;Eichsfeld;16;TH +6527;37345;Bischofferode;16061;Eichsfeld;16;TH +6528;37345;Holungen;16061;Eichsfeld;16;TH +6529;37345;Zwinge;16061;Eichsfeld;16;TH +6530;37351;Dingelstaedt;16061;Eichsfeld;16;TH +6531;37351;Silberhausen;16061;Eichsfeld;16;TH +6532;37351;Kefferhausen;16061;Eichsfeld;16;TH +6533;37351;Kreuzebra;16061;Eichsfeld;16;TH +6534;37351;Helmsdorf;16061;Eichsfeld;16;TH +6535;37355;Vollenborn;16061;Eichsfeld;16;TH +6536;37355;Bernterode, Untereichsfeld;16061;Eichsfeld;16;TH +6537;37355;Niederorschel;16061;Eichsfeld;16;TH +6538;37355;Gerterode;16061;Eichsfeld;16;TH +6539;37355;Deuna;16061;Eichsfeld;16;TH +6540;37355;Kleinbartloff;16061;Eichsfeld;16;TH +6541;37359;Kuellstedt;16061;Eichsfeld;16;TH +6542;37359;Buettstedt;16061;Eichsfeld;16;TH +6543;37359;Grossbartloff;16061;Eichsfeld;16;TH +6544;37359;Wachstedt;16061;Eichsfeld;16;TH +6545;37359;Effelder;16061;Eichsfeld;16;TH +6546;37412;Elbingerode;3156;Osterode am Harz;3;NI +6547;37412;Herzberg am Harz;3156;Osterode am Harz;3;NI +6548;37412;Hoerden;3156;Osterode am Harz;3;NI +6549;37431;Bad Lauterberg im Harz;3156;Osterode am Harz;3;NI +6550;37434;Wollershausen;3152;Goettingen;3;NI +6551;37434;Rollshausen;3152;Goettingen;3;NI +6552;37434;Krebeck;3152;Goettingen;3;NI +6553;37434;Bilshausen;3152;Goettingen;3;NI +6554;37434;Ruedershausen;3152;Goettingen;3;NI +6555;37434;Wollbrandshausen;3152;Goettingen;3;NI +6556;37434;Bodensee;3152;Goettingen;3;NI +6557;37434;Obernfeld;3152;Goettingen;3;NI +6558;37434;Gieboldehausen;3152;Goettingen;3;NI +6559;37434;Rhumspringe;3152;Goettingen;3;NI +6560;37441;Bad Sachsa;3156;Osterode am Harz;3;NI +6561;37444;Sankt Andreasberg;3153;Goslar;3;NI +6562;37445;Walkenried;3156;Osterode am Harz;3;NI +6563;37447;Wieda;3156;Osterode am Harz;3;NI +6564;37449;Zorge;3156;Osterode am Harz;3;NI +6565;37520;Osterode am Harz;3156;Osterode am Harz;3;NI +6566;37534;Eisdorf;3156;Osterode am Harz;3;NI +6567;37534;Gittelde;3156;Osterode am Harz;3;NI +6568;37534;Badenhausen;3156;Osterode am Harz;3;NI +6569;37539;Bad Grund (Harz);3156;Osterode am Harz;3;NI +6570;37539;Windhausen;3156;Osterode am Harz;3;NI +6571;37547;Kreiensen;3155;Northeim;3;NI +6572;37574;Einbeck;3155;Northeim;3;NI +6573;37581;Bad Gandersheim;3155;Northeim;3;NI +6574;37586;Dassel;3155;Northeim;3;NI +6575;37589;Kalefeld;3155;Northeim;3;NI +6576;37603;Holzminden;3255;Holzminden;3;NI +6577;37619;Kirchbrak;3255;Holzminden;3;NI +6578;37619;Pegestorf;3255;Holzminden;3;NI +6579;37619;Hehlen;3255;Holzminden;3;NI +6580;37619;Heyen;3255;Holzminden;3;NI +6581;37619;Bodenwerder;3255;Holzminden;3;NI +6582;37620;Halle;3255;Holzminden;3;NI +6583;37627;Heinade;3255;Holzminden;3;NI +6584;37627;Deensen;3255;Holzminden;3;NI +6585;37627;Stadtoldendorf;3255;Holzminden;3;NI +6586;37627;Wangelnstedt;3255;Holzminden;3;NI +6587;37627;Lenne;3255;Holzminden;3;NI +6588;37627;Arholzen;3255;Holzminden;3;NI +6589;37632;Holzen;3255;Holzminden;3;NI +6590;37632;Eschershausen;3255;Holzminden;3;NI +6591;37632;Eimen;3255;Holzminden;3;NI +6592;37633;Dielmissen;3255;Holzminden;3;NI +6593;37635;Lueerdissen;3255;Holzminden;3;NI +6594;37639;Bevern;3255;Holzminden;3;NI +6595;37640;Golmbach;3255;Holzminden;3;NI +6596;37642;Holenberg;3255;Holzminden;3;NI +6597;37643;Negenborn;3255;Holzminden;3;NI +6598;37647;Polle;3255;Holzminden;3;NI +6599;37647;Vahlbruch;3255;Holzminden;3;NI +6600;37647;Brevoerde;3255;Holzminden;3;NI +6601;37649;Heinsen;3255;Holzminden;3;NI +6602;37671;Hoexter;5762;Hoexter;5;NW +6603;37688;Beverungen;5762;Hoexter;5;NW +6604;37691;Derental;3255;Holzminden;3;NI +6605;37691;Boffzen;3255;Holzminden;3;NI +6606;37696;Marienmuenster;5762;Hoexter;5;NW +6607;37697;Lauenfoerde;3255;Holzminden;3;NI +6608;37699;Fuerstenberg;3255;Holzminden;3;NI +6609;38100;Braunschweig;3101;Braunschweig, Stadt;3;NI +6610;38102;Braunschweig;3101;Braunschweig, Stadt;3;NI +6611;38104;Braunschweig;3101;Braunschweig, Stadt;3;NI +6612;38106;Braunschweig;3101;Braunschweig, Stadt;3;NI +6613;38108;Braunschweig;3101;Braunschweig, Stadt;3;NI +6614;38110;Braunschweig;3101;Braunschweig, Stadt;3;NI +6615;38112;Braunschweig;3101;Braunschweig, Stadt;3;NI +6616;38114;Braunschweig;3101;Braunschweig, Stadt;3;NI +6617;38116;Braunschweig;3101;Braunschweig, Stadt;3;NI +6618;38118;Braunschweig;3101;Braunschweig, Stadt;3;NI +6619;38120;Braunschweig;3101;Braunschweig, Stadt;3;NI +6620;38122;Braunschweig;3101;Braunschweig, Stadt;3;NI +6621;38124;Braunschweig;3101;Braunschweig, Stadt;3;NI +6622;38126;Braunschweig;3101;Braunschweig, Stadt;3;NI +6623;38154;Koenigslutter am Elm;3154;Helmstedt;3;NI +6624;38159;Vechelde;3157;Peine;3;NI +6625;38162;Cremlingen;3158;Wolfenbuettel;3;NI +6626;38165;Lehre;3154;Helmstedt;3;NI +6627;38170;Dahlum;3158;Wolfenbuettel;3;NI +6628;38170;Kneitlingen;3158;Wolfenbuettel;3;NI +6629;38170;Uehrde;3158;Wolfenbuettel;3;NI +6630;38170;Winnigstedt;3158;Wolfenbuettel;3;NI +6631;38170;Vahlberg;3158;Wolfenbuettel;3;NI +6632;38170;Schoeppenstedt;3158;Wolfenbuettel;3;NI +6633;38173;Evessen;3158;Wolfenbuettel;3;NI +6634;38173;Dettum;3158;Wolfenbuettel;3;NI +6635;38173;Veltheim;3158;Wolfenbuettel;3;NI +6636;38173;Erkerode;3158;Wolfenbuettel;3;NI +6637;38173;Sickte;3158;Wolfenbuettel;3;NI +6638;38176;Wendeburg;3157;Peine;3;NI +6639;38179;Schwuelper;3151;Gifhorn;3;NI +6640;38226;Salzgitter;3102;Salzgitter, Stadt;3;NI +6641;38228;Salzgitter;3102;Salzgitter, Stadt;3;NI +6642;38229;Salzgitter;3102;Salzgitter, Stadt;3;NI +6643;38239;Salzgitter;3102;Salzgitter, Stadt;3;NI +6644;38259;Salzgitter;3102;Salzgitter, Stadt;3;NI +6645;38268;Lengede;3157;Peine;3;NI +6646;38271;Baddeckenstedt;3158;Wolfenbuettel;3;NI +6647;38272;Burgdorf;3158;Wolfenbuettel;3;NI +6648;38274;Elbe;3158;Wolfenbuettel;3;NI +6649;38275;Haverlah;3158;Wolfenbuettel;3;NI +6650;38277;Heere;3158;Wolfenbuettel;3;NI +6651;38279;Sehlde;3158;Wolfenbuettel;3;NI +6652;38300;Wolfenbuettel;3158;Wolfenbuettel;3;NI +6653;38302;Wolfenbuettel;3158;Wolfenbuettel;3;NI +6654;38304;Wolfenbuettel;3158;Wolfenbuettel;3;NI +6655;38312;Floethe;3158;Wolfenbuettel;3;NI +6656;38312;Heiningen;3158;Wolfenbuettel;3;NI +6657;38312;Cramme;3158;Wolfenbuettel;3;NI +6658;38312;Boerssum;3158;Wolfenbuettel;3;NI +6659;38312;Achim;3158;Wolfenbuettel;3;NI +6660;38312;Dorstadt;3158;Wolfenbuettel;3;NI +6661;38312;Ohrum;3158;Wolfenbuettel;3;NI +6662;38315;Hornburg;3158;Wolfenbuettel;3;NI +6663;38315;Schladen;3158;Wolfenbuettel;3;NI +6664;38315;Werlaburgdorf;3158;Wolfenbuettel;3;NI +6665;38315;Gielde;3158;Wolfenbuettel;3;NI +6666;38319;Remlingen;3158;Wolfenbuettel;3;NI +6667;38321;Denkte;3158;Wolfenbuettel;3;NI +6668;38322;Hedeper;3158;Wolfenbuettel;3;NI +6669;38324;Kissenbrueck;3158;Wolfenbuettel;3;NI +6670;38325;Roklum;3158;Wolfenbuettel;3;NI +6671;38327;Semmenstedt;3158;Wolfenbuettel;3;NI +6672;38329;Wittmar;3158;Wolfenbuettel;3;NI +6673;38350;Helmstedt;3154;Helmstedt;3;NI +6674;38364;Schoeningen;3154;Helmstedt;3;NI +6675;38368;Grasleben;3154;Helmstedt;3;NI +6676;38368;Mariental;3154;Helmstedt;3;NI +6677;38368;Rennau;3154;Helmstedt;3;NI +6678;38368;Querenhorst;3154;Helmstedt;3;NI +6679;38372;Bueddenstedt;3154;Helmstedt;3;NI +6680;38373;Frellstedt;3154;Helmstedt;3;NI +6681;38373;Suepplingen;3154;Helmstedt;3;NI +6682;38375;Raebke;3154;Helmstedt;3;NI +6683;38376;Suepplingenburg;3154;Helmstedt;3;NI +6684;38378;Warberg;3154;Helmstedt;3;NI +6685;38379;Wolsdorf;3154;Helmstedt;3;NI +6686;38381;Jerxheim;3154;Helmstedt;3;NI +6687;38382;Beierstedt;3154;Helmstedt;3;NI +6688;38384;Gevensleben;3154;Helmstedt;3;NI +6689;38385;Ingeleben;3154;Helmstedt;3;NI +6690;38387;Soellingen;3154;Helmstedt;3;NI +6691;38388;Twieflingen;3154;Helmstedt;3;NI +6692;38440;Wolfsburg;3103;Wolfsburg, Stadt;3;NI +6693;38442;Wolfsburg;3103;Wolfsburg, Stadt;3;NI +6694;38444;Wolfsburg;3103;Wolfsburg, Stadt;3;NI +6695;38446;Wolfsburg;3103;Wolfsburg, Stadt;3;NI +6696;38448;Wolfsburg;3103;Wolfsburg, Stadt;3;NI +6697;38458;Velpke;3154;Helmstedt;3;NI +6698;38459;Bahrdorf;3154;Helmstedt;3;NI +6699;38461;Danndorf;3154;Helmstedt;3;NI +6700;38462;Grafhorst;3154;Helmstedt;3;NI +6701;38464;Gross Twuelpstedt;3154;Helmstedt;3;NI +6702;38465;Brome;3151;Gifhorn;3;NI +6703;38467;Bergfeld;3151;Gifhorn;3;NI +6704;38468;Ehra-Lessien;3151;Gifhorn;3;NI +6705;38470;Parsau;3151;Gifhorn;3;NI +6706;38471;Ruehen;3151;Gifhorn;3;NI +6707;38473;Tiddische;3151;Gifhorn;3;NI +6708;38474;Tuelau;3151;Gifhorn;3;NI +6709;38476;Barwedel;3151;Gifhorn;3;NI +6710;38477;Jembke;3151;Gifhorn;3;NI +6711;38479;Tappenbeck;3151;Gifhorn;3;NI +6712;38486;Steimke;15370;Altmarkkreis Salzwedel;15;ST +6713;38486;Ristedt;15370;Altmarkkreis Salzwedel;15;ST +6714;38486;Kusey;15370;Altmarkkreis Salzwedel;15;ST +6715;38486;Kunrau;15370;Altmarkkreis Salzwedel;15;ST +6716;38486;Kloetze;15370;Altmarkkreis Salzwedel;15;ST +6717;38486;Jahrstedt;15370;Altmarkkreis Salzwedel;15;ST +6718;38486;Immekath;15370;Altmarkkreis Salzwedel;15;ST +6719;38486;Wenze;15370;Altmarkkreis Salzwedel;15;ST +6720;38486;Doenitz;15370;Altmarkkreis Salzwedel;15;ST +6721;38486;Neuferchau;15370;Altmarkkreis Salzwedel;15;ST +6722;38486;Neuendorf;15370;Altmarkkreis Salzwedel;15;ST +6723;38486;Flecken Apenburg;15370;Altmarkkreis Salzwedel;15;ST +6724;38486;Bandau;15370;Altmarkkreis Salzwedel;15;ST +6725;38489;Tangeln;15370;Altmarkkreis Salzwedel;15;ST +6726;38489;Rohrberg;15370;Altmarkkreis Salzwedel;15;ST +6727;38489;Juebar;15370;Altmarkkreis Salzwedel;15;ST +6728;38489;Jeeben;15370;Altmarkkreis Salzwedel;15;ST +6729;38489;Hohentramm;15370;Altmarkkreis Salzwedel;15;ST +6730;38489;Hanum;15370;Altmarkkreis Salzwedel;15;ST +6731;38489;Beetzendorf;15370;Altmarkkreis Salzwedel;15;ST +6732;38489;Nettgau;15370;Altmarkkreis Salzwedel;15;ST +6733;38489;Mellin;15370;Altmarkkreis Salzwedel;15;ST +6734;38489;Luedelsen;15370;Altmarkkreis Salzwedel;15;ST +6735;38489;Ahlum;15370;Altmarkkreis Salzwedel;15;ST +6736;38518;Gifhorn;3151;Gifhorn;3;NI +6737;38524;Sassenburg;3151;Gifhorn;3;NI +6738;38527;Meine;3151;Gifhorn;3;NI +6739;38528;Adenbuettel;3151;Gifhorn;3;NI +6740;38530;Didderse;3151;Gifhorn;3;NI +6741;38531;Roetgesbuettel;3151;Gifhorn;3;NI +6742;38533;Vordorf;3151;Gifhorn;3;NI +6743;38536;Meinersen;3151;Gifhorn;3;NI +6744;38539;Mueden (Aller);3151;Gifhorn;3;NI +6745;38542;Leiferde;3151;Gifhorn;3;NI +6746;38543;Hillerse;3151;Gifhorn;3;NI +6747;38547;Calberlah;3151;Gifhorn;3;NI +6748;38550;Isenbuettel;3151;Gifhorn;3;NI +6749;38551;Ribbesbuettel;3151;Gifhorn;3;NI +6750;38553;Wasbuettel;3151;Gifhorn;3;NI +6751;38554;Weyhausen;3151;Gifhorn;3;NI +6752;38556;Bokensdorf;3151;Gifhorn;3;NI +6753;38557;Osloss;3151;Gifhorn;3;NI +6754;38559;Wagenhoff;3151;Gifhorn;3;NI +6755;38640;Goslar;3153;Goslar;3;NI +6756;38642;Goslar;3153;Goslar;3;NI +6757;38644;Goslar;3153;Goslar;3;NI +6758;38667;Bad Harzburg;3153;Goslar;3;NI +6759;38667;Bad Harzburg;3153;Goslar;3;NI +6760;38678;Clausthal-Zellerfeld;3153;Goslar;3;NI +6761;38685;Langelsheim;3153;Goslar;3;NI +6762;38690;Vienenburg;3153;Goslar;3;NI +6763;38700;Braunlage;3153;Goslar;3;NI +6764;38704;Liebenburg;3153;Goslar;3;NI +6765;38707;Schulenberg im Oberharz;3153;Goslar;3;NI +6766;38707;Altenau;3153;Goslar;3;NI +6767;38709;Wildemann;3153;Goslar;3;NI +6768;38723;Seesen;3153;Goslar;3;NI +6769;38729;Lutter am Barenberge;3153;Goslar;3;NI +6770;38729;Wallmoden;3153;Goslar;3;NI +6771;38729;Hahausen;3153;Goslar;3;NI +6772;38820;Halberstadt;15357;Halberstadt;15;ST +6773;38822;Stroebeck;15357;Halberstadt;15;ST +6774;38822;Sargstedt;15357;Halberstadt;15;ST +6775;38822;Gross Quenstedt;15357;Halberstadt;15;ST +6776;38822;Athenstedt;15357;Halberstadt;15;ST +6777;38822;Aspenstedt;15357;Halberstadt;15;ST +6778;38828;Wegeleben;15357;Halberstadt;15;ST +6779;38829;Harsleben;15357;Halberstadt;15;ST +6780;38835;Veltheim;15357;Halberstadt;15;ST +6781;38835;Schauen;15357;Halberstadt;15;ST +6782;38835;Rhoden;15357;Halberstadt;15;ST +6783;38835;HE;15357;Halberstadt;15;ST +6784;38835;Zilly;15357;Halberstadt;15;ST +6785;38835;Wuelperode;15357;Halberstadt;15;ST +6786;38835;Deersheim;15357;Halberstadt;15;ST +6787;38835;Buehne;15357;Halberstadt;15;ST +6788;38835;Osterwieck;15357;Halberstadt;15;ST +6789;38835;Osterode;15357;Halberstadt;15;ST +6790;38835;Luettgenrode;15357;Halberstadt;15;ST +6791;38835;Berssel;15357;Halberstadt;15;ST +6792;38836;Vogelsdorf;15357;Halberstadt;15;ST +6793;38836;Rohrsheim;15357;Halberstadt;15;ST +6794;38836;Huy-Neinstedt;15357;Halberstadt;15;ST +6795;38836;Dedeleben;15357;Halberstadt;15;ST +6796;38836;Dardesheim;15357;Halberstadt;15;ST +6797;38836;Pabstorf;15357;Halberstadt;15;ST +6798;38836;Anderbeck;15357;Halberstadt;15;ST +6799;38836;Badersleben;15357;Halberstadt;15;ST +6800;38838;Schlanstedt;15357;Halberstadt;15;ST +6801;38838;Eilsdorf;15357;Halberstadt;15;ST +6802;38838;Eilenstedt;15357;Halberstadt;15;ST +6803;38838;Dingelstedt;15357;Halberstadt;15;ST +6804;38838;Aderstedt;15357;Halberstadt;15;ST +6805;38855;Schmatzfeld;15369;Wernigerode;15;ST +6806;38855;Heudeber;15369;Wernigerode;15;ST +6807;38855;Wernigerode;15369;Wernigerode;15;ST +6808;38855;Danstedt;15357;Halberstadt;15;ST +6809;38855;Reddeber;15369;Wernigerode;15;ST +6810;38871;Wasserleben;15369;Wernigerode;15;ST +6811;38871;Veckenstedt;15369;Wernigerode;15;ST +6812;38871;Stapelburg;15369;Wernigerode;15;ST +6813;38871;Langeln;15369;Wernigerode;15;ST +6814;38871;Ilsenburg;15369;Wernigerode;15;ST +6815;38871;Druebeck;15369;Wernigerode;15;ST +6816;38871;Darlingerode;15369;Wernigerode;15;ST +6817;38871;Abbenrode;15369;Wernigerode;15;ST +6818;38875;Tanne;15369;Wernigerode;15;ST +6819;38875;Sorge;15369;Wernigerode;15;ST +6820;38875;Koenigshuette;15369;Wernigerode;15;ST +6821;38875;Elend;15369;Wernigerode;15;ST +6822;38875;Elbingerode;15369;Wernigerode;15;ST +6823;38877;Benneckenstein;15369;Wernigerode;15;ST +6824;38879;Schierke;15369;Wernigerode;15;ST +6825;38889;Treseburg;15369;Wernigerode;15;ST +6826;38889;Ruebeland;15369;Wernigerode;15;ST +6827;38889;Huettenrode;15369;Wernigerode;15;ST +6828;38889;Heimburg;15369;Wernigerode;15;ST +6829;38889;Wienrode;15369;Wernigerode;15;ST +6830;38889;Cattenstedt;15369;Wernigerode;15;ST +6831;38889;Blankenburg;15369;Wernigerode;15;ST +6832;38889;Altenbrak;15369;Wernigerode;15;ST +6833;38895;Langenstein;15357;Halberstadt;15;ST +6834;38895;Derenburg;15369;Wernigerode;15;ST +6835;38899;Trautenstein;15369;Wernigerode;15;ST +6836;38899;Stiege;15369;Wernigerode;15;ST +6837;38899;Hasselfelde;15369;Wernigerode;15;ST +6838;39104;Magdeburg;15303;Magdeburg;15;ST +6839;39106;Magdeburg;15303;Magdeburg;15;ST +6840;39108;Magdeburg;15303;Magdeburg;15;ST +6841;39110;Magdeburg;15303;Magdeburg;15;ST +6842;39112;Magdeburg;15303;Magdeburg;15;ST +6843;39114;Magdeburg;15303;Magdeburg;15;ST +6844;39116;Magdeburg;15303;Magdeburg;15;ST +6845;39118;Magdeburg;15303;Magdeburg;15;ST +6846;39120;Magdeburg;15303;Magdeburg;15;ST +6847;39122;Magdeburg;15303;Magdeburg;15;ST +6848;39124;Magdeburg;15303;Magdeburg;15;ST +6849;39126;Magdeburg;15303;Magdeburg;15;ST +6850;39128;Magdeburg;15303;Magdeburg;15;ST +6851;39130;Magdeburg;15303;Magdeburg;15;ST +6852;39164;Wanzleben;15355;Boerdekreis;15;ST +6853;39164;Klein Wanzleben;15355;Boerdekreis;15;ST +6854;39164;Domersleben;15355;Boerdekreis;15;ST +6855;39164;Bottmersdorf;15355;Boerdekreis;15;ST +6856;39167;Klein Rodensleben;15355;Boerdekreis;15;ST +6857;39167;Irxleben;15362;Ohrekreis;15;ST +6858;39167;Hohendodeleben;15355;Boerdekreis;15;ST +6859;39167;Wellen;15362;Ohrekreis;15;ST +6860;39167;Gross Rodensleben;15355;Boerdekreis;15;ST +6861;39167;Eichenbarleben;15362;Ohrekreis;15;ST +6862;39167;Ochtmersleben;15362;Ohrekreis;15;ST +6863;39167;Niederndodeleben;15362;Ohrekreis;15;ST +6864;39171;Suelzetal;15355;Boerdekreis;15;ST +6865;39175;Wahlitz;15358;Jerichower Land;15;ST +6866;39175;Koerbelitz;15358;Jerichower Land;15;ST +6867;39175;Koenigsborn;15358;Jerichower Land;15;ST +6868;39175;Guebs;15358;Jerichower Land;15;ST +6869;39175;Woltersdorf;15358;Jerichower Land;15;ST +6870;39175;Biederitz;15358;Jerichower Land;15;ST +6871;39175;Menz;15358;Jerichower Land;15;ST +6872;39175;Gerwisch;15358;Jerichower Land;15;ST +6873;39179;Ebendorf;15362;Ohrekreis;15;ST +6874;39179;Barleben;15362;Ohrekreis;15;ST +6875;39179;Mittelland;15362;Ohrekreis;15;ST +6876;39218;Schoenebeck (Elbe);15367;Schoenebeck;15;ST +6877;39221;Kleinmuehlingen;15367;Schoenebeck;15;ST +6878;39221;Zens;15367;Schoenebeck;15;ST +6879;39221;Welsleben;15367;Schoenebeck;15;ST +6880;39221;Grossmuehlingen;15367;Schoenebeck;15;ST +6881;39221;Eickendorf;15367;Schoenebeck;15;ST +6882;39221;Eggersdorf;15367;Schoenebeck;15;ST +6883;39221;Biere;15367;Schoenebeck;15;ST +6884;39221;Ranies;15367;Schoenebeck;15;ST +6885;39240;SNdorf;15367;Schoenebeck;15;ST +6886;39240;Gross Rosenburg;15367;Schoenebeck;15;ST +6887;39240;Zuchau;15367;Schoenebeck;15;ST +6888;39240;Calbe;15367;Schoenebeck;15;ST +6889;39240;Brumby;15367;Schoenebeck;15;ST +6890;39240;Breitenhagen;15367;Schoenebeck;15;ST +6891;39240;Loedderitz;15367;Schoenebeck;15;ST +6892;39240;Gloethe;15367;Schoenebeck;15;ST +6893;39245;Dannigkow;15358;Jerichower Land;15;ST +6894;39245;Pretzien;15367;Schoenebeck;15;ST +6895;39245;Ploetzky;15367;Schoenebeck;15;ST +6896;39245;Gommern;15358;Jerichower Land;15;ST +6897;39249;Tornitz;15367;Schoenebeck;15;ST +6898;39249;Wespen;15367;Schoenebeck;15;ST +6899;39249;Poemmelte;15367;Schoenebeck;15;ST +6900;39249;Glinde;15367;Schoenebeck;15;ST +6901;39249;Barby;15367;Schoenebeck;15;ST +6902;39249;Gnadau;15367;Schoenebeck;15;ST +6903;39261;Zerbst;15151;Anhalt-Zerbst;15;ST +6904;39264;Walternienburg;15151;Anhalt-Zerbst;15;ST +6905;39264;Straguth;15151;Anhalt-Zerbst;15;ST +6906;39264;Steutz;15151;Anhalt-Zerbst;15;ST +6907;39264;Reuden;15151;Anhalt-Zerbst;15;ST +6908;39264;Juetrichau;15151;Anhalt-Zerbst;15;ST +6909;39264;Hohenlepte;15151;Anhalt-Zerbst;15;ST +6910;39264;Gueterglueck;15151;Anhalt-Zerbst;15;ST +6911;39264;Zernitz;15151;Anhalt-Zerbst;15;ST +6912;39264;Grimme;15151;Anhalt-Zerbst;15;ST +6913;39264;Gehrden;15151;Anhalt-Zerbst;15;ST +6914;39264;Dornburg;15151;Anhalt-Zerbst;15;ST +6915;39264;Dobritz;15151;Anhalt-Zerbst;15;ST +6916;39264;Deetz;15151;Anhalt-Zerbst;15;ST +6917;39264;Buhlendorf;15151;Anhalt-Zerbst;15;ST +6918;39264;Bornum;15151;Anhalt-Zerbst;15;ST +6919;39264;Bias;15151;Anhalt-Zerbst;15;ST +6920;39264;Proedel;15151;Anhalt-Zerbst;15;ST +6921;39264;Polenzko;15151;Anhalt-Zerbst;15;ST +6922;39264;Nutha;15151;Anhalt-Zerbst;15;ST +6923;39264;Nedlitz;15151;Anhalt-Zerbst;15;ST +6924;39264;Moritz;15151;Anhalt-Zerbst;15;ST +6925;39264;Luso;15151;Anhalt-Zerbst;15;ST +6926;39264;Luebs;15151;Anhalt-Zerbst;15;ST +6927;39264;Lindau;15151;Anhalt-Zerbst;15;ST +6928;39264;Leps;15151;Anhalt-Zerbst;15;ST +6929;39264;Goednitz;15151;Anhalt-Zerbst;15;ST +6930;39279;Schweinitz;15151;Anhalt-Zerbst;15;ST +6931;39279;Rosian;15151;Anhalt-Zerbst;15;ST +6932;39279;Ladeburg;15151;Anhalt-Zerbst;15;ST +6933;39279;Hobeck;15151;Anhalt-Zerbst;15;ST +6934;39279;Zeppernick;15151;Anhalt-Zerbst;15;ST +6935;39279;Loburg;15151;Anhalt-Zerbst;15;ST +6936;39279;Leitzkau;15151;Anhalt-Zerbst;15;ST +6937;39288;Burg;15358;Jerichower Land;15;ST +6938;39291;Wallwitz;15358;Jerichower Land;15;ST +6939;39291;Vehlitz;15358;Jerichower Land;15;ST +6940;39291;Tryppehna;15358;Jerichower Land;15;ST +6941;39291;Theessen;15358;Jerichower Land;15;ST +6942;39291;Stresow;15358;Jerichower Land;15;ST +6943;39291;Stegelitz;15358;Jerichower Land;15;ST +6944;39291;Schopsdorf;15358;Jerichower Land;15;ST +6945;39291;Schermen;15358;Jerichower Land;15;ST +6946;39291;Schartau;15358;Jerichower Land;15;ST +6947;39291;Rietzel;15358;Jerichower Land;15;ST +6948;39291;Kuesel;15358;Jerichower Land;15;ST +6949;39291;Kruessau;15358;Jerichower Land;15;ST +6950;39291;Karith;15358;Jerichower Land;15;ST +6951;39291;Ihleburg;15358;Jerichower Land;15;ST +6952;39291;Hohenziatz;15358;Jerichower Land;15;ST +6953;39291;Hohenwarthe;15358;Jerichower Land;15;ST +6954;39291;Ziepel;15358;Jerichower Land;15;ST +6955;39291;Zeddenick;15358;Jerichower Land;15;ST +6956;39291;Wuestenjerichow;15358;Jerichower Land;15;ST +6957;39291;Woermlitz;15358;Jerichower Land;15;ST +6958;39291;Friedensau;15358;Jerichower Land;15;ST +6959;39291;Drewitz;15358;Jerichower Land;15;ST +6960;39291;Doernitz;15358;Jerichower Land;15;ST +6961;39291;Detershagen;15358;Jerichower Land;15;ST +6962;39291;Bueden;15358;Jerichower Land;15;ST +6963;39291;Pietzpuhl;15358;Jerichower Land;15;ST +6964;39291;Parchau;15358;Jerichower Land;15;ST +6965;39291;Niegripp;15358;Jerichower Land;15;ST +6966;39291;Nedlitz;15358;Jerichower Land;15;ST +6967;39291;Moeser;15358;Jerichower Land;15;ST +6968;39291;Moeckern;15358;Jerichower Land;15;ST +6969;39291;Magdeburgerforth;15358;Jerichower Land;15;ST +6970;39291;Luebars;15358;Jerichower Land;15;ST +6971;39291;Lostau;15358;Jerichower Land;15;ST +6972;39291;Reesdorf;15358;Jerichower Land;15;ST +6973;39291;Reesen;15358;Jerichower Land;15;ST +6974;39291;Grabow;15358;Jerichower Land;15;ST +6975;39307;Tucheim;15358;Jerichower Land;15;ST +6976;39307;Schlagenthin;15358;Jerichower Land;15;ST +6977;39307;Rossdorf;15358;Jerichower Land;15;ST +6978;39307;Klitsche;15358;Jerichower Land;15;ST +6979;39307;Karow;15358;Jerichower Land;15;ST +6980;39307;Kade;15358;Jerichower Land;15;ST +6981;39307;Zabakuck;15358;Jerichower Land;15;ST +6982;39307;Genthin;15358;Jerichower Land;15;ST +6983;39307;Elbe-Parey;15358;Jerichower Land;15;ST +6984;39307;Demsin;15358;Jerichower Land;15;ST +6985;39307;Brettin;15358;Jerichower Land;15;ST +6986;39307;Parchen;15358;Jerichower Land;15;ST +6987;39307;Paplitz;15358;Jerichower Land;15;ST +6988;39307;Muetzel;15358;Jerichower Land;15;ST +6989;39307;Gladau;15358;Jerichower Land;15;ST +6990;39317;Elbe-Parey;15358;Jerichower Land;15;ST +6991;39319;Jerichow;15358;Jerichower Land;15;ST +6992;39319;Wulkow;15358;Jerichower Land;15;ST +6993;39319;Nielebock;15358;Jerichower Land;15;ST +6994;39319;Redekin;15358;Jerichower Land;15;ST +6995;39326;Samswegen;15362;Ohrekreis;15;ST +6996;39326;Rogaetz;15362;Ohrekreis;15;ST +6997;39326;Klein Ammensleben;15362;Ohrekreis;15;ST +6998;39326;Jersleben;15362;Ohrekreis;15;ST +6999;39326;Hohenwarsleben;15362;Ohrekreis;15;ST +7000;39326;Hermsdorf;15362;Ohrekreis;15;ST +7001;39326;Heinrichsberg;15362;Ohrekreis;15;ST +7002;39326;Gutenswegen;15362;Ohrekreis;15;ST +7003;39326;Zielitz;15362;Ohrekreis;15;ST +7004;39326;Wolmirstedt;15362;Ohrekreis;15;ST +7005;39326;Gross Ammensleben;15362;Ohrekreis;15;ST +7006;39326;Farsleben;15362;Ohrekreis;15;ST +7007;39326;Dahlenwarsleben;15362;Ohrekreis;15;ST +7008;39326;Colbitz;15362;Ohrekreis;15;ST +7009;39326;Meseberg;15362;Ohrekreis;15;ST +7010;39326;Loitsche;15362;Ohrekreis;15;ST +7011;39326;Angern;15362;Ohrekreis;15;ST +7012;39326;Glindenberg;15362;Ohrekreis;15;ST +7013;39326;Meitzendorf;15362;Ohrekreis;15;ST +7014;39326;Mittelland;15362;Ohrekreis;15;ST +7015;39326;Barleben;15362;Ohrekreis;15;ST +7016;39340;Haldensleben;15362;Ohrekreis;15;ST +7017;39343;Uhrsleben;15362;Ohrekreis;15;ST +7018;39343;Sueplingen;15362;Ohrekreis;15;ST +7019;39343;Schwanefeld;15362;Ohrekreis;15;ST +7020;39343;Schackensleben;15362;Ohrekreis;15;ST +7021;39343;Rottmersleben;15362;Ohrekreis;15;ST +7022;39343;Ivenrode;15362;Ohrekreis;15;ST +7023;39343;Hillersleben;15362;Ohrekreis;15;ST +7024;39343;Hakenstedt;15362;Ohrekreis;15;ST +7025;39343;Gross Santersleben;15362;Ohrekreis;15;ST +7026;39343;Erxleben;15362;Ohrekreis;15;ST +7027;39343;Emden;15362;Ohrekreis;15;ST +7028;39343;Eimersleben;15362;Ohrekreis;15;ST +7029;39343;Bregenstedt;15362;Ohrekreis;15;ST +7030;39343;Bornstedt;15362;Ohrekreis;15;ST +7031;39343;Ostingersleben;15362;Ohrekreis;15;ST +7032;39343;Nordgermersleben;15362;Ohrekreis;15;ST +7033;39343;Morsleben;15362;Ohrekreis;15;ST +7034;39343;Altenhausen;15362;Ohrekreis;15;ST +7035;39343;Alleringersleben;15362;Ohrekreis;15;ST +7036;39343;Ackendorf;15362;Ohrekreis;15;ST +7037;39343;Beendorf;15362;Ohrekreis;15;ST +7038;39343;Bebertal;15362;Ohrekreis;15;ST +7039;39343;Bartensleben;15362;Ohrekreis;15;ST +7040;39345;Vahldorf;15362;Ohrekreis;15;ST +7041;39345;Wieglitz;15362;Ohrekreis;15;ST +7042;39345;Flechtingen;15362;Ohrekreis;15;ST +7043;39345;Buelstringen;15362;Ohrekreis;15;ST +7044;39345;Born;15362;Ohrekreis;15;ST +7045;39345;Neuenhofe;15362;Ohrekreis;15;ST +7046;39356;Walbeck;15362;Ohrekreis;15;ST +7047;39356;Siestedt;15362;Ohrekreis;15;ST +7048;39356;Seggerde;15362;Ohrekreis;15;ST +7049;39356;Hoersingen;15362;Ohrekreis;15;ST +7050;39356;Hoedingen;15362;Ohrekreis;15;ST +7051;39356;Weferlingen;15362;Ohrekreis;15;ST +7052;39356;Eschenrode;15362;Ohrekreis;15;ST +7053;39356;Doehren;15362;Ohrekreis;15;ST +7054;39356;Belsdorf;15362;Ohrekreis;15;ST +7055;39356;Behnsdorf;15362;Ohrekreis;15;ST +7056;39359;Velsdorf;15362;Ohrekreis;15;ST +7057;39359;Kathendorf;15362;Ohrekreis;15;ST +7058;39359;Wegenstedt;15362;Ohrekreis;15;ST +7059;39359;Everingen;15362;Ohrekreis;15;ST +7060;39359;Etingen;15362;Ohrekreis;15;ST +7061;39359;Eickendorf;15362;Ohrekreis;15;ST +7062;39359;Calvoerde;15362;Ohrekreis;15;ST +7063;39359;Boesdorf;15362;Ohrekreis;15;ST +7064;39359;Boeddensell;15362;Ohrekreis;15;ST +7065;39359;Mannhausen;15362;Ohrekreis;15;ST +7066;39359;Raetzlingen;15362;Ohrekreis;15;ST +7067;39359;Grauingen;15362;Ohrekreis;15;ST +7068;39365;Ummendorf;15355;Boerdekreis;15;ST +7069;39365;Sommersdorf;15355;Boerdekreis;15;ST +7070;39365;Seehausen;15355;Boerdekreis;15;ST +7071;39365;Harbke;15355;Boerdekreis;15;ST +7072;39365;Wormsdorf;15355;Boerdekreis;15;ST +7073;39365;Wefensleben;15355;Boerdekreis;15;ST +7074;39365;Eilsleben;15355;Boerdekreis;15;ST +7075;39365;Eggenstedt;15355;Boerdekreis;15;ST +7076;39365;Druxberge;15355;Boerdekreis;15;ST +7077;39365;Dreileben;15355;Boerdekreis;15;ST +7078;39365;Drackenstedt;15355;Boerdekreis;15;ST +7079;39365;Ovelguenne;15355;Boerdekreis;15;ST +7080;39365;Marienborn;15355;Boerdekreis;15;ST +7081;39387;Schermcke;15355;Boerdekreis;15;ST +7082;39387;Hornhausen;15355;Boerdekreis;15;ST +7083;39387;Wulferstedt;15355;Boerdekreis;15;ST +7084;39387;Oschersleben;15355;Boerdekreis;15;ST +7085;39387;Ampfurth;15355;Boerdekreis;15;ST +7086;39387;Altbrandsleben;15355;Boerdekreis;15;ST +7087;39387;Neuwegersleben;15355;Boerdekreis;15;ST +7088;39387;Am Grossen Bruch;15355;Boerdekreis;15;ST +7089;39393;Wackersleben;15355;Boerdekreis;15;ST +7090;39393;Voelpke;15355;Boerdekreis;15;ST +7091;39393;Hoetensleben;15355;Boerdekreis;15;ST +7092;39393;Ohrsleben;15355;Boerdekreis;15;ST +7093;39393;Ausleben;15355;Boerdekreis;15;ST +7094;39393;Barneberg;15355;Boerdekreis;15;ST +7095;39393;Hamersleben;15355;Boerdekreis;15;ST +7096;39393;Gunsleben;15355;Boerdekreis;15;ST +7097;39393;Am Grossen Bruch;15355;Boerdekreis;15;ST +7098;39397;Schwanebeck;15357;Halberstadt;15;ST +7099;39397;Kroppenstedt;15355;Boerdekreis;15;ST +7100;39397;Groeningen;15355;Boerdekreis;15;ST +7101;39397;Nienhagen;15357;Halberstadt;15;ST +7102;39398;Klein Oschersleben;15355;Boerdekreis;15;ST +7103;39398;Hadmersleben;15355;Boerdekreis;15;ST +7104;39398;Gross Germersleben;15355;Boerdekreis;15;ST +7105;39398;Peseckendorf;15355;Boerdekreis;15;ST +7106;39398;Alikendorf;15355;Boerdekreis;15;ST +7107;39418;Stassfurt;15352;Aschersleben-Stassfurt;15;ST +7108;39418;Neundorf (Anhalt);15352;Aschersleben-Stassfurt;15;ST +7109;39435;Unseburg;15352;Aschersleben-Stassfurt;15;ST +7110;39435;Tarthun;15352;Aschersleben-Stassfurt;15;ST +7111;39435;Schneidlingen;15352;Aschersleben-Stassfurt;15;ST +7112;39435;Wolmirsleben;15352;Aschersleben-Stassfurt;15;ST +7113;39435;Gross Boernecke;15352;Aschersleben-Stassfurt;15;ST +7114;39435;Egeln;15352;Aschersleben-Stassfurt;15;ST +7115;39435;Borne;15352;Aschersleben-Stassfurt;15;ST +7116;39439;Guesten;15153;Bernburg;15;ST +7117;39439;Amesdorf;15352;Aschersleben-Stassfurt;15;ST +7118;39439;Rathmannsdorf;15352;Aschersleben-Stassfurt;15;ST +7119;39443;Hohenerxleben;15352;Aschersleben-Stassfurt;15;ST +7120;39443;Foerderstedt;15367;Schoenebeck;15;ST +7121;39443;Loebnitz;15367;Schoenebeck;15;ST +7122;39443;Atzendorf;15367;Schoenebeck;15;ST +7123;39444;Hecklingen;15352;Aschersleben-Stassfurt;15;ST +7124;39446;Loederburg;15352;Aschersleben-Stassfurt;15;ST +7125;39448;Hakeborn;15352;Aschersleben-Stassfurt;15;ST +7126;39448;Westeregeln;15352;Aschersleben-Stassfurt;15;ST +7127;39448;Etgersleben;15352;Aschersleben-Stassfurt;15;ST +7128;39517;Uetz;15363;Stendal;15;ST +7129;39517;Uchtdorf;15363;Stendal;15;ST +7130;39517;Tangerhuette;15363;Stendal;15;ST +7131;39517;Schoenwalde (Altmark);15363;Stendal;15;ST +7132;39517;Schernebeck;15363;Stendal;15;ST +7133;39517;Schelldorf;15363;Stendal;15;ST +7134;39517;Sandbeiendorf;15362;Ohrekreis;15;ST +7135;39517;Ringfurth;15363;Stendal;15;ST +7136;39517;Kehnert;15363;Stendal;15;ST +7137;39517;Jerchel;15363;Stendal;15;ST +7138;39517;Wenddorf;15362;Ohrekreis;15;ST +7139;39517;Weissewarte;15363;Stendal;15;ST +7140;39517;Grieben;15363;Stendal;15;ST +7141;39517;Dolle;15362;Ohrekreis;15;ST +7142;39517;Croechern;15362;Ohrekreis;15;ST +7143;39517;Cobbel;15363;Stendal;15;ST +7144;39517;Burgstall;15362;Ohrekreis;15;ST +7145;39517;Buch;15363;Stendal;15;ST +7146;39517;Boelsdorf;15363;Stendal;15;ST +7147;39517;Bittkau;15363;Stendal;15;ST +7148;39517;Birkholz;15363;Stendal;15;ST +7149;39517;Mahlwinkel;15362;Ohrekreis;15;ST +7150;39517;Luederitz;15363;Stendal;15;ST +7151;39517;Bertingen;15362;Ohrekreis;15;ST +7152;39524;Warnau;15363;Stendal;15;ST +7153;39524;Schoenhausen (Elbe);15363;Stendal;15;ST +7154;39524;Schoenfeld;15363;Stendal;15;ST +7155;39524;Sandau (Elbe);15363;Stendal;15;ST +7156;39524;Kuhlhausen;15363;Stendal;15;ST +7157;39524;Klietz;15363;Stendal;15;ST +7158;39524;Kamern;15363;Stendal;15;ST +7159;39524;Hohengoehren;15363;Stendal;15;ST +7160;39524;Wust;15363;Stendal;15;ST +7161;39524;Wulkau;15363;Stendal;15;ST +7162;39524;Garz;15363;Stendal;15;ST +7163;39524;Fischbeck (Elbe);15363;Stendal;15;ST +7164;39524;Neuermark-Luebars;15363;Stendal;15;ST +7165;39524;Mangelsdorf;15358;Jerichower Land;15;ST +7166;39539;Havelberg;15363;Stendal;15;ST +7167;39576;Stendal;15363;Stendal;15;ST +7168;39579;Uenglingen;15363;Stendal;15;ST +7169;39579;Schinne;15363;Stendal;15;ST +7170;39579;Schernikau;15363;Stendal;15;ST +7171;39579;Schaeplitz;15363;Stendal;15;ST +7172;39579;Rochau;15363;Stendal;15;ST +7173;39579;Klein Schwechten;15363;Stendal;15;ST +7174;39579;Klaeden;15363;Stendal;15;ST +7175;39579;Hueselitz;15363;Stendal;15;ST +7176;39579;Gross Schwechten;15363;Stendal;15;ST +7177;39579;Wittenmoor;15363;Stendal;15;ST +7178;39579;Windberge;15363;Stendal;15;ST +7179;39579;Grobleben;15363;Stendal;15;ST +7180;39579;Garlipp;15363;Stendal;15;ST +7181;39579;Demker;15363;Stendal;15;ST +7182;39579;Dahlen;15363;Stendal;15;ST +7183;39579;Buchholz;15363;Stendal;15;ST +7184;39579;Querstedt;15363;Stendal;15;ST +7185;39579;Bellingen;15363;Stendal;15;ST +7186;39579;Badingen;15363;Stendal;15;ST +7187;39579;Grassau;15363;Stendal;15;ST +7188;39590;Tangermuende;15363;Stendal;15;ST +7189;39590;Storkau (Elbe);15363;Stendal;15;ST +7190;39590;Langensalzwedel;15363;Stendal;15;ST +7191;39590;Heeren;15363;Stendal;15;ST +7192;39590;Haemerten;15363;Stendal;15;ST +7193;39590;Miltern;15363;Stendal;15;ST +7194;39596;Schwarzholz;15363;Stendal;15;ST +7195;39596;Sanne;15363;Stendal;15;ST +7196;39596;Jarchau;15363;Stendal;15;ST +7197;39596;Hohenberg-Krusemark;15363;Stendal;15;ST +7198;39596;Hindenburg;15363;Stendal;15;ST +7199;39596;Hassel;15363;Stendal;15;ST +7200;39596;Eichstedt (Altmark);15363;Stendal;15;ST +7201;39596;Lindtorf;15363;Stendal;15;ST +7202;39596;Bertkow;15363;Stendal;15;ST +7203;39596;Arneburg;15363;Stendal;15;ST +7204;39596;Altenzaun;15363;Stendal;15;ST +7205;39596;Beelitz;15363;Stendal;15;ST +7206;39596;Baben;15363;Stendal;15;ST +7207;39596;Goldbeck;15363;Stendal;15;ST +7208;39599;Volgfelde;15363;Stendal;15;ST +7209;39599;Vinzelberg;15363;Stendal;15;ST +7210;39599;Uchtspringe;15363;Stendal;15;ST +7211;39599;Steinfeld (Altmark);15363;Stendal;15;ST +7212;39599;Staats;15363;Stendal;15;ST +7213;39599;Kaethen;15363;Stendal;15;ST +7214;39599;Insel;15363;Stendal;15;ST +7215;39599;Nahrstedt;15363;Stendal;15;ST +7216;39599;Moeringen;15363;Stendal;15;ST +7217;39606;Walsleben;15363;Stendal;15;ST +7218;39606;Schorstedt;15363;Stendal;15;ST +7219;39606;Sanne-Kerkuhn;15370;Altmarkkreis Salzwedel;15;ST +7220;39606;Sandauerholz;15363;Stendal;15;ST +7221;39606;Rossau;15363;Stendal;15;ST +7222;39606;Krevese;15363;Stendal;15;ST +7223;39606;Kossebau;15363;Stendal;15;ST +7224;39606;Koenigsmark;15363;Stendal;15;ST +7225;39606;Kleinau;15370;Altmarkkreis Salzwedel;15;ST +7226;39606;Iden;15363;Stendal;15;ST +7227;39606;Hohenwulsch;15363;Stendal;15;ST +7228;39606;Heiligenfelde;15363;Stendal;15;ST +7229;39606;Gagel;15363;Stendal;15;ST +7230;39606;Flessau;15363;Stendal;15;ST +7231;39606;Erxleben;15363;Stendal;15;ST +7232;39606;Duesedau;15363;Stendal;15;ST +7233;39606;Dobberkau;15363;Stendal;15;ST +7234;39606;Bretsch;15363;Stendal;15;ST +7235;39606;Boock;15363;Stendal;15;ST +7236;39606;Osterburg;15363;Stendal;15;ST +7237;39606;Meseberg;15363;Stendal;15;ST +7238;39606;Lueckstedt;15363;Stendal;15;ST +7239;39606;Gladigau;15363;Stendal;15;ST +7240;39606;Behrendorf;15363;Stendal;15;ST +7241;39606;Ballerstedt;15363;Stendal;15;ST +7242;39615;Wanzer;15363;Stendal;15;ST +7243;39615;Wahrenberg;15363;Stendal;15;ST +7244;39615;Seehausen;15363;Stendal;15;ST +7245;39615;Schoenberg;15363;Stendal;15;ST +7246;39615;Krueden;15363;Stendal;15;ST +7247;39615;Hoewisch;15370;Altmarkkreis Salzwedel;15;ST +7248;39615;Werben (Elbe);15363;Stendal;15;ST +7249;39615;Wendemark;15363;Stendal;15;ST +7250;39615;Gross Garz;15363;Stendal;15;ST +7251;39615;Geestgottberg;15363;Stendal;15;ST +7252;39615;Falkenberg;15363;Stendal;15;ST +7253;39615;Beuster;15363;Stendal;15;ST +7254;39615;Pollitz;15363;Stendal;15;ST +7255;39615;Neulingen;15370;Altmarkkreis Salzwedel;15;ST +7256;39615;Neukirchen (Altmark);15363;Stendal;15;ST +7257;39615;Losse;15363;Stendal;15;ST +7258;39615;Losenrade;15363;Stendal;15;ST +7259;39615;Lichterfelde;15363;Stendal;15;ST +7260;39615;Leppin;15370;Altmarkkreis Salzwedel;15;ST +7261;39615;Aulosen;15363;Stendal;15;ST +7262;39615;Gollensdorf;15363;Stendal;15;ST +7263;39619;Thielbeer;15370;Altmarkkreis Salzwedel;15;ST +7264;39619;Schrampe;15370;Altmarkkreis Salzwedel;15;ST +7265;39619;Klaeden;15370;Altmarkkreis Salzwedel;15;ST +7266;39619;Ziemendorf;15370;Altmarkkreis Salzwedel;15;ST +7267;39619;Arendsee;15370;Altmarkkreis Salzwedel;15;ST +7268;39624;Vienau;15370;Altmarkkreis Salzwedel;15;ST +7269;39624;Kremkau;15363;Stendal;15;ST +7270;39624;Kalbe (Milde);15370;Altmarkkreis Salzwedel;15;ST +7271;39624;Kakerbeck;15370;Altmarkkreis Salzwedel;15;ST +7272;39624;Kahrstedt;15370;Altmarkkreis Salzwedel;15;ST +7273;39624;Jeetze;15370;Altmarkkreis Salzwedel;15;ST +7274;39624;Guessefeld;15370;Altmarkkreis Salzwedel;15;ST +7275;39624;Zethlingen;15370;Altmarkkreis Salzwedel;15;ST +7276;39624;Winkelstedt;15370;Altmarkkreis Salzwedel;15;ST +7277;39624;Wernstedt;15370;Altmarkkreis Salzwedel;15;ST +7278;39624;Bueste;15363;Stendal;15;ST +7279;39624;Brunau;15370;Altmarkkreis Salzwedel;15;ST +7280;39624;Packebusch;15370;Altmarkkreis Salzwedel;15;ST +7281;39624;Neuendorf am Damm;15370;Altmarkkreis Salzwedel;15;ST +7282;39624;Messdorf;15363;Stendal;15;ST +7283;39624;Altmersleben;15370;Altmarkkreis Salzwedel;15;ST +7284;39624;Berkau;15363;Stendal;15;ST +7285;39624;Badel;15370;Altmarkkreis Salzwedel;15;ST +7286;39629;Koennigde;15363;Stendal;15;ST +7287;39629;Holzhausen;15363;Stendal;15;ST +7288;39629;Bismark (Altmark);15363;Stendal;15;ST +7289;39638;Wannefeld;15370;Altmarkkreis Salzwedel;15;ST +7290;39638;Solpke;15370;Altmarkkreis Salzwedel;15;ST +7291;39638;Seethen;15370;Altmarkkreis Salzwedel;15;ST +7292;39638;Schwiesau;15370;Altmarkkreis Salzwedel;15;ST +7293;39638;Schenkenhorst;15370;Altmarkkreis Salzwedel;15;ST +7294;39638;Roxfoerde;15370;Altmarkkreis Salzwedel;15;ST +7295;39638;Klueden;15362;Ohrekreis;15;ST +7296;39638;Kloster Neuendorf;15370;Altmarkkreis Salzwedel;15;ST +7297;39638;Kassieck;15370;Altmarkkreis Salzwedel;15;ST +7298;39638;Jeseritz;15370;Altmarkkreis Salzwedel;15;ST +7299;39638;Jerchel;15370;Altmarkkreis Salzwedel;15;ST +7300;39638;Jaevenitz;15370;Altmarkkreis Salzwedel;15;ST +7301;39638;Hottendorf;15370;Altmarkkreis Salzwedel;15;ST +7302;39638;Hemstedt;15370;Altmarkkreis Salzwedel;15;ST +7303;39638;Zobbenitz;15362;Ohrekreis;15;ST +7304;39638;Zichtau;15370;Altmarkkreis Salzwedel;15;ST +7305;39638;Wiepke;15370;Altmarkkreis Salzwedel;15;ST +7306;39638;Gardelegen;15370;Altmarkkreis Salzwedel;15;ST +7307;39638;Estedt;15370;Altmarkkreis Salzwedel;15;ST +7308;39638;Engersen;15370;Altmarkkreis Salzwedel;15;ST +7309;39638;Dorst;15362;Ohrekreis;15;ST +7310;39638;Breitenfeld;15370;Altmarkkreis Salzwedel;15;ST +7311;39638;Potzehne;15370;Altmarkkreis Salzwedel;15;ST +7312;39638;Lindstedt;15370;Altmarkkreis Salzwedel;15;ST +7313;39638;Letzlingen;15370;Altmarkkreis Salzwedel;15;ST +7314;39638;Algenstedt;15370;Altmarkkreis Salzwedel;15;ST +7315;39638;Berge;15370;Altmarkkreis Salzwedel;15;ST +7316;39638;Berenbrock;15362;Ohrekreis;15;ST +7317;39646;Oebisfelde;15362;Ohrekreis;15;ST +7318;39649;Sichau;15370;Altmarkkreis Salzwedel;15;ST +7319;39649;Sachau;15370;Altmarkkreis Salzwedel;15;ST +7320;39649;Koeckte;15370;Altmarkkreis Salzwedel;15;ST +7321;39649;Jeggau;15370;Altmarkkreis Salzwedel;15;ST +7322;39649;Dannefeld;15370;Altmarkkreis Salzwedel;15;ST +7323;39649;Peckfitz;15370;Altmarkkreis Salzwedel;15;ST +7324;39649;Miesterhorst;15370;Altmarkkreis Salzwedel;15;ST +7325;39649;Mieste;15370;Altmarkkreis Salzwedel;15;ST +7326;40210;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7327;40211;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7328;40212;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7329;40213;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7330;40215;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7331;40217;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7332;40219;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7333;40221;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7334;40223;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7335;40225;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7336;40227;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7337;40229;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7338;40231;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7339;40233;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7340;40235;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7341;40237;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7342;40239;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7343;40468;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7344;40470;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7345;40472;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7346;40474;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7347;40476;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7348;40477;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7349;40479;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7350;40489;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7351;40545;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7352;40547;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7353;40549;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7354;40589;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7355;40591;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7356;40593;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7357;40595;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7358;40597;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7359;40599;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7360;40625;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7361;40627;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7362;40629;Duesseldorf;5111;Duesseldorf, Stadt;5;NW +7363;40667;Meerbusch;5162;Rhein-Kreis Neuss;5;NW +7364;40668;Meerbusch;5162;Rhein-Kreis Neuss;5;NW +7365;40670;Meerbusch;5162;Rhein-Kreis Neuss;5;NW +7366;40699;Erkrath;5158;Mettmann;5;NW +7367;40721;Hilden;5158;Mettmann;5;NW +7368;40723;Hilden;5158;Mettmann;5;NW +7369;40724;Hilden;5158;Mettmann;5;NW +7370;40764;Langenfeld;5158;Mettmann;5;NW +7371;40789;Monheim am Rhein;5158;Mettmann;5;NW +7372;40822;Mettmann;5158;Mettmann;5;NW +7373;40878;Ratingen;5158;Mettmann;5;NW +7374;40880;Ratingen;5158;Mettmann;5;NW +7375;40882;Ratingen;5158;Mettmann;5;NW +7376;40883;Ratingen;5158;Mettmann;5;NW +7377;40885;Ratingen;5158;Mettmann;5;NW +7378;41061;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7379;41063;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7380;41065;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7381;41066;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7382;41068;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7383;41069;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7384;41169;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7385;41179;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7386;41189;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7387;41199;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7388;41236;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7389;41238;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7390;41239;Moenchengladbach;5116;Moenchengladbach, Stadt;5;NW +7391;41334;Nettetal;5166;Viersen;5;NW +7392;41352;Korschenbroich;5162;Rhein-Kreis Neuss;5;NW +7393;41363;Juechen;5162;Rhein-Kreis Neuss;5;NW +7394;41366;Schwalmtal;5166;Viersen;5;NW +7395;41372;Niederkruechten;5166;Viersen;5;NW +7396;41379;Brueggen;5166;Viersen;5;NW +7397;41460;Neuss;5162;Rhein-Kreis Neuss;5;NW +7398;41462;Neuss;5162;Rhein-Kreis Neuss;5;NW +7399;41464;Neuss;5162;Rhein-Kreis Neuss;5;NW +7400;41466;Neuss;5162;Rhein-Kreis Neuss;5;NW +7401;41468;Neuss;5162;Rhein-Kreis Neuss;5;NW +7402;41469;Neuss;5162;Rhein-Kreis Neuss;5;NW +7403;41470;Neuss;5162;Rhein-Kreis Neuss;5;NW +7404;41472;Neuss;5162;Rhein-Kreis Neuss;5;NW +7405;41515;Grevenbroich;5162;Rhein-Kreis Neuss;5;NW +7406;41516;Grevenbroich;5162;Rhein-Kreis Neuss;5;NW +7407;41517;Grevenbroich;5162;Rhein-Kreis Neuss;5;NW +7408;41539;Dormagen;5162;Rhein-Kreis Neuss;5;NW +7409;41540;Dormagen;5162;Rhein-Kreis Neuss;5;NW +7410;41541;Dormagen;5162;Rhein-Kreis Neuss;5;NW +7411;41542;Dormagen;5162;Rhein-Kreis Neuss;5;NW +7412;41564;Kaarst;5162;Rhein-Kreis Neuss;5;NW +7413;41569;Rommerskirchen;5162;Rhein-Kreis Neuss;5;NW +7414;41747;Viersen;5166;Viersen;5;NW +7415;41748;Viersen;5166;Viersen;5;NW +7416;41749;Viersen;5166;Viersen;5;NW +7417;41751;Viersen;5166;Viersen;5;NW +7418;41812;Erkelenz;5370;Heinsberg;5;NW +7419;41836;Hueckelhoven;5370;Heinsberg;5;NW +7420;41844;Wegberg;5370;Heinsberg;5;NW +7421;41849;Wassenberg;5370;Heinsberg;5;NW +7422;42103;Wuppertal;5124;Wuppertal, Stadt;5;NW +7423;42105;Wuppertal;5124;Wuppertal, Stadt;5;NW +7424;42107;Wuppertal;5124;Wuppertal, Stadt;5;NW +7425;42109;Wuppertal;5124;Wuppertal, Stadt;5;NW +7426;42111;Wuppertal;5124;Wuppertal, Stadt;5;NW +7427;42113;Wuppertal;5124;Wuppertal, Stadt;5;NW +7428;42115;Wuppertal;5124;Wuppertal, Stadt;5;NW +7429;42117;Wuppertal;5124;Wuppertal, Stadt;5;NW +7430;42119;Wuppertal;5124;Wuppertal, Stadt;5;NW +7431;42275;Wuppertal;5124;Wuppertal, Stadt;5;NW +7432;42277;Wuppertal;5124;Wuppertal, Stadt;5;NW +7433;42279;Wuppertal;5124;Wuppertal, Stadt;5;NW +7434;42281;Wuppertal;5124;Wuppertal, Stadt;5;NW +7435;42283;Wuppertal;5124;Wuppertal, Stadt;5;NW +7436;42285;Wuppertal;5124;Wuppertal, Stadt;5;NW +7437;42287;Wuppertal;5124;Wuppertal, Stadt;5;NW +7438;42289;Wuppertal;5124;Wuppertal, Stadt;5;NW +7439;42327;Wuppertal;5124;Wuppertal, Stadt;5;NW +7440;42329;Wuppertal;5124;Wuppertal, Stadt;5;NW +7441;42349;Wuppertal;5124;Wuppertal, Stadt;5;NW +7442;42369;Wuppertal;5124;Wuppertal, Stadt;5;NW +7443;42389;Wuppertal;5124;Wuppertal, Stadt;5;NW +7444;42399;Wuppertal;5124;Wuppertal, Stadt;5;NW +7445;42477;Radevormwald;5374;Oberbergischer Kreis;5;NW +7446;42489;Wuelfrath;5158;Mettmann;5;NW +7447;42499;Hueckeswagen;5374;Oberbergischer Kreis;5;NW +7448;42549;Velbert;5158;Mettmann;5;NW +7449;42551;Velbert;5158;Mettmann;5;NW +7450;42553;Velbert;5158;Mettmann;5;NW +7451;42555;Velbert;5158;Mettmann;5;NW +7452;42579;Heiligenhaus;5158;Mettmann;5;NW +7453;42651;Solingen;5122;Solingen, Stadt;5;NW +7454;42653;Solingen;5122;Solingen, Stadt;5;NW +7455;42655;Solingen;5122;Solingen, Stadt;5;NW +7456;42657;Solingen;5122;Solingen, Stadt;5;NW +7457;42659;Solingen;5122;Solingen, Stadt;5;NW +7458;42697;Solingen;5122;Solingen, Stadt;5;NW +7459;42699;Solingen;5122;Solingen, Stadt;5;NW +7460;42719;Solingen;5122;Solingen, Stadt;5;NW +7461;42781;Haan;5158;Mettmann;5;NW +7462;42799;Leichlingen;5378;Rheinisch-Bergischer Kreis;5;NW +7463;42853;Remscheid;5120;Remscheid, Stadt;5;NW +7464;42855;Remscheid;5120;Remscheid, Stadt;5;NW +7465;42857;Remscheid;5120;Remscheid, Stadt;5;NW +7466;42859;Remscheid;5120;Remscheid, Stadt;5;NW +7467;42897;Remscheid;5120;Remscheid, Stadt;5;NW +7468;42899;Remscheid;5120;Remscheid, Stadt;5;NW +7469;42929;Wermelskirchen;5378;Rheinisch-Bergischer Kreis;5;NW +7470;44135;Dortmund;5913;Dortmund, Stadt;5;NW +7471;44137;Dortmund;5913;Dortmund, Stadt;5;NW +7472;44139;Dortmund;5913;Dortmund, Stadt;5;NW +7473;44141;Dortmund;5913;Dortmund, Stadt;5;NW +7474;44143;Dortmund;5913;Dortmund, Stadt;5;NW +7475;44145;Dortmund;5913;Dortmund, Stadt;5;NW +7476;44147;Dortmund;5913;Dortmund, Stadt;5;NW +7477;44149;Dortmund;5913;Dortmund, Stadt;5;NW +7478;44225;Dortmund;5913;Dortmund, Stadt;5;NW +7479;44227;Dortmund;5913;Dortmund, Stadt;5;NW +7480;44229;Dortmund;5913;Dortmund, Stadt;5;NW +7481;44263;Dortmund;5913;Dortmund, Stadt;5;NW +7482;44265;Dortmund;5913;Dortmund, Stadt;5;NW +7483;44267;Dortmund;5913;Dortmund, Stadt;5;NW +7484;44269;Dortmund;5913;Dortmund, Stadt;5;NW +7485;44287;Dortmund;5913;Dortmund, Stadt;5;NW +7486;44289;Dortmund;5913;Dortmund, Stadt;5;NW +7487;44309;Dortmund;5913;Dortmund, Stadt;5;NW +7488;44319;Dortmund;5913;Dortmund, Stadt;5;NW +7489;44328;Dortmund;5913;Dortmund, Stadt;5;NW +7490;44329;Dortmund;5913;Dortmund, Stadt;5;NW +7491;44339;Dortmund;5913;Dortmund, Stadt;5;NW +7492;44357;Dortmund;5913;Dortmund, Stadt;5;NW +7493;44359;Dortmund;5913;Dortmund, Stadt;5;NW +7494;44369;Dortmund;5913;Dortmund, Stadt;5;NW +7495;44379;Dortmund;5913;Dortmund, Stadt;5;NW +7496;44388;Dortmund;5913;Dortmund, Stadt;5;NW +7497;44532;Luenen;5978;Unna;5;NW +7498;44534;Luenen;5978;Unna;5;NW +7499;44536;Luenen;5978;Unna;5;NW +7500;44575;Castrop-Rauxel;5562;Recklinghausen;5;NW +7501;44577;Castrop-Rauxel;5562;Recklinghausen;5;NW +7502;44579;Castrop-Rauxel;5562;Recklinghausen;5;NW +7503;44581;Castrop-Rauxel;5562;Recklinghausen;5;NW +7504;44623;Herne;5916;Herne, Stadt;5;NW +7505;44625;Herne;5916;Herne, Stadt;5;NW +7506;44627;Herne;5916;Herne, Stadt;5;NW +7507;44628;Herne;5916;Herne, Stadt;5;NW +7508;44629;Herne;5916;Herne, Stadt;5;NW +7509;44649;Herne;5916;Herne, Stadt;5;NW +7510;44651;Herne;5916;Herne, Stadt;5;NW +7511;44652;Herne;5916;Herne, Stadt;5;NW +7512;44653;Herne;5916;Herne, Stadt;5;NW +7513;44787;Bochum;5911;Bochum, Stadt;5;NW +7514;44789;Bochum;5911;Bochum, Stadt;5;NW +7515;44791;Bochum;5911;Bochum, Stadt;5;NW +7516;44793;Bochum;5911;Bochum, Stadt;5;NW +7517;44795;Bochum;5911;Bochum, Stadt;5;NW +7518;44797;Bochum;5911;Bochum, Stadt;5;NW +7519;44799;Bochum;5911;Bochum, Stadt;5;NW +7520;44801;Bochum;5911;Bochum, Stadt;5;NW +7521;44803;Bochum;5911;Bochum, Stadt;5;NW +7522;44805;Bochum;5911;Bochum, Stadt;5;NW +7523;44807;Bochum;5911;Bochum, Stadt;5;NW +7524;44809;Bochum;5911;Bochum, Stadt;5;NW +7525;44866;Bochum;5911;Bochum, Stadt;5;NW +7526;44867;Bochum;5911;Bochum, Stadt;5;NW +7527;44869;Bochum;5911;Bochum, Stadt;5;NW +7528;44879;Bochum;5911;Bochum, Stadt;5;NW +7529;44892;Bochum;5911;Bochum, Stadt;5;NW +7530;44894;Bochum;5911;Bochum, Stadt;5;NW +7531;45127;Essen;5113;Essen, Stadt;5;NW +7532;45128;Essen;5113;Essen, Stadt;5;NW +7533;45130;Essen;5113;Essen, Stadt;5;NW +7534;45131;Essen;5113;Essen, Stadt;5;NW +7535;45133;Essen;5113;Essen, Stadt;5;NW +7536;45134;Essen;5113;Essen, Stadt;5;NW +7537;45136;Essen;5113;Essen, Stadt;5;NW +7538;45138;Essen;5113;Essen, Stadt;5;NW +7539;45139;Essen;5113;Essen, Stadt;5;NW +7540;45141;Essen;5113;Essen, Stadt;5;NW +7541;45143;Essen;5113;Essen, Stadt;5;NW +7542;45144;Essen;5113;Essen, Stadt;5;NW +7543;45145;Essen;5113;Essen, Stadt;5;NW +7544;45147;Essen;5113;Essen, Stadt;5;NW +7545;45149;Essen;5113;Essen, Stadt;5;NW +7546;45219;Essen;5113;Essen, Stadt;5;NW +7547;45239;Essen;5113;Essen, Stadt;5;NW +7548;45257;Essen;5113;Essen, Stadt;5;NW +7549;45259;Essen;5113;Essen, Stadt;5;NW +7550;45276;Essen;5113;Essen, Stadt;5;NW +7551;45277;Essen;5113;Essen, Stadt;5;NW +7552;45279;Essen;5113;Essen, Stadt;5;NW +7553;45289;Essen;5113;Essen, Stadt;5;NW +7554;45307;Essen;5113;Essen, Stadt;5;NW +7555;45309;Essen;5113;Essen, Stadt;5;NW +7556;45326;Essen;5113;Essen, Stadt;5;NW +7557;45327;Essen;5113;Essen, Stadt;5;NW +7558;45329;Essen;5113;Essen, Stadt;5;NW +7559;45355;Essen;5113;Essen, Stadt;5;NW +7560;45356;Essen;5113;Essen, Stadt;5;NW +7561;45357;Essen;5113;Essen, Stadt;5;NW +7562;45359;Essen;5113;Essen, Stadt;5;NW +7563;45468;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7564;45470;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7565;45472;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7566;45473;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7567;45475;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7568;45476;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7569;45478;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7570;45479;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7571;45481;Muelheim an der Ruhr;5117;Muelheim an der Ruhr, Stadt;5;NW +7572;45525;Hattingen;5954;Ennepe-Ruhr-Kreis;5;NW +7573;45527;Hattingen;5954;Ennepe-Ruhr-Kreis;5;NW +7574;45529;Hattingen;5954;Ennepe-Ruhr-Kreis;5;NW +7575;45549;Sprockhoevel;5954;Ennepe-Ruhr-Kreis;5;NW +7576;45657;Recklinghausen;5562;Recklinghausen;5;NW +7577;45659;Recklinghausen;5562;Recklinghausen;5;NW +7578;45661;Recklinghausen;5562;Recklinghausen;5;NW +7579;45663;Recklinghausen;5562;Recklinghausen;5;NW +7580;45665;Recklinghausen;5562;Recklinghausen;5;NW +7581;45699;Herten;5562;Recklinghausen;5;NW +7582;45701;Herten;5562;Recklinghausen;5;NW +7583;45711;Datteln;5562;Recklinghausen;5;NW +7584;45721;Haltern am See;5562;Recklinghausen;5;NW +7585;45731;Waltrop;5562;Recklinghausen;5;NW +7586;45739;Oer-Erkenschwick;5562;Recklinghausen;5;NW +7587;45768;Marl;5562;Recklinghausen;5;NW +7588;45770;Marl;5562;Recklinghausen;5;NW +7589;45772;Marl;5562;Recklinghausen;5;NW +7590;45879;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7591;45881;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7592;45883;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7593;45884;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7594;45886;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7595;45888;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7596;45889;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7597;45891;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7598;45892;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7599;45894;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7600;45896;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7601;45897;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7602;45899;Gelsenkirchen;5513;Gelsenkirchen, Stadt;5;NW +7603;45964;Gladbeck;5562;Recklinghausen;5;NW +7604;45966;Gladbeck;5562;Recklinghausen;5;NW +7605;45968;Gladbeck;5562;Recklinghausen;5;NW +7606;46045;Oberhausen;5119;Oberhausen, Stadt;5;NW +7607;46047;Oberhausen;5119;Oberhausen, Stadt;5;NW +7608;46049;Oberhausen;5119;Oberhausen, Stadt;5;NW +7609;46117;Oberhausen;5119;Oberhausen, Stadt;5;NW +7610;46119;Oberhausen;5119;Oberhausen, Stadt;5;NW +7611;46145;Oberhausen;5119;Oberhausen, Stadt;5;NW +7612;46147;Oberhausen;5119;Oberhausen, Stadt;5;NW +7613;46149;Oberhausen;5119;Oberhausen, Stadt;5;NW +7614;46236;Bottrop;5512;Bottrop, Stadt;5;NW +7615;46238;Bottrop;5512;Bottrop, Stadt;5;NW +7616;46240;Bottrop;5512;Bottrop, Stadt;5;NW +7617;46242;Bottrop;5512;Bottrop, Stadt;5;NW +7618;46244;Bottrop;5512;Bottrop, Stadt;5;NW +7619;46282;Dorsten;5562;Recklinghausen;5;NW +7620;46284;Dorsten;5562;Recklinghausen;5;NW +7621;46286;Dorsten;5562;Recklinghausen;5;NW +7622;46325;Borken;5554;Borken;5;NW +7623;46342;Velen;5554;Borken;5;NW +7624;46348;Raesfeld;5554;Borken;5;NW +7625;46354;Suedlohn;5554;Borken;5;NW +7626;46359;Heiden;5554;Borken;5;NW +7627;46395;Bocholt;5554;Borken;5;NW +7628;46397;Bocholt;5554;Borken;5;NW +7629;46399;Bocholt;5554;Borken;5;NW +7630;46414;Rhede;5554;Borken;5;NW +7631;46419;Isselburg;5554;Borken;5;NW +7632;46446;Emmerich;5154;Kleve;5;NW +7633;46459;Rees;5154;Kleve;5;NW +7634;46483;Wesel;5170;Wesel;5;NW +7635;46485;Wesel;5170;Wesel;5;NW +7636;46487;Wesel;5170;Wesel;5;NW +7637;46499;Hamminkeln;5170;Wesel;5;NW +7638;46509;Xanten;5170;Wesel;5;NW +7639;46514;Schermbeck;5170;Wesel;5;NW +7640;46519;Alpen;5170;Wesel;5;NW +7641;46535;Dinslaken;5170;Wesel;5;NW +7642;46537;Dinslaken;5170;Wesel;5;NW +7643;46539;Dinslaken;5170;Wesel;5;NW +7644;46562;Voerde;5170;Wesel;5;NW +7645;46569;Huenxe;5170;Wesel;5;NW +7646;47051;Duisburg;5112;Duisburg, Stadt;5;NW +7647;47053;Duisburg;5112;Duisburg, Stadt;5;NW +7648;47055;Duisburg;5112;Duisburg, Stadt;5;NW +7649;47057;Duisburg;5112;Duisburg, Stadt;5;NW +7650;47058;Duisburg;5112;Duisburg, Stadt;5;NW +7651;47059;Duisburg;5112;Duisburg, Stadt;5;NW +7652;47119;Duisburg;5112;Duisburg, Stadt;5;NW +7653;47137;Duisburg;5112;Duisburg, Stadt;5;NW +7654;47138;Duisburg;5112;Duisburg, Stadt;5;NW +7655;47139;Duisburg;5112;Duisburg, Stadt;5;NW +7656;47166;Duisburg;5112;Duisburg, Stadt;5;NW +7657;47167;Duisburg;5112;Duisburg, Stadt;5;NW +7658;47169;Duisburg;5112;Duisburg, Stadt;5;NW +7659;47178;Duisburg;5112;Duisburg, Stadt;5;NW +7660;47179;Duisburg;5112;Duisburg, Stadt;5;NW +7661;47198;Duisburg;5112;Duisburg, Stadt;5;NW +7662;47199;Duisburg;5112;Duisburg, Stadt;5;NW +7663;47226;Duisburg;5112;Duisburg, Stadt;5;NW +7664;47228;Duisburg;5112;Duisburg, Stadt;5;NW +7665;47229;Duisburg;5112;Duisburg, Stadt;5;NW +7666;47239;Duisburg;5112;Duisburg, Stadt;5;NW +7667;47249;Duisburg;5112;Duisburg, Stadt;5;NW +7668;47259;Duisburg;5112;Duisburg, Stadt;5;NW +7669;47269;Duisburg;5112;Duisburg, Stadt;5;NW +7670;47279;Duisburg;5112;Duisburg, Stadt;5;NW +7671;47441;Moers;5170;Wesel;5;NW +7672;47443;Moers;5170;Wesel;5;NW +7673;47445;Moers;5170;Wesel;5;NW +7674;47447;Moers;5170;Wesel;5;NW +7675;47475;Kamp-Lintfort;5170;Wesel;5;NW +7676;47495;Rheinberg;5170;Wesel;5;NW +7677;47506;Neukirchen-Vluyn;5170;Wesel;5;NW +7678;47509;Rheurdt;5154;Kleve;5;NW +7679;47533;Kleve;5154;Kleve;5;NW +7680;47546;Kalkar;5154;Kleve;5;NW +7681;47551;Bedburg-Hau;5154;Kleve;5;NW +7682;47559;Kranenburg;5154;Kleve;5;NW +7683;47574;Goch;5154;Kleve;5;NW +7684;47589;Uedem;5154;Kleve;5;NW +7685;47608;Geldern;5154;Kleve;5;NW +7686;47623;Kevelaer;5154;Kleve;5;NW +7687;47624;Kevelaer;5154;Kleve;5;NW +7688;47625;Kevelaer;5154;Kleve;5;NW +7689;47626;Kevelaer;5154;Kleve;5;NW +7690;47627;Kevelaer;5154;Kleve;5;NW +7691;47638;Straelen;5154;Kleve;5;NW +7692;47647;Kerken;5154;Kleve;5;NW +7693;47652;Weeze;5154;Kleve;5;NW +7694;47661;Issum;5154;Kleve;5;NW +7695;47665;Sonsbeck;5170;Wesel;5;NW +7696;47669;Wachtendonk;5154;Kleve;5;NW +7697;47798;Krefeld;5114;Krefeld, Stadt;5;NW +7698;47799;Krefeld;5114;Krefeld, Stadt;5;NW +7699;47800;Krefeld;5114;Krefeld, Stadt;5;NW +7700;47802;Krefeld;5114;Krefeld, Stadt;5;NW +7701;47803;Krefeld;5114;Krefeld, Stadt;5;NW +7702;47804;Krefeld;5114;Krefeld, Stadt;5;NW +7703;47805;Krefeld;5114;Krefeld, Stadt;5;NW +7704;47807;Krefeld;5114;Krefeld, Stadt;5;NW +7705;47809;Krefeld;5114;Krefeld, Stadt;5;NW +7706;47829;Krefeld;5114;Krefeld, Stadt;5;NW +7707;47839;Krefeld;5114;Krefeld, Stadt;5;NW +7708;47877;Willich;5166;Viersen;5;NW +7709;47906;Kempen;5166;Viersen;5;NW +7710;47918;Toenisvorst;5166;Viersen;5;NW +7711;47929;Grefrath;5166;Viersen;5;NW +7712;48143;Muenster;5515;Muenster, Stadt;5;NW +7713;48145;Muenster;5515;Muenster, Stadt;5;NW +7714;48147;Muenster;5515;Muenster, Stadt;5;NW +7715;48149;Muenster;5515;Muenster, Stadt;5;NW +7716;48151;Muenster;5515;Muenster, Stadt;5;NW +7717;48153;Muenster;5515;Muenster, Stadt;5;NW +7718;48155;Muenster;5515;Muenster, Stadt;5;NW +7719;48157;Muenster;5515;Muenster, Stadt;5;NW +7720;48159;Muenster;5515;Muenster, Stadt;5;NW +7721;48161;Muenster;5515;Muenster, Stadt;5;NW +7722;48163;Muenster;5515;Muenster, Stadt;5;NW +7723;48165;Muenster;5515;Muenster, Stadt;5;NW +7724;48167;Muenster;5515;Muenster, Stadt;5;NW +7725;48231;Warendorf;5570;Warendorf;5;NW +7726;48249;Duelmen;5558;Coesfeld;5;NW +7727;48268;Greven;5566;Steinfurt;5;NW +7728;48282;Emsdetten;5566;Steinfurt;5;NW +7729;48291;Telgte;5570;Warendorf;5;NW +7730;48301;Nottuln;5558;Coesfeld;5;NW +7731;48308;Senden;5558;Coesfeld;5;NW +7732;48317;Drensteinfurt;5570;Warendorf;5;NW +7733;48324;Sendenhorst;5570;Warendorf;5;NW +7734;48329;Havixbeck;5558;Coesfeld;5;NW +7735;48336;Sassenberg;5570;Warendorf;5;NW +7736;48341;Altenberge;5566;Steinfurt;5;NW +7737;48346;Ostbevern;5570;Warendorf;5;NW +7738;48351;Everswinkel;5570;Warendorf;5;NW +7739;48356;Nordwalde;5566;Steinfurt;5;NW +7740;48361;Beelen;5570;Warendorf;5;NW +7741;48366;Laer;5566;Steinfurt;5;NW +7742;48369;Saerbeck;5566;Steinfurt;5;NW +7743;48429;Rheine;5566;Steinfurt;5;NW +7744;48431;Rheine;5566;Steinfurt;5;NW +7745;48432;Rheine;5566;Steinfurt;5;NW +7746;48455;Bad Bentheim;3456;Grafschaft Bentheim;3;NI +7747;48465;Samern;3456;Grafschaft Bentheim;3;NI +7748;48465;Schuettorf;3456;Grafschaft Bentheim;3;NI +7749;48465;Suddendorf;3456;Grafschaft Bentheim;3;NI +7750;48465;Isterberg;3456;Grafschaft Bentheim;3;NI +7751;48465;Engden;3456;Grafschaft Bentheim;3;NI +7752;48465;Ohne;3456;Grafschaft Bentheim;3;NI +7753;48465;Quendorf;3456;Grafschaft Bentheim;3;NI +7754;48477;Hoerstel;5566;Steinfurt;5;NW +7755;48480;Schapen;3454;Emsland;3;NI +7756;48480;Spelle;3454;Emsland;3;NI +7757;48480;Luenne;3454;Emsland;3;NI +7758;48485;Neuenkirchen;5566;Steinfurt;5;NW +7759;48488;Emsbueren;3454;Emsland;3;NI +7760;48493;Wettringen;5566;Steinfurt;5;NW +7761;48496;Hopsten;5566;Steinfurt;5;NW +7762;48499;Salzbergen;3454;Emsland;3;NI +7763;48527;Nordhorn;3456;Grafschaft Bentheim;3;NI +7764;48529;Nordhorn;3456;Grafschaft Bentheim;3;NI +7765;48531;Nordhorn;3456;Grafschaft Bentheim;3;NI +7766;48565;Steinfurt;5566;Steinfurt;5;NW +7767;48599;Gronau (Westfalen);5554;Borken;5;NW +7768;48607;Ochtrup;5566;Steinfurt;5;NW +7769;48612;Horstmar;5566;Steinfurt;5;NW +7770;48619;Heek;5554;Borken;5;NW +7771;48624;Schoeppingen;5554;Borken;5;NW +7772;48629;Metelen;5566;Steinfurt;5;NW +7773;48653;Coesfeld;5558;Coesfeld;5;NW +7774;48683;Ahaus;5554;Borken;5;NW +7775;48691;Vreden;5554;Borken;5;NW +7776;48703;Stadtlohn;5554;Borken;5;NW +7777;48712;Gescher;5554;Borken;5;NW +7778;48720;Rosendahl;5558;Coesfeld;5;NW +7779;48727;Billerbeck;5558;Coesfeld;5;NW +7780;48734;Reken;5554;Borken;5;NW +7781;48739;Legden;5554;Borken;5;NW +7782;49074;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7783;49076;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7784;49078;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7785;49080;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7786;49082;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7787;49084;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7788;49086;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7789;49088;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7790;49090;Osnabrueck;3404;Osnabrueck, Stadt;3;NI +7791;49124;Georgsmarienhuette;3459;Osnabrueck;3;NI +7792;49134;Wallenhorst;3459;Osnabrueck;3;NI +7793;49143;Bissendorf;3459;Osnabrueck;3;NI +7794;49152;Bad Essen;3459;Osnabrueck;3;NI +7795;49163;Bohmte;3459;Osnabrueck;3;NI +7796;49170;Hagen am Teutoburger Wald;3459;Osnabrueck;3;NI +7797;49176;Hilter am Teutoburger Wald;3459;Osnabrueck;3;NI +7798;49179;Ostercappeln;3459;Osnabrueck;3;NI +7799;49186;Bad Iburg;3459;Osnabrueck;3;NI +7800;49191;Belm;3459;Osnabrueck;3;NI +7801;49196;Bad Laer;3459;Osnabrueck;3;NI +7802;49201;Dissen am Teutoburger Wald;3459;Osnabrueck;3;NI +7803;49205;Hasbergen;3459;Osnabrueck;3;NI +7804;49214;Bad Rothenfelde;3459;Osnabrueck;3;NI +7805;49219;Glandorf;3459;Osnabrueck;3;NI +7806;49324;Melle;3459;Osnabrueck;3;NI +7807;49326;Melle;3459;Osnabrueck;3;NI +7808;49328;Melle;3459;Osnabrueck;3;NI +7809;49356;Diepholz;3251;Diepholz;3;NI +7810;49377;Vechta;3460;Vechta;3;NI +7811;49393;Lohne (Oldenburg);3460;Vechta;3;NI +7812;49401;Damme;3460;Vechta;3;NI +7813;49406;Eydelstedt;3251;Diepholz;3;NI +7814;49406;Barnstorf;3251;Diepholz;3;NI +7815;49406;Drentwede;3251;Diepholz;3;NI +7816;49413;Dinklage;3460;Vechta;3;NI +7817;49419;Wagenfeld;3251;Diepholz;3;NI +7818;49424;Goldenstedt;3460;Vechta;3;NI +7819;49429;Visbek;3460;Vechta;3;NI +7820;49434;Neuenkirchen-Voerden;3460;Vechta;3;NI +7821;49439;Steinfeld (Oldenburg);3460;Vechta;3;NI +7822;49448;Huede;3251;Diepholz;3;NI +7823;49448;Lemfoerde;3251;Diepholz;3;NI +7824;49448;Marl;3251;Diepholz;3;NI +7825;49448;Quernheim;3251;Diepholz;3;NI +7826;49448;Stemshorn;3251;Diepholz;3;NI +7827;49448;Brockum;3251;Diepholz;3;NI +7828;49451;Holdorf;3460;Vechta;3;NI +7829;49453;Hemsloh;3251;Diepholz;3;NI +7830;49453;Rehden;3251;Diepholz;3;NI +7831;49453;Wetschen;3251;Diepholz;3;NI +7832;49453;Dickel;3251;Diepholz;3;NI +7833;49453;Barver;3251;Diepholz;3;NI +7834;49456;Bakum;3460;Vechta;3;NI +7835;49457;Drebber;3251;Diepholz;3;NI +7836;49459;Lembruch;3251;Diepholz;3;NI +7837;49477;Ibbenbueren;5566;Steinfurt;5;NW +7838;49479;Ibbenbueren;5566;Steinfurt;5;NW +7839;49492;Westerkappeln;5566;Steinfurt;5;NW +7840;49497;Mettingen;5566;Steinfurt;5;NW +7841;49504;Lotte;5566;Steinfurt;5;NW +7842;49509;Recke;5566;Steinfurt;5;NW +7843;49525;Lengerich;5566;Steinfurt;5;NW +7844;49536;Lienen;5566;Steinfurt;5;NW +7845;49545;Tecklenburg;5566;Steinfurt;5;NW +7846;49549;Ladbergen;5566;Steinfurt;5;NW +7847;49565;Bramsche;3459;Osnabrueck;3;NI +7848;49577;Eggermuehlen;3459;Osnabrueck;3;NI +7849;49577;Kettenkamp;3459;Osnabrueck;3;NI +7850;49577;Ankum;3459;Osnabrueck;3;NI +7851;49584;Fuerstenau;3459;Osnabrueck;3;NI +7852;49586;Neuenkirchen;3459;Osnabrueck;3;NI +7853;49586;Merzen;3459;Osnabrueck;3;NI +7854;49593;Bersenbrueck;3459;Osnabrueck;3;NI +7855;49594;Alfhausen;3459;Osnabrueck;3;NI +7856;49596;Gehrde;3459;Osnabrueck;3;NI +7857;49597;Rieste;3459;Osnabrueck;3;NI +7858;49599;Voltlage;3459;Osnabrueck;3;NI +7859;49610;Quakenbrueck;3459;Osnabrueck;3;NI +7860;49624;Loeningen;3453;Cloppenburg;3;NI +7861;49626;Berge;3459;Osnabrueck;3;NI +7862;49626;Bippen;3459;Osnabrueck;3;NI +7863;49632;Essen (Oldenburg);3453;Cloppenburg;3;NI +7864;49635;Badbergen;3459;Osnabrueck;3;NI +7865;49637;Menslage;3459;Osnabrueck;3;NI +7866;49638;Nortrup;3459;Osnabrueck;3;NI +7867;49661;Cloppenburg;3453;Cloppenburg;3;NI +7868;49681;Garrel;3453;Cloppenburg;3;NI +7869;49685;Emstek;3453;Cloppenburg;3;NI +7870;49688;Lastrup;3453;Cloppenburg;3;NI +7871;49692;Cappeln (Oldenburg);3453;Cloppenburg;3;NI +7872;49696;Molbergen;3453;Cloppenburg;3;NI +7873;49699;Lindern (Oldenburg);3453;Cloppenburg;3;NI +7874;49716;Meppen;3454;Emsland;3;NI +7875;49733;Haren;3454;Emsland;3;NI +7876;49740;Haseluenne;3454;Emsland;3;NI +7877;49744;Geeste;3454;Emsland;3;NI +7878;49751;Hueven;3454;Emsland;3;NI +7879;49751;Soegel;3454;Emsland;3;NI +7880;49751;Spahnharrenstaette;3454;Emsland;3;NI +7881;49751;Werpeloh;3454;Emsland;3;NI +7882;49757;Vrees;3454;Emsland;3;NI +7883;49757;Werlte;3454;Emsland;3;NI +7884;49757;Lahn;3454;Emsland;3;NI +7885;49762;Fresenburg;3454;Emsland;3;NI +7886;49762;Sustrum;3454;Emsland;3;NI +7887;49762;Renkenberge;3454;Emsland;3;NI +7888;49762;Lathen;3454;Emsland;3;NI +7889;49767;Twist;3454;Emsland;3;NI +7890;49770;Dohren;3454;Emsland;3;NI +7891;49770;Herzlake;3454;Emsland;3;NI +7892;49774;Laehden;3454;Emsland;3;NI +7893;49777;Stavern;3454;Emsland;3;NI +7894;49777;Gross Berssen;3454;Emsland;3;NI +7895;49777;Klein Berssen;3454;Emsland;3;NI +7896;49779;Niederlangen;3454;Emsland;3;NI +7897;49779;Oberlangen;3454;Emsland;3;NI +7898;49808;Lingen;3454;Emsland;3;NI +7899;49809;Lingen;3454;Emsland;3;NI +7900;49811;Lingen;3454;Emsland;3;NI +7901;49824;Ringe;3456;Grafschaft Bentheim;3;NI +7902;49824;Laar;3456;Grafschaft Bentheim;3;NI +7903;49824;Emlichheim;3456;Grafschaft Bentheim;3;NI +7904;49828;Osterwald;3456;Grafschaft Bentheim;3;NI +7905;49828;Georgsdorf;3456;Grafschaft Bentheim;3;NI +7906;49828;Esche;3456;Grafschaft Bentheim;3;NI +7907;49828;Neuenhaus;3456;Grafschaft Bentheim;3;NI +7908;49828;Lage;3456;Grafschaft Bentheim;3;NI +7909;49832;Beesten;3454;Emsland;3;NI +7910;49832;Andervenne;3454;Emsland;3;NI +7911;49832;Thuine;3454;Emsland;3;NI +7912;49832;Freren;3454;Emsland;3;NI +7913;49832;Messingen;3454;Emsland;3;NI +7914;49835;Wietmarschen;3456;Grafschaft Bentheim;3;NI +7915;49838;Lengerich;3454;Emsland;3;NI +7916;49838;Wettrup;3454;Emsland;3;NI +7917;49838;Gersten;3454;Emsland;3;NI +7918;49838;Langen;3454;Emsland;3;NI +7919;49838;Handrup;3454;Emsland;3;NI +7920;49843;Uelsen;3456;Grafschaft Bentheim;3;NI +7921;49843;Halle;3456;Grafschaft Bentheim;3;NI +7922;49843;Goelenkamp;3456;Grafschaft Bentheim;3;NI +7923;49843;Wielen;3456;Grafschaft Bentheim;3;NI +7924;49843;Getelo;3456;Grafschaft Bentheim;3;NI +7925;49844;Bawinkel;3454;Emsland;3;NI +7926;49846;Hoogstede;3456;Grafschaft Bentheim;3;NI +7927;49847;Itterbeck;3456;Grafschaft Bentheim;3;NI +7928;49849;Wilsum;3456;Grafschaft Bentheim;3;NI +7929;50126;Bergheim;5362;Rhein-Erft-Kreis;5;NW +7930;50127;Bergheim;5362;Rhein-Erft-Kreis;5;NW +7931;50129;Bergheim;5362;Rhein-Erft-Kreis;5;NW +7932;50169;Kerpen;5362;Rhein-Erft-Kreis;5;NW +7933;50170;Kerpen;5362;Rhein-Erft-Kreis;5;NW +7934;50171;Kerpen;5362;Rhein-Erft-Kreis;5;NW +7935;50181;Bedburg;5362;Rhein-Erft-Kreis;5;NW +7936;50189;Elsdorf;5362;Rhein-Erft-Kreis;5;NW +7937;50226;Frechen;5362;Rhein-Erft-Kreis;5;NW +7938;50259;Pulheim;5362;Rhein-Erft-Kreis;5;NW +7939;50321;Bruehl;5362;Rhein-Erft-Kreis;5;NW +7940;50354;Huerth;5362;Rhein-Erft-Kreis;5;NW +7941;50374;Erftstadt;5362;Rhein-Erft-Kreis;5;NW +7942;50389;Wesseling;5362;Rhein-Erft-Kreis;5;NW +7943;50667;Koeln;5315;Koeln, Stadt;5;NW +7944;50668;Koeln;5315;Koeln, Stadt;5;NW +7945;50670;Koeln;5315;Koeln, Stadt;5;NW +7946;50672;Koeln;5315;Koeln, Stadt;5;NW +7947;50674;Koeln;5315;Koeln, Stadt;5;NW +7948;50676;Koeln;5315;Koeln, Stadt;5;NW +7949;50677;Koeln;5315;Koeln, Stadt;5;NW +7950;50678;Koeln;5315;Koeln, Stadt;5;NW +7951;50679;Koeln;5315;Koeln, Stadt;5;NW +7952;50733;Koeln;5315;Koeln, Stadt;5;NW +7953;50735;Koeln;5315;Koeln, Stadt;5;NW +7954;50737;Koeln;5315;Koeln, Stadt;5;NW +7955;50739;Koeln;5315;Koeln, Stadt;5;NW +7956;50765;Koeln;5315;Koeln, Stadt;5;NW +7957;50767;Koeln;5315;Koeln, Stadt;5;NW +7958;50769;Koeln;5315;Koeln, Stadt;5;NW +7959;50823;Koeln;5315;Koeln, Stadt;5;NW +7960;50825;Koeln;5315;Koeln, Stadt;5;NW +7961;50827;Koeln;5315;Koeln, Stadt;5;NW +7962;50829;Koeln;5315;Koeln, Stadt;5;NW +7963;50858;Koeln;5315;Koeln, Stadt;5;NW +7964;50859;Koeln;5315;Koeln, Stadt;5;NW +7965;50931;Koeln;5315;Koeln, Stadt;5;NW +7966;50933;Koeln;5315;Koeln, Stadt;5;NW +7967;50935;Koeln;5315;Koeln, Stadt;5;NW +7968;50937;Koeln;5315;Koeln, Stadt;5;NW +7969;50939;Koeln;5315;Koeln, Stadt;5;NW +7970;50968;Koeln;5315;Koeln, Stadt;5;NW +7971;50969;Koeln;5315;Koeln, Stadt;5;NW +7972;50996;Koeln;5315;Koeln, Stadt;5;NW +7973;50997;Koeln;5315;Koeln, Stadt;5;NW +7974;50999;Koeln;5315;Koeln, Stadt;5;NW +7975;51061;Koeln;5315;Koeln, Stadt;5;NW +7976;51063;Koeln;5315;Koeln, Stadt;5;NW +7977;51065;Koeln;5315;Koeln, Stadt;5;NW +7978;51067;Koeln;5315;Koeln, Stadt;5;NW +7979;51069;Koeln;5315;Koeln, Stadt;5;NW +7980;51103;Koeln;5315;Koeln, Stadt;5;NW +7981;51105;Koeln;5315;Koeln, Stadt;5;NW +7982;51107;Koeln;5315;Koeln, Stadt;5;NW +7983;51109;Koeln;5315;Koeln, Stadt;5;NW +7984;51143;Koeln;5315;Koeln, Stadt;5;NW +7985;51145;Koeln;5315;Koeln, Stadt;5;NW +7986;51147;Koeln;5315;Koeln, Stadt;5;NW +7987;51149;Koeln;5315;Koeln, Stadt;5;NW +7988;51371;Leverkusen;5316;Leverkusen, Stadt;5;NW +7989;51373;Leverkusen;5316;Leverkusen, Stadt;5;NW +7990;51375;Leverkusen;5316;Leverkusen, Stadt;5;NW +7991;51377;Leverkusen;5316;Leverkusen, Stadt;5;NW +7992;51379;Leverkusen;5316;Leverkusen, Stadt;5;NW +7993;51381;Leverkusen;5316;Leverkusen, Stadt;5;NW +7994;51399;Burscheid;5378;Rheinisch-Bergischer Kreis;5;NW +7995;51427;Bergisch Gladbach;5378;Rheinisch-Bergischer Kreis;5;NW +7996;51429;Bergisch Gladbach;5378;Rheinisch-Bergischer Kreis;5;NW +7997;51465;Bergisch Gladbach;5378;Rheinisch-Bergischer Kreis;5;NW +7998;51467;Bergisch Gladbach;5378;Rheinisch-Bergischer Kreis;5;NW +7999;51469;Bergisch Gladbach;5378;Rheinisch-Bergischer Kreis;5;NW +8000;51491;Overath;5378;Rheinisch-Bergischer Kreis;5;NW +8001;51503;Roesrath;5378;Rheinisch-Bergischer Kreis;5;NW +8002;51515;Kuerten;5378;Rheinisch-Bergischer Kreis;5;NW +8003;51519;Odenthal;5378;Rheinisch-Bergischer Kreis;5;NW +8004;51545;Waldbroel;5374;Oberbergischer Kreis;5;NW +8005;51570;Windeck;5382;Rhein-Sieg-Kreis;5;NW +8006;51580;Reichshof;5374;Oberbergischer Kreis;5;NW +8007;51588;Nuembrecht;5374;Oberbergischer Kreis;5;NW +8008;51597;Morsbach;5374;Oberbergischer Kreis;5;NW +8009;51598;Friesenhagen;7132;Altenkirchen (Westerwald);7;RP +8010;51643;Gummersbach;5374;Oberbergischer Kreis;5;NW +8011;51645;Gummersbach;5374;Oberbergischer Kreis;5;NW +8012;51647;Gummersbach;5374;Oberbergischer Kreis;5;NW +8013;51674;Wiehl;5374;Oberbergischer Kreis;5;NW +8014;51688;Wipperfuerth;5374;Oberbergischer Kreis;5;NW +8015;51702;Bergneustadt;5374;Oberbergischer Kreis;5;NW +8016;51709;Marienheide;5374;Oberbergischer Kreis;5;NW +8017;51766;Engelskirchen;5374;Oberbergischer Kreis;5;NW +8018;51789;Lindlar;5374;Oberbergischer Kreis;5;NW +8019;52062;Aachen;5313;Aachen, Stadt;5;NW +8020;52064;Aachen;5313;Aachen, Stadt;5;NW +8021;52066;Aachen;5313;Aachen, Stadt;5;NW +8022;52068;Aachen;5313;Aachen, Stadt;5;NW +8023;52070;Aachen;5313;Aachen, Stadt;5;NW +8024;52072;Aachen;5313;Aachen, Stadt;5;NW +8025;52074;Aachen;5313;Aachen, Stadt;5;NW +8026;52076;Aachen;5313;Aachen, Stadt;5;NW +8027;52078;Aachen;5313;Aachen, Stadt;5;NW +8028;52080;Aachen;5313;Aachen, Stadt;5;NW +8029;52134;Herzogenrath;5354;Aachen;5;NW +8030;52146;Wuerselen;5354;Aachen;5;NW +8031;52152;Simmerath;5354;Aachen;5;NW +8032;52156;Monschau;5354;Aachen;5;NW +8033;52159;Roetgen;5354;Aachen;5;NW +8034;52222;Stolberg (Rheinland);5354;Aachen;5;NW +8035;52223;Stolberg (Rheinland);5354;Aachen;5;NW +8036;52224;Stolberg (Rheinland);5354;Aachen;5;NW +8037;52249;Eschweiler;5354;Aachen;5;NW +8038;52349;Dueren;5358;Dueren;5;NW +8039;52351;Dueren;5358;Dueren;5;NW +8040;52353;Dueren;5358;Dueren;5;NW +8041;52355;Dueren;5358;Dueren;5;NW +8042;52372;Kreuzau;5358;Dueren;5;NW +8043;52379;Langerwehe;5358;Dueren;5;NW +8044;52382;Niederzier;5358;Dueren;5;NW +8045;52385;Nideggen;5358;Dueren;5;NW +8046;52388;Noervenich;5358;Dueren;5;NW +8047;52391;Vettweiss;5358;Dueren;5;NW +8048;52393;Huertgenwald;5358;Dueren;5;NW +8049;52396;Heimbach;5358;Dueren;5;NW +8050;52399;Merzenich;5358;Dueren;5;NW +8051;52428;Juelich;5358;Dueren;5;NW +8052;52441;Linnich;5358;Dueren;5;NW +8053;52445;Titz;5358;Dueren;5;NW +8054;52457;Aldenhoven;5358;Dueren;5;NW +8055;52459;Inden;5358;Dueren;5;NW +8056;52477;Alsdorf;5354;Aachen;5;NW +8057;52499;Baesweiler;5354;Aachen;5;NW +8058;52511;Geilenkirchen;5370;Heinsberg;5;NW +8059;52525;Heinsberg;5370;Heinsberg;5;NW +8060;52525;Waldfeucht;5370;Heinsberg;5;NW +8061;52531;bach-Palenberg;5370;Heinsberg;5;NW +8062;52538;Selfkant;5370;Heinsberg;5;NW +8063;52538;Gangelt;5370;Heinsberg;5;NW +8064;53111;Bonn;5314;Bonn, Stadt;5;NW +8065;53113;Bonn;5314;Bonn, Stadt;5;NW +8066;53115;Bonn;5314;Bonn, Stadt;5;NW +8067;53117;Bonn;5314;Bonn, Stadt;5;NW +8068;53119;Bonn;5314;Bonn, Stadt;5;NW +8069;53121;Bonn;5314;Bonn, Stadt;5;NW +8070;53123;Bonn;5314;Bonn, Stadt;5;NW +8071;53125;Bonn;5314;Bonn, Stadt;5;NW +8072;53127;Bonn;5314;Bonn, Stadt;5;NW +8073;53129;Bonn;5314;Bonn, Stadt;5;NW +8074;53173;Bonn;5314;Bonn, Stadt;5;NW +8075;53175;Bonn;5314;Bonn, Stadt;5;NW +8076;53177;Bonn;5314;Bonn, Stadt;5;NW +8077;53179;Bonn;5314;Bonn, Stadt;5;NW +8078;53225;Bonn;5314;Bonn, Stadt;5;NW +8079;53227;Bonn;5314;Bonn, Stadt;5;NW +8080;53229;Bonn;5314;Bonn, Stadt;5;NW +8081;53332;Bornheim;5382;Rhein-Sieg-Kreis;5;NW +8082;53340;Meckenheim;5382;Rhein-Sieg-Kreis;5;NW +8083;53343;Wachtberg;5382;Rhein-Sieg-Kreis;5;NW +8084;53347;Alfter;5382;Rhein-Sieg-Kreis;5;NW +8085;53359;Rheinbach;5382;Rhein-Sieg-Kreis;5;NW +8086;53424;Remagen;7131;Ahrweiler;7;RP +8087;53426;Schalkenbach;7131;Ahrweiler;7;RP +8088;53426;Dedenbach;7131;Ahrweiler;7;RP +8089;53426;Koenigsfeld;7131;Ahrweiler;7;RP +8090;53474;Bad Neuenahr-Ahrweiler;7131;Ahrweiler;7;RP +8091;53489;Sinzig;7131;Ahrweiler;7;RP +8092;53498;Waldorf;7131;Ahrweiler;7;RP +8093;53498;Bad Breisig;7131;Ahrweiler;7;RP +8094;53498;Goennersdorf;7131;Ahrweiler;7;RP +8095;53501;Grafschaft;7131;Ahrweiler;7;RP +8096;53505;Kalenborn;7131;Ahrweiler;7;RP +8097;53505;Berg;7131;Ahrweiler;7;RP +8098;53505;Altenahr;7131;Ahrweiler;7;RP +8099;53505;Kirchsahr;7131;Ahrweiler;7;RP +8100;53506;Ahrbrueck;7131;Ahrweiler;7;RP +8101;53506;Lind;7131;Ahrweiler;7;RP +8102;53506;Rech;7131;Ahrweiler;7;RP +8103;53506;Heckenbach;7131;Ahrweiler;7;RP +8104;53506;Kesseling;7131;Ahrweiler;7;RP +8105;53506;Hoenningen;7131;Ahrweiler;7;RP +8106;53507;Dernau;7131;Ahrweiler;7;RP +8107;53508;Mayschoss;7131;Ahrweiler;7;RP +8108;53518;Kottenborn;7131;Ahrweiler;7;RP +8109;53518;Adenau;7131;Ahrweiler;7;RP +8110;53518;Leimbach;7131;Ahrweiler;7;RP +8111;53518;Herschbroich;7131;Ahrweiler;7;RP +8112;53518;Welcherath;7233;Daun;7;RP +8113;53518;Wimbach;7131;Ahrweiler;7;RP +8114;53518;Honerath;7131;Ahrweiler;7;RP +8115;53518;Quiddelbach;7131;Ahrweiler;7;RP +8116;53520;Insul;7131;Ahrweiler;7;RP +8117;53520;Huemmel;7131;Ahrweiler;7;RP +8118;53520;Drees;7233;Daun;7;RP +8119;53520;Nuerburg;7131;Ahrweiler;7;RP +8120;53520;Harscheid;7131;Ahrweiler;7;RP +8121;53520;Trierscheid;7131;Ahrweiler;7;RP +8122;53520;Rodder;7131;Ahrweiler;7;RP +8123;53520;Senscheid;7131;Ahrweiler;7;RP +8124;53520;Ohlenhard;7131;Ahrweiler;7;RP +8125;53520;Reifferscheid;7131;Ahrweiler;7;RP +8126;53520;Kaltenborn;7131;Ahrweiler;7;RP +8127;53520;Meuspath;7131;Ahrweiler;7;RP +8128;53520;Schuld;7131;Ahrweiler;7;RP +8129;53520;Duempelfeld;7131;Ahrweiler;7;RP +8130;53520;Wershofen;7131;Ahrweiler;7;RP +8131;53520;Sierscheid;7131;Ahrweiler;7;RP +8132;53520;Winnerath;7131;Ahrweiler;7;RP +8133;53520;Muellenbach;7131;Ahrweiler;7;RP +8134;53520;Dankerath;7131;Ahrweiler;7;RP +8135;53533;Muesch;7131;Ahrweiler;7;RP +8136;53533;Antweiler;7131;Ahrweiler;7;RP +8137;53533;Eichenbach;7131;Ahrweiler;7;RP +8138;53533;Dorsel;7131;Ahrweiler;7;RP +8139;53533;Fuchshofen;7131;Ahrweiler;7;RP +8140;53533;Aremberg;7131;Ahrweiler;7;RP +8141;53534;Wiesemscheid;7131;Ahrweiler;7;RP +8142;53534;Bauler;7131;Ahrweiler;7;RP +8143;53534;Pomster;7131;Ahrweiler;7;RP +8144;53534;Barweiler;7131;Ahrweiler;7;RP +8145;53534;Hoffeld;7131;Ahrweiler;7;RP +8146;53534;Wirft;7131;Ahrweiler;7;RP +8147;53539;Borler;7233;Daun;7;RP +8148;53539;Gelenberg;7233;Daun;7;RP +8149;53539;Reimerath;7233;Daun;7;RP +8150;53539;Bodenbach;7233;Daun;7;RP +8151;53539;Kirsbach;7233;Daun;7;RP +8152;53539;Bruecktal;7233;Daun;7;RP +8153;53539;Kelberg;7233;Daun;7;RP +8154;53539;Bongard;7233;Daun;7;RP +8155;53545;Ockenfels;7138;Neuwied;7;RP +8156;53545;Linz am Rhein;7138;Neuwied;7;RP +8157;53547;Dattenberg;7138;Neuwied;7;RP +8158;53547;Huemmerich;7138;Neuwied;7;RP +8159;53547;Rossbach;7138;Neuwied;7;RP +8160;53547;Leubsdorf;7138;Neuwied;7;RP +8161;53547;Kasbach-Ohlenberg;7138;Neuwied;7;RP +8162;53547;Breitscheid;7138;Neuwied;7;RP +8163;53547;Hausen (Wied);7138;Neuwied;7;RP +8164;53557;Bad Hoenningen;7138;Neuwied;7;RP +8165;53560;Vettelschoss;7138;Neuwied;7;RP +8166;53562;Sankt Katharinen;7138;Neuwied;7;RP +8167;53567;Buchholz (Westerwald);7138;Neuwied;7;RP +8168;53567;Asbach;7138;Neuwied;7;RP +8169;53572;Unkel;7138;Neuwied;7;RP +8170;53572;Bruchhausen;7138;Neuwied;7;RP +8171;53577;Neustadt (Wied);7138;Neuwied;7;RP +8172;53578;Windhagen;7138;Neuwied;7;RP +8173;53579;Erpel;7138;Neuwied;7;RP +8174;53604;Bad Honnef;5382;Rhein-Sieg-Kreis;5;NW +8175;53619;Rheinbreitbach;7138;Neuwied;7;RP +8176;53639;Koenigswinter;5382;Rhein-Sieg-Kreis;5;NW +8177;53721;Siegburg;5382;Rhein-Sieg-Kreis;5;NW +8178;53757;Sankt Augustin;5382;Rhein-Sieg-Kreis;5;NW +8179;53773;Hennef;5382;Rhein-Sieg-Kreis;5;NW +8180;53783;Eitorf;5382;Rhein-Sieg-Kreis;5;NW +8181;53797;Lohmar;5382;Rhein-Sieg-Kreis;5;NW +8182;53804;Much;5382;Rhein-Sieg-Kreis;5;NW +8183;53809;Ruppichteroth;5382;Rhein-Sieg-Kreis;5;NW +8184;53819;Neunkirchen-Seelscheid;5382;Rhein-Sieg-Kreis;5;NW +8185;53840;Troisdorf;5382;Rhein-Sieg-Kreis;5;NW +8186;53842;Troisdorf;5382;Rhein-Sieg-Kreis;5;NW +8187;53844;Troisdorf;5382;Rhein-Sieg-Kreis;5;NW +8188;53859;Niederkassel;5382;Rhein-Sieg-Kreis;5;NW +8189;53879;Euskirchen;5366;Euskirchen;5;NW +8190;53881;Euskirchen;5366;Euskirchen;5;NW +8191;53894;Mechernich;5366;Euskirchen;5;NW +8192;53902;Bad Muenstereifel;5366;Euskirchen;5;NW +8193;53909;Zuelpich;5366;Euskirchen;5;NW +8194;53913;Swisttal;5382;Rhein-Sieg-Kreis;5;NW +8195;53919;Weilerswist;5366;Euskirchen;5;NW +8196;53925;Kall;5366;Euskirchen;5;NW +8197;53937;Schleiden;5366;Euskirchen;5;NW +8198;53940;Hellenthal;5366;Euskirchen;5;NW +8199;53945;Blankenheim;5366;Euskirchen;5;NW +8200;53947;Nettersheim;5366;Euskirchen;5;NW +8201;53949;Dahlem;5366;Euskirchen;5;NW +8202;54290;Trier;7211;Trier, Stadt;7;RP +8203;54292;Trier;7211;Trier, Stadt;7;RP +8204;54293;Trier;7211;Trier, Stadt;7;RP +8205;54294;Trier;7211;Trier, Stadt;7;RP +8206;54295;Trier;7211;Trier, Stadt;7;RP +8207;54296;Trier;7211;Trier, Stadt;7;RP +8208;54298;Welschbillig;7235;Trier-Saarburg;7;RP +8209;54298;Orenhofen;7232;Bitburg-Pruem;7;RP +8210;54298;Greimerath;7235;Trier-Saarburg;7;RP +8211;54298;Igel;7235;Trier-Saarburg;7;RP +8212;54298;Aach;7235;Trier-Saarburg;7;RP +8213;54298;Eisenach;7232;Bitburg-Pruem;7;RP +8214;54298;Gilzem;7232;Bitburg-Pruem;7;RP +8215;54306;Kordel;7235;Trier-Saarburg;7;RP +8216;54308;Langsur;7235;Trier-Saarburg;7;RP +8217;54309;Newel;7235;Trier-Saarburg;7;RP +8218;54310;Menningen;7232;Bitburg-Pruem;7;RP +8219;54310;Minden;7232;Bitburg-Pruem;7;RP +8220;54310;Ralingen an der Sauer;7235;Trier-Saarburg;7;RP +8221;54311;Trierweiler;7235;Trier-Saarburg;7;RP +8222;54313;Zemmer;7235;Trier-Saarburg;7;RP +8223;54314;Baldringen;7235;Trier-Saarburg;7;RP +8224;54314;Zerf;7235;Trier-Saarburg;7;RP +8225;54314;Hentern;7235;Trier-Saarburg;7;RP +8226;54314;Vierherrenborn;7235;Trier-Saarburg;7;RP +8227;54314;Schoemerich;7235;Trier-Saarburg;7;RP +8228;54314;Paschel;7235;Trier-Saarburg;7;RP +8229;54316;Bonerath;7235;Trier-Saarburg;7;RP +8230;54316;Hockweiler;7235;Trier-Saarburg;7;RP +8231;54316;Franzenheim;7235;Trier-Saarburg;7;RP +8232;54316;Lampaden;7235;Trier-Saarburg;7;RP +8233;54316;Ollmuth;7235;Trier-Saarburg;7;RP +8234;54316;Hinzenburg;7235;Trier-Saarburg;7;RP +8235;54316;Pluwig;7235;Trier-Saarburg;7;RP +8236;54316;Holzerath;7235;Trier-Saarburg;7;RP +8237;54316;Schoendorf;7235;Trier-Saarburg;7;RP +8238;54317;Morscheid;7235;Trier-Saarburg;7;RP +8239;54317;Riveris;7235;Trier-Saarburg;7;RP +8240;54317;Kasel;7235;Trier-Saarburg;7;RP +8241;54317;Gutweiler;7235;Trier-Saarburg;7;RP +8242;54317;Lorscheid;7235;Trier-Saarburg;7;RP +8243;54317;Korlingen;7235;Trier-Saarburg;7;RP +8244;54317;Thomm;7235;Trier-Saarburg;7;RP +8245;54317;Gusterath;7235;Trier-Saarburg;7;RP +8246;54317;Farschweiler;7235;Trier-Saarburg;7;RP +8247;54317;Herl;7235;Trier-Saarburg;7;RP +8248;54317;Osburg;7235;Trier-Saarburg;7;RP +8249;54317;Sommerau;7235;Trier-Saarburg;7;RP +8250;54318;Mertesdorf;7235;Trier-Saarburg;7;RP +8251;54320;Waldrach;7235;Trier-Saarburg;7;RP +8252;54329;Konz;7235;Trier-Saarburg;7;RP +8253;54331;Oberbillig;7235;Trier-Saarburg;7;RP +8254;54331;Pellingen;7235;Trier-Saarburg;7;RP +8255;54332;Wasserliesch;7235;Trier-Saarburg;7;RP +8256;54338;Schweich;7235;Trier-Saarburg;7;RP +8257;54338;Longen;7235;Trier-Saarburg;7;RP +8258;54340;Ensch;7235;Trier-Saarburg;7;RP +8259;54340;Riol;7235;Trier-Saarburg;7;RP +8260;54340;Leiwen;7235;Trier-Saarburg;7;RP +8261;54340;Kluesserath;7235;Trier-Saarburg;7;RP +8262;54340;Longuich;7235;Trier-Saarburg;7;RP +8263;54340;Schleich;7235;Trier-Saarburg;7;RP +8264;54340;Thoernich;7235;Trier-Saarburg;7;RP +8265;54340;Koewerich;7235;Trier-Saarburg;7;RP +8266;54340;Bekond;7235;Trier-Saarburg;7;RP +8267;54340;Naurath (Eifel);7235;Trier-Saarburg;7;RP +8268;54340;Poelich;7235;Trier-Saarburg;7;RP +8269;54340;Detzem;7235;Trier-Saarburg;7;RP +8270;54341;Fell;7235;Trier-Saarburg;7;RP +8271;54343;Foehren;7235;Trier-Saarburg;7;RP +8272;54344;Kenn;7235;Trier-Saarburg;7;RP +8273;54346;Mehring;7235;Trier-Saarburg;7;RP +8274;54347;Neumagen-Dhron;7231;Bernkastel-Wittlich;7;RP +8275;54349;Trittenheim;7231;Bernkastel-Wittlich;7;RP +8276;54411;Hermeskeil;7235;Trier-Saarburg;7;RP +8277;54411;Deuselbach;7231;Bernkastel-Wittlich;7;RP +8278;54411;Rorodt;7231;Bernkastel-Wittlich;7;RP +8279;54413;Rascheid;7235;Trier-Saarburg;7;RP +8280;54413;Gusenburg;7235;Trier-Saarburg;7;RP +8281;54413;Geisfeld;7235;Trier-Saarburg;7;RP +8282;54413;Damflos;7235;Trier-Saarburg;7;RP +8283;54413;Beuren (Hochwald);7235;Trier-Saarburg;7;RP +8284;54413;Bescheid;7235;Trier-Saarburg;7;RP +8285;54413;Grimburg;7235;Trier-Saarburg;7;RP +8286;54421;Hinzert-Poelert;7235;Trier-Saarburg;7;RP +8287;54421;Reinsfeld;7235;Trier-Saarburg;7;RP +8288;54422;Neuhuetten;7235;Trier-Saarburg;7;RP +8289;54422;Boerfink;7134;Birkenfeld;7;RP +8290;54422;Zuesch;7235;Trier-Saarburg;7;RP +8291;54424;Etgert;7231;Bernkastel-Wittlich;7;RP +8292;54424;Thalfang;7231;Bernkastel-Wittlich;7;RP +8293;54424;Burtscheid;7231;Bernkastel-Wittlich;7;RP +8294;54424;Gielert;7231;Bernkastel-Wittlich;7;RP +8295;54424;Lueckenburg;7231;Bernkastel-Wittlich;7;RP +8296;54426;Breit;7231;Bernkastel-Wittlich;7;RP +8297;54426;Berglicht;7231;Bernkastel-Wittlich;7;RP +8298;54426;Buedlich;7231;Bernkastel-Wittlich;7;RP +8299;54426;Hilscheid;7231;Bernkastel-Wittlich;7;RP +8300;54426;Merschbach;7231;Bernkastel-Wittlich;7;RP +8301;54426;Neunkirchen;7231;Bernkastel-Wittlich;7;RP +8302;54426;Naurath;7235;Trier-Saarburg;7;RP +8303;54426;Heidenburg;7231;Bernkastel-Wittlich;7;RP +8304;54426;Dhronecken;7231;Bernkastel-Wittlich;7;RP +8305;54426;Talling;7231;Bernkastel-Wittlich;7;RP +8306;54426;Immert;7231;Bernkastel-Wittlich;7;RP +8307;54426;Malborn;7231;Bernkastel-Wittlich;7;RP +8308;54426;Graefendhron;7231;Bernkastel-Wittlich;7;RP +8309;54426;Schoenberg;7231;Bernkastel-Wittlich;7;RP +8310;54427;Kell am See;7235;Trier-Saarburg;7;RP +8311;54429;Waldweiler;7235;Trier-Saarburg;7;RP +8312;54429;Schillingen;7235;Trier-Saarburg;7;RP +8313;54429;Heddert;7235;Trier-Saarburg;7;RP +8314;54429;Mandern;7235;Trier-Saarburg;7;RP +8315;54439;Saarburg;7235;Trier-Saarburg;7;RP +8316;54439;Merzkirchen;7235;Trier-Saarburg;7;RP +8317;54439;Fisch;7235;Trier-Saarburg;7;RP +8318;54439;Palzem;7235;Trier-Saarburg;7;RP +8319;54441;Trassem;7235;Trier-Saarburg;7;RP +8320;54441;Schoden;7235;Trier-Saarburg;7;RP +8321;54441;Kastel-Staadt;7235;Trier-Saarburg;7;RP +8322;54441;Wawern;7235;Trier-Saarburg;7;RP +8323;54441;Mannebach;7235;Trier-Saarburg;7;RP +8324;54441;Wellen;7235;Trier-Saarburg;7;RP +8325;54441;Kanzem;7235;Trier-Saarburg;7;RP +8326;54441;Ayl;7235;Trier-Saarburg;7;RP +8327;54441;Kirf;7235;Trier-Saarburg;7;RP +8328;54441;Taben-Rodt;7235;Trier-Saarburg;7;RP +8329;54441;Temmels;7235;Trier-Saarburg;7;RP +8330;54441;Ockfen;7235;Trier-Saarburg;7;RP +8331;54450;Freudenburg;7235;Trier-Saarburg;7;RP +8332;54451;Irsch;7235;Trier-Saarburg;7;RP +8333;54453;Nittel;7235;Trier-Saarburg;7;RP +8334;54455;Serrig;7235;Trier-Saarburg;7;RP +8335;54456;Onsdorf;7235;Trier-Saarburg;7;RP +8336;54456;Tawern;7235;Trier-Saarburg;7;RP +8337;54457;Wincheringen;7235;Trier-Saarburg;7;RP +8338;54459;Wiltingen;7235;Trier-Saarburg;7;RP +8339;54470;Lieser;7231;Bernkastel-Wittlich;7;RP +8340;54470;Bernkastel-Kues;7231;Bernkastel-Wittlich;7;RP +8341;54470;Graach;7231;Bernkastel-Wittlich;7;RP +8342;54472;Kommen;7231;Bernkastel-Wittlich;7;RP +8343;54472;Hochscheid;7231;Bernkastel-Wittlich;7;RP +8344;54472;Longkamp;7231;Bernkastel-Wittlich;7;RP +8345;54472;Veldenz;7231;Bernkastel-Wittlich;7;RP +8346;54472;Brauneberg;7231;Bernkastel-Wittlich;7;RP +8347;54472;Burgen;7231;Bernkastel-Wittlich;7;RP +8348;54472;Gornhausen;7231;Bernkastel-Wittlich;7;RP +8349;54472;Monzelfeld;7231;Bernkastel-Wittlich;7;RP +8350;54483;Kleinich;7231;Bernkastel-Wittlich;7;RP +8351;54484;Maring-Noviand;7231;Bernkastel-Wittlich;7;RP +8352;54486;Muelheim;7231;Bernkastel-Wittlich;7;RP +8353;54487;Wintrich;7231;Bernkastel-Wittlich;7;RP +8354;54492;Loesnich;7231;Bernkastel-Wittlich;7;RP +8355;54492;Erden;7231;Bernkastel-Wittlich;7;RP +8356;54492;Zeltingen-Rachtig;7231;Bernkastel-Wittlich;7;RP +8357;54497;Horath;7231;Bernkastel-Wittlich;7;RP +8358;54497;Morbach;7231;Bernkastel-Wittlich;7;RP +8359;54498;Piesport;7231;Bernkastel-Wittlich;7;RP +8360;54516;Wittlich;7231;Bernkastel-Wittlich;7;RP +8361;54516;Flussbach;7231;Bernkastel-Wittlich;7;RP +8362;54518;Binsfeld;7231;Bernkastel-Wittlich;7;RP +8363;54518;Rivenich;7231;Bernkastel-Wittlich;7;RP +8364;54518;Arenrath;7231;Bernkastel-Wittlich;7;RP +8365;54518;Plein;7231;Bernkastel-Wittlich;7;RP +8366;54518;Bergweiler;7231;Bernkastel-Wittlich;7;RP +8367;54518;Heckenmuenster;7231;Bernkastel-Wittlich;7;RP +8368;54518;Esch;7231;Bernkastel-Wittlich;7;RP +8369;54518;Sehlem;7231;Bernkastel-Wittlich;7;RP +8370;54518;Platten;7231;Bernkastel-Wittlich;7;RP +8371;54518;Bruch;7231;Bernkastel-Wittlich;7;RP +8372;54518;Hupperath;7231;Bernkastel-Wittlich;7;RP +8373;54518;Altrich;7231;Bernkastel-Wittlich;7;RP +8374;54518;Minheim;7231;Bernkastel-Wittlich;7;RP +8375;54518;Osann-Monzel;7231;Bernkastel-Wittlich;7;RP +8376;54518;Minderlittgen;7231;Bernkastel-Wittlich;7;RP +8377;54518;Dodenburg;7231;Bernkastel-Wittlich;7;RP +8378;54518;Gladbach;7231;Bernkastel-Wittlich;7;RP +8379;54518;Kesten;7231;Bernkastel-Wittlich;7;RP +8380;54518;Dreis;7231;Bernkastel-Wittlich;7;RP +8381;54518;Heidweiler;7231;Bernkastel-Wittlich;7;RP +8382;54518;Niersbach;7231;Bernkastel-Wittlich;7;RP +8383;54523;Dierscheid;7231;Bernkastel-Wittlich;7;RP +8384;54523;Hetzerath;7231;Bernkastel-Wittlich;7;RP +8385;54524;Klausen;7231;Bernkastel-Wittlich;7;RP +8386;54526;Landscheid;7231;Bernkastel-Wittlich;7;RP +8387;54528;Salmtal;7231;Bernkastel-Wittlich;7;RP +8388;54529;Spangdahlem;7232;Bitburg-Pruem;7;RP +8389;54531;Eckfeld;7231;Bernkastel-Wittlich;7;RP +8390;54531;Meerfeld;7231;Bernkastel-Wittlich;7;RP +8391;54531;Pantenburg;7231;Bernkastel-Wittlich;7;RP +8392;54531;Manderscheid;7231;Bernkastel-Wittlich;7;RP +8393;54531;Wallscheid;7231;Bernkastel-Wittlich;7;RP +8394;54533;Willwerscheid;7231;Bernkastel-Wittlich;7;RP +8395;54533;Niederscheidweiler;7231;Bernkastel-Wittlich;7;RP +8396;54533;Oberoefflingen;7231;Bernkastel-Wittlich;7;RP +8397;54533;Hasborn;7231;Bernkastel-Wittlich;7;RP +8398;54533;Schwarzenborn;7231;Bernkastel-Wittlich;7;RP +8399;54533;Niederoefflingen;7231;Bernkastel-Wittlich;7;RP +8400;54533;Bettenfeld;7231;Bernkastel-Wittlich;7;RP +8401;54533;Gransdorf;7232;Bitburg-Pruem;7;RP +8402;54533;Laufeld;7231;Bernkastel-Wittlich;7;RP +8403;54533;Dierfeld;7231;Bernkastel-Wittlich;7;RP +8404;54533;Eisenschmitt;7231;Bernkastel-Wittlich;7;RP +8405;54533;Oberscheidweiler;7231;Bernkastel-Wittlich;7;RP +8406;54533;Greimerath;7231;Bernkastel-Wittlich;7;RP +8407;54533;Oberkail;7232;Bitburg-Pruem;7;RP +8408;54533;Gipperath;7231;Bernkastel-Wittlich;7;RP +8409;54534;Musweiler;7231;Bernkastel-Wittlich;7;RP +8410;54534;Grosslittgen;7231;Bernkastel-Wittlich;7;RP +8411;54534;Karl;7231;Bernkastel-Wittlich;7;RP +8412;54534;Schladt;7231;Bernkastel-Wittlich;7;RP +8413;54536;Kroev;7231;Bernkastel-Wittlich;7;RP +8414;54538;Hontheim;7231;Bernkastel-Wittlich;7;RP +8415;54538;Diefenbach;7231;Bernkastel-Wittlich;7;RP +8416;54538;Kinderbeuern;7231;Bernkastel-Wittlich;7;RP +8417;54538;Bengel;7231;Bernkastel-Wittlich;7;RP +8418;54538;Kinheim;7231;Bernkastel-Wittlich;7;RP +8419;54538;Bausendorf;7231;Bernkastel-Wittlich;7;RP +8420;54539;rzig;7231;Bernkastel-Wittlich;7;RP +8421;54550;Daun;7233;Daun;7;RP +8422;54552;Dreis-Brueck;7233;Daun;7;RP +8423;54552;Darscheid;7233;Daun;7;RP +8424;54552;Katzwinkel;7233;Daun;7;RP +8425;54552;dersdorf;7233;Daun;7;RP +8426;54552;Utzerath;7233;Daun;7;RP +8427;54552;Mehren;7233;Daun;7;RP +8428;54552;Demerath;7233;Daun;7;RP +8429;54552;Ellscheid;7233;Daun;7;RP +8430;54552;Strotzbuesch;7233;Daun;7;RP +8431;54552;Beinhausen;7233;Daun;7;RP +8432;54552;Steiningen;7233;Daun;7;RP +8433;54552;Sarmersbach;7233;Daun;7;RP +8434;54552;Hoerscheid;7233;Daun;7;RP +8435;54552;Hoerschhausen;7233;Daun;7;RP +8436;54552;Kradenbach;7233;Daun;7;RP +8437;54552;Neichen;7233;Daun;7;RP +8438;54552;Brockscheid;7233;Daun;7;RP +8439;54552;Gefell;7233;Daun;7;RP +8440;54552;Udler;7233;Daun;7;RP +8441;54552;Schalkenmehren;7233;Daun;7;RP +8442;54552;Steineberg;7233;Daun;7;RP +8443;54552;Schoenbach;7233;Daun;7;RP +8444;54552;Boxberg;7233;Daun;7;RP +8445;54552;Immerath;7233;Daun;7;RP +8446;54552;Nerdlen;7233;Daun;7;RP +8447;54552;Dockweiler;7233;Daun;7;RP +8448;54558;Gillenfeld;7233;Daun;7;RP +8449;54558;Mueckeln;7233;Daun;7;RP +8450;54558;Winkel;7233;Daun;7;RP +8451;54558;Strohn;7233;Daun;7;RP +8452;54558;Saxler;7233;Daun;7;RP +8453;54568;Gerolstein;7233;Daun;7;RP +8454;54570;Niederstadtfeld;7233;Daun;7;RP +8455;54570;Neroth;7233;Daun;7;RP +8456;54570;Hohenfels-Essingen;7233;Daun;7;RP +8457;54570;Bleckhausen;7233;Daun;7;RP +8458;54570;Kirchweiler;7233;Daun;7;RP +8459;54570;Kalenborn-Scheuern;7233;Daun;7;RP +8460;54570;BEgen;7233;Daun;7;RP +8461;54570;Rockeskyll;7233;Daun;7;RP +8462;54570;Wallenborn;7233;Daun;7;RP +8463;54570;Muerlenbach;7233;Daun;7;RP +8464;54570;Pelm;7233;Daun;7;RP +8465;54570;Salm;7233;Daun;7;RP +8466;54570;Hinterweiler;7233;Daun;7;RP +8467;54570;Densborn;7233;Daun;7;RP +8468;54570;Weidenbach;7233;Daun;7;RP +8469;54570;Betteldorf;7233;Daun;7;RP +8470;54570;Deudesfeld;7233;Daun;7;RP +8471;54570;Meisburg;7233;Daun;7;RP +8472;54570;Schutz;7233;Daun;7;RP +8473;54570;Oberstadtfeld;7233;Daun;7;RP +8474;54574;Kopp;7233;Daun;7;RP +8475;54574;Birresborn;7233;Daun;7;RP +8476;54576;Hillesheim;7233;Daun;7;RP +8477;54576;Dohm-Lammersdorf;7233;Daun;7;RP +8478;54578;Oberbettingen;7233;Daun;7;RP +8479;54578;Berndorf;7233;Daun;7;RP +8480;54578;Walsdorf;7233;Daun;7;RP +8481;54578;Basberg;7233;Daun;7;RP +8482;54578;Nohn;7233;Daun;7;RP +8483;54578;Wiesbaum;7233;Daun;7;RP +8484;54578;Kerpen;7233;Daun;7;RP +8485;54578;Oberehe-Stroheich;7233;Daun;7;RP +8486;54579;xheim;7233;Daun;7;RP +8487;54584;Juenkerath;7233;Daun;7;RP +8488;54584;Feusdorf;7233;Daun;7;RP +8489;54584;Goennersdorf;7233;Daun;7;RP +8490;54585;Esch;7233;Daun;7;RP +8491;54586;Schueller;7233;Daun;7;RP +8492;54587;Lissendorf;7233;Daun;7;RP +8493;54587;Birgel;7233;Daun;7;RP +8494;54589;Kerschenbach;7233;Daun;7;RP +8495;54589;Stadtkyll;7233;Daun;7;RP +8496;54595;Watzerath;7232;Bitburg-Pruem;7;RP +8497;54595;Pruem;7232;Bitburg-Pruem;7;RP +8498;54595;Weinsheim;7232;Bitburg-Pruem;7;RP +8499;54595;Pittenbach;7232;Bitburg-Pruem;7;RP +8500;54595;Orlenbach;7232;Bitburg-Pruem;7;RP +8501;54595;Gondenbrett;7232;Bitburg-Pruem;7;RP +8502;54597;Burbach;7232;Bitburg-Pruem;7;RP +8503;54597;Wallersheim;7232;Bitburg-Pruem;7;RP +8504;54597;Kleinlangenfeld;7232;Bitburg-Pruem;7;RP +8505;54597;Olzheim;7232;Bitburg-Pruem;7;RP +8506;54597;Steffeln;7233;Daun;7;RP +8507;54597;Neuheilenbach;7232;Bitburg-Pruem;7;RP +8508;54597;Habscheid;7232;Bitburg-Pruem;7;RP +8509;54597;Kinzenburg;7232;Bitburg-Pruem;7;RP +8510;54597;Euscheid;7232;Bitburg-Pruem;7;RP +8511;54597;Masthorn;7232;Bitburg-Pruem;7;RP +8512;54597;Duppach;7233;Daun;7;RP +8513;54597;Rommersheim;7232;Bitburg-Pruem;7;RP +8514;54597;Pronsfeld;7232;Bitburg-Pruem;7;RP +8515;54597;Reuth;7233;Daun;7;RP +8516;54597;Balesfeld;7232;Bitburg-Pruem;7;RP +8517;54597;Lierfeld;7232;Bitburg-Pruem;7;RP +8518;54597;Merlscheid;7232;Bitburg-Pruem;7;RP +8519;54597;Strickscheid;7232;Bitburg-Pruem;7;RP +8520;54597;Hersdorf;7232;Bitburg-Pruem;7;RP +8521;54597;Neuendorf;7232;Bitburg-Pruem;7;RP +8522;54597;Fleringen;7232;Bitburg-Pruem;7;RP +8523;54597;Roth;7232;Bitburg-Pruem;7;RP +8524;54597;Pluetscheid;7232;Bitburg-Pruem;7;RP +8525;54597;Lascheid;7232;Bitburg-Pruem;7;RP +8526;54597;Luenebach;7232;Bitburg-Pruem;7;RP +8527;54597;Auw bei Pruem;7232;Bitburg-Pruem;7;RP +8528;54597;Seiwerath;7232;Bitburg-Pruem;7;RP +8529;54597;Schwirzheim;7232;Bitburg-Pruem;7;RP +8530;54597;Feuerscheid;7232;Bitburg-Pruem;7;RP +8531;54597;Matzerath;7232;Bitburg-Pruem;7;RP +8532;54597;Ormont;7233;Daun;7;RP +8533;54608;Bleialf;7232;Bitburg-Pruem;7;RP +8534;54608;Oberlascheid;7232;Bitburg-Pruem;7;RP +8535;54608;Sellerich;7232;Bitburg-Pruem;7;RP +8536;54608;Winterscheid;7232;Bitburg-Pruem;7;RP +8537;54608;Buchet;7232;Bitburg-Pruem;7;RP +8538;54608;Muetzenich;7232;Bitburg-Pruem;7;RP +8539;54608;Brandscheid;7232;Bitburg-Pruem;7;RP +8540;54608;Grosslangenfeld;7232;Bitburg-Pruem;7;RP +8541;54610;Buedesheim;7232;Bitburg-Pruem;7;RP +8542;54611;Scheid;7233;Daun;7;RP +8543;54611;Hallschlag;7233;Daun;7;RP +8544;54612;Wawern;7232;Bitburg-Pruem;7;RP +8545;54612;Nimshuscheid;7232;Bitburg-Pruem;7;RP +8546;54612;Lasel;7232;Bitburg-Pruem;7;RP +8547;54614;Niederlauch;7232;Bitburg-Pruem;7;RP +8548;54614;Nimsreuland;7232;Bitburg-Pruem;7;RP +8549;54614;Oberlauch;7232;Bitburg-Pruem;7;RP +8550;54614;Schoenecken;7232;Bitburg-Pruem;7;RP +8551;54614;Heisdorf;7232;Bitburg-Pruem;7;RP +8552;54614;Dingdorf;7232;Bitburg-Pruem;7;RP +8553;54614;Giesdorf;7232;Bitburg-Pruem;7;RP +8554;54614;Winringen;7232;Bitburg-Pruem;7;RP +8555;54616;Winterspelt;7232;Bitburg-Pruem;7;RP +8556;54617;Sevenig (Our);7232;Bitburg-Pruem;7;RP +8557;54617;Harspelt;7232;Bitburg-Pruem;7;RP +8558;54617;Luetzkampen;7232;Bitburg-Pruem;7;RP +8559;54619;Heckhuscheid;7232;Bitburg-Pruem;7;RP +8560;54619;Herzfeld;7232;Bitburg-Pruem;7;RP +8561;54619;Kesfeld;7232;Bitburg-Pruem;7;RP +8562;54619;Eschfeld;7232;Bitburg-Pruem;7;RP +8563;54619;Roscheid;7232;Bitburg-Pruem;7;RP +8564;54619;Sengerich;7232;Bitburg-Pruem;7;RP +8565;54619;ttfeld;7232;Bitburg-Pruem;7;RP +8566;54619;Leidenborn;7232;Bitburg-Pruem;7;RP +8567;54619;Reiff;7232;Bitburg-Pruem;7;RP +8568;54619;Lichtenborn;7232;Bitburg-Pruem;7;RP +8569;54619;Grosskampenberg;7232;Bitburg-Pruem;7;RP +8570;54634;Bitburg;7232;Bitburg-Pruem;7;RP +8571;54634;Niederstedem;7232;Bitburg-Pruem;7;RP +8572;54634;Oberstedem;7232;Bitburg-Pruem;7;RP +8573;54634;Metterich;7232;Bitburg-Pruem;7;RP +8574;54634;Birtlingen;7232;Bitburg-Pruem;7;RP +8575;54636;Schleid;7232;Bitburg-Pruem;7;RP +8576;54636;Meckel;7232;Bitburg-Pruem;7;RP +8577;54636;Ehlenz;7232;Bitburg-Pruem;7;RP +8578;54636;Idesheim;7232;Bitburg-Pruem;7;RP +8579;54636;Baustert;7232;Bitburg-Pruem;7;RP +8580;54636;Esslingen;7232;Bitburg-Pruem;7;RP +8581;54636;Suelm;7232;Bitburg-Pruem;7;RP +8582;54636;Bickendorf;7232;Bitburg-Pruem;7;RP +8583;54636;Nattenheim;7232;Bitburg-Pruem;7;RP +8584;54636;Dockendorf;7232;Bitburg-Pruem;7;RP +8585;54636;Altscheid;7232;Bitburg-Pruem;7;RP +8586;54636;Roehl;7232;Bitburg-Pruem;7;RP +8587;54636;Wolsfeld;7232;Bitburg-Pruem;7;RP +8588;54636;Idenheim;7232;Bitburg-Pruem;7;RP +8589;54636;Seffern;7232;Bitburg-Pruem;7;RP +8590;54636;Oberweis;7232;Bitburg-Pruem;7;RP +8591;54636;Dahlem;7232;Bitburg-Pruem;7;RP +8592;54636;Brecht;7232;Bitburg-Pruem;7;RP +8593;54636;Wiersdorf;7232;Bitburg-Pruem;7;RP +8594;54636;Echtershausen;7232;Bitburg-Pruem;7;RP +8595;54636;Liessem;7232;Bitburg-Pruem;7;RP +8596;54636;Wissmannsdorf;7232;Bitburg-Pruem;7;RP +8597;54636;Biersdorf;7232;Bitburg-Pruem;7;RP +8598;54636;Feilsdorf;7232;Bitburg-Pruem;7;RP +8599;54636;Huetterscheid;7232;Bitburg-Pruem;7;RP +8600;54636;Trimport;7232;Bitburg-Pruem;7;RP +8601;54636;Niederweiler;7232;Bitburg-Pruem;7;RP +8602;54636;Fliessem;7232;Bitburg-Pruem;7;RP +8603;54636;Rittersdorf;7232;Bitburg-Pruem;7;RP +8604;54636;Messerich;7232;Bitburg-Pruem;7;RP +8605;54636;Heilenbach;7232;Bitburg-Pruem;7;RP +8606;54636;Muelbach;7232;Bitburg-Pruem;7;RP +8607;54636;Ingendorf;7232;Bitburg-Pruem;7;RP +8608;54636;Weidingen;7232;Bitburg-Pruem;7;RP +8609;54636;Hamm;7232;Bitburg-Pruem;7;RP +8610;54636;Oberweiler;7232;Bitburg-Pruem;7;RP +8611;54636;Huettingen an der Kyll;7232;Bitburg-Pruem;7;RP +8612;54636;Sefferweich;7232;Bitburg-Pruem;7;RP +8613;54636;Scharfbillig;7232;Bitburg-Pruem;7;RP +8614;54646;Hisel;7232;Bitburg-Pruem;7;RP +8615;54646;Wettlingen;7232;Bitburg-Pruem;7;RP +8616;54646;Enzen;7232;Bitburg-Pruem;7;RP +8617;54646;Burg;7232;Bitburg-Pruem;7;RP +8618;54646;Halsdorf;7232;Bitburg-Pruem;7;RP +8619;54646;Bettingen;7232;Bitburg-Pruem;7;RP +8620;54646;Brimingen;7232;Bitburg-Pruem;7;RP +8621;54646;Olsdorf;7232;Bitburg-Pruem;7;RP +8622;54646;Stockem;7232;Bitburg-Pruem;7;RP +8623;54646;Niehl;7232;Bitburg-Pruem;7;RP +8624;54647;Pickliessem;7232;Bitburg-Pruem;7;RP +8625;54647;Dudeldorf;7232;Bitburg-Pruem;7;RP +8626;54647;Gondorf;7232;Bitburg-Pruem;7;RP +8627;54649;Eilscheid;7232;Bitburg-Pruem;7;RP +8628;54649;Dackscheid;7232;Bitburg-Pruem;7;RP +8629;54649;Niederpierscheid;7232;Bitburg-Pruem;7;RP +8630;54649;Hargarten;7232;Bitburg-Pruem;7;RP +8631;54649;Manderscheid;7232;Bitburg-Pruem;7;RP +8632;54649;Oberpierscheid;7232;Bitburg-Pruem;7;RP +8633;54649;Lambertsberg;7232;Bitburg-Pruem;7;RP +8634;54649;Mauel;7232;Bitburg-Pruem;7;RP +8635;54649;Lauperath;7232;Bitburg-Pruem;7;RP +8636;54649;Waxweiler;7232;Bitburg-Pruem;7;RP +8637;54649;Pintesfeld;7232;Bitburg-Pruem;7;RP +8638;54655;Seinsfeld;7232;Bitburg-Pruem;7;RP +8639;54655;Kyllburgweiler;7232;Bitburg-Pruem;7;RP +8640;54655;Malberg;7232;Bitburg-Pruem;7;RP +8641;54655;Sankt Thomas;7232;Bitburg-Pruem;7;RP +8642;54655;Usch;7232;Bitburg-Pruem;7;RP +8643;54655;Orsfeld;7232;Bitburg-Pruem;7;RP +8644;54655;Zendscheid;7232;Bitburg-Pruem;7;RP +8645;54655;Kyllburg;7232;Bitburg-Pruem;7;RP +8646;54655;Steinborn;7232;Bitburg-Pruem;7;RP +8647;54655;Etteldorf;7232;Bitburg-Pruem;7;RP +8648;54655;Malbergweich;7232;Bitburg-Pruem;7;RP +8649;54655;Wilsecker;7232;Bitburg-Pruem;7;RP +8650;54657;Gindorf;7232;Bitburg-Pruem;7;RP +8651;54657;Badem;7232;Bitburg-Pruem;7;RP +8652;54657;Neidenbach;7232;Bitburg-Pruem;7;RP +8653;54662;Philippsheim;7232;Bitburg-Pruem;7;RP +8654;54662;Speicher;7232;Bitburg-Pruem;7;RP +8655;54662;Beilingen;7232;Bitburg-Pruem;7;RP +8656;54662;Herforst;7232;Bitburg-Pruem;7;RP +8657;54664;Preist;7232;Bitburg-Pruem;7;RP +8658;54664;Hosten;7232;Bitburg-Pruem;7;RP +8659;54664;Auw an der Kyll;7232;Bitburg-Pruem;7;RP +8660;54666;Irrel;7232;Bitburg-Pruem;7;RP +8661;54668;Alsdorf;7232;Bitburg-Pruem;7;RP +8662;54668;Ferschweiler;7232;Bitburg-Pruem;7;RP +8663;54668;Echternacherbrueck;7232;Bitburg-Pruem;7;RP +8664;54668;Kaschenbach;7232;Bitburg-Pruem;7;RP +8665;54668;Holsthum;7232;Bitburg-Pruem;7;RP +8666;54668;Ernzen;7232;Bitburg-Pruem;7;RP +8667;54668;Peffingen;7232;Bitburg-Pruem;7;RP +8668;54668;Pruemzurlay;7232;Bitburg-Pruem;7;RP +8669;54668;Schankweiler;7232;Bitburg-Pruem;7;RP +8670;54668;Niederweis;7232;Bitburg-Pruem;7;RP +8671;54669;Bollendorf;7232;Bitburg-Pruem;7;RP +8672;54673;Plascheid;7232;Bitburg-Pruem;7;RP +8673;54673;Berkoth;7232;Bitburg-Pruem;7;RP +8674;54673;Keppeshausen;7232;Bitburg-Pruem;7;RP +8675;54673;Zweifelscheid;7232;Bitburg-Pruem;7;RP +8676;54673;Sevenig;7232;Bitburg-Pruem;7;RP +8677;54673;Neuerburg;7232;Bitburg-Pruem;7;RP +8678;54673;Bauler;7232;Bitburg-Pruem;7;RP +8679;54673;Scheuern;7232;Bitburg-Pruem;7;RP +8680;54673;Waldhof-Falkenstein;7232;Bitburg-Pruem;7;RP +8681;54673;Rodershausen;7232;Bitburg-Pruem;7;RP +8682;54673;Karlshausen;7232;Bitburg-Pruem;7;RP +8683;54673;Heilbach;7232;Bitburg-Pruem;7;RP +8684;54673;Koxhausen;7232;Bitburg-Pruem;7;RP +8685;54673;Huetten;7232;Bitburg-Pruem;7;RP +8686;54673;Emmelbaum;7232;Bitburg-Pruem;7;RP +8687;54673;Herbstmuehle;7232;Bitburg-Pruem;7;RP +8688;54673;Krautscheid;7232;Bitburg-Pruem;7;RP +8689;54673;Leimbach;7232;Bitburg-Pruem;7;RP +8690;54673;Muxerath;7232;Bitburg-Pruem;7;RP +8691;54673;Berscheid;7232;Bitburg-Pruem;7;RP +8692;54673;Gemuend;7232;Bitburg-Pruem;7;RP +8693;54673;Ammeldingen bei Neuerburg;7232;Bitburg-Pruem;7;RP +8694;54673;Scheitenkorb;7232;Bitburg-Pruem;7;RP +8695;54673;Dauwelshausen;7232;Bitburg-Pruem;7;RP +8696;54673;Burscheid;7232;Bitburg-Pruem;7;RP +8697;54673;Nasingen;7232;Bitburg-Pruem;7;RP +8698;54673;Uppershausen;7232;Bitburg-Pruem;7;RP +8699;54675;Fischbach-Oberraden;7232;Bitburg-Pruem;7;RP +8700;54675;Geichlingen;7232;Bitburg-Pruem;7;RP +8701;54675;Roth an der Our;7232;Bitburg-Pruem;7;RP +8702;54675;Obergeckler;7232;Bitburg-Pruem;7;RP +8703;54675;Sinspelt;7232;Bitburg-Pruem;7;RP +8704;54675;Utscheid;7232;Bitburg-Pruem;7;RP +8705;54675;Kruchten;7232;Bitburg-Pruem;7;RP +8706;54675;Wallendorf;7232;Bitburg-Pruem;7;RP +8707;54675;Nusbaum;7232;Bitburg-Pruem;7;RP +8708;54675;Koerperich;7232;Bitburg-Pruem;7;RP +8709;54675;Ammeldingen an der Our;7232;Bitburg-Pruem;7;RP +8710;54675;Mettendorf;7232;Bitburg-Pruem;7;RP +8711;54675;Huettingen;7232;Bitburg-Pruem;7;RP +8712;54675;Niedergeckler;7232;Bitburg-Pruem;7;RP +8713;54675;Lahr;7232;Bitburg-Pruem;7;RP +8714;54675;Gentingen;7232;Bitburg-Pruem;7;RP +8715;54675;Biesdorf;7232;Bitburg-Pruem;7;RP +8716;54675;Hommerdingen;7232;Bitburg-Pruem;7;RP +8717;54675;Niederraden;7232;Bitburg-Pruem;7;RP +8718;54687;Arzfeld;7232;Bitburg-Pruem;7;RP +8719;54689;Affler;7232;Bitburg-Pruem;7;RP +8720;54689;Olmscheid;7232;Bitburg-Pruem;7;RP +8721;54689;Jucken;7232;Bitburg-Pruem;7;RP +8722;54689;bereisenbach;7232;Bitburg-Pruem;7;RP +8723;54689;Dasburg;7232;Bitburg-Pruem;7;RP +8724;54689;Dahnen;7232;Bitburg-Pruem;7;RP +8725;54689;Daleiden;7232;Bitburg-Pruem;7;RP +8726;54689;Reipeldingen;7232;Bitburg-Pruem;7;RP +8727;54689;Preischeid;7232;Bitburg-Pruem;7;RP +8728;54689;Irrhausen;7232;Bitburg-Pruem;7;RP +8729;54689;Kickeshausen;7232;Bitburg-Pruem;7;RP +8730;55116;Mainz;7315;Mainz, Stadt;7;RP +8731;55118;Mainz;7315;Mainz, Stadt;7;RP +8732;55120;Mainz;7315;Mainz, Stadt;7;RP +8733;55122;Mainz;7315;Mainz, Stadt;7;RP +8734;55124;Mainz;7315;Mainz, Stadt;7;RP +8735;55126;Mainz;7315;Mainz, Stadt;7;RP +8736;55127;Mainz;7315;Mainz, Stadt;7;RP +8737;55128;Mainz;7315;Mainz, Stadt;7;RP +8738;55129;Mainz;7315;Mainz, Stadt;7;RP +8739;55130;Mainz;7315;Mainz, Stadt;7;RP +8740;55131;Mainz;7315;Mainz, Stadt;7;RP +8741;55218;Ingelheim am Rhein;7339;Mainz-Bingen;7;RP +8742;55232;Ensheim;7331;Alzey-Worms;7;RP +8743;55232;Alzey;7331;Alzey-Worms;7;RP +8744;55234;Dintesheim;7331;Alzey-Worms;7;RP +8745;55234;Hangen-Weisheim;7331;Alzey-Worms;7;RP +8746;55234;Hochborn;7331;Alzey-Worms;7;RP +8747;55234;Esselborn;7331;Alzey-Worms;7;RP +8748;55234;Bechenheim;7331;Alzey-Worms;7;RP +8749;55234;Gau-Heppenheim;7331;Alzey-Worms;7;RP +8750;55234;Kettenheim;7331;Alzey-Worms;7;RP +8751;55234;Bechtolsheim;7331;Alzey-Worms;7;RP +8752;55234;Eppelsheim;7331;Alzey-Worms;7;RP +8753;55234;Flomborn;7331;Alzey-Worms;7;RP +8754;55234;Erbes-Buedesheim;7331;Alzey-Worms;7;RP +8755;55234;Framersheim;7331;Alzey-Worms;7;RP +8756;55234;Freimersheim;7331;Alzey-Worms;7;RP +8757;55234;Wendelsheim;7331;Alzey-Worms;7;RP +8758;55234;Monzernheim;7331;Alzey-Worms;7;RP +8759;55234;Biebelnheim;7331;Alzey-Worms;7;RP +8760;55234;Wahlheim;7331;Alzey-Worms;7;RP +8761;55234;Albig;7331;Alzey-Worms;7;RP +8762;55234;Bermersheim vor der Hoehe;7331;Alzey-Worms;7;RP +8763;55234;Nieder-Wiesen;7331;Alzey-Worms;7;RP +8764;55234;Ober-Floersheim;7331;Alzey-Worms;7;RP +8765;55234;Offenheim;7331;Alzey-Worms;7;RP +8766;55234;Nack;7331;Alzey-Worms;7;RP +8767;55237;Lonsheim;7331;Alzey-Worms;7;RP +8768;55237;Bornheim;7331;Alzey-Worms;7;RP +8769;55237;Flonheim;7331;Alzey-Worms;7;RP +8770;55239;Gau-Odernheim;7331;Alzey-Worms;7;RP +8771;55257;Budenheim;7339;Mainz-Bingen;7;RP +8772;55262;Heidesheim am Rhein;7339;Mainz-Bingen;7;RP +8773;55263;Wackernheim;7339;Mainz-Bingen;7;RP +8774;55268;Nieder-Olm;7339;Mainz-Bingen;7;RP +8775;55270;Schwabenheim an der Selz;7339;Mainz-Bingen;7;RP +8776;55270;Zornheim;7339;Mainz-Bingen;7;RP +8777;55270;Essenheim;7339;Mainz-Bingen;7;RP +8778;55270;Ober-Olm;7339;Mainz-Bingen;7;RP +8779;55270;Jugenheim;7339;Mainz-Bingen;7;RP +8780;55270;Soergenloch;7339;Mainz-Bingen;7;RP +8781;55270;Engelstadt;7339;Mainz-Bingen;7;RP +8782;55270;Klein-Winternheim;7339;Mainz-Bingen;7;RP +8783;55270;Bubenheim;7339;Mainz-Bingen;7;RP +8784;55271;Stadecken-Elsheim;7339;Mainz-Bingen;7;RP +8785;55276;Oppenheim;7339;Mainz-Bingen;7;RP +8786;55276;Dienheim;7339;Mainz-Bingen;7;RP +8787;55278;Koengernheim;7339;Mainz-Bingen;7;RP +8788;55278;Friesenheim;7339;Mainz-Bingen;7;RP +8789;55278;Weinolsheim;7339;Mainz-Bingen;7;RP +8790;55278;Uelversheim;7339;Mainz-Bingen;7;RP +8791;55278;Undenheim;7339;Mainz-Bingen;7;RP +8792;55278;Dexheim;7339;Mainz-Bingen;7;RP +8793;55278;Selzen;7339;Mainz-Bingen;7;RP +8794;55278;Dolgesheim;7339;Mainz-Bingen;7;RP +8795;55278;Dalheim;7339;Mainz-Bingen;7;RP +8796;55278;Ludwigshoehe;7339;Mainz-Bingen;7;RP +8797;55278;Hahnheim;7339;Mainz-Bingen;7;RP +8798;55278;Eimsheim;7339;Mainz-Bingen;7;RP +8799;55278;Mommenheim;7339;Mainz-Bingen;7;RP +8800;55283;Nierstein;7339;Mainz-Bingen;7;RP +8801;55286;Woerrstadt;7331;Alzey-Worms;7;RP +8802;55286;Sulzheim;7331;Alzey-Worms;7;RP +8803;55288;Gabsheim;7331;Alzey-Worms;7;RP +8804;55288;Partenheim;7331;Alzey-Worms;7;RP +8805;55288;Schornsheim;7331;Alzey-Worms;7;RP +8806;55288;Armsheim;7331;Alzey-Worms;7;RP +8807;55288;Spiesheim;7331;Alzey-Worms;7;RP +8808;55288;Udenheim;7331;Alzey-Worms;7;RP +8809;55291;Saulheim;7331;Alzey-Worms;7;RP +8810;55294;Bodenheim;7339;Mainz-Bingen;7;RP +8811;55296;Harxheim;7339;Mainz-Bingen;7;RP +8812;55296;Loerzweiler;7339;Mainz-Bingen;7;RP +8813;55296;Gau-Bischofsheim;7339;Mainz-Bingen;7;RP +8814;55299;Nackenheim;7339;Mainz-Bingen;7;RP +8815;55411;Bingen am Rhein;7339;Mainz-Bingen;7;RP +8816;55413;Manubach;7339;Mainz-Bingen;7;RP +8817;55413;Niederheimbach;7339;Mainz-Bingen;7;RP +8818;55413;Oberheimbach;7339;Mainz-Bingen;7;RP +8819;55413;Oberdiebach;7339;Mainz-Bingen;7;RP +8820;55413;Weiler;7339;Mainz-Bingen;7;RP +8821;55413;Trechtingshausen;7339;Mainz-Bingen;7;RP +8822;55422;Breitscheid;7339;Mainz-Bingen;7;RP +8823;55422;Bacharach;7339;Mainz-Bingen;7;RP +8824;55424;Muenster-Sarmsheim;7339;Mainz-Bingen;7;RP +8825;55425;Waldalgesheim;7339;Mainz-Bingen;7;RP +8826;55430;Oberwesel;7140;Rhein-Hunsrueck-Kreis;7;RP +8827;55430;Perscheid;7140;Rhein-Hunsrueck-Kreis;7;RP +8828;55430;Urbar;7140;Rhein-Hunsrueck-Kreis;7;RP +8829;55432;Niederburg;7140;Rhein-Hunsrueck-Kreis;7;RP +8830;55432;Damscheid;7140;Rhein-Hunsrueck-Kreis;7;RP +8831;55435;Gau-Algesheim;7339;Mainz-Bingen;7;RP +8832;55437;Ockenheim;7339;Mainz-Bingen;7;RP +8833;55437;Appenheim;7339;Mainz-Bingen;7;RP +8834;55437;Nieder-Hilbersheim;7339;Mainz-Bingen;7;RP +8835;55437;Ober-Hilbersheim;7339;Mainz-Bingen;7;RP +8836;55442;Daxweiler;7133;Bad Kreuznach;7;RP +8837;55442;Roth;7133;Bad Kreuznach;7;RP +8838;55442;Warmsroth;7133;Bad Kreuznach;7;RP +8839;55442;Stromberg;7133;Bad Kreuznach;7;RP +8840;55444;Schoeneberg;7133;Bad Kreuznach;7;RP +8841;55444;Seibersbach;7133;Bad Kreuznach;7;RP +8842;55444;Schweppenhausen;7133;Bad Kreuznach;7;RP +8843;55444;Waldlaubersheim;7133;Bad Kreuznach;7;RP +8844;55444;Eckenroth;7133;Bad Kreuznach;7;RP +8845;55444;Doerrebach;7133;Bad Kreuznach;7;RP +8846;55450;Langenlonsheim;7133;Bad Kreuznach;7;RP +8847;55452;Guldental;7133;Bad Kreuznach;7;RP +8848;55452;Ruemmelsheim/Burg Layen;7133;Bad Kreuznach;7;RP +8849;55452;Windesheim;7133;Bad Kreuznach;7;RP +8850;55452;Hergenfeld;7133;Bad Kreuznach;7;RP +8851;55452;Laubenheim;7133;Bad Kreuznach;7;RP +8852;55452;Dorsheim;7133;Bad Kreuznach;7;RP +8853;55457;Gensingen;7339;Mainz-Bingen;7;RP +8854;55457;Horrweiler;7339;Mainz-Bingen;7;RP +8855;55459;Grolsheim;7339;Mainz-Bingen;7;RP +8856;55459;Aspisheim;7339;Mainz-Bingen;7;RP +8857;55469;Nannhausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8858;55469;Horn;7140;Rhein-Hunsrueck-Kreis;7;RP +8859;55469;Schoenborn;7140;Rhein-Hunsrueck-Kreis;7;RP +8860;55469;Altweidelbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8861;55469;Riegenroth;7140;Rhein-Hunsrueck-Kreis;7;RP +8862;55469;Niederkumbd;7140;Rhein-Hunsrueck-Kreis;7;RP +8863;55469;Oppertshausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8864;55469;Mutterschied;7140;Rhein-Hunsrueck-Kreis;7;RP +8865;55469;Ohlweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +8866;55469;Rayerschied;7140;Rhein-Hunsrueck-Kreis;7;RP +8867;55469;Bergenhausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8868;55469;Simmern;7140;Rhein-Hunsrueck-Kreis;7;RP +8869;55469;Klosterkumbd;7140;Rhein-Hunsrueck-Kreis;7;RP +8870;55469;Belgweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +8871;55469;Holzbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8872;55469;Budenbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8873;55469;Pleizenhausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8874;55471;Ravengiersburg;7140;Rhein-Hunsrueck-Kreis;7;RP +8875;55471;Sargenroth;7140;Rhein-Hunsrueck-Kreis;7;RP +8876;55471;Keidelheim;7140;Rhein-Hunsrueck-Kreis;7;RP +8877;55471;Fronhofen;7140;Rhein-Hunsrueck-Kreis;7;RP +8878;55471;Wueschheim;7140;Rhein-Hunsrueck-Kreis;7;RP +8879;55471;Kuembdchen;7140;Rhein-Hunsrueck-Kreis;7;RP +8880;55471;Biebern;7140;Rhein-Hunsrueck-Kreis;7;RP +8881;55471;Reich;7140;Rhein-Hunsrueck-Kreis;7;RP +8882;55471;Kuelz;7140;Rhein-Hunsrueck-Kreis;7;RP +8883;55471;Tiefenbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8884;55471;Neuerkirch;7140;Rhein-Hunsrueck-Kreis;7;RP +8885;55481;Kirchberg;7140;Rhein-Hunsrueck-Kreis;7;RP +8886;55481;Lindenschied;7140;Rhein-Hunsrueck-Kreis;7;RP +8887;55481;Nieder Kostenz;7140;Rhein-Hunsrueck-Kreis;7;RP +8888;55481;Hecken;7140;Rhein-Hunsrueck-Kreis;7;RP +8889;55481;Roedern;7140;Rhein-Hunsrueck-Kreis;7;RP +8890;55481;Metzenhausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8891;55481;Womrath;7140;Rhein-Hunsrueck-Kreis;7;RP +8892;55481;Ober Kostenz;7140;Rhein-Hunsrueck-Kreis;7;RP +8893;55481;Todenroth;7140;Rhein-Hunsrueck-Kreis;7;RP +8894;55481;Kludenbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8895;55481;Reckershausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8896;55481;Dillendorf;7140;Rhein-Hunsrueck-Kreis;7;RP +8897;55481;Schwarzen;7140;Rhein-Hunsrueck-Kreis;7;RP +8898;55481;Maitzborn;7140;Rhein-Hunsrueck-Kreis;7;RP +8899;55483;Baerenbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8900;55483;Krummenau;7134;Birkenfeld;7;RP +8901;55483;Kappel;7140;Rhein-Hunsrueck-Kreis;7;RP +8902;55483;Heinzenbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8903;55483;Horbruch;7134;Birkenfeld;7;RP +8904;55483;Unzenberg;7140;Rhein-Hunsrueck-Kreis;7;RP +8905;55483;Dickenschied;7140;Rhein-Hunsrueck-Kreis;7;RP +8906;55483;Hirschfeld;7140;Rhein-Hunsrueck-Kreis;7;RP +8907;55483;Schlierschied;7140;Rhein-Hunsrueck-Kreis;7;RP +8908;55483;Lautzenhausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8909;55487;Sohren;7140;Rhein-Hunsrueck-Kreis;7;RP +8910;55487;Dill;7140;Rhein-Hunsrueck-Kreis;7;RP +8911;55487;Sohrschied;7140;Rhein-Hunsrueck-Kreis;7;RP +8912;55487;Laufersweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +8913;55487;Niedersohren;7140;Rhein-Hunsrueck-Kreis;7;RP +8914;55490;Woppenroth;7140;Rhein-Hunsrueck-Kreis;7;RP +8915;55490;Henau;7140;Rhein-Hunsrueck-Kreis;7;RP +8916;55490;Rohrbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8917;55490;Gemuenden;7140;Rhein-Hunsrueck-Kreis;7;RP +8918;55490;Mengerschied;7140;Rhein-Hunsrueck-Kreis;7;RP +8919;55490;Gehlweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +8920;55491;Niederweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +8921;55491;Buechenbeuren;7140;Rhein-Hunsrueck-Kreis;7;RP +8922;55491;Wahlenau;7140;Rhein-Hunsrueck-Kreis;7;RP +8923;55494;Wahlbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8924;55494;Rheinboellen;7140;Rhein-Hunsrueck-Kreis;7;RP +8925;55494;Erbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8926;55494;Dichtelbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8927;55494;Benzweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +8928;55494;Moerschbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8929;55494;Liebshausen;7140;Rhein-Hunsrueck-Kreis;7;RP +8930;55496;Argenthal;7140;Rhein-Hunsrueck-Kreis;7;RP +8931;55497;Ellern;7140;Rhein-Hunsrueck-Kreis;7;RP +8932;55497;Schnorbach;7140;Rhein-Hunsrueck-Kreis;7;RP +8933;55499;Riesweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +8934;55543;Bad Kreuznach;7133;Bad Kreuznach;7;RP +8935;55545;Bad Kreuznach;7133;Bad Kreuznach;7;RP +8936;55546;Tiefenthal;7133;Bad Kreuznach;7;RP +8937;55546;Frei-Laubersheim;7133;Bad Kreuznach;7;RP +8938;55546;Hackenheim;7133;Bad Kreuznach;7;RP +8939;55546;Fuerfeld;7133;Bad Kreuznach;7;RP +8940;55546;Neu-Bamberg;7133;Bad Kreuznach;7;RP +8941;55546;Biebelsheim;7133;Bad Kreuznach;7;RP +8942;55546;Pfaffen-Schwabenheim;7133;Bad Kreuznach;7;RP +8943;55546;Volxheim;7133;Bad Kreuznach;7;RP +8944;55559;Bretzenheim;7133;Bad Kreuznach;7;RP +8945;55566;Kirschroth;7133;Bad Kreuznach;7;RP +8946;55566;Rehbach;7133;Bad Kreuznach;7;RP +8947;55566;Daubach;7133;Bad Kreuznach;7;RP +8948;55566;Ippenschied;7133;Bad Kreuznach;7;RP +8949;55566;Meddersheim;7133;Bad Kreuznach;7;RP +8950;55566;Bad Sobernheim;7133;Bad Kreuznach;7;RP +8951;55568;Abtweiler;7133;Bad Kreuznach;7;RP +8952;55568;Lauschied;7133;Bad Kreuznach;7;RP +8953;55568;Staudernheim;7133;Bad Kreuznach;7;RP +8954;55569;Langenthal;7133;Bad Kreuznach;7;RP +8955;55569;Auen;7133;Bad Kreuznach;7;RP +8956;55569;Nussbaum;7133;Bad Kreuznach;7;RP +8957;55569;Monzingen;7133;Bad Kreuznach;7;RP +8958;55571;Odernheim am Glan;7133;Bad Kreuznach;7;RP +8959;55576;Sprendlingen;7339;Mainz-Bingen;7;RP +8960;55576;Pleitersheim;7133;Bad Kreuznach;7;RP +8961;55576;Badenheim;7339;Mainz-Bingen;7;RP +8962;55576;Welgesheim;7339;Mainz-Bingen;7;RP +8963;55576;Zotzenheim;7339;Mainz-Bingen;7;RP +8964;55578;Wallertheim;7331;Alzey-Worms;7;RP +8965;55578;Wolfsheim;7339;Mainz-Bingen;7;RP +8966;55578;Vendersheim;7331;Alzey-Worms;7;RP +8967;55578;Sankt Johann;7339;Mainz-Bingen;7;RP +8968;55578;Gau-Weinheim;7331;Alzey-Worms;7;RP +8969;55583;Bad Muenster am Stein-Ebernburg;7133;Bad Kreuznach;7;RP +8970;55585;Oberhausen an der Nahe;7133;Bad Kreuznach;7;RP +8971;55585;Hochstaetten;7133;Bad Kreuznach;7;RP +8972;55585;Duchroth;7133;Bad Kreuznach;7;RP +8973;55585;Norheim;7133;Bad Kreuznach;7;RP +8974;55585;Altenbamberg;7133;Bad Kreuznach;7;RP +8975;55585;Niederhausen;7133;Bad Kreuznach;7;RP +8976;55590;Meisenheim;7133;Bad Kreuznach;7;RP +8977;55592;Desloch;7133;Bad Kreuznach;7;RP +8978;55592;Rehborn;7133;Bad Kreuznach;7;RP +8979;55592;Breitenheim;7133;Bad Kreuznach;7;RP +8980;55592;Jeckenbach;7133;Bad Kreuznach;7;RP +8981;55592;Raumbach;7133;Bad Kreuznach;7;RP +8982;55593;Ruedesheim;7133;Bad Kreuznach;7;RP +8983;55595;Hargesheim;7133;Bad Kreuznach;7;RP +8984;55595;Burgsponheim;7133;Bad Kreuznach;7;RP +8985;55595;Winterbach;7133;Bad Kreuznach;7;RP +8986;55595;Spabruecken;7133;Bad Kreuznach;7;RP +8987;55595;Sankt Katharinen;7133;Bad Kreuznach;7;RP +8988;55595;Spall;7133;Bad Kreuznach;7;RP +8989;55595;Wallhausen;7133;Bad Kreuznach;7;RP +8990;55595;Roxheim;7133;Bad Kreuznach;7;RP +8991;55595;Gutenberg;7133;Bad Kreuznach;7;RP +8992;55595;Gebroth;7133;Bad Kreuznach;7;RP +8993;55595;Winterburg;7133;Bad Kreuznach;7;RP +8994;55595;Weinsheim;7133;Bad Kreuznach;7;RP +8995;55595;Sommerloch;7133;Bad Kreuznach;7;RP +8996;55595;Traisen;7133;Bad Kreuznach;7;RP +8997;55595;Bockenau;7133;Bad Kreuznach;7;RP +8998;55595;Muenchwald;7133;Bad Kreuznach;7;RP +8999;55595;Argenschwang;7133;Bad Kreuznach;7;RP +9000;55595;Allenfeld;7133;Bad Kreuznach;7;RP +9001;55595;Boos;7133;Bad Kreuznach;7;RP +9002;55595;Mandel;7133;Bad Kreuznach;7;RP +9003;55595;Hueffelsheim;7133;Bad Kreuznach;7;RP +9004;55595;Sponheim;7133;Bad Kreuznach;7;RP +9005;55595;Dalberg;7133;Bad Kreuznach;7;RP +9006;55595;Braunweiler;7133;Bad Kreuznach;7;RP +9007;55596;Waldboeckelheim;7133;Bad Kreuznach;7;RP +9008;55596;Schlossboeckelheim;7133;Bad Kreuznach;7;RP +9009;55596;Oberstreit;7133;Bad Kreuznach;7;RP +9010;55597;Gumbsheim;7331;Alzey-Worms;7;RP +9011;55597;Woellstein;7331;Alzey-Worms;7;RP +9012;55599;Gau-Bickelheim;7331;Alzey-Worms;7;RP +9013;55599;Stein-Bockenheim;7331;Alzey-Worms;7;RP +9014;55599;Siefersheim;7331;Alzey-Worms;7;RP +9015;55599;Eckelsheim;7331;Alzey-Worms;7;RP +9016;55599;Wonsheim;7331;Alzey-Worms;7;RP +9017;55606;Hahnenbach;7133;Bad Kreuznach;7;RP +9018;55606;Brauweiler;7133;Bad Kreuznach;7;RP +9019;55606;Koenigsau;7133;Bad Kreuznach;7;RP +9020;55606;Meckenbach;7133;Bad Kreuznach;7;RP +9021;55606;Hochstetten-Dhaun;7133;Bad Kreuznach;7;RP +9022;55606;Kirn;7133;Bad Kreuznach;7;RP +9023;55606;Limbach;7133;Bad Kreuznach;7;RP +9024;55606;Kellenbach;7133;Bad Kreuznach;7;RP +9025;55606;Bruschied;7133;Bad Kreuznach;7;RP +9026;55606;Otzweiler;7133;Bad Kreuznach;7;RP +9027;55606;Baerweiler;7133;Bad Kreuznach;7;RP +9028;55606;Horbach;7133;Bad Kreuznach;7;RP +9029;55606;Heinzenberg;7133;Bad Kreuznach;7;RP +9030;55606;Oberhausen;7133;Bad Kreuznach;7;RP +9031;55606;Heimweiler;7133;Bad Kreuznach;7;RP +9032;55608;Becherbach bei Kirn;7133;Bad Kreuznach;7;RP +9033;55608;Griebelschied;7134;Birkenfeld;7;RP +9034;55608;Bergen;7134;Birkenfeld;7;RP +9035;55608;Berschweiler;7134;Birkenfeld;7;RP +9036;55608;Schneppenbach;7133;Bad Kreuznach;7;RP +9037;55608;Hausen;7134;Birkenfeld;7;RP +9038;55618;Simmertal;7133;Bad Kreuznach;7;RP +9039;55619;Hennweiler;7133;Bad Kreuznach;7;RP +9040;55621;Hundsbach;7133;Bad Kreuznach;7;RP +9041;55624;Oberkirn;7134;Birkenfeld;7;RP +9042;55624;Weitersbach;7134;Birkenfeld;7;RP +9043;55624;Rhaunen;7134;Birkenfeld;7;RP +9044;55624;Goesenroth;7134;Birkenfeld;7;RP +9045;55624;Schwerbach;7134;Birkenfeld;7;RP +9046;55624;Bollenbach;7134;Birkenfeld;7;RP +9047;55626;Bundenbach;7134;Birkenfeld;7;RP +9048;55627;Merxheim;7133;Bad Kreuznach;7;RP +9049;55627;Martinstein;7133;Bad Kreuznach;7;RP +9050;55627;Weiler bei Monzingen;7133;Bad Kreuznach;7;RP +9051;55629;Seesbach;7133;Bad Kreuznach;7;RP +9052;55629;Weitersborn;7133;Bad Kreuznach;7;RP +9053;55629;Schwarzerden;7133;Bad Kreuznach;7;RP +9054;55743;Kirschweiler;7134;Birkenfeld;7;RP +9055;55743;Idar-Oberstein;7134;Birkenfeld;7;RP +9056;55743;Gerach;7134;Birkenfeld;7;RP +9057;55743;Hintertiefenbach;7134;Birkenfeld;7;RP +9058;55743;Fischbach;7134;Birkenfeld;7;RP +9059;55756;Herrstein;7134;Birkenfeld;7;RP +9060;55758;Allenbach;7134;Birkenfeld;7;RP +9061;55758;Moerschied;7134;Birkenfeld;7;RP +9062;55758;Sonnschied;7134;Birkenfeld;7;RP +9063;55758;Schmidthachenbach;7134;Birkenfeld;7;RP +9064;55758;Sensweiler;7134;Birkenfeld;7;RP +9065;55758;Niederhosenbach;7134;Birkenfeld;7;RP +9066;55758;Kempfeld;7134;Birkenfeld;7;RP +9067;55758;Veitsrodt;7134;Birkenfeld;7;RP +9068;55758;Baerenbach;7133;Bad Kreuznach;7;RP +9069;55758;Weiden;7134;Birkenfeld;7;RP +9070;55758;Oberreidenbach;7134;Birkenfeld;7;RP +9071;55758;Breitenthal;7134;Birkenfeld;7;RP +9072;55758;Sienhachenbach;7134;Birkenfeld;7;RP +9073;55758;Sien;7134;Birkenfeld;7;RP +9074;55758;Wickenrodt;7134;Birkenfeld;7;RP +9075;55758;Mittelreidenbach;7134;Birkenfeld;7;RP +9076;55758;Dickesbach;7134;Birkenfeld;7;RP +9077;55758;Langweiler;7134;Birkenfeld;7;RP +9078;55758;Bruchweiler;7134;Birkenfeld;7;RP +9079;55758;Sulzbach;7134;Birkenfeld;7;RP +9080;55758;Mackenrodt;7134;Birkenfeld;7;RP +9081;55758;Oberhosenbach;7134;Birkenfeld;7;RP +9082;55758;Herborn;7134;Birkenfeld;7;RP +9083;55758;Vollmersbach;7134;Birkenfeld;7;RP +9084;55758;Stipshausen;7134;Birkenfeld;7;RP +9085;55758;Asbach;7134;Birkenfeld;7;RP +9086;55758;Wirschweiler;7134;Birkenfeld;7;RP +9087;55758;Hottenbach;7134;Birkenfeld;7;RP +9088;55758;Oberwoerresbach;7134;Birkenfeld;7;RP +9089;55758;Niederwoerresbach;7134;Birkenfeld;7;RP +9090;55758;Hellertshausen;7134;Birkenfeld;7;RP +9091;55758;Hettenrodt;7134;Birkenfeld;7;RP +9092;55758;Schauren;7134;Birkenfeld;7;RP +9093;55765;Ellenberg;7134;Birkenfeld;7;RP +9094;55765;Dienstweiler;7134;Birkenfeld;7;RP +9095;55765;Oberhambach;7134;Birkenfeld;7;RP +9096;55765;Birkenfeld;7134;Birkenfeld;7;RP +9097;55765;Ellweiler;7134;Birkenfeld;7;RP +9098;55765;Rimsberg;7134;Birkenfeld;7;RP +9099;55765;Elchweiler;7134;Birkenfeld;7;RP +9100;55765;Dambach;7134;Birkenfeld;7;RP +9101;55765;Schmissberg;7134;Birkenfeld;7;RP +9102;55767;Rinzenberg;7134;Birkenfeld;7;RP +9103;55767;Niederhambach;7134;Birkenfeld;7;RP +9104;55767;Meckenbach;7134;Birkenfeld;7;RP +9105;55767;Kronweiler;7134;Birkenfeld;7;RP +9106;55767;Wilzenberg-Hussweiler;7134;Birkenfeld;7;RP +9107;55767;Niederbrombach;7134;Birkenfeld;7;RP +9108;55767;Buhlenberg;7134;Birkenfeld;7;RP +9109;55767;Roetsweiler-Nockenthal;7134;Birkenfeld;7;RP +9110;55767;Gollenberg;7134;Birkenfeld;7;RP +9111;55767;Sonnenberg-Winnenberg;7134;Birkenfeld;7;RP +9112;55767;Hattgenstein;7134;Birkenfeld;7;RP +9113;55767;Nohen;7134;Birkenfeld;7;RP +9114;55767;Abentheuer;7134;Birkenfeld;7;RP +9115;55767;Gimbweiler;7134;Birkenfeld;7;RP +9116;55767;Schwollen;7134;Birkenfeld;7;RP +9117;55767;Bruecken;7134;Birkenfeld;7;RP +9118;55767;Siesbach;7134;Birkenfeld;7;RP +9119;55767;Achtelsbach;7134;Birkenfeld;7;RP +9120;55767;Leisel;7134;Birkenfeld;7;RP +9121;55767;Oberbrombach;7134;Birkenfeld;7;RP +9122;55768;Hoppstaedten-Weiersbach;7134;Birkenfeld;7;RP +9123;55774;Baumholder;7134;Birkenfeld;7;RP +9124;55776;Berglangenbach;7134;Birkenfeld;7;RP +9125;55776;Ruschberg;7134;Birkenfeld;7;RP +9126;55776;Reichenbach;7134;Birkenfeld;7;RP +9127;55776;Frauenberg;7134;Birkenfeld;7;RP +9128;55776;Hahnweiler;7134;Birkenfeld;7;RP +9129;55776;Rueckweiler;7134;Birkenfeld;7;RP +9130;55776;Rohrbach;7134;Birkenfeld;7;RP +9131;55777;Fohren-Linden;7134;Birkenfeld;7;RP +9132;55777;Berschweiler;7134;Birkenfeld;7;RP +9133;55777;Eckersweiler;7134;Birkenfeld;7;RP +9134;55777;Mettweiler;7134;Birkenfeld;7;RP +9135;55779;Heimbach;7134;Birkenfeld;7;RP +9136;55779;Leitzweiler;7134;Birkenfeld;7;RP +9137;56068;Koblenz;7111;Koblenz, Stadt;7;RP +9138;56070;Koblenz;7111;Koblenz, Stadt;7;RP +9139;56072;Koblenz;7111;Koblenz, Stadt;7;RP +9140;56073;Koblenz;7111;Koblenz, Stadt;7;RP +9141;56075;Koblenz;7111;Koblenz, Stadt;7;RP +9142;56076;Koblenz;7111;Koblenz, Stadt;7;RP +9143;56077;Koblenz;7111;Koblenz, Stadt;7;RP +9144;56112;Lahnstein;7141;Rhein-Lahn-Kreis;7;RP +9145;56130;Bad Ems;7141;Rhein-Lahn-Kreis;7;RP +9146;56132;Miellen;7141;Rhein-Lahn-Kreis;7;RP +9147;56132;Becheln;7141;Rhein-Lahn-Kreis;7;RP +9148;56132;Fruecht;7141;Rhein-Lahn-Kreis;7;RP +9149;56132;Kemmenau;7141;Rhein-Lahn-Kreis;7;RP +9150;56132;Dausenau;7141;Rhein-Lahn-Kreis;7;RP +9151;56132;Nievern;7141;Rhein-Lahn-Kreis;7;RP +9152;56133;Fachbach;7141;Rhein-Lahn-Kreis;7;RP +9153;56154;Boppard;7140;Rhein-Hunsrueck-Kreis;7;RP +9154;56170;Bendorf;7137;Mayen-Koblenz;7;RP +9155;56179;Niederwerth;7137;Mayen-Koblenz;7;RP +9156;56179;Vallendar;7137;Mayen-Koblenz;7;RP +9157;56182;Urbar;7137;Mayen-Koblenz;7;RP +9158;56191;Weitersburg;7137;Mayen-Koblenz;7;RP +9159;56203;Hoehr-Grenzhausen;7143;Westerwaldkreis;7;RP +9160;56204;Hillscheid;7143;Westerwaldkreis;7;RP +9161;56206;Kammerforst;7143;Westerwaldkreis;7;RP +9162;56206;Hilgert;7143;Westerwaldkreis;7;RP +9163;56218;Muelheim-Kaerlich;7137;Mayen-Koblenz;7;RP +9164;56220;Kaltenengers;7137;Mayen-Koblenz;7;RP +9165;56220;Kettig;7137;Mayen-Koblenz;7;RP +9166;56220;Urmitz;7137;Mayen-Koblenz;7;RP +9167;56220;Sankt Sebastian;7137;Mayen-Koblenz;7;RP +9168;56220;Bassenheim;7137;Mayen-Koblenz;7;RP +9169;56235;Ransbach-Baumbach;7143;Westerwaldkreis;7;RP +9170;56235;Hundsdorf;7143;Westerwaldkreis;7;RP +9171;56237;Wirscheid;7143;Westerwaldkreis;7;RP +9172;56237;Wittgert;7143;Westerwaldkreis;7;RP +9173;56237;Breitenau;7143;Westerwaldkreis;7;RP +9174;56237;Alsbach;7143;Westerwaldkreis;7;RP +9175;56237;Caan;7143;Westerwaldkreis;7;RP +9176;56237;Deesen;7143;Westerwaldkreis;7;RP +9177;56237;Oberhaid;7143;Westerwaldkreis;7;RP +9178;56237;Nauort;7143;Westerwaldkreis;7;RP +9179;56237;Sessenbach;7143;Westerwaldkreis;7;RP +9180;56242;Marienrachdorf;7143;Westerwaldkreis;7;RP +9181;56242;Quirnbach;7143;Westerwaldkreis;7;RP +9182;56242;Nordhofen;7143;Westerwaldkreis;7;RP +9183;56242;Ellenhausen;7143;Westerwaldkreis;7;RP +9184;56242;Selters;7143;Westerwaldkreis;7;RP +9185;56244;Ewighausen;7143;Westerwaldkreis;7;RP +9186;56244;Freilingen;7143;Westerwaldkreis;7;RP +9187;56244;Ettinghausen;7143;Westerwaldkreis;7;RP +9188;56244;Weidenhahn;7143;Westerwaldkreis;7;RP +9189;56244;Hartenfels;7143;Westerwaldkreis;7;RP +9190;56244;Hahn am See;7143;Westerwaldkreis;7;RP +9191;56244;Schenkelberg;7143;Westerwaldkreis;7;RP +9192;56244;Maxsain;7143;Westerwaldkreis;7;RP +9193;56244;Leuterod;7143;Westerwaldkreis;7;RP +9194;56244;Rueckeroth;7143;Westerwaldkreis;7;RP +9195;56244;tzingen;7143;Westerwaldkreis;7;RP +9196;56244;Helferskirchen;7143;Westerwaldkreis;7;RP +9197;56244;Freirachdorf;7143;Westerwaldkreis;7;RP +9198;56244;Woelferlingen;7143;Westerwaldkreis;7;RP +9199;56244;Sessenhausen;7143;Westerwaldkreis;7;RP +9200;56244;Steinen;7143;Westerwaldkreis;7;RP +9201;56244;Arnshoefen;7143;Westerwaldkreis;7;RP +9202;56244;Goddert;7143;Westerwaldkreis;7;RP +9203;56244;Kruemmel;7143;Westerwaldkreis;7;RP +9204;56244;Kuhnhoefen;7143;Westerwaldkreis;7;RP +9205;56244;Vielbach;7143;Westerwaldkreis;7;RP +9206;56244;Niedersayn;7143;Westerwaldkreis;7;RP +9207;56249;Herschbach;7143;Westerwaldkreis;7;RP +9208;56253;Treis-Karden;7135;Cochem-Zell;7;RP +9209;56254;Mueden;7135;Cochem-Zell;7;RP +9210;56254;Moselkern;7135;Cochem-Zell;7;RP +9211;56269;Marienhausen;7138;Neuwied;7;RP +9212;56269;Dierdorf;7138;Neuwied;7;RP +9213;56271;Maroth;7143;Westerwaldkreis;7;RP +9214;56271;Kleinmaischeid;7138;Neuwied;7;RP +9215;56271;Isenburg;7138;Neuwied;7;RP +9216;56271;Rossbach;7143;Westerwaldkreis;7;RP +9217;56271;Muendersbach;7143;Westerwaldkreis;7;RP +9218;56276;Grossmaischeid;7138;Neuwied;7;RP +9219;56276;Stebach;7138;Neuwied;7;RP +9220;56281;Schwall;7140;Rhein-Hunsrueck-Kreis;7;RP +9221;56281;Karbach;7140;Rhein-Hunsrueck-Kreis;7;RP +9222;56281;Hungenroth;7140;Rhein-Hunsrueck-Kreis;7;RP +9223;56281;Emmelshausen;7140;Rhein-Hunsrueck-Kreis;7;RP +9224;56281;Doerth;7140;Rhein-Hunsrueck-Kreis;7;RP +9225;56283;Kratzenburg;7140;Rhein-Hunsrueck-Kreis;7;RP +9226;56283;Halsenbach;7140;Rhein-Hunsrueck-Kreis;7;RP +9227;56283;Morshausen;7140;Rhein-Hunsrueck-Kreis;7;RP +9228;56283;Gondershausen;7140;Rhein-Hunsrueck-Kreis;7;RP +9229;56283;Mermuth;7140;Rhein-Hunsrueck-Kreis;7;RP +9230;56283;Noertershausen;7137;Mayen-Koblenz;7;RP +9231;56283;Ney;7140;Rhein-Hunsrueck-Kreis;7;RP +9232;56283;Beulich;7140;Rhein-Hunsrueck-Kreis;7;RP +9233;56288;Michelbach;7140;Rhein-Hunsrueck-Kreis;7;RP +9234;56288;Spesenroth;7140;Rhein-Hunsrueck-Kreis;7;RP +9235;56288;Bubach;7140;Rhein-Hunsrueck-Kreis;7;RP +9236;56288;Roth;7140;Rhein-Hunsrueck-Kreis;7;RP +9237;56288;Zilshausen;7135;Cochem-Zell;7;RP +9238;56288;Laubach;7140;Rhein-Hunsrueck-Kreis;7;RP +9239;56288;Kastellaun;7140;Rhein-Hunsrueck-Kreis;7;RP +9240;56288;Hasselbach;7140;Rhein-Hunsrueck-Kreis;7;RP +9241;56288;Korweiler;7140;Rhein-Hunsrueck-Kreis;7;RP +9242;56288;Alterkuelz;7140;Rhein-Hunsrueck-Kreis;7;RP +9243;56288;Bell;7140;Rhein-Hunsrueck-Kreis;7;RP +9244;56288;Lahr;7135;Cochem-Zell;7;RP +9245;56288;Hollnich;7140;Rhein-Hunsrueck-Kreis;7;RP +9246;56288;Braunshorn;7140;Rhein-Hunsrueck-Kreis;7;RP +9247;56290;Beltheim;7140;Rhein-Hunsrueck-Kreis;7;RP +9248;56290;Goedenroth;7140;Rhein-Hunsrueck-Kreis;7;RP +9249;56290;Macken;7137;Mayen-Koblenz;7;RP +9250;56290;Buch;7140;Rhein-Hunsrueck-Kreis;7;RP +9251;56290;Moersdorf;7135;Cochem-Zell;7;RP +9252;56290;Luetz;7135;Cochem-Zell;7;RP +9253;56290;Dommershausen;7140;Rhein-Hunsrueck-Kreis;7;RP +9254;56290;Lieg;7135;Cochem-Zell;7;RP +9255;56290;Uhler;7140;Rhein-Hunsrueck-Kreis;7;RP +9256;56291;Muehlpfad;7140;Rhein-Hunsrueck-Kreis;7;RP +9257;56291;Birkheim;7140;Rhein-Hunsrueck-Kreis;7;RP +9258;56291;Norath;7140;Rhein-Hunsrueck-Kreis;7;RP +9259;56291;Steinbach;7140;Rhein-Hunsrueck-Kreis;7;RP +9260;56291;Maisborn;7140;Rhein-Hunsrueck-Kreis;7;RP +9261;56291;Kisselbach;7140;Rhein-Hunsrueck-Kreis;7;RP +9262;56291;Hausbay;7140;Rhein-Hunsrueck-Kreis;7;RP +9263;56291;Niedert;7140;Rhein-Hunsrueck-Kreis;7;RP +9264;56291;Badenhard;7140;Rhein-Hunsrueck-Kreis;7;RP +9265;56291;Bickenbach;7140;Rhein-Hunsrueck-Kreis;7;RP +9266;56291;Pfalzfeld;7140;Rhein-Hunsrueck-Kreis;7;RP +9267;56291;Wiebelsheim;7140;Rhein-Hunsrueck-Kreis;7;RP +9268;56291;Leiningen;7140;Rhein-Hunsrueck-Kreis;7;RP +9269;56291;Thoerlingen;7140;Rhein-Hunsrueck-Kreis;7;RP +9270;56291;Laudert;7140;Rhein-Hunsrueck-Kreis;7;RP +9271;56291;Utzenhain;7140;Rhein-Hunsrueck-Kreis;7;RP +9272;56291;Lingerhahn;7140;Rhein-Hunsrueck-Kreis;7;RP +9273;56294;Gierschnach;7137;Mayen-Koblenz;7;RP +9274;56294;Muenstermaifeld;7137;Mayen-Koblenz;7;RP +9275;56294;Kalt;7137;Mayen-Koblenz;7;RP +9276;56294;Gappenach;7137;Mayen-Koblenz;7;RP +9277;56294;Wierschem;7137;Mayen-Koblenz;7;RP +9278;56295;Rueber;7137;Mayen-Koblenz;7;RP +9279;56295;Lonnig;7137;Mayen-Koblenz;7;RP +9280;56295;Kerben;7137;Mayen-Koblenz;7;RP +9281;56299;Ochtendung;7137;Mayen-Koblenz;7;RP +9282;56305;Puderbach;7138;Neuwied;7;RP +9283;56305;Doettesfeld;7138;Neuwied;7;RP +9284;56307;Duerrholz;7138;Neuwied;7;RP +9285;56307;Dernbach;7138;Neuwied;7;RP +9286;56307;Harschbach;7138;Neuwied;7;RP +9287;56316;Hanroth;7138;Neuwied;7;RP +9288;56316;Niederhofen;7138;Neuwied;7;RP +9289;56316;Raubach;7138;Neuwied;7;RP +9290;56317;Linkenbach;7138;Neuwied;7;RP +9291;56317;Urbach;7138;Neuwied;7;RP +9292;56321;Rhens;7137;Mayen-Koblenz;7;RP +9293;56321;Brey;7137;Mayen-Koblenz;7;RP +9294;56322;Spay;7137;Mayen-Koblenz;7;RP +9295;56323;Waldesch;7137;Mayen-Koblenz;7;RP +9296;56329;Sankt Goar;7140;Rhein-Hunsrueck-Kreis;7;RP +9297;56330;Kobern-Gondorf;7137;Mayen-Koblenz;7;RP +9298;56332;Oberfell;7137;Mayen-Koblenz;7;RP +9299;56332;Hatzenport;7137;Mayen-Koblenz;7;RP +9300;56332;Lehmen;7137;Mayen-Koblenz;7;RP +9301;56332;Dieblich;7137;Mayen-Koblenz;7;RP +9302;56332;Kattenes;7137;Mayen-Koblenz;7;RP +9303;56332;Alken;7137;Mayen-Koblenz;7;RP +9304;56332;Brodenbach;7137;Mayen-Koblenz;7;RP +9305;56332;Burgen;7137;Mayen-Koblenz;7;RP +9306;56332;Loef;7137;Mayen-Koblenz;7;RP +9307;56332;Wolken;7137;Mayen-Koblenz;7;RP +9308;56332;Niederfell;7137;Mayen-Koblenz;7;RP +9309;56333;Winningen;7137;Mayen-Koblenz;7;RP +9310;56335;Neuhaeusel;7143;Westerwaldkreis;7;RP +9311;56337;Simmern;7143;Westerwaldkreis;7;RP +9312;56337;Arzbach;7141;Rhein-Lahn-Kreis;7;RP +9313;56337;Eitelborn;7143;Westerwaldkreis;7;RP +9314;56337;Kadenbach;7143;Westerwaldkreis;7;RP +9315;56338;Braubach;7141;Rhein-Lahn-Kreis;7;RP +9316;56340;Dachsenhausen;7141;Rhein-Lahn-Kreis;7;RP +9317;56340;Osterspai;7141;Rhein-Lahn-Kreis;7;RP +9318;56341;Filsen;7141;Rhein-Lahn-Kreis;7;RP +9319;56341;Kamp-Bornhofen;7141;Rhein-Lahn-Kreis;7;RP +9320;56346;Lykershausen;7141;Rhein-Lahn-Kreis;7;RP +9321;56346;Prath;7141;Rhein-Lahn-Kreis;7;RP +9322;56346;Sankt Goarshausen;7141;Rhein-Lahn-Kreis;7;RP +9323;56348;Dahlheim;7141;Rhein-Lahn-Kreis;7;RP +9324;56348;Weisel;7141;Rhein-Lahn-Kreis;7;RP +9325;56348;Kestert;7141;Rhein-Lahn-Kreis;7;RP +9326;56348;Patersberg;7141;Rhein-Lahn-Kreis;7;RP +9327;56348;Bornich;7141;Rhein-Lahn-Kreis;7;RP +9328;56348;Doerscheid;7141;Rhein-Lahn-Kreis;7;RP +9329;56349;Kaub;7141;Rhein-Lahn-Kreis;7;RP +9330;56355;Lautert;7141;Rhein-Lahn-Kreis;7;RP +9331;56355;Endlichhofen;7141;Rhein-Lahn-Kreis;7;RP +9332;56355;Diethardt;7141;Rhein-Lahn-Kreis;7;RP +9333;56355;Bettendorf;7141;Rhein-Lahn-Kreis;7;RP +9334;56355;Nastaetten;7141;Rhein-Lahn-Kreis;7;RP +9335;56355;Hunzel;7141;Rhein-Lahn-Kreis;7;RP +9336;56355;Winterwerb;7141;Rhein-Lahn-Kreis;7;RP +9337;56355;Weidenbach;7141;Rhein-Lahn-Kreis;7;RP +9338;56355;Oberbachheim;7141;Rhein-Lahn-Kreis;7;RP +9339;56355;Kehlbach;7141;Rhein-Lahn-Kreis;7;RP +9340;56357;Dornholzhausen;7141;Rhein-Lahn-Kreis;7;RP +9341;56357;Reitzenhain;7141;Rhein-Lahn-Kreis;7;RP +9342;56357;Himmighofen;7141;Rhein-Lahn-Kreis;7;RP +9343;56357;Obertiefenbach;7141;Rhein-Lahn-Kreis;7;RP +9344;56357;Rettershain;7141;Rhein-Lahn-Kreis;7;RP +9345;56357;Buch;7141;Rhein-Lahn-Kreis;7;RP +9346;56357;Geisig;7141;Rhein-Lahn-Kreis;7;RP +9347;56357;Eschbach;7141;Rhein-Lahn-Kreis;7;RP +9348;56357;Reichenberg;7141;Rhein-Lahn-Kreis;7;RP +9349;56357;Nochern;7141;Rhein-Lahn-Kreis;7;RP +9350;56357;Niederwallmenach;7141;Rhein-Lahn-Kreis;7;RP +9351;56357;Lipporn;7141;Rhein-Lahn-Kreis;7;RP +9352;56357;Weyer;7141;Rhein-Lahn-Kreis;7;RP +9353;56357;Auel;7141;Rhein-Lahn-Kreis;7;RP +9354;56357;Strueth;7141;Rhein-Lahn-Kreis;7;RP +9355;56357;Lierschied;7141;Rhein-Lahn-Kreis;7;RP +9356;56357;Gemmerich;7141;Rhein-Lahn-Kreis;7;RP +9357;56357;Pohl;7141;Rhein-Lahn-Kreis;7;RP +9358;56357;Holzhausen an der Haide;7141;Rhein-Lahn-Kreis;7;RP +9359;56357;Berg;7141;Rhein-Lahn-Kreis;7;RP +9360;56357;Welterod;7141;Rhein-Lahn-Kreis;7;RP +9361;56357;Hainau;7141;Rhein-Lahn-Kreis;7;RP +9362;56357;Niederbachheim;7141;Rhein-Lahn-Kreis;7;RP +9363;56357;Kasdorf;7141;Rhein-Lahn-Kreis;7;RP +9364;56357;Miehlen;7141;Rhein-Lahn-Kreis;7;RP +9365;56357;Oelsberg;7141;Rhein-Lahn-Kreis;7;RP +9366;56357;Lollschied;7141;Rhein-Lahn-Kreis;7;RP +9367;56357;Dessighofen;7141;Rhein-Lahn-Kreis;7;RP +9368;56357;Ehr;7141;Rhein-Lahn-Kreis;7;RP +9369;56357;Oberwallmenach;7141;Rhein-Lahn-Kreis;7;RP +9370;56357;Marienfels;7141;Rhein-Lahn-Kreis;7;RP +9371;56357;Ruppertshofen;7141;Rhein-Lahn-Kreis;7;RP +9372;56357;Bogel;7141;Rhein-Lahn-Kreis;7;RP +9373;56368;Klingelbach;7141;Rhein-Lahn-Kreis;7;RP +9374;56368;Herold;7141;Rhein-Lahn-Kreis;7;RP +9375;56368;Katzenelnbogen;7141;Rhein-Lahn-Kreis;7;RP +9376;56368;Niedertiefenbach;7141;Rhein-Lahn-Kreis;7;RP +9377;56368;Roth;7141;Rhein-Lahn-Kreis;7;RP +9378;56368;Ergeshausen;7141;Rhein-Lahn-Kreis;7;RP +9379;56368;Berghausen;7141;Rhein-Lahn-Kreis;7;RP +9380;56370;Ebertshausen;7141;Rhein-Lahn-Kreis;7;RP +9381;56370;Doersdorf;7141;Rhein-Lahn-Kreis;7;RP +9382;56370;Bremberg;7141;Rhein-Lahn-Kreis;7;RP +9383;56370;Reckenroth;7141;Rhein-Lahn-Kreis;7;RP +9384;56370;Rettert;7141;Rhein-Lahn-Kreis;7;RP +9385;56370;Koerdorf;7141;Rhein-Lahn-Kreis;7;RP +9386;56370;Allendorf;7141;Rhein-Lahn-Kreis;7;RP +9387;56370;Schoenborn;7141;Rhein-Lahn-Kreis;7;RP +9388;56370;Eisighofen;7141;Rhein-Lahn-Kreis;7;RP +9389;56370;Attenhausen;7141;Rhein-Lahn-Kreis;7;RP +9390;56370;Biebrich;7141;Rhein-Lahn-Kreis;7;RP +9391;56370;Oberfischbach;7141;Rhein-Lahn-Kreis;7;RP +9392;56370;Gutenacker;7141;Rhein-Lahn-Kreis;7;RP +9393;56370;Wasenbach;7141;Rhein-Lahn-Kreis;7;RP +9394;56370;Berndroth;7141;Rhein-Lahn-Kreis;7;RP +9395;56370;Mittelfischbach;7141;Rhein-Lahn-Kreis;7;RP +9396;56377;Misselberg;7141;Rhein-Lahn-Kreis;7;RP +9397;56377;Seelbach;7141;Rhein-Lahn-Kreis;7;RP +9398;56377;Schweighausen;7141;Rhein-Lahn-Kreis;7;RP +9399;56377;Nassau;7141;Rhein-Lahn-Kreis;7;RP +9400;56379;Horhausen;7141;Rhein-Lahn-Kreis;7;RP +9401;56379;Charlottenberg;7141;Rhein-Lahn-Kreis;7;RP +9402;56379;Geilnau;7141;Rhein-Lahn-Kreis;7;RP +9403;56379;Zimmerschied;7141;Rhein-Lahn-Kreis;7;RP +9404;56379;Oberwies;7141;Rhein-Lahn-Kreis;7;RP +9405;56379;Obernhof;7141;Rhein-Lahn-Kreis;7;RP +9406;56379;Steinsberg;7141;Rhein-Lahn-Kreis;7;RP +9407;56379;Dienethal;7141;Rhein-Lahn-Kreis;7;RP +9408;56379;Hoemberg;7141;Rhein-Lahn-Kreis;7;RP +9409;56379;Scheidt;7141;Rhein-Lahn-Kreis;7;RP +9410;56379;Laurenburg;7141;Rhein-Lahn-Kreis;7;RP +9411;56379;Weinaehr;7141;Rhein-Lahn-Kreis;7;RP +9412;56379;Doernberg;7141;Rhein-Lahn-Kreis;7;RP +9413;56379;Singhofen;7141;Rhein-Lahn-Kreis;7;RP +9414;56379;Holzappel;7141;Rhein-Lahn-Kreis;7;RP +9415;56379;Sulzbach;7141;Rhein-Lahn-Kreis;7;RP +9416;56379;Winden;7141;Rhein-Lahn-Kreis;7;RP +9417;56410;Montabaur;7143;Westerwaldkreis;7;RP +9418;56412;Daubach;7143;Westerwaldkreis;7;RP +9419;56412;Nentershausen;7143;Westerwaldkreis;7;RP +9420;56412;Girod;7143;Westerwaldkreis;7;RP +9421;56412;Ruppach-Goldhausen;7143;Westerwaldkreis;7;RP +9422;56412;Nomborn;7143;Westerwaldkreis;7;RP +9423;56412;Holler;7143;Westerwaldkreis;7;RP +9424;56412;Horbach;7143;Westerwaldkreis;7;RP +9425;56412;Heiligenroth;7143;Westerwaldkreis;7;RP +9426;56412;Huebingen;7143;Westerwaldkreis;7;RP +9427;56412;Grossholbach;7143;Westerwaldkreis;7;RP +9428;56412;Goergeshausen;7143;Westerwaldkreis;7;RP +9429;56412;Welschneudorf;7143;Westerwaldkreis;7;RP +9430;56412;Gackenbach;7143;Westerwaldkreis;7;RP +9431;56412;Untershausen;7143;Westerwaldkreis;7;RP +9432;56412;Niederelbert;7143;Westerwaldkreis;7;RP +9433;56412;Boden;7143;Westerwaldkreis;7;RP +9434;56412;Heilberscheid;7143;Westerwaldkreis;7;RP +9435;56412;Niedererbach;7143;Westerwaldkreis;7;RP +9436;56412;Stahlhofen;7143;Westerwaldkreis;7;RP +9437;56412;Oberelbert;7143;Westerwaldkreis;7;RP +9438;56414;Steinefrenz;7143;Westerwaldkreis;7;RP +9439;56414;Wallmerod;7143;Westerwaldkreis;7;RP +9440;56414;Salz;7143;Westerwaldkreis;7;RP +9441;56414;Oberahr;7143;Westerwaldkreis;7;RP +9442;56414;Zehnhausen bei Wallmerod;7143;Westerwaldkreis;7;RP +9443;56414;Berod bei Wallmerod;7143;Westerwaldkreis;7;RP +9444;56414;Weroth;7143;Westerwaldkreis;7;RP +9445;56414;Dreikirchen;7143;Westerwaldkreis;7;RP +9446;56414;Herschbach (Oberwesterwald);7143;Westerwaldkreis;7;RP +9447;56414;Bilkheim;7143;Westerwaldkreis;7;RP +9448;56414;Niederahr;7143;Westerwaldkreis;7;RP +9449;56414;Obererbach;7143;Westerwaldkreis;7;RP +9450;56414;Hundsangen;7143;Westerwaldkreis;7;RP +9451;56414;Molsberg;7143;Westerwaldkreis;7;RP +9452;56414;Meudt;7143;Westerwaldkreis;7;RP +9453;56422;Wirges;7143;Westerwaldkreis;7;RP +9454;56424;Bannberscheid;7143;Westerwaldkreis;7;RP +9455;56424;Moschheim;7143;Westerwaldkreis;7;RP +9456;56424;Ebernhahn;7143;Westerwaldkreis;7;RP +9457;56424;Staudt;7143;Westerwaldkreis;7;RP +9458;56424;Mogendorf;7143;Westerwaldkreis;7;RP +9459;56427;Siershahn;7143;Westerwaldkreis;7;RP +9460;56428;Dernbach (Westerwald);7143;Westerwaldkreis;7;RP +9461;56457;Westerburg;7143;Westerwaldkreis;7;RP +9462;56457;Halbs;7143;Westerwaldkreis;7;RP +9463;56457;Hergenroth;7143;Westerwaldkreis;7;RP +9464;56459;Willmenrod;7143;Westerwaldkreis;7;RP +9465;56459;Langenhahn;7143;Westerwaldkreis;7;RP +9466;56459;Maehren;7143;Westerwaldkreis;7;RP +9467;56459;Girkenroth;7143;Westerwaldkreis;7;RP +9468;56459;Winnen;7143;Westerwaldkreis;7;RP +9469;56459;Ailertchen;7143;Westerwaldkreis;7;RP +9470;56459;Rothenbach;7143;Westerwaldkreis;7;RP +9471;56459;Haertlingen;7143;Westerwaldkreis;7;RP +9472;56459;Brandscheid;7143;Westerwaldkreis;7;RP +9473;56459;Kaden;7143;Westerwaldkreis;7;RP +9474;56459;Rotenhain;7143;Westerwaldkreis;7;RP +9475;56459;Stockum-Pueschen;7143;Westerwaldkreis;7;RP +9476;56459;Gemuenden;7143;Westerwaldkreis;7;RP +9477;56459;Stahlhofen am Wiesensee;7143;Westerwaldkreis;7;RP +9478;56459;Pottum;7143;Westerwaldkreis;7;RP +9479;56459;Koelbingen;7143;Westerwaldkreis;7;RP +9480;56459;Guckheim;7143;Westerwaldkreis;7;RP +9481;56459;Berzhahn;7143;Westerwaldkreis;7;RP +9482;56459;Bellingen;7143;Westerwaldkreis;7;RP +9483;56459;Weltersburg;7143;Westerwaldkreis;7;RP +9484;56459;Elbingen;7143;Westerwaldkreis;7;RP +9485;56462;Hoehn;7143;Westerwaldkreis;7;RP +9486;56470;Bad Marienberg;7143;Westerwaldkreis;7;RP +9487;56472;Dreisbach;7143;Westerwaldkreis;7;RP +9488;56472;Fehl-Ritzhausen;7143;Westerwaldkreis;7;RP +9489;56472;Hardt;7143;Westerwaldkreis;7;RP +9490;56472;Hahn bei Marienberg;7143;Westerwaldkreis;7;RP +9491;56472;Nisterau;7143;Westerwaldkreis;7;RP +9492;56472;Stockhausen-Illfurth;7143;Westerwaldkreis;7;RP +9493;56472;Nisterberg;7132;Altenkirchen (Westerwald);7;RP +9494;56472;Grossseifen;7143;Westerwaldkreis;7;RP +9495;56472;Hof;7143;Westerwaldkreis;7;RP +9496;56472;Lautzenbruecken;7143;Westerwaldkreis;7;RP +9497;56477;Zehnhausen bei Rennerod;7143;Westerwaldkreis;7;RP +9498;56477;Nister-Moehrendorf;7143;Westerwaldkreis;7;RP +9499;56477;Rennerod;7143;Westerwaldkreis;7;RP +9500;56477;Waigandshain;7143;Westerwaldkreis;7;RP +9501;56479;Stein-Neukirch;7143;Westerwaldkreis;7;RP +9502;56479;Liebenscheid;7143;Westerwaldkreis;7;RP +9503;56479;Westernohe;7143;Westerwaldkreis;7;RP +9504;56479;Niederrossbach;7143;Westerwaldkreis;7;RP +9505;56479;Rehe;7143;Westerwaldkreis;7;RP +9506;56479;Seck;7143;Westerwaldkreis;7;RP +9507;56479;Bretthausen;7143;Westerwaldkreis;7;RP +9508;56479;Irmtraut;7143;Westerwaldkreis;7;RP +9509;56479;Salzburg;7143;Westerwaldkreis;7;RP +9510;56479;Hellenhahn-Schellenberg;7143;Westerwaldkreis;7;RP +9511;56479;Willingen;7143;Westerwaldkreis;7;RP +9512;56479;Homberg;7143;Westerwaldkreis;7;RP +9513;56479;Neustadt (Westerwald);7143;Westerwaldkreis;7;RP +9514;56479;Oberrod;7143;Westerwaldkreis;7;RP +9515;56479;Neunkirchen;7143;Westerwaldkreis;7;RP +9516;56479;Hueblingen;7143;Westerwaldkreis;7;RP +9517;56479;Waldmuehlen;7143;Westerwaldkreis;7;RP +9518;56479;Oberrossbach;7143;Westerwaldkreis;7;RP +9519;56564;Neuwied;7138;Neuwied;7;RP +9520;56566;Neuwied;7138;Neuwied;7;RP +9521;56567;Neuwied;7138;Neuwied;7;RP +9522;56575;Weissenthurm;7137;Mayen-Koblenz;7;RP +9523;56579;Bonefeld;7138;Neuwied;7;RP +9524;56579;Rengsdorf;7138;Neuwied;7;RP +9525;56579;Hardert;7138;Neuwied;7;RP +9526;56581;Kurtscheid;7138;Neuwied;7;RP +9527;56581;Ehlscheid;7138;Neuwied;7;RP +9528;56581;Melsbach;7138;Neuwied;7;RP +9529;56584;Ruescheid;7138;Neuwied;7;RP +9530;56584;Anhausen;7138;Neuwied;7;RP +9531;56584;Thalhausen;7138;Neuwied;7;RP +9532;56584;Meinborn;7138;Neuwied;7;RP +9533;56587;Strassenhaus;7138;Neuwied;7;RP +9534;56587;Oberraden;7138;Neuwied;7;RP +9535;56587;Oberhonnefeld-Gierend;7138;Neuwied;7;RP +9536;56588;Waldbreitbach;7138;Neuwied;7;RP +9537;56589;Datzeroth;7138;Neuwied;7;RP +9538;56589;Niederbreitbach;7138;Neuwied;7;RP +9539;56593;Niedersteinebach;7132;Altenkirchen (Westerwald);7;RP +9540;56593;Guellesheim;7132;Altenkirchen (Westerwald);7;RP +9541;56593;Pleckhausen;7132;Altenkirchen (Westerwald);7;RP +9542;56593;Krunkel;7132;Altenkirchen (Westerwald);7;RP +9543;56593;Horhausen;7132;Altenkirchen (Westerwald);7;RP +9544;56593;Obersteinebach;7132;Altenkirchen (Westerwald);7;RP +9545;56593;Buerdenbach;7132;Altenkirchen (Westerwald);7;RP +9546;56594;Willroth;7132;Altenkirchen (Westerwald);7;RP +9547;56598;Rheinbrohl;7138;Neuwied;7;RP +9548;56598;Hammerstein;7138;Neuwied;7;RP +9549;56599;Leutesdorf;7138;Neuwied;7;RP +9550;56626;Andernach;7137;Mayen-Koblenz;7;RP +9551;56630;Kretz;7137;Mayen-Koblenz;7;RP +9552;56637;Plaidt;7137;Mayen-Koblenz;7;RP +9553;56642;Kruft;7137;Mayen-Koblenz;7;RP +9554;56645;Nickenich;7137;Mayen-Koblenz;7;RP +9555;56648;Saffig;7137;Mayen-Koblenz;7;RP +9556;56651;Niederzissen;7131;Ahrweiler;7;RP +9557;56651;Oberzissen;7131;Ahrweiler;7;RP +9558;56651;Oberduerenbach;7131;Ahrweiler;7;RP +9559;56651;Brenk;7131;Ahrweiler;7;RP +9560;56651;Niederduerenbach;7131;Ahrweiler;7;RP +9561;56651;Galenberg;7131;Ahrweiler;7;RP +9562;56653;Glees;7131;Ahrweiler;7;RP +9563;56653;Wehr;7131;Ahrweiler;7;RP +9564;56653;Wassenach;7131;Ahrweiler;7;RP +9565;56656;Brohl-Luetzing;7131;Ahrweiler;7;RP +9566;56659;Burgbrohl;7131;Ahrweiler;7;RP +9567;56727;Reudelsterz;7137;Mayen-Koblenz;7;RP +9568;56727;Sankt Johann;7137;Mayen-Koblenz;7;RP +9569;56727;Mayen;7137;Mayen-Koblenz;7;RP +9570;56729;Bermel;7137;Mayen-Koblenz;7;RP +9571;56729;Acht;7137;Mayen-Koblenz;7;RP +9572;56729;Ettringen;7137;Mayen-Koblenz;7;RP +9573;56729;Arft;7137;Mayen-Koblenz;7;RP +9574;56729;Anschau;7137;Mayen-Koblenz;7;RP +9575;56729;Siebenbach;7137;Mayen-Koblenz;7;RP +9576;56729;Weiler;7137;Mayen-Koblenz;7;RP +9577;56729;Virneburg;7137;Mayen-Koblenz;7;RP +9578;56729;Muenk;7137;Mayen-Koblenz;7;RP +9579;56729;Lind;7137;Mayen-Koblenz;7;RP +9580;56729;Monreal;7137;Mayen-Koblenz;7;RP +9581;56729;Luxem;7137;Mayen-Koblenz;7;RP +9582;56729;Boos;7137;Mayen-Koblenz;7;RP +9583;56729;Hirten;7137;Mayen-Koblenz;7;RP +9584;56729;Ditscheid;7137;Mayen-Koblenz;7;RP +9585;56729;Langscheid;7137;Mayen-Koblenz;7;RP +9586;56729;Langenfeld;7137;Mayen-Koblenz;7;RP +9587;56729;Nachtsheim;7137;Mayen-Koblenz;7;RP +9588;56729;Nitz;7233;Daun;7;RP +9589;56729;Herresbach;7137;Mayen-Koblenz;7;RP +9590;56729;Kehrig;7137;Mayen-Koblenz;7;RP +9591;56729;Baar;7137;Mayen-Koblenz;7;RP +9592;56729;Welschenbach;7137;Mayen-Koblenz;7;RP +9593;56729;Kirchwald;7137;Mayen-Koblenz;7;RP +9594;56736;Kottenheim;7137;Mayen-Koblenz;7;RP +9595;56743;Mendig;7137;Mayen-Koblenz;7;RP +9596;56743;Thuer;7137;Mayen-Koblenz;7;RP +9597;56745;Weibern;7131;Ahrweiler;7;RP +9598;56745;Hausten;7137;Mayen-Koblenz;7;RP +9599;56745;Rieden;7137;Mayen-Koblenz;7;RP +9600;56745;Volkesfeld;7137;Mayen-Koblenz;7;RP +9601;56745;Bell;7137;Mayen-Koblenz;7;RP +9602;56746;Spessart;7131;Ahrweiler;7;RP +9603;56746;Hohenleimbach;7131;Ahrweiler;7;RP +9604;56746;Kempenich;7131;Ahrweiler;7;RP +9605;56751;Polch;7137;Mayen-Koblenz;7;RP +9606;56751;Kollig;7137;Mayen-Koblenz;7;RP +9607;56751;Gering;7137;Mayen-Koblenz;7;RP +9608;56751;Einig;7137;Mayen-Koblenz;7;RP +9609;56753;Welling;7137;Mayen-Koblenz;7;RP +9610;56753;Naunheim;7137;Mayen-Koblenz;7;RP +9611;56753;Mertloch;7137;Mayen-Koblenz;7;RP +9612;56753;Trimbs;7137;Mayen-Koblenz;7;RP +9613;56753;Pillig;7137;Mayen-Koblenz;7;RP +9614;56754;Binningen;7135;Cochem-Zell;7;RP +9615;56754;Roes;7135;Cochem-Zell;7;RP +9616;56754;Brohl;7135;Cochem-Zell;7;RP +9617;56754;Forst (Eifel);7135;Cochem-Zell;7;RP +9618;56754;Duenfus;7135;Cochem-Zell;7;RP +9619;56754;Moentenich;7135;Cochem-Zell;7;RP +9620;56759;Laubach;7135;Cochem-Zell;7;RP +9621;56759;Eppenberg;7135;Cochem-Zell;7;RP +9622;56759;Kalenborn;7135;Cochem-Zell;7;RP +9623;56759;Kaisersesch;7135;Cochem-Zell;7;RP +9624;56759;Leienkaul;7135;Cochem-Zell;7;RP +9625;56761;Kaifenheim;7135;Cochem-Zell;7;RP +9626;56761;Brachtendorf;7135;Cochem-Zell;7;RP +9627;56761;Hauroth;7135;Cochem-Zell;7;RP +9628;56761;Eulgem;7135;Cochem-Zell;7;RP +9629;56761;Muellenbach;7135;Cochem-Zell;7;RP +9630;56761;Urmersbach;7135;Cochem-Zell;7;RP +9631;56761;Masburg;7135;Cochem-Zell;7;RP +9632;56761;Zettingen;7135;Cochem-Zell;7;RP +9633;56761;Hambuch;7135;Cochem-Zell;7;RP +9634;56761;Gamlen;7135;Cochem-Zell;7;RP +9635;56761;Duengenheim;7135;Cochem-Zell;7;RP +9636;56766;Berenbach;7233;Daun;7;RP +9637;56766;Filz;7135;Cochem-Zell;7;RP +9638;56766;Auderath;7135;Cochem-Zell;7;RP +9639;56766;Ulmen;7135;Cochem-Zell;7;RP +9640;56766;Horperath;7233;Daun;7;RP +9641;56767;Hoechstberg;7233;Daun;7;RP +9642;56767;Mosbruch;7233;Daun;7;RP +9643;56767;Sassen;7233;Daun;7;RP +9644;56767;Koetterichen;7233;Daun;7;RP +9645;56767;Gunderath;7233;Daun;7;RP +9646;56767;Lirstal;7233;Daun;7;RP +9647;56767;Kaperich;7233;Daun;7;RP +9648;56767;Kolverath;7233;Daun;7;RP +9649;56767;Oberelz;7233;Daun;7;RP +9650;56767;Uersfeld;7233;Daun;7;RP +9651;56767;Uess;7233;Daun;7;RP +9652;56769;Arbach;7233;Daun;7;RP +9653;56769;Retterath;7233;Daun;7;RP +9654;56769;Mannebach;7233;Daun;7;RP +9655;56769;Bereborn;7233;Daun;7;RP +9656;56812;Valwig;7135;Cochem-Zell;7;RP +9657;56812;Cochem;7135;Cochem-Zell;7;RP +9658;56812;Dohr;7135;Cochem-Zell;7;RP +9659;56814;Bremm;7135;Cochem-Zell;7;RP +9660;56814;Ediger-Eller;7135;Cochem-Zell;7;RP +9661;56814;Wirfus;7135;Cochem-Zell;7;RP +9662;56814;Greimersburg;7135;Cochem-Zell;7;RP +9663;56814;Bruttig-Fankel;7135;Cochem-Zell;7;RP +9664;56814;Landkern;7135;Cochem-Zell;7;RP +9665;56814;Ernst;7135;Cochem-Zell;7;RP +9666;56814;Illerich;7135;Cochem-Zell;7;RP +9667;56814;Beilstein;7135;Cochem-Zell;7;RP +9668;56814;Faid;7135;Cochem-Zell;7;RP +9669;56818;Klotten;7135;Cochem-Zell;7;RP +9670;56820;Senheim-Senhals;7135;Cochem-Zell;7;RP +9671;56820;Briedern;7135;Cochem-Zell;7;RP +9672;56820;Mesenich;7135;Cochem-Zell;7;RP +9673;56820;Nehren;7135;Cochem-Zell;7;RP +9674;56821;Ellenz-Poltersdorf;7135;Cochem-Zell;7;RP +9675;56823;Buechel;7135;Cochem-Zell;7;RP +9676;56825;Urschmitt;7135;Cochem-Zell;7;RP +9677;56825;Gevenich;7135;Cochem-Zell;7;RP +9678;56825;Schmitt;7135;Cochem-Zell;7;RP +9679;56825;Gillenbeuren;7135;Cochem-Zell;7;RP +9680;56825;Weiler;7135;Cochem-Zell;7;RP +9681;56825;Kliding;7135;Cochem-Zell;7;RP +9682;56825;Beuren;7135;Cochem-Zell;7;RP +9683;56826;Lutzerath;7135;Cochem-Zell;7;RP +9684;56826;Wollmerath;7135;Cochem-Zell;7;RP +9685;56826;Wagenhausen;7135;Cochem-Zell;7;RP +9686;56828;Alflen;7135;Cochem-Zell;7;RP +9687;56829;Pommern;7135;Cochem-Zell;7;RP +9688;56829;Brieden;7135;Cochem-Zell;7;RP +9689;56829;Kail;7135;Cochem-Zell;7;RP +9690;56841;Traben-Trarbach;7231;Bernkastel-Wittlich;7;RP +9691;56843;Starkenburg;7231;Bernkastel-Wittlich;7;RP +9692;56843;Loetzbeuren;7231;Bernkastel-Wittlich;7;RP +9693;56843;Irmenach;7231;Bernkastel-Wittlich;7;RP +9694;56843;Burg (Mosel);7231;Bernkastel-Wittlich;7;RP +9695;56850;Enkirch;7231;Bernkastel-Wittlich;7;RP +9696;56850;Raversbeuren;7140;Rhein-Hunsrueck-Kreis;7;RP +9697;56850;Hahn;7140;Rhein-Hunsrueck-Kreis;7;RP +9698;56856;Zell;7135;Cochem-Zell;7;RP +9699;56858;Peterswald-Loeffelscheid;7135;Cochem-Zell;7;RP +9700;56858;Roedelhausen;7140;Rhein-Hunsrueck-Kreis;7;RP +9701;56858;Wuerrich;7140;Rhein-Hunsrueck-Kreis;7;RP +9702;56858;Altlay;7135;Cochem-Zell;7;RP +9703;56858;Liesenich;7135;Cochem-Zell;7;RP +9704;56858;Grenderich;7135;Cochem-Zell;7;RP +9705;56858;Mittelstrimmig;7135;Cochem-Zell;7;RP +9706;56858;Neef;7135;Cochem-Zell;7;RP +9707;56858;Sosberg;7135;Cochem-Zell;7;RP +9708;56858;Tellig;7135;Cochem-Zell;7;RP +9709;56858;Altstrimmig;7135;Cochem-Zell;7;RP +9710;56858;Sankt Aldegund;7135;Cochem-Zell;7;RP +9711;56858;Forst (Hunsrueck);7135;Cochem-Zell;7;RP +9712;56858;Belg;7140;Rhein-Hunsrueck-Kreis;7;RP +9713;56858;Haserich;7135;Cochem-Zell;7;RP +9714;56859;Alf;7135;Cochem-Zell;7;RP +9715;56859;Bullay;7135;Cochem-Zell;7;RP +9716;56861;Reil;7231;Bernkastel-Wittlich;7;RP +9717;56862;Puenderich;7135;Cochem-Zell;7;RP +9718;56864;Bad Bertrich;7135;Cochem-Zell;7;RP +9719;56865;Schauren;7135;Cochem-Zell;7;RP +9720;56865;Moritzheim;7135;Cochem-Zell;7;RP +9721;56865;Panzweiler;7135;Cochem-Zell;7;RP +9722;56865;Blankenrath;7135;Cochem-Zell;7;RP +9723;56865;Hesweiler;7135;Cochem-Zell;7;RP +9724;56865;Walhausen;7135;Cochem-Zell;7;RP +9725;56865;Reidenhausen;7135;Cochem-Zell;7;RP +9726;56867;Briedel;7135;Cochem-Zell;7;RP +9727;56869;Mastershausen;7140;Rhein-Hunsrueck-Kreis;7;RP +9728;57072;Siegen;5970;Siegen-Wittgenstein;5;NW +9729;57074;Siegen;5970;Siegen-Wittgenstein;5;NW +9730;57076;Siegen;5970;Siegen-Wittgenstein;5;NW +9731;57078;Siegen;5970;Siegen-Wittgenstein;5;NW +9732;57080;Siegen;5970;Siegen-Wittgenstein;5;NW +9733;57223;Kreuztal;5970;Siegen-Wittgenstein;5;NW +9734;57234;Wilnsdorf;5970;Siegen-Wittgenstein;5;NW +9735;57250;Netphen;5970;Siegen-Wittgenstein;5;NW +9736;57258;Freudenberg;5970;Siegen-Wittgenstein;5;NW +9737;57271;Hilchenbach;5970;Siegen-Wittgenstein;5;NW +9738;57290;Neunkirchen;5970;Siegen-Wittgenstein;5;NW +9739;57299;Burbach;5970;Siegen-Wittgenstein;5;NW +9740;57319;Bad Berleburg;5970;Siegen-Wittgenstein;5;NW +9741;57334;Bad Laasphe;5970;Siegen-Wittgenstein;5;NW +9742;57339;Erndtebrueck;5970;Siegen-Wittgenstein;5;NW +9743;57368;Lennestadt;5966;Olpe;5;NW +9744;57392;Schmallenberg;5958;Hochsauerlandkreis;5;NW +9745;57399;Kirchhundem;5966;Olpe;5;NW +9746;57413;Finnentrop;5966;Olpe;5;NW +9747;57439;Attendorn;5966;Olpe;5;NW +9748;57462;Olpe;5966;Olpe;5;NW +9749;57482;Wenden;5966;Olpe;5;NW +9750;57489;Drolshagen;5966;Olpe;5;NW +9751;57518;Steineroth;7132;Altenkirchen (Westerwald);7;RP +9752;57518;Alsdorf;7132;Altenkirchen (Westerwald);7;RP +9753;57518;Betzdorf;7132;Altenkirchen (Westerwald);7;RP +9754;57520;Derschen;7132;Altenkirchen (Westerwald);7;RP +9755;57520;Molzhain;7132;Altenkirchen (Westerwald);7;RP +9756;57520;Mauden;7132;Altenkirchen (Westerwald);7;RP +9757;57520;Friedewald;7132;Altenkirchen (Westerwald);7;RP +9758;57520;Schutzbach;7132;Altenkirchen (Westerwald);7;RP +9759;57520;Kausen;7132;Altenkirchen (Westerwald);7;RP +9760;57520;Dickendorf;7132;Altenkirchen (Westerwald);7;RP +9761;57520;Langenbach bei Kirburg;7143;Westerwaldkreis;7;RP +9762;57520;Niederdreisbach;7132;Altenkirchen (Westerwald);7;RP +9763;57520;Steinebach/Sieg;7132;Altenkirchen (Westerwald);7;RP +9764;57520;Emmerzhausen;7132;Altenkirchen (Westerwald);7;RP +9765;57520;Neunkhausen;7143;Westerwaldkreis;7;RP +9766;57520;Rosenheim;7132;Altenkirchen (Westerwald);7;RP +9767;57520;Gruenebach;7132;Altenkirchen (Westerwald);7;RP +9768;57537;Mittelhof;7132;Altenkirchen (Westerwald);7;RP +9769;57537;Wissen;7132;Altenkirchen (Westerwald);7;RP +9770;57537;Forst;7132;Altenkirchen (Westerwald);7;RP +9771;57539;Bitzen;7132;Altenkirchen (Westerwald);7;RP +9772;57539;Bruchertseifen;7132;Altenkirchen (Westerwald);7;RP +9773;57539;Selbach;7132;Altenkirchen (Westerwald);7;RP +9774;57539;Etzbach;7132;Altenkirchen (Westerwald);7;RP +9775;57539;Hoevels;7132;Altenkirchen (Westerwald);7;RP +9776;57539;Roth;7132;Altenkirchen (Westerwald);7;RP +9777;57539;Breitscheidt;7132;Altenkirchen (Westerwald);7;RP +9778;57539;Fuerthen;7132;Altenkirchen (Westerwald);7;RP +9779;57548;Kirchen;7132;Altenkirchen (Westerwald);7;RP +9780;57555;Mudersbach;7132;Altenkirchen (Westerwald);7;RP +9781;57555;Brachbach;7132;Altenkirchen (Westerwald);7;RP +9782;57562;Herdorf;7132;Altenkirchen (Westerwald);7;RP +9783;57567;Daaden;7132;Altenkirchen (Westerwald);7;RP +9784;57572;Niederfischbach;7132;Altenkirchen (Westerwald);7;RP +9785;57572;Harbach;7132;Altenkirchen (Westerwald);7;RP +9786;57577;Seelbach;7132;Altenkirchen (Westerwald);7;RP +9787;57577;Hamm;7132;Altenkirchen (Westerwald);7;RP +9788;57578;Elkenroth;7132;Altenkirchen (Westerwald);7;RP +9789;57580;Elben;7132;Altenkirchen (Westerwald);7;RP +9790;57580;Fensdorf;7132;Altenkirchen (Westerwald);7;RP +9791;57580;Gebhardshain;7132;Altenkirchen (Westerwald);7;RP +9792;57581;Katzwinkel;7132;Altenkirchen (Westerwald);7;RP +9793;57583;Moerlen;7143;Westerwaldkreis;7;RP +9794;57583;Nauroth;7132;Altenkirchen (Westerwald);7;RP +9795;57584;Wallmenroth;7132;Altenkirchen (Westerwald);7;RP +9796;57584;Scheuerfeld;7132;Altenkirchen (Westerwald);7;RP +9797;57586;Weitefeld;7132;Altenkirchen (Westerwald);7;RP +9798;57587;Birken-Honigsessen;7132;Altenkirchen (Westerwald);7;RP +9799;57589;Niederirsen;7132;Altenkirchen (Westerwald);7;RP +9800;57589;Birkenbeul;7132;Altenkirchen (Westerwald);7;RP +9801;57589;Pracht;7132;Altenkirchen (Westerwald);7;RP +9802;57610;Altenkirchen;7132;Altenkirchen (Westerwald);7;RP +9803;57610;Ingelbach;7132;Altenkirchen (Westerwald);7;RP +9804;57610;Michelbach;7132;Altenkirchen (Westerwald);7;RP +9805;57610;Bachenberg;7132;Altenkirchen (Westerwald);7;RP +9806;57610;Gieleroth;7132;Altenkirchen (Westerwald);7;RP +9807;57610;Almersbach;7132;Altenkirchen (Westerwald);7;RP +9808;57612;Kroppach;7143;Westerwaldkreis;7;RP +9809;57612;Hilgenroth;7132;Altenkirchen (Westerwald);7;RP +9810;57612;Volkerzen;7132;Altenkirchen (Westerwald);7;RP +9811;57612;Racksen;7132;Altenkirchen (Westerwald);7;RP +9812;57612;Isert;7132;Altenkirchen (Westerwald);7;RP +9813;57612;Hemmelzen;7132;Altenkirchen (Westerwald);7;RP +9814;57612;Eichelhardt;7132;Altenkirchen (Westerwald);7;RP +9815;57612;Obererbach;7132;Altenkirchen (Westerwald);7;RP +9816;57612;lsen;7132;Altenkirchen (Westerwald);7;RP +9817;57612;Birnbach;7132;Altenkirchen (Westerwald);7;RP +9818;57612;Helmenzen;7132;Altenkirchen (Westerwald);7;RP +9819;57612;Helmeroth;7132;Altenkirchen (Westerwald);7;RP +9820;57612;Kettenhausen;7132;Altenkirchen (Westerwald);7;RP +9821;57612;Idelberg;7132;Altenkirchen (Westerwald);7;RP +9822;57612;Giesenhausen;7143;Westerwaldkreis;7;RP +9823;57612;Heupelzen;7132;Altenkirchen (Westerwald);7;RP +9824;57612;Busenhausen;7132;Altenkirchen (Westerwald);7;RP +9825;57614;Steimel;7138;Neuwied;7;RP +9826;57614;Ratzert;7138;Neuwied;7;RP +9827;57614;Woldert;7138;Neuwied;7;RP +9828;57614;Fluterschen;7132;Altenkirchen (Westerwald);7;RP +9829;57614;Berod bei Hoechstenbach;7132;Altenkirchen (Westerwald);7;RP +9830;57614;Niederwambach;7138;Neuwied;7;RP +9831;57614;Wahlrod;7143;Westerwaldkreis;7;RP +9832;57614;Borod;7143;Westerwaldkreis;7;RP +9833;57614;Mudenbach;7143;Westerwaldkreis;7;RP +9834;57614;Oberwambach;7132;Altenkirchen (Westerwald);7;RP +9835;57614;Stuerzelbach;7132;Altenkirchen (Westerwald);7;RP +9836;57627;Gehlert;7143;Westerwaldkreis;7;RP +9837;57627;Heuzert;7143;Westerwaldkreis;7;RP +9838;57627;Marzhausen;7143;Westerwaldkreis;7;RP +9839;57627;Astert;7143;Westerwaldkreis;7;RP +9840;57627;Hachenburg;7143;Westerwaldkreis;7;RP +9841;57629;Limbach;7143;Westerwaldkreis;7;RP +9842;57629;Linden;7143;Westerwaldkreis;7;RP +9843;57629;Steinebach an der Wied;7143;Westerwaldkreis;7;RP +9844;57629;Dreifelden;7143;Westerwaldkreis;7;RP +9845;57629;Heimborn;7143;Westerwaldkreis;7;RP +9846;57629;Kirburg;7143;Westerwaldkreis;7;RP +9847;57629;Streithausen;7143;Westerwaldkreis;7;RP +9848;57629;Norken;7143;Westerwaldkreis;7;RP +9849;57629;Atzelgift;7143;Westerwaldkreis;7;RP +9850;57629;Merkelbach;7143;Westerwaldkreis;7;RP +9851;57629;Luckenbach;7143;Westerwaldkreis;7;RP +9852;57629;Wied;7143;Westerwaldkreis;7;RP +9853;57629;Malberg;7132;Altenkirchen (Westerwald);7;RP +9854;57629;Lochum;7143;Westerwaldkreis;7;RP +9855;57629;Moersbach;7143;Westerwaldkreis;7;RP +9856;57629;Stein-Wingert;7143;Westerwaldkreis;7;RP +9857;57629;Kundert;7143;Westerwaldkreis;7;RP +9858;57629;Mueschenbach;7143;Westerwaldkreis;7;RP +9859;57629;Hoechstenbach;7143;Westerwaldkreis;7;RP +9860;57632;Schuerdt;7132;Altenkirchen (Westerwald);7;RP +9861;57632;Flammersfeld;7132;Altenkirchen (Westerwald);7;RP +9862;57632;Ziegenhain;7132;Altenkirchen (Westerwald);7;RP +9863;57632;Burglahr;7132;Altenkirchen (Westerwald);7;RP +9864;57632;Rott;7132;Altenkirchen (Westerwald);7;RP +9865;57632;Reiferscheid;7132;Altenkirchen (Westerwald);7;RP +9866;57632;Seelbach;7132;Altenkirchen (Westerwald);7;RP +9867;57632;Eichen;7132;Altenkirchen (Westerwald);7;RP +9868;57632;Giershausen;7132;Altenkirchen (Westerwald);7;RP +9869;57632;Seifen;7132;Altenkirchen (Westerwald);7;RP +9870;57632;Walterschen;7132;Altenkirchen (Westerwald);7;RP +9871;57632;Eulenberg;7132;Altenkirchen (Westerwald);7;RP +9872;57632;Orfgen;7132;Altenkirchen (Westerwald);7;RP +9873;57632;Kescheid;7132;Altenkirchen (Westerwald);7;RP +9874;57632;Berzhausen;7132;Altenkirchen (Westerwald);7;RP +9875;57632;Peterslahr;7132;Altenkirchen (Westerwald);7;RP +9876;57635;Rettersen;7132;Altenkirchen (Westerwald);7;RP +9877;57635;Hirz-Maulsbach;7132;Altenkirchen (Westerwald);7;RP +9878;57635;Ersfeld;7132;Altenkirchen (Westerwald);7;RP +9879;57635;Kircheib;7132;Altenkirchen (Westerwald);7;RP +9880;57635;Werkhausen;7132;Altenkirchen (Westerwald);7;RP +9881;57635;Kraam;7132;Altenkirchen (Westerwald);7;RP +9882;57635;Weyerbusch;7132;Altenkirchen (Westerwald);7;RP +9883;57635;Mehren;7132;Altenkirchen (Westerwald);7;RP +9884;57635;Hasselbach;7132;Altenkirchen (Westerwald);7;RP +9885;57635;Fiersbach;7132;Altenkirchen (Westerwald);7;RP +9886;57635;Oberirsen;7132;Altenkirchen (Westerwald);7;RP +9887;57635;Forstmehren;7132;Altenkirchen (Westerwald);7;RP +9888;57635;Woelmersen;7132;Altenkirchen (Westerwald);7;RP +9889;57636;Soerth;7132;Altenkirchen (Westerwald);7;RP +9890;57636;Mammelzen;7132;Altenkirchen (Westerwald);7;RP +9891;57638;Neitersen;7132;Altenkirchen (Westerwald);7;RP +9892;57638;Obernau;7132;Altenkirchen (Westerwald);7;RP +9893;57638;Schoeneberg;7132;Altenkirchen (Westerwald);7;RP +9894;57639;Oberdreis;7138;Neuwied;7;RP +9895;57639;Rodenbach;7138;Neuwied;7;RP +9896;57641;Oberlahr;7132;Altenkirchen (Westerwald);7;RP +9897;57642;Alpenrod;7143;Westerwaldkreis;7;RP +9898;57644;Winkelbach;7143;Westerwaldkreis;7;RP +9899;57644;Hattert;7143;Westerwaldkreis;7;RP +9900;57644;Welkenbach;7143;Westerwaldkreis;7;RP +9901;57645;Nister;7143;Westerwaldkreis;7;RP +9902;57647;Nistertal;7143;Westerwaldkreis;7;RP +9903;57647;Enspel;7143;Westerwaldkreis;7;RP +9904;57648;Unnau;7143;Westerwaldkreis;7;RP +9905;57648;Boelsberg;7143;Westerwaldkreis;7;RP +9906;58089;Hagen;5914;Hagen, Stadt;5;NW +9907;58091;Hagen;5914;Hagen, Stadt;5;NW +9908;58093;Hagen;5914;Hagen, Stadt;5;NW +9909;58095;Hagen;5914;Hagen, Stadt;5;NW +9910;58097;Hagen;5914;Hagen, Stadt;5;NW +9911;58099;Hagen;5914;Hagen, Stadt;5;NW +9912;58119;Hagen;5914;Hagen, Stadt;5;NW +9913;58135;Hagen;5914;Hagen, Stadt;5;NW +9914;58239;Schwerte;5978;Unna;5;NW +9915;58256;Ennepetal;5954;Ennepe-Ruhr-Kreis;5;NW +9916;58285;Gevelsberg;5954;Ennepe-Ruhr-Kreis;5;NW +9917;58300;Wetter (Ruhr);5954;Ennepe-Ruhr-Kreis;5;NW +9918;58313;Herdecke;5954;Ennepe-Ruhr-Kreis;5;NW +9919;58332;Schwelm;5954;Ennepe-Ruhr-Kreis;5;NW +9920;58339;Breckerfeld;5954;Ennepe-Ruhr-Kreis;5;NW +9921;58452;Witten;5954;Ennepe-Ruhr-Kreis;5;NW +9922;58453;Witten;5954;Ennepe-Ruhr-Kreis;5;NW +9923;58454;Witten;5954;Ennepe-Ruhr-Kreis;5;NW +9924;58455;Witten;5954;Ennepe-Ruhr-Kreis;5;NW +9925;58456;Witten;5954;Ennepe-Ruhr-Kreis;5;NW +9926;58507;Luedenscheid;5962;Maerkischer Kreis;5;NW +9927;58509;Luedenscheid;5962;Maerkischer Kreis;5;NW +9928;58511;Luedenscheid;5962;Maerkischer Kreis;5;NW +9929;58513;Luedenscheid;5962;Maerkischer Kreis;5;NW +9930;58515;Luedenscheid;5962;Maerkischer Kreis;5;NW +9931;58540;Meinerzhagen;5962;Maerkischer Kreis;5;NW +9932;58553;Halver;5962;Maerkischer Kreis;5;NW +9933;58566;Kierspe;5962;Maerkischer Kreis;5;NW +9934;58579;Schalksmuehle;5962;Maerkischer Kreis;5;NW +9935;58636;Iserlohn;5962;Maerkischer Kreis;5;NW +9936;58638;Iserlohn;5962;Maerkischer Kreis;5;NW +9937;58640;Iserlohn;5962;Maerkischer Kreis;5;NW +9938;58642;Iserlohn;5962;Maerkischer Kreis;5;NW +9939;58644;Iserlohn;5962;Maerkischer Kreis;5;NW +9940;58675;Hemer;5962;Maerkischer Kreis;5;NW +9941;58706;Menden;5962;Maerkischer Kreis;5;NW +9942;58708;Menden;5962;Maerkischer Kreis;5;NW +9943;58710;Menden;5962;Maerkischer Kreis;5;NW +9944;58730;Froendenberg;5978;Unna;5;NW +9945;58739;Wickede;5974;Soest;5;NW +9946;58762;Altena;5962;Maerkischer Kreis;5;NW +9947;58769;Nachrodt-Wiblingwerde;5962;Maerkischer Kreis;5;NW +9948;58791;Werdohl;5962;Maerkischer Kreis;5;NW +9949;58802;Balve;5962;Maerkischer Kreis;5;NW +9950;58809;Neuenrade;5962;Maerkischer Kreis;5;NW +9951;58840;Plettenberg;5962;Maerkischer Kreis;5;NW +9952;58849;Herscheid;5962;Maerkischer Kreis;5;NW +9953;59063;Hamm;5915;Hamm, Stadt;5;NW +9954;59065;Hamm;5915;Hamm, Stadt;5;NW +9955;59067;Hamm;5915;Hamm, Stadt;5;NW +9956;59069;Hamm;5915;Hamm, Stadt;5;NW +9957;59071;Hamm;5915;Hamm, Stadt;5;NW +9958;59073;Hamm;5915;Hamm, Stadt;5;NW +9959;59075;Hamm;5915;Hamm, Stadt;5;NW +9960;59077;Hamm;5915;Hamm, Stadt;5;NW +9961;59174;Kamen;5978;Unna;5;NW +9962;59192;Bergkamen;5978;Unna;5;NW +9963;59199;Boenen;5978;Unna;5;NW +9964;59227;Ahlen;5570;Warendorf;5;NW +9965;59229;Ahlen;5570;Warendorf;5;NW +9966;59269;Beckum;5570;Warendorf;5;NW +9967;59302;Oelde;5570;Warendorf;5;NW +9968;59320;Ennigerloh;5570;Warendorf;5;NW +9969;59329;Wadersloh;5570;Warendorf;5;NW +9970;59348;Luedinghausen;5558;Coesfeld;5;NW +9971;59368;Werne;5978;Unna;5;NW +9972;59379;Selm;5978;Unna;5;NW +9973;59387;Ascheberg;5558;Coesfeld;5;NW +9974;59394;Nordkirchen;5558;Coesfeld;5;NW +9975;59399;Olfen;5558;Coesfeld;5;NW +9976;59423;Unna;5978;Unna;5;NW +9977;59425;Unna;5978;Unna;5;NW +9978;59427;Unna;5978;Unna;5;NW +9979;59439;Holzwickede;5978;Unna;5;NW +9980;59457;Werl;5974;Soest;5;NW +9981;59469;Ense;5974;Soest;5;NW +9982;59494;Soest;5974;Soest;5;NW +9983;59505;Bad Sassendorf;5974;Soest;5;NW +9984;59510;Lippetal;5974;Soest;5;NW +9985;59514;Welver;5974;Soest;5;NW +9986;59519;Moehnesee;5974;Soest;5;NW +9987;59555;Lippstadt;5974;Soest;5;NW +9988;59556;Lippstadt;5974;Soest;5;NW +9989;59557;Lippstadt;5974;Soest;5;NW +9990;59558;Lippstadt;5974;Soest;5;NW +9991;59581;Warstein;5974;Soest;5;NW +9992;59590;Geseke;5974;Soest;5;NW +9993;59597;Erwitte;5974;Soest;5;NW +9994;59602;Ruethen;5974;Soest;5;NW +9995;59609;Anroechte;5974;Soest;5;NW +9996;59755;Arnsberg;5958;Hochsauerlandkreis;5;NW +9997;59757;Arnsberg;5958;Hochsauerlandkreis;5;NW +9998;59759;Arnsberg;5958;Hochsauerlandkreis;5;NW +9999;59821;Arnsberg;5958;Hochsauerlandkreis;5;NW +10000;59823;Arnsberg;5958;Hochsauerlandkreis;5;NW +10001;59846;Sundern;5958;Hochsauerlandkreis;5;NW +10002;59872;Meschede;5958;Hochsauerlandkreis;5;NW +10003;59889;Eslohe;5958;Hochsauerlandkreis;5;NW +10004;59909;Bestwig;5958;Hochsauerlandkreis;5;NW +10005;59929;Brilon;5958;Hochsauerlandkreis;5;NW +10006;59939;Olsberg;5958;Hochsauerlandkreis;5;NW +10007;59955;Winterberg;5958;Hochsauerlandkreis;5;NW +10008;59964;Medebach;5958;Hochsauerlandkreis;5;NW +10009;59969;Hallenberg;5958;Hochsauerlandkreis;5;NW +10010;59969;Bromskirchen;6635;Waldeck-Frankenberg;6;HE +10011;60311;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10012;60313;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10013;60314;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10014;60316;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10015;60318;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10016;60320;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10017;60322;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10018;60323;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10019;60325;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10020;60326;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10021;60327;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10022;60329;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10023;60385;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10024;60386;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10025;60388;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10026;60389;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10027;60431;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10028;60433;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10029;60435;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10030;60437;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10031;60439;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10032;60486;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10033;60487;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10034;60488;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10035;60489;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10036;60528;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10037;60529;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10038;60549;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10039;60594;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10040;60596;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10041;60598;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10042;60599;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10043;61118;Bad Vilbel;6440;Wetteraukreis;6;HE +10044;61130;Nidderau;6435;Main-Kinzig-Kreis;6;HE +10045;61137;Schoeneck;6435;Main-Kinzig-Kreis;6;HE +10046;61138;Niederdorfelden;6435;Main-Kinzig-Kreis;6;HE +10047;61169;Friedberg;6440;Wetteraukreis;6;HE +10048;61184;Karben;6440;Wetteraukreis;6;HE +10049;61191;Rosbach vor der Hoehe;6440;Wetteraukreis;6;HE +10050;61194;Niddatal;6440;Wetteraukreis;6;HE +10051;61197;Florstadt;6440;Wetteraukreis;6;HE +10052;61200;Woelfersheim;6440;Wetteraukreis;6;HE +10053;61203;Reichelsheim;6440;Wetteraukreis;6;HE +10054;61206;Woellstadt;6440;Wetteraukreis;6;HE +10055;61209;Echzell;6440;Wetteraukreis;6;HE +10056;61231;Bad Nauheim;6440;Wetteraukreis;6;HE +10057;61239;Ober-Moerlen;6440;Wetteraukreis;6;HE +10058;61250;Usingen;6434;Hochtaunuskreis;6;HE +10059;61267;Neu-Anspach;6434;Hochtaunuskreis;6;HE +10060;61273;Wehrheim;6434;Hochtaunuskreis;6;HE +10061;61276;Weilrod;6434;Hochtaunuskreis;6;HE +10062;61279;Graevenwiesbach;6434;Hochtaunuskreis;6;HE +10063;61348;Bad Homburg vor der Hoehe;6434;Hochtaunuskreis;6;HE +10064;61350;Bad Homburg vor der Hoehe;6434;Hochtaunuskreis;6;HE +10065;61352;Bad Homburg vor der Hoehe;6434;Hochtaunuskreis;6;HE +10066;61381;Friedrichsdorf;6434;Hochtaunuskreis;6;HE +10067;61389;Schmitten;6434;Hochtaunuskreis;6;HE +10068;61440;Oberursel;6434;Hochtaunuskreis;6;HE +10069;61449;Steinbach (Taunus);6434;Hochtaunuskreis;6;HE +10070;61462;Koenigstein im Taunus;6434;Hochtaunuskreis;6;HE +10071;61476;Kronberg im Taunus;6434;Hochtaunuskreis;6;HE +10072;61479;Glashuetten;6434;Hochtaunuskreis;6;HE +10073;63065;Offenbach;6438;Offenbach;6;HE +10074;63067;Offenbach;6438;Offenbach;6;HE +10075;63069;Offenbach;6438;Offenbach;6;HE +10076;63071;Offenbach;6438;Offenbach;6;HE +10077;63073;Offenbach;6438;Offenbach;6;HE +10078;63075;Offenbach;6438;Offenbach;6;HE +10079;63110;Rodgau;6438;Offenbach;6;HE +10080;63128;Dietzenbach;6438;Offenbach;6;HE +10081;63150;Heusenstamm;6438;Offenbach;6;HE +10082;63165;Muehlheim;6438;Offenbach;6;HE +10083;63179;Obertshausen;6438;Offenbach;6;HE +10084;63225;Langen;6438;Offenbach;6;HE +10085;63263;Neu-Isenburg;6438;Offenbach;6;HE +10086;63303;Dreieich;6438;Offenbach;6;HE +10087;63322;Roedermark;6438;Offenbach;6;HE +10088;63329;Egelsbach;6438;Offenbach;6;HE +10089;63450;Hanau;6435;Main-Kinzig-Kreis;6;HE +10090;63452;Hanau;6435;Main-Kinzig-Kreis;6;HE +10091;63454;Hanau;6435;Main-Kinzig-Kreis;6;HE +10092;63456;Hanau;6435;Main-Kinzig-Kreis;6;HE +10093;63457;Hanau;6435;Main-Kinzig-Kreis;6;HE +10094;63477;Maintal;6435;Main-Kinzig-Kreis;6;HE +10095;63486;Bruchkoebel;6435;Main-Kinzig-Kreis;6;HE +10096;63500;Seligenstadt;6438;Offenbach;6;HE +10097;63505;Langenselbold;6435;Main-Kinzig-Kreis;6;HE +10098;63512;Hainburg;6438;Offenbach;6;HE +10099;63517;Rodenbach;6435;Main-Kinzig-Kreis;6;HE +10100;63526;Erlensee;6435;Main-Kinzig-Kreis;6;HE +10101;63533;Mainhausen;6438;Offenbach;6;HE +10102;63538;Grosskrotzenburg;6435;Main-Kinzig-Kreis;6;HE +10103;63543;Neuberg;6435;Main-Kinzig-Kreis;6;HE +10104;63546;Hammersbach;6435;Main-Kinzig-Kreis;6;HE +10105;63549;Ronneburg;6435;Main-Kinzig-Kreis;6;HE +10106;63571;Gelnhausen;6435;Main-Kinzig-Kreis;6;HE +10107;63579;Freigericht;6435;Main-Kinzig-Kreis;6;HE +10108;63584;Gruendau;6435;Main-Kinzig-Kreis;6;HE +10109;63589;Linsengericht;6435;Main-Kinzig-Kreis;6;HE +10110;63594;Hasselroth;6435;Main-Kinzig-Kreis;6;HE +10111;63599;Biebergemuend;6435;Main-Kinzig-Kreis;6;HE +10112;63607;Waechtersbach;6435;Main-Kinzig-Kreis;6;HE +10113;63619;Bad Orb;6435;Main-Kinzig-Kreis;6;HE +10114;63628;Bad Soden-Salmuenster;6435;Main-Kinzig-Kreis;6;HE +10115;63633;Birstein;6435;Main-Kinzig-Kreis;6;HE +10116;63636;Brachttal;6435;Main-Kinzig-Kreis;6;HE +10117;63637;Jossgrund;6435;Main-Kinzig-Kreis;6;HE +10118;63639;Floersbachtal;6435;Main-Kinzig-Kreis;6;HE +10119;63654;Buedingen;6440;Wetteraukreis;6;HE +10120;63667;Nidda;6440;Wetteraukreis;6;HE +10121;63674;Altenstadt;6440;Wetteraukreis;6;HE +10122;63679;Schotten;6535;Vogelsbergkreis;6;HE +10123;63683;Ortenberg;6440;Wetteraukreis;6;HE +10124;63688;Gedern;6440;Wetteraukreis;6;HE +10125;63691;Ranstadt;6440;Wetteraukreis;6;HE +10126;63694;Limeshain;6440;Wetteraukreis;6;HE +10127;63695;Glauburg;6440;Wetteraukreis;6;HE +10128;63697;Hirzenhain;6440;Wetteraukreis;6;HE +10129;63699;Kefenrod;6440;Wetteraukreis;6;HE +10130;63739;Aschaffenburg;9661;Aschaffenburg, Stadt;9;BY +10131;63741;Aschaffenburg;9661;Aschaffenburg, Stadt;9;BY +10132;63743;Aschaffenburg;9661;Aschaffenburg, Stadt;9;BY +10133;63755;Alzenau in Unterfranken;9671;Aschaffenburg;9;BY +10134;63762;Grossostheim;9671;Aschaffenburg;9;BY +10135;63768;Hoesbach;9671;Aschaffenburg;9;BY +10136;63773;Goldbach;9671;Aschaffenburg;9;BY +10137;63776;Moembris;9671;Aschaffenburg;9;BY +10138;63785;Obernburg am Main;9676;Miltenberg;9;BY +10139;63791;Karlstein am Main;9671;Aschaffenburg;9;BY +10140;63796;Kahl am Main;9671;Aschaffenburg;9;BY +10141;63801;Kleinostheim;9671;Aschaffenburg;9;BY +10142;63808;Haibach;9671;Aschaffenburg;9;BY +10143;63811;Stockstadt am Main;9671;Aschaffenburg;9;BY +10144;63814;Mainaschaff;9671;Aschaffenburg;9;BY +10145;63820;Elsenfeld;9676;Miltenberg;9;BY +10146;63825;Westerngrund;9671;Aschaffenburg;9;BY +10147;63825;Sommerkahl;9671;Aschaffenburg;9;BY +10148;63825;Blankenbach;9671;Aschaffenburg;9;BY +10149;63825;Schoellkrippen;9671;Aschaffenburg;9;BY +10150;63826;Geiselbach;9671;Aschaffenburg;9;BY +10151;63828;Kleinkahl;9671;Aschaffenburg;9;BY +10152;63829;Krombach;9671;Aschaffenburg;9;BY +10153;63831;Wiesen;9671;Aschaffenburg;9;BY +10154;63834;Sulzbach am Main;9676;Miltenberg;9;BY +10155;63839;Kleinwallstadt;9676;Miltenberg;9;BY +10156;63840;Hausen;9676;Miltenberg;9;BY +10157;63843;Niedernberg;9676;Miltenberg;9;BY +10158;63846;Laufach;9671;Aschaffenburg;9;BY +10159;63849;Leidersbach;9676;Miltenberg;9;BY +10160;63853;Moemlingen;9676;Miltenberg;9;BY +10161;63856;Bessenbach;9671;Aschaffenburg;9;BY +10162;63857;Waldaschaff;9671;Aschaffenburg;9;BY +10163;63860;Rothenbuch;9671;Aschaffenburg;9;BY +10164;63863;Eschau;9676;Miltenberg;9;BY +10165;63864;Glattbach;9671;Aschaffenburg;9;BY +10166;63867;Johannesberg;9671;Aschaffenburg;9;BY +10167;63868;Grosswallstadt;9676;Miltenberg;9;BY +10168;63869;Heigenbruecken;9671;Aschaffenburg;9;BY +10169;63871;Heinrichsthal;9671;Aschaffenburg;9;BY +10170;63872;Heimbuchenthal;9671;Aschaffenburg;9;BY +10171;63874;Dammbach;9671;Aschaffenburg;9;BY +10172;63875;Mespelbrunn;9671;Aschaffenburg;9;BY +10173;63877;Sailauf;9671;Aschaffenburg;9;BY +10174;63879;Weibersbrunn;9671;Aschaffenburg;9;BY +10175;63897;Miltenberg;9676;Miltenberg;9;BY +10176;63906;Erlenbach am Main;9676;Miltenberg;9;BY +10177;63911;Klingenberg am Main;9676;Miltenberg;9;BY +10178;63916;Amorbach;9676;Miltenberg;9;BY +10179;63920;Grossheubach;9676;Miltenberg;9;BY +10180;63924;Kleinheubach;9676;Miltenberg;9;BY +10181;63924;Ruedenau;9676;Miltenberg;9;BY +10182;63925;Laudenbach;9676;Miltenberg;9;BY +10183;63927;Buergstadt;9676;Miltenberg;9;BY +10184;63928;Eichenbuehl;9676;Miltenberg;9;BY +10185;63930;Neunkirchen;9676;Miltenberg;9;BY +10186;63931;Kirchzell;9676;Miltenberg;9;BY +10187;63933;Moenchberg;9676;Miltenberg;9;BY +10188;63934;Roellbach;9676;Miltenberg;9;BY +10189;63936;Schneeberg;9676;Miltenberg;9;BY +10190;63937;Weilbach;9676;Miltenberg;9;BY +10191;63939;Woerth am Main;9676;Miltenberg;9;BY +10192;64283;Darmstadt;6411;Darmstadt, Stadt;6;HE +10193;64285;Darmstadt;6411;Darmstadt, Stadt;6;HE +10194;64287;Darmstadt;6411;Darmstadt, Stadt;6;HE +10195;64289;Darmstadt;6411;Darmstadt, Stadt;6;HE +10196;64291;Darmstadt;6411;Darmstadt, Stadt;6;HE +10197;64293;Darmstadt;6411;Darmstadt, Stadt;6;HE +10198;64295;Darmstadt;6411;Darmstadt, Stadt;6;HE +10199;64297;Darmstadt;6411;Darmstadt, Stadt;6;HE +10200;64319;Pfungstadt;6432;Darmstadt-Dieburg;6;HE +10201;64331;Weiterstadt;6432;Darmstadt-Dieburg;6;HE +10202;64342;Seeheim-Jugenheim;6432;Darmstadt-Dieburg;6;HE +10203;64347;Griesheim;6432;Darmstadt-Dieburg;6;HE +10204;64354;Reinheim;6432;Darmstadt-Dieburg;6;HE +10205;64367;Muehltal;6432;Darmstadt-Dieburg;6;HE +10206;64372;Ober-Ramstadt;6432;Darmstadt-Dieburg;6;HE +10207;64380;Rossdorf;6432;Darmstadt-Dieburg;6;HE +10208;64385;Reichelsheim;6437;Odenwaldkreis;6;HE +10209;64390;Erzhausen;6432;Darmstadt-Dieburg;6;HE +10210;64395;Brensbach;6437;Odenwaldkreis;6;HE +10211;64397;Modautal;6432;Darmstadt-Dieburg;6;HE +10212;64401;Gross-Bieberau;6432;Darmstadt-Dieburg;6;HE +10213;64404;Bickenbach;6432;Darmstadt-Dieburg;6;HE +10214;64405;Fischbachtal;6432;Darmstadt-Dieburg;6;HE +10215;64407;Fraenkisch-Crumbach;6437;Odenwaldkreis;6;HE +10216;64409;Messel;6432;Darmstadt-Dieburg;6;HE +10217;64521;Gross-Gerau;6433;Gross-Gerau;6;HE +10218;64546;Moerfelden-Walldorf;6433;Gross-Gerau;6;HE +10219;64560;Riedstadt;6433;Gross-Gerau;6;HE +10220;64569;Nauheim;6433;Gross-Gerau;6;HE +10221;64572;Buettelborn;6433;Gross-Gerau;6;HE +10222;64579;Gernsheim;6433;Gross-Gerau;6;HE +10223;64584;Biebesheim am Rhein;6433;Gross-Gerau;6;HE +10224;64589;Stockstadt am Rhein;6433;Gross-Gerau;6;HE +10225;64625;Bensheim;6431;Bergstrasse;6;HE +10226;64646;Heppenheim (Bergstrasse);6431;Bergstrasse;6;HE +10227;64653;Lorsch;6431;Bergstrasse;6;HE +10228;64658;Fuerth;6431;Bergstrasse;6;HE +10229;64665;Alsbach-Haehnlein;6432;Darmstadt-Dieburg;6;HE +10230;64668;Rimbach;6431;Bergstrasse;6;HE +10231;64673;Zwingenberg;6431;Bergstrasse;6;HE +10232;64678;Lindenfels;6431;Bergstrasse;6;HE +10233;64683;Einhausen;6431;Bergstrasse;6;HE +10234;64686;Lautertal;6431;Bergstrasse;6;HE +10235;64689;Grasellenbach;6431;Bergstrasse;6;HE +10236;64711;Erbach;6437;Odenwaldkreis;6;HE +10237;64720;Michelstadt;6437;Odenwaldkreis;6;HE +10238;64732;Bad Koenig;6437;Odenwaldkreis;6;HE +10239;64739;Hoechst im Odenwald;6437;Odenwaldkreis;6;HE +10240;64743;Beerfelden;6437;Odenwaldkreis;6;HE +10241;64747;Breuberg;6437;Odenwaldkreis;6;HE +10242;64750;Luetzelbach;6437;Odenwaldkreis;6;HE +10243;64753;Brombachtal;6437;Odenwaldkreis;6;HE +10244;64754;HEeck;6437;Odenwaldkreis;6;HE +10245;64756;Mossautal;6437;Odenwaldkreis;6;HE +10246;64757;Rothenberg;6437;Odenwaldkreis;6;HE +10247;64759;Sensbachtal;6437;Odenwaldkreis;6;HE +10248;64807;Dieburg;6432;Darmstadt-Dieburg;6;HE +10249;64823;Gross-Umstadt;6432;Darmstadt-Dieburg;6;HE +10250;64832;Babenhausen;6432;Darmstadt-Dieburg;6;HE +10251;64839;Muenster;6432;Darmstadt-Dieburg;6;HE +10252;64846;Gross-Zimmern;6432;Darmstadt-Dieburg;6;HE +10253;64850;Schaafheim;6432;Darmstadt-Dieburg;6;HE +10254;64853;Otzberg;6432;Darmstadt-Dieburg;6;HE +10255;64859;Eppertshausen;6432;Darmstadt-Dieburg;6;HE +10256;65183;Wiesbaden;6414;Wiesbaden;6;HE +10257;65185;Wiesbaden;6414;Wiesbaden;6;HE +10258;65187;Wiesbaden;6414;Wiesbaden;6;HE +10259;65189;Wiesbaden;6414;Wiesbaden;6;HE +10260;65191;Wiesbaden;6414;Wiesbaden;6;HE +10261;65193;Wiesbaden;6414;Wiesbaden;6;HE +10262;65195;Wiesbaden;6414;Wiesbaden;6;HE +10263;65197;Wiesbaden;6414;Wiesbaden;6;HE +10264;65199;Wiesbaden;6414;Wiesbaden;6;HE +10265;65201;Wiesbaden;6414;Wiesbaden;6;HE +10266;65203;Wiesbaden;6414;Wiesbaden;6;HE +10267;65205;Wiesbaden;6414;Wiesbaden;6;HE +10268;65207;Wiesbaden;6414;Wiesbaden;6;HE +10269;65232;Taunusstein;6439;Rheingau-Taunus-Kreis;6;HE +10270;65239;Hochheim am Main;6436;Main-Taunus-Kreis;6;HE +10271;65307;Bad Schwalbach;6439;Rheingau-Taunus-Kreis;6;HE +10272;65321;Heidenrod;6439;Rheingau-Taunus-Kreis;6;HE +10273;65326;Aarbergen;6439;Rheingau-Taunus-Kreis;6;HE +10274;65329;Hohenstein;6439;Rheingau-Taunus-Kreis;6;HE +10275;65343;Eltville am Rhein;6439;Rheingau-Taunus-Kreis;6;HE +10276;65344;Eltville am Rhein;6439;Rheingau-Taunus-Kreis;6;HE +10277;65345;Eltville am Rhein;6439;Rheingau-Taunus-Kreis;6;HE +10278;65346;Eltville am Rhein;6439;Rheingau-Taunus-Kreis;6;HE +10279;65347;Eltville am Rhein;6439;Rheingau-Taunus-Kreis;6;HE +10280;65366;Geisenheim;6439;Rheingau-Taunus-Kreis;6;HE +10281;65375;Oestrich-Winkel;6439;Rheingau-Taunus-Kreis;6;HE +10282;65385;Ruedesheim am Rhein;6439;Rheingau-Taunus-Kreis;6;HE +10283;65388;Schlangenbad;6439;Rheingau-Taunus-Kreis;6;HE +10284;65391;Lorch;6439;Rheingau-Taunus-Kreis;6;HE +10285;65391;Sauerthal;7141;Rhein-Lahn-Kreis;7;RP +10286;65396;Walluf;6439;Rheingau-Taunus-Kreis;6;HE +10287;65399;Kiedrich;6439;Rheingau-Taunus-Kreis;6;HE +10288;65428;Ruesselsheim;6433;Gross-Gerau;6;HE +10289;65439;Floersheim;6436;Main-Taunus-Kreis;6;HE +10290;65451;Kelsterbach;6433;Gross-Gerau;6;HE +10291;65462;Ginsheim-Gustavsburg;6433;Gross-Gerau;6;HE +10292;65468;Trebur;6433;Gross-Gerau;6;HE +10293;65474;Bischofsheim;6433;Gross-Gerau;6;HE +10294;65479;Raunheim;6433;Gross-Gerau;6;HE +10295;65510;Idstein;6439;Rheingau-Taunus-Kreis;6;HE +10296;65510;Huenstetten;6439;Rheingau-Taunus-Kreis;6;HE +10297;65520;Bad Camberg;6533;Limburg-Weilburg;6;HE +10298;65527;Niedernhausen;6439;Rheingau-Taunus-Kreis;6;HE +10299;65529;Waldems;6439;Rheingau-Taunus-Kreis;6;HE +10300;65549;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10301;65550;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10302;65551;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10303;65552;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10304;65553;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10305;65554;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10306;65555;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10307;65556;Limburg an der Lahn;6533;Limburg-Weilburg;6;HE +10308;65558;Cramberg;7141;Rhein-Lahn-Kreis;7;RP +10309;65558;Balduinstein;7141;Rhein-Lahn-Kreis;7;RP +10310;65558;Hirschberg;7141;Rhein-Lahn-Kreis;7;RP +10311;65558;Gueckingen;7141;Rhein-Lahn-Kreis;7;RP +10312;65558;Holzheim;7141;Rhein-Lahn-Kreis;7;RP +10313;65558;Langenscheid;7141;Rhein-Lahn-Kreis;7;RP +10314;65558;Flacht;7141;Rhein-Lahn-Kreis;7;RP +10315;65558;Heistenbach;7141;Rhein-Lahn-Kreis;7;RP +10316;65558;Eppenrod;7141;Rhein-Lahn-Kreis;7;RP +10317;65558;Lohrheim;7141;Rhein-Lahn-Kreis;7;RP +10318;65558;Oberneisen;7141;Rhein-Lahn-Kreis;7;RP +10319;65558;Isselbach;7141;Rhein-Lahn-Kreis;7;RP +10320;65558;Burgschwalbach;7141;Rhein-Lahn-Kreis;7;RP +10321;65558;Kaltenholzhausen;7141;Rhein-Lahn-Kreis;7;RP +10322;65582;Hambach;7141;Rhein-Lahn-Kreis;7;RP +10323;65582;Aull;7141;Rhein-Lahn-Kreis;7;RP +10324;65582;Diez;7141;Rhein-Lahn-Kreis;7;RP +10325;65589;Hadamar;6533;Limburg-Weilburg;6;HE +10326;65594;Runkel;6533;Limburg-Weilburg;6;HE +10327;65597;Huenfelden;6533;Limburg-Weilburg;6;HE +10328;65599;Dornburg;6533;Limburg-Weilburg;6;HE +10329;65604;Elz;6533;Limburg-Weilburg;6;HE +10330;65606;Villmar;6533;Limburg-Weilburg;6;HE +10331;65611;Brechen;6533;Limburg-Weilburg;6;HE +10332;65614;Beselich;6533;Limburg-Weilburg;6;HE +10333;65618;Selters (Taunus);6533;Limburg-Weilburg;6;HE +10334;65620;Waldbrunn (Westerwald);6533;Limburg-Weilburg;6;HE +10335;65623;Mudershausen;7141;Rhein-Lahn-Kreis;7;RP +10336;65623;Schiesheim;7141;Rhein-Lahn-Kreis;7;RP +10337;65623;Netzbach;7141;Rhein-Lahn-Kreis;7;RP +10338;65623;Hahnstaetten;7141;Rhein-Lahn-Kreis;7;RP +10339;65624;Altendiez;7141;Rhein-Lahn-Kreis;7;RP +10340;65626;Birlenbach;7141;Rhein-Lahn-Kreis;7;RP +10341;65627;Elbtal;6533;Limburg-Weilburg;6;HE +10342;65629;Niederneisen;7141;Rhein-Lahn-Kreis;7;RP +10343;65719;Hofheim am Taunus;6436;Main-Taunus-Kreis;6;HE +10344;65760;Eschborn;6436;Main-Taunus-Kreis;6;HE +10345;65779;Kelkheim (Taunus);6436;Main-Taunus-Kreis;6;HE +10346;65795;Hattersheim;6436;Main-Taunus-Kreis;6;HE +10347;65812;Bad Soden am Taunus;6436;Main-Taunus-Kreis;6;HE +10348;65817;Eppstein;6436;Main-Taunus-Kreis;6;HE +10349;65824;Schwalbach am Taunus;6436;Main-Taunus-Kreis;6;HE +10350;65830;Kriftel;6436;Main-Taunus-Kreis;6;HE +10351;65835;Liederbach am Taunus;6436;Main-Taunus-Kreis;6;HE +10352;65843;Sulzbach;6436;Main-Taunus-Kreis;6;HE +10353;65929;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10354;65931;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10355;65933;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10356;65934;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10357;65936;Frankfurt am Main;6412;Frankfurt am Main, Stadt;6;HE +10358;66111;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10359;66113;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10360;66115;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10361;66117;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10362;66119;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10363;66121;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10364;66123;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10365;66125;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10366;66126;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10367;66127;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10368;66128;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10369;66129;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10370;66130;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10371;66131;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10372;66132;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10373;66133;Saarbruecken;10041;Stadtverband Saarbruecken;10;SL +10374;66265;Heusweiler;10041;Stadtverband Saarbruecken;10;SL +10375;66271;Kleinblittersdorf;10041;Stadtverband Saarbruecken;10;SL +10376;66280;Sulzbach/Saar;10041;Stadtverband Saarbruecken;10;SL +10377;66287;Quierschied;10041;Stadtverband Saarbruecken;10;SL +10378;66292;Riegelsberg;10041;Stadtverband Saarbruecken;10;SL +10379;66299;Friedrichsthal;10041;Stadtverband Saarbruecken;10;SL +10380;66333;Voelklingen;10041;Stadtverband Saarbruecken;10;SL +10381;66346;Puettlingen;10041;Stadtverband Saarbruecken;10;SL +10382;66352;Grossrosseln;10041;Stadtverband Saarbruecken;10;SL +10383;66359;Bous;10044;Saarlouis;10;SL +10384;66386;Sankt Ingbert;10045;Saarpfalz-Kreis;10;SL +10385;66399;Mandelbachtal;10045;Saarpfalz-Kreis;10;SL +10386;66424;Homburg;10045;Saarpfalz-Kreis;10;SL +10387;66440;Blieskastel;10045;Saarpfalz-Kreis;10;SL +10388;66450;Bexbach;10045;Saarpfalz-Kreis;10;SL +10389;66453;Gersheim;10045;Saarpfalz-Kreis;10;SL +10390;66459;Kirkel;10045;Saarpfalz-Kreis;10;SL +10391;66482;Zweibruecken;7320;Zweibruecken, Stadt;7;RP +10392;66484;Battweiler;7340;Suedwestpfalz;7;RP +10393;66484;Kleinsteinhausen;7340;Suedwestpfalz;7;RP +10394;66484;Dietrichingen;7340;Suedwestpfalz;7;RP +10395;66484;Grosssteinhausen;7340;Suedwestpfalz;7;RP +10396;66484;Winterbach;7340;Suedwestpfalz;7;RP +10397;66484;Riedelberg;7340;Suedwestpfalz;7;RP +10398;66484;Schmitshausen;7340;Suedwestpfalz;7;RP +10399;66484;Walshausen;7340;Suedwestpfalz;7;RP +10400;66484;Althornbach;7340;Suedwestpfalz;7;RP +10401;66497;Contwig;7340;Suedwestpfalz;7;RP +10402;66500;Hornbach;7340;Suedwestpfalz;7;RP +10403;66500;Mauschbach;7340;Suedwestpfalz;7;RP +10404;66501;Grossbundenbach;7340;Suedwestpfalz;7;RP +10405;66501;Kleinbundenbach;7340;Suedwestpfalz;7;RP +10406;66503;Dellfeld;7340;Suedwestpfalz;7;RP +10407;66504;Bottenbach;7340;Suedwestpfalz;7;RP +10408;66506;Massweiler;7340;Suedwestpfalz;7;RP +10409;66507;Reifenberg;7340;Suedwestpfalz;7;RP +10410;66509;Rieschweiler-Muehlbach;7340;Suedwestpfalz;7;RP +10411;66538;Neunkirchen/Saar;10043;Neunkirchen;10;SL +10412;66539;Neunkirchen/Saar;10043;Neunkirchen;10;SL +10413;66540;Neunkirchen/Saar;10043;Neunkirchen;10;SL +10414;66557;Illingen;10043;Neunkirchen;10;SL +10415;66564;Ottweiler;10043;Neunkirchen;10;SL +10416;66571;Eppelborn;10043;Neunkirchen;10;SL +10417;66578;Schiffweiler;10043;Neunkirchen;10;SL +10418;66583;Spiesen-Elversberg;10043;Neunkirchen;10;SL +10419;66589;Merchweiler;10043;Neunkirchen;10;SL +10420;66606;Sankt Wendel;10046;St. Wendel;10;SL +10421;66620;Nonnweiler;10046;St. Wendel;10;SL +10422;66625;Nohfelden;10046;St. Wendel;10;SL +10423;66629;Freisen;10046;St. Wendel;10;SL +10424;66636;Tholey;10046;St. Wendel;10;SL +10425;66640;Namborn;10046;St. Wendel;10;SL +10426;66646;Marpingen;10046;St. Wendel;10;SL +10427;66649;Oberthal;10046;St. Wendel;10;SL +10428;66663;Merzig;10042;Merzig-Wadern;10;SL +10429;66679;Losheim am See;10042;Merzig-Wadern;10;SL +10430;66687;Wadern;10042;Merzig-Wadern;10;SL +10431;66693;Mettlach;10042;Merzig-Wadern;10;SL +10432;66701;Beckingen;10042;Merzig-Wadern;10;SL +10433;66706;Perl;10042;Merzig-Wadern;10;SL +10434;66709;Weiskirchen;10042;Merzig-Wadern;10;SL +10435;66740;Saarlouis;10044;Saarlouis;10;SL +10436;66763;Dillingen;10044;Saarlouis;10;SL +10437;66773;Schwalbach;10044;Saarlouis;10;SL +10438;66780;Rehlingen-Siersburg;10044;Saarlouis;10;SL +10439;66787;Wadgassen;10044;Saarlouis;10;SL +10440;66793;Saarwellingen;10044;Saarlouis;10;SL +10441;66798;Wallerfangen;10044;Saarlouis;10;SL +10442;66802;berherrn;10044;Saarlouis;10;SL +10443;66806;Ensdorf;10044;Saarlouis;10;SL +10444;66809;Nalbach;10044;Saarlouis;10;SL +10445;66822;Lebach;10044;Saarlouis;10;SL +10446;66839;Schmelz;10044;Saarlouis;10;SL +10447;66849;Landstuhl;7335;Kaiserslautern;7;RP +10448;66851;Mittelbrunn;7335;Kaiserslautern;7;RP +10449;66851;Bann;7335;Kaiserslautern;7;RP +10450;66851;Oberarnbach;7335;Kaiserslautern;7;RP +10451;66851;Steinalben;7340;Suedwestpfalz;7;RP +10452;66851;Queidersbach;7335;Kaiserslautern;7;RP +10453;66851;Hauptstuhl;7335;Kaiserslautern;7;RP +10454;66851;Linden;7335;Kaiserslautern;7;RP +10455;66851;Horbach;7340;Suedwestpfalz;7;RP +10456;66862;Kindsbach;7335;Kaiserslautern;7;RP +10457;66869;Schellweiler;7336;Kusel;7;RP +10458;66869;Kusel;7336;Kusel;7;RP +10459;66869;Blaubach;7336;Kusel;7;RP +10460;66869;Ruthweiler;7336;Kusel;7;RP +10461;66871;Koerborn;7336;Kusel;7;RP +10462;66871;Pfeffelbach;7336;Kusel;7;RP +10463;66871;Konken;7336;Kusel;7;RP +10464;66871;Theisbergstegen;7336;Kusel;7;RP +10465;66871;Ehweiler;7336;Kusel;7;RP +10466;66871;Haschbach am Remigiusberg;7336;Kusel;7;RP +10467;66871;Reichweiler;7336;Kusel;7;RP +10468;66871;Etschberg;7336;Kusel;7;RP +10469;66871;Albessen;7336;Kusel;7;RP +10470;66871;Oberalben;7336;Kusel;7;RP +10471;66871;Thallichtenberg;7336;Kusel;7;RP +10472;66871;Selchenbach;7336;Kusel;7;RP +10473;66871;Dennweiler-Frohnbach;7336;Kusel;7;RP +10474;66871;Herchweiler;7336;Kusel;7;RP +10475;66877;Ramstein-Miesenbach;7335;Kaiserslautern;7;RP +10476;66879;Kottweiler-Schwanden;7335;Kaiserslautern;7;RP +10477;66879;Steinwenden;7335;Kaiserslautern;7;RP +10478;66879;Niederstaufenbach;7336;Kusel;7;RP +10479;66879;Kollweiler;7335;Kaiserslautern;7;RP +10480;66879;Reichenbach-Steegen;7335;Kaiserslautern;7;RP +10481;66879;Oberstaufenbach;7336;Kusel;7;RP +10482;66879;Niedermohr;7335;Kaiserslautern;7;RP +10483;66882;Huetschenhausen;7335;Kaiserslautern;7;RP +10484;66885;Bedesbach;7336;Kusel;7;RP +10485;66885;Altenglan;7336;Kusel;7;RP +10486;66887;Ulmet;7336;Kusel;7;RP +10487;66887;Neunkirchen am Potzberg;7336;Kusel;7;RP +10488;66887;Foeckelberg;7336;Kusel;7;RP +10489;66887;Jettenbach;7336;Kusel;7;RP +10490;66887;Welchweiler;7336;Kusel;7;RP +10491;66887;Rutsweiler am Glan;7336;Kusel;7;RP +10492;66887;Rammelsbach;7336;Kusel;7;RP +10493;66887;Elzweiler;7336;Kusel;7;RP +10494;66887;Horschbach;7336;Kusel;7;RP +10495;66887;Erdesbach;7336;Kusel;7;RP +10496;66887;Glanbruecken;7336;Kusel;7;RP +10497;66887;Bosenbach;7336;Kusel;7;RP +10498;66887;Rathsweiler;7336;Kusel;7;RP +10499;66887;Sankt Julian;7336;Kusel;7;RP +10500;66887;Niederalben;7336;Kusel;7;RP +10501;66892;Bruchmuehlbach-Miesau;7335;Kaiserslautern;7;RP +10502;66894;Martinshoehe;7335;Kaiserslautern;7;RP +10503;66894;Kraehenberg;7340;Suedwestpfalz;7;RP +10504;66894;Bechhofen;7340;Suedwestpfalz;7;RP +10505;66894;Wiesbach;7340;Suedwestpfalz;7;RP +10506;66894;Gerhardsbrunn;7335;Kaiserslautern;7;RP +10507;66894;Langwieden;7335;Kaiserslautern;7;RP +10508;66894;Rosenkopf;7340;Suedwestpfalz;7;RP +10509;66894;Lambsborn;7335;Kaiserslautern;7;RP +10510;66894;Kaeshofen;7340;Suedwestpfalz;7;RP +10511;66901;Schoenenberg-Kuebelberg;7336;Kusel;7;RP +10512;66903;Ohmbach;7336;Kusel;7;RP +10513;66903;Gries;7336;Kusel;7;RP +10514;66903;Dittweiler;7336;Kusel;7;RP +10515;66903;Altenkirchen;7336;Kusel;7;RP +10516;66903;Frohnhofen;7336;Kusel;7;RP +10517;66904;Bruecken;7336;Kusel;7;RP +10518;66904;Boersborn;7336;Kusel;7;RP +10519;66907;Glan-Muenchweiler;7336;Kusel;7;RP +10520;66907;Rehweiler;7336;Kusel;7;RP +10521;66909;Quirnbach;7336;Kusel;7;RP +10522;66909;Henschtal;7336;Kusel;7;RP +10523;66909;Steinbach am Glan;7336;Kusel;7;RP +10524;66909;Wahnwegen;7336;Kusel;7;RP +10525;66909;Hueffler;7336;Kusel;7;RP +10526;66909;Herschweiler-Pettersheim;7336;Kusel;7;RP +10527;66909;Langenbach;7336;Kusel;7;RP +10528;66909;Krottelbach;7336;Kusel;7;RP +10529;66909;Nanzdietschweiler;7336;Kusel;7;RP +10530;66909;Matzenbach;7336;Kusel;7;RP +10531;66914;Waldmohr;7336;Kusel;7;RP +10532;66916;Breitenbach;7336;Kusel;7;RP +10533;66916;Dunzweiler;7336;Kusel;7;RP +10534;66917;Knopp-Labach;7340;Suedwestpfalz;7;RP +10535;66917;Wallhalben;7340;Suedwestpfalz;7;RP +10536;66917;Biedershausen;7340;Suedwestpfalz;7;RP +10537;66919;Hermersberg;7340;Suedwestpfalz;7;RP +10538;66919;Schauerberg;7340;Suedwestpfalz;7;RP +10539;66919;Hettenhausen;7340;Suedwestpfalz;7;RP +10540;66919;Obernheim-Kirchenarnbach;7340;Suedwestpfalz;7;RP +10541;66919;Herschberg;7340;Suedwestpfalz;7;RP +10542;66919;Saalstadt;7340;Suedwestpfalz;7;RP +10543;66919;Weselberg;7340;Suedwestpfalz;7;RP +10544;66953;Pirmasens;7317;Pirmasens, Stadt;7;RP +10545;66954;Pirmasens;7317;Pirmasens, Stadt;7;RP +10546;66955;Pirmasens;7317;Pirmasens, Stadt;7;RP +10547;66957;Obersimten;7340;Suedwestpfalz;7;RP +10548;66957;Vinningen;7340;Suedwestpfalz;7;RP +10549;66957;Ruppertsweiler;7340;Suedwestpfalz;7;RP +10550;66957;Schweix;7340;Suedwestpfalz;7;RP +10551;66957;Kroeppen;7340;Suedwestpfalz;7;RP +10552;66957;Eppenbrunn;7340;Suedwestpfalz;7;RP +10553;66957;Hilst;7340;Suedwestpfalz;7;RP +10554;66957;Trulben;7340;Suedwestpfalz;7;RP +10555;66969;Lemberg;7340;Suedwestpfalz;7;RP +10556;66976;Rodalben;7340;Suedwestpfalz;7;RP +10557;66978;Leimen;7340;Suedwestpfalz;7;RP +10558;66978;Clausen;7340;Suedwestpfalz;7;RP +10559;66978;Donsieders;7340;Suedwestpfalz;7;RP +10560;66978;Merzalben;7340;Suedwestpfalz;7;RP +10561;66981;Muenchweiler an der Rodalb;7340;Suedwestpfalz;7;RP +10562;66987;Thaleischweiler-Froeschen;7340;Suedwestpfalz;7;RP +10563;66989;Nuenschweiler;7340;Suedwestpfalz;7;RP +10564;66989;Hoeheinoed;7340;Suedwestpfalz;7;RP +10565;66989;Hoehfroeschen;7340;Suedwestpfalz;7;RP +10566;66989;Petersberg;7340;Suedwestpfalz;7;RP +10567;66989;Hoeheischweiler;7340;Suedwestpfalz;7;RP +10568;66994;Dahn;7340;Suedwestpfalz;7;RP +10569;66996;Schindhard;7340;Suedwestpfalz;7;RP +10570;66996;Erfweiler;7340;Suedwestpfalz;7;RP +10571;66996;Hirschthal;7340;Suedwestpfalz;7;RP +10572;66996;Fischbach bei Dahn;7340;Suedwestpfalz;7;RP +10573;66996;Schoenau;7340;Suedwestpfalz;7;RP +10574;66996;Ludwigswinkel;7340;Suedwestpfalz;7;RP +10575;66999;Hinterweidenthal;7340;Suedwestpfalz;7;RP +10576;67059;Ludwigshafen am Rhein;7314;Ludwigshafen am Rhein, Stadt;7;RP +10577;67061;Ludwigshafen am Rhein;7314;Ludwigshafen am Rhein, Stadt;7;RP +10578;67063;Ludwigshafen am Rhein;7314;Ludwigshafen am Rhein, Stadt;7;RP +10579;67065;Ludwigshafen am Rhein;7314;Ludwigshafen am Rhein, Stadt;7;RP +10580;67067;Ludwigshafen am Rhein;7314;Ludwigshafen am Rhein, Stadt;7;RP +10581;67069;Ludwigshafen am Rhein;7314;Ludwigshafen am Rhein, Stadt;7;RP +10582;67071;Ludwigshafen am Rhein;7314;Ludwigshafen am Rhein, Stadt;7;RP +10583;67098;Bad Duerkheim;7332;Bad Duerkheim;7;RP +10584;67105;Schifferstadt;7314;Ludwigshafen am Rhein, Stadt;7;RP +10585;67112;Mutterstadt;7314;Ludwigshafen am Rhein, Stadt;7;RP +10586;67117;Limburgerhof;7314;Ludwigshafen am Rhein, Stadt;7;RP +10587;67122;Altrip;7314;Ludwigshafen am Rhein, Stadt;7;RP +10588;67125;Dannstadt-Schauernheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10589;67126;Hochdorf-Assenheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10590;67127;Roedersheim-Gronau;7314;Ludwigshafen am Rhein, Stadt;7;RP +10591;67133;Maxdorf;7314;Ludwigshafen am Rhein, Stadt;7;RP +10592;67134;Birkenheide;7314;Ludwigshafen am Rhein, Stadt;7;RP +10593;67136;Fussgoenheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10594;67141;Neuhofen;7314;Ludwigshafen am Rhein, Stadt;7;RP +10595;67146;Deidesheim;7332;Bad Duerkheim;7;RP +10596;67147;Forst an der Weinstrasse;7332;Bad Duerkheim;7;RP +10597;67149;Meckenheim;7332;Bad Duerkheim;7;RP +10598;67150;Niederkirchen bei Deidesheim;7332;Bad Duerkheim;7;RP +10599;67152;Ruppertsberg;7332;Bad Duerkheim;7;RP +10600;67157;Wachenheim an der Weinstrasse;7332;Bad Duerkheim;7;RP +10601;67158;Ellerstadt;7332;Bad Duerkheim;7;RP +10602;67159;Friedelsheim;7332;Bad Duerkheim;7;RP +10603;67161;Goennheim;7332;Bad Duerkheim;7;RP +10604;67165;Waldsee;7314;Ludwigshafen am Rhein, Stadt;7;RP +10605;67166;Otterstadt;7314;Ludwigshafen am Rhein, Stadt;7;RP +10606;67167;Erpolzheim;7332;Bad Duerkheim;7;RP +10607;67169;Kallstadt;7332;Bad Duerkheim;7;RP +10608;67227;Frankenthal (Pfalz);7311;Frankenthal (Pfalz), Stadt;7;RP +10609;67229;Grosskarlbach;7332;Bad Duerkheim;7;RP +10610;67229;Laumersheim;7332;Bad Duerkheim;7;RP +10611;67229;Gerolsheim;7332;Bad Duerkheim;7;RP +10612;67240;Bobenheim-Roxheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10613;67245;Lambsheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10614;67246;Dirmstein;7332;Bad Duerkheim;7;RP +10615;67251;Freinsheim;7332;Bad Duerkheim;7;RP +10616;67256;Weisenheim am Sand;7332;Bad Duerkheim;7;RP +10617;67258;Hessheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10618;67259;Kleinniedesheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10619;67259;Beindersheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10620;67259;Grossniedesheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10621;67259;Heuchelheim bei Frankenthal;7314;Ludwigshafen am Rhein, Stadt;7;RP +10622;67269;Gruenstadt;7332;Bad Duerkheim;7;RP +10623;67271;Kleinkarlbach;7332;Bad Duerkheim;7;RP +10624;67271;Neuleiningen;7332;Bad Duerkheim;7;RP +10625;67271;Obersuelzen;7332;Bad Duerkheim;7;RP +10626;67271;Mertesheim;7332;Bad Duerkheim;7;RP +10627;67271;Kindenheim;7332;Bad Duerkheim;7;RP +10628;67271;Battenberg (Pfalz);7332;Bad Duerkheim;7;RP +10629;67273;Weisenheim am Berg;7332;Bad Duerkheim;7;RP +10630;67273;Herxheim am Berg;7332;Bad Duerkheim;7;RP +10631;67273;Dackenheim;7332;Bad Duerkheim;7;RP +10632;67273;Bobenheim am Berg;7332;Bad Duerkheim;7;RP +10633;67278;Bockenheim;7332;Bad Duerkheim;7;RP +10634;67280;Quirnheim;7332;Bad Duerkheim;7;RP +10635;67280;Ebertsheim;7332;Bad Duerkheim;7;RP +10636;67281;Kirchheim an der Weinstrasse;7332;Bad Duerkheim;7;RP +10637;67281;Bissersheim;7332;Bad Duerkheim;7;RP +10638;67283;Obrigheim;7332;Bad Duerkheim;7;RP +10639;67292;Kirchheimbolanden;7333;Donnersbergkreis;7;RP +10640;67294;Gauersheim;7333;Donnersbergkreis;7;RP +10641;67294;Bischheim;7333;Donnersbergkreis;7;RP +10642;67294;Oberwiesen;7333;Donnersbergkreis;7;RP +10643;67294;Morschheim;7333;Donnersbergkreis;7;RP +10644;67294;Stetten;7333;Donnersbergkreis;7;RP +10645;67294;Orbis;7333;Donnersbergkreis;7;RP +10646;67294;Mauchenheim;7331;Alzey-Worms;7;RP +10647;67294;Rittersheim;7333;Donnersbergkreis;7;RP +10648;67294;Ilbesheim;7333;Donnersbergkreis;7;RP +10649;67295;Bolanden;7333;Donnersbergkreis;7;RP +10650;67297;Marnheim;7333;Donnersbergkreis;7;RP +10651;67304;Kerzenheim;7333;Donnersbergkreis;7;RP +10652;67304;Eisenberg;7333;Donnersbergkreis;7;RP +10653;67305;Ramsen;7333;Donnersbergkreis;7;RP +10654;67307;Goellheim;7333;Donnersbergkreis;7;RP +10655;67308;Biedesheim;7333;Donnersbergkreis;7;RP +10656;67308;Niefernheim-Zellertal;7333;Donnersbergkreis;7;RP +10657;67308;Einselthum;7333;Donnersbergkreis;7;RP +10658;67308;Harxheim-Zellertal;7333;Donnersbergkreis;7;RP +10659;67308;Ruessingen;7333;Donnersbergkreis;7;RP +10660;67308;Ottersheim;7333;Donnersbergkreis;7;RP +10661;67308;Bubenheim;7333;Donnersbergkreis;7;RP +10662;67308;Lautersheim;7333;Donnersbergkreis;7;RP +10663;67308;Immesheim;7333;Donnersbergkreis;7;RP +10664;67308;Albisheim (Pfrimm);7333;Donnersbergkreis;7;RP +10665;67308;Zell-Zellertal;7333;Donnersbergkreis;7;RP +10666;67310;Hettenleidelheim;7332;Bad Duerkheim;7;RP +10667;67311;Tiefenthal;7332;Bad Duerkheim;7;RP +10668;67316;Carlsberg;7332;Bad Duerkheim;7;RP +10669;67317;Altleiningen;7332;Bad Duerkheim;7;RP +10670;67319;Wattenheim;7332;Bad Duerkheim;7;RP +10671;67346;Speyer;7318;Speyer, Stadt;7;RP +10672;67354;Roemerberg;7314;Ludwigshafen am Rhein, Stadt;7;RP +10673;67360;Lingenfeld;7334;Germersheim;7;RP +10674;67361;Freisbach;7334;Germersheim;7;RP +10675;67363;Lustadt;7334;Germersheim;7;RP +10676;67365;Schwegenheim;7334;Germersheim;7;RP +10677;67366;Weingarten;7334;Germersheim;7;RP +10678;67368;Westheim;7334;Germersheim;7;RP +10679;67373;Dudenhofen;7314;Ludwigshafen am Rhein, Stadt;7;RP +10680;67374;Hanhofen;7314;Ludwigshafen am Rhein, Stadt;7;RP +10681;67376;Harthausen;7314;Ludwigshafen am Rhein, Stadt;7;RP +10682;67377;Gommersheim;7337;Suedliche Weinstrasse;7;RP +10683;67378;Zeiskam;7334;Germersheim;7;RP +10684;67433;Neustadt an der Weinstrasse;7316;Neustadt an der Weinstrasse, Stadt;7;RP +10685;67434;Neustadt an der Weinstrasse;7316;Neustadt an der Weinstrasse, Stadt;7;RP +10686;67435;Neustadt an der Weinstrasse;7316;Neustadt an der Weinstrasse, Stadt;7;RP +10687;67454;Hassloch;7332;Bad Duerkheim;7;RP +10688;67459;Boehl-Iggelheim;7314;Ludwigshafen am Rhein, Stadt;7;RP +10689;67466;Lambrecht;7332;Bad Duerkheim;7;RP +10690;67468;Frankenstein;7335;Kaiserslautern;7;RP +10691;67468;Frankeneck;7332;Bad Duerkheim;7;RP +10692;67468;Neidenfels;7332;Bad Duerkheim;7;RP +10693;67471;Elmstein;7332;Bad Duerkheim;7;RP +10694;67472;Esthal;7332;Bad Duerkheim;7;RP +10695;67473;Lindenberg;7332;Bad Duerkheim;7;RP +10696;67475;Weidenthal;7332;Bad Duerkheim;7;RP +10697;67480;Edenkoben;7337;Suedliche Weinstrasse;7;RP +10698;67482;Freimersheim;7337;Suedliche Weinstrasse;7;RP +10699;67482;Venningen;7337;Suedliche Weinstrasse;7;RP +10700;67482;Boebingen;7337;Suedliche Weinstrasse;7;RP +10701;67482;Altdorf;7337;Suedliche Weinstrasse;7;RP +10702;67483;Edesheim;7337;Suedliche Weinstrasse;7;RP +10703;67483;Kleinfischlingen;7337;Suedliche Weinstrasse;7;RP +10704;67483;Grossfischlingen;7337;Suedliche Weinstrasse;7;RP +10705;67487;Maikammer;7337;Suedliche Weinstrasse;7;RP +10706;67487;Sankt Martin;7337;Suedliche Weinstrasse;7;RP +10707;67489;Kirrweiler (Pfalz);7337;Suedliche Weinstrasse;7;RP +10708;67547;Worms;7319;Worms, Stadt;7;RP +10709;67549;Worms;7319;Worms, Stadt;7;RP +10710;67550;Worms;7319;Worms, Stadt;7;RP +10711;67551;Worms;7319;Worms, Stadt;7;RP +10712;67574;Osthofen;7331;Alzey-Worms;7;RP +10713;67575;Eich;7331;Alzey-Worms;7;RP +10714;67577;Alsheim;7331;Alzey-Worms;7;RP +10715;67578;Gimbsheim;7331;Alzey-Worms;7;RP +10716;67580;Hamm;7331;Alzey-Worms;7;RP +10717;67582;Mettenheim;7331;Alzey-Worms;7;RP +10718;67583;Guntersblum;7339;Mainz-Bingen;7;RP +10719;67585;Dorn-Duerkheim;7339;Mainz-Bingen;7;RP +10720;67586;Hillesheim;7339;Mainz-Bingen;7;RP +10721;67587;Wintersheim;7339;Mainz-Bingen;7;RP +10722;67590;Monsheim;7331;Alzey-Worms;7;RP +10723;67591;Moerstadt;7331;Alzey-Worms;7;RP +10724;67591;Moelsheim;7331;Alzey-Worms;7;RP +10725;67591;Offstein;7331;Alzey-Worms;7;RP +10726;67591;Hohen-Suelzen;7331;Alzey-Worms;7;RP +10727;67591;Wachenheim;7331;Alzey-Worms;7;RP +10728;67592;Floersheim-Dalsheim;7331;Alzey-Worms;7;RP +10729;67593;Bermersheim;7331;Alzey-Worms;7;RP +10730;67593;Westhofen;7331;Alzey-Worms;7;RP +10731;67595;Bechtheim;7331;Alzey-Worms;7;RP +10732;67596;Frettenheim;7331;Alzey-Worms;7;RP +10733;67596;Dittelsheim-Hessloch;7331;Alzey-Worms;7;RP +10734;67598;Gundersheim;7331;Alzey-Worms;7;RP +10735;67599;Gundheim;7331;Alzey-Worms;7;RP +10736;67655;Kaiserslautern;7312;Kaiserslautern, Stadt;7;RP +10737;67657;Kaiserslautern;7312;Kaiserslautern, Stadt;7;RP +10738;67659;Kaiserslautern;7312;Kaiserslautern, Stadt;7;RP +10739;67661;Kaiserslautern;7312;Kaiserslautern, Stadt;7;RP +10740;67663;Kaiserslautern;7312;Kaiserslautern, Stadt;7;RP +10741;67677;Enkenbach-Alsenborn;7335;Kaiserslautern;7;RP +10742;67678;Mehlingen;7335;Kaiserslautern;7;RP +10743;67680;Neuhemsbach;7335;Kaiserslautern;7;RP +10744;67681;Sembach;7335;Kaiserslautern;7;RP +10745;67681;Wartenberg-Rohrbach;7333;Donnersbergkreis;7;RP +10746;67685;Weilerbach;7335;Kaiserslautern;7;RP +10747;67685;Erzenhausen;7335;Kaiserslautern;7;RP +10748;67685;Eulenbis;7335;Kaiserslautern;7;RP +10749;67685;Schwedelbach;7335;Kaiserslautern;7;RP +10750;67686;Mackenbach;7335;Kaiserslautern;7;RP +10751;67688;Rodenbach;7335;Kaiserslautern;7;RP +10752;67691;Hochspeyer;7335;Kaiserslautern;7;RP +10753;67693;Fischbach;7335;Kaiserslautern;7;RP +10754;67693;Waldleiningen;7335;Kaiserslautern;7;RP +10755;67697;Otterberg;7335;Kaiserslautern;7;RP +10756;67699;Schneckenhausen;7335;Kaiserslautern;7;RP +10757;67699;Heiligenmoschel;7335;Kaiserslautern;7;RP +10758;67700;Niederkirchen;7335;Kaiserslautern;7;RP +10759;67701;Schallodenbach;7335;Kaiserslautern;7;RP +10760;67705;Stelzenberg;7335;Kaiserslautern;7;RP +10761;67705;Trippstadt;7335;Kaiserslautern;7;RP +10762;67706;Krickenbach;7335;Kaiserslautern;7;RP +10763;67707;Schopp;7335;Kaiserslautern;7;RP +10764;67714;Waldfischbach-Burgalben;7340;Suedwestpfalz;7;RP +10765;67715;Geiselberg;7340;Suedwestpfalz;7;RP +10766;67716;Heltersberg;7340;Suedwestpfalz;7;RP +10767;67718;Schmalenberg;7340;Suedwestpfalz;7;RP +10768;67722;Winnweiler;7333;Donnersbergkreis;7;RP +10769;67722;Hochstein;7333;Donnersbergkreis;7;RP +10770;67722;Potzbach;7333;Donnersbergkreis;7;RP +10771;67722;Alsenbrueck-Langmeil;7333;Donnersbergkreis;7;RP +10772;67724;Gonbach;7333;Donnersbergkreis;7;RP +10773;67724;Gehrweiler;7333;Donnersbergkreis;7;RP +10774;67724;Hoeringen;7333;Donnersbergkreis;7;RP +10775;67724;Gundersweiler;7333;Donnersbergkreis;7;RP +10776;67725;Boerrstadt;7333;Donnersbergkreis;7;RP +10777;67725;Breunigweiler;7333;Donnersbergkreis;7;RP +10778;67727;Lohnsfeld;7333;Donnersbergkreis;7;RP +10779;67728;Muenchweiler an der Alsenz;7333;Donnersbergkreis;7;RP +10780;67729;Sippersfeld;7333;Donnersbergkreis;7;RP +10781;67731;Otterbach;7335;Kaiserslautern;7;RP +10782;67732;Hirschhorn;7335;Kaiserslautern;7;RP +10783;67734;Katzweiler;7335;Kaiserslautern;7;RP +10784;67734;Sulzbachtal;7335;Kaiserslautern;7;RP +10785;67735;Mehlbach;7335;Kaiserslautern;7;RP +10786;67737;Olsbruecken;7335;Kaiserslautern;7;RP +10787;67737;Frankelbach;7335;Kaiserslautern;7;RP +10788;67742;Deimberg;7336;Kusel;7;RP +10789;67742;Adenbach;7336;Kusel;7;RP +10790;67742;Herren-Sulzbach;7336;Kusel;7;RP +10791;67742;Lauterecken;7336;Kusel;7;RP +10792;67742;Buborn;7336;Kusel;7;RP +10793;67742;Heinzenhausen;7336;Kusel;7;RP +10794;67742;Hausweiler;7336;Kusel;7;RP +10795;67742;Ginsweiler;7336;Kusel;7;RP +10796;67744;Lohnweiler;7336;Kusel;7;RP +10797;67744;Loellbach;7133;Bad Kreuznach;7;RP +10798;67744;Hoppstaedten;7336;Kusel;7;RP +10799;67744;Wiesweiler;7336;Kusel;7;RP +10800;67744;Hohenoellen;7336;Kusel;7;RP +10801;67744;Medard;7336;Kusel;7;RP +10802;67744;Seelen;7333;Donnersbergkreis;7;RP +10803;67744;Kirrweiler;7336;Kusel;7;RP +10804;67744;Cronenberg;7336;Kusel;7;RP +10805;67744;Kappeln;7336;Kusel;7;RP +10806;67744;Schweinschied;7133;Bad Kreuznach;7;RP +10807;67744;Rathskirchen;7333;Donnersbergkreis;7;RP +10808;67744;Homberg;7336;Kusel;7;RP +10809;67745;Grumbach;7336;Kusel;7;RP +10810;67746;Langweiler;7336;Kusel;7;RP +10811;67746;Unterjeckenbach;7336;Kusel;7;RP +10812;67746;Merzweiler;7336;Kusel;7;RP +10813;67748;Odenbach;7336;Kusel;7;RP +10814;67749;Offenbach-Hundheim;7336;Kusel;7;RP +10815;67749;Nerzweiler;7336;Kusel;7;RP +10816;67752;Rutsweiler an der Lauter;7336;Kusel;7;RP +10817;67752;Wolfstein;7336;Kusel;7;RP +10818;67752;Oberweiler-Tiefenbach;7336;Kusel;7;RP +10819;67753;Einoellen;7336;Kusel;7;RP +10820;67753;Aschbach;7336;Kusel;7;RP +10821;67753;Hefersweiler;7336;Kusel;7;RP +10822;67753;Rothselberg;7336;Kusel;7;RP +10823;67753;Reipoltskirchen;7336;Kusel;7;RP +10824;67754;Essweiler;7336;Kusel;7;RP +10825;67756;Oberweiler im Tal;7336;Kusel;7;RP +10826;67756;Hinzweiler;7336;Kusel;7;RP +10827;67756;Relsberg;7336;Kusel;7;RP +10828;67757;Kreimbach-Kaulbach;7336;Kusel;7;RP +10829;67759;Reichsthal;7333;Donnersbergkreis;7;RP +10830;67759;Nussbach;7336;Kusel;7;RP +10831;67806;Bisterschied;7333;Donnersbergkreis;7;RP +10832;67806;Teschenmoschel;7333;Donnersbergkreis;7;RP +10833;67806;Katzenbach;7333;Donnersbergkreis;7;RP +10834;67806;Rockenhausen;7333;Donnersbergkreis;7;RP +10835;67806;Doernbach;7333;Donnersbergkreis;7;RP +10836;67806;Doerrmoschel;7333;Donnersbergkreis;7;RP +10837;67806;Marienthal;7333;Donnersbergkreis;7;RP +10838;67808;Ransweiler;7333;Donnersbergkreis;7;RP +10839;67808;Schweisweiler;7333;Donnersbergkreis;7;RP +10840;67808;Bennhausen;7333;Donnersbergkreis;7;RP +10841;67808;Falkenstein;7333;Donnersbergkreis;7;RP +10842;67808;Wuerzweiler;7333;Donnersbergkreis;7;RP +10843;67808;Steinbach am Donnersberg;7333;Donnersbergkreis;7;RP +10844;67808;Ruppertsecken;7333;Donnersbergkreis;7;RP +10845;67808;Imsweiler;7333;Donnersbergkreis;7;RP +10846;67808;Moersfeld;7333;Donnersbergkreis;7;RP +10847;67808;Stahlberg;7333;Donnersbergkreis;7;RP +10848;67808;Schoenborn;7333;Donnersbergkreis;7;RP +10849;67808;Bayerfeld-Steckweiler;7333;Donnersbergkreis;7;RP +10850;67808;Weitersweiler;7333;Donnersbergkreis;7;RP +10851;67811;Dielkirchen;7333;Donnersbergkreis;7;RP +10852;67813;Gerbach;7333;Donnersbergkreis;7;RP +10853;67813;Sankt Alban;7333;Donnersbergkreis;7;RP +10854;67814;Jakobsweiler;7333;Donnersbergkreis;7;RP +10855;67814;Dannenfels;7333;Donnersbergkreis;7;RP +10856;67816;Dreisen;7333;Donnersbergkreis;7;RP +10857;67816;Standenbuehl;7333;Donnersbergkreis;7;RP +10858;67817;Imsbach;7333;Donnersbergkreis;7;RP +10859;67819;Kriegsfeld;7333;Donnersbergkreis;7;RP +10860;67821;Oberndorf;7333;Donnersbergkreis;7;RP +10861;67821;Alsenz;7333;Donnersbergkreis;7;RP +10862;67822;Finkenbach-Gersweiler;7333;Donnersbergkreis;7;RP +10863;67822;Winterborn;7333;Donnersbergkreis;7;RP +10864;67822;Mannweiler-Coelln;7333;Donnersbergkreis;7;RP +10865;67822;Waldgrehweiler;7333;Donnersbergkreis;7;RP +10866;67822;Oberhausen an der Appel;7333;Donnersbergkreis;7;RP +10867;67822;Muensterappel;7333;Donnersbergkreis;7;RP +10868;67822;Niederhausen an der Appel;7333;Donnersbergkreis;7;RP +10869;67822;Niedermoschel;7333;Donnersbergkreis;7;RP +10870;67822;Gaugrehweiler;7333;Donnersbergkreis;7;RP +10871;67822;Kalkofen;7333;Donnersbergkreis;7;RP +10872;67823;Sitters;7333;Donnersbergkreis;7;RP +10873;67823;Obermoschel;7333;Donnersbergkreis;7;RP +10874;67823;Lettweiler;7133;Bad Kreuznach;7;RP +10875;67823;Schiersfeld;7333;Donnersbergkreis;7;RP +10876;67823;Unkenbach;7333;Donnersbergkreis;7;RP +10877;67824;Feilbingert;7133;Bad Kreuznach;7;RP +10878;67826;Hallgarten;7133;Bad Kreuznach;7;RP +10879;67827;Becherbach;7133;Bad Kreuznach;7;RP +10880;67829;Schmittweiler;7133;Bad Kreuznach;7;RP +10881;67829;Callbach;7133;Bad Kreuznach;7;RP +10882;67829;Reiffelbach;7133;Bad Kreuznach;7;RP +10883;68159;Mannheim;8222;Mannheim;8;BW +10884;68161;Mannheim;8222;Mannheim;8;BW +10885;68163;Mannheim;8222;Mannheim;8;BW +10886;68165;Mannheim;8222;Mannheim;8;BW +10887;68167;Mannheim;8222;Mannheim;8;BW +10888;68169;Mannheim;8222;Mannheim;8;BW +10889;68199;Mannheim;8222;Mannheim;8;BW +10890;68219;Mannheim;8222;Mannheim;8;BW +10891;68229;Mannheim;8222;Mannheim;8;BW +10892;68239;Mannheim;8222;Mannheim;8;BW +10893;68259;Mannheim;8222;Mannheim;8;BW +10894;68305;Mannheim;8222;Mannheim;8;BW +10895;68307;Mannheim;8222;Mannheim;8;BW +10896;68309;Mannheim;8222;Mannheim;8;BW +10897;68519;Viernheim;6431;Bergstrasse;6;HE +10898;68526;Ladenburg;8226;Rhein-Neckar-Kreis;8;BW +10899;68535;Edingen-Neckarhausen;8226;Rhein-Neckar-Kreis;8;BW +10900;68542;Heddesheim;8226;Rhein-Neckar-Kreis;8;BW +10901;68549;Ilvesheim;8226;Rhein-Neckar-Kreis;8;BW +10902;68623;Lampertheim;6431;Bergstrasse;6;HE +10903;68642;Buerstadt;6431;Bergstrasse;6;HE +10904;68647;Biblis;6431;Bergstrasse;6;HE +10905;68649;Gross-Rohrheim;6431;Bergstrasse;6;HE +10906;68723;Plankstadt;8226;Rhein-Neckar-Kreis;8;BW +10907;68723;Oftersheim;8226;Rhein-Neckar-Kreis;8;BW +10908;68723;Schwetzingen;8226;Rhein-Neckar-Kreis;8;BW +10909;68753;Waghaeusel;8212;Karlsruhe;8;BW +10910;68766;Hockenheim;8226;Rhein-Neckar-Kreis;8;BW +10911;68775;Ketsch;8226;Rhein-Neckar-Kreis;8;BW +10912;68782;Bruehl;8226;Rhein-Neckar-Kreis;8;BW +10913;68789;Sankt Leon-Rot;8226;Rhein-Neckar-Kreis;8;BW +10914;68794;Oberhausen-Rheinhausen;8212;Karlsruhe;8;BW +10915;68799;Reilingen;8226;Rhein-Neckar-Kreis;8;BW +10916;68804;Altlussheim;8226;Rhein-Neckar-Kreis;8;BW +10917;68809;Neulussheim;8226;Rhein-Neckar-Kreis;8;BW +10918;69115;Heidelberg;8221;Heidelberg;8;BW +10919;69117;Heidelberg;8221;Heidelberg;8;BW +10920;69118;Heidelberg;8221;Heidelberg;8;BW +10921;69120;Heidelberg;8221;Heidelberg;8;BW +10922;69121;Heidelberg;8221;Heidelberg;8;BW +10923;69123;Heidelberg;8221;Heidelberg;8;BW +10924;69124;Heidelberg;8221;Heidelberg;8;BW +10925;69126;Heidelberg;8221;Heidelberg;8;BW +10926;69151;Neckargemuend;8226;Rhein-Neckar-Kreis;8;BW +10927;69168;Wiesloch;8226;Rhein-Neckar-Kreis;8;BW +10928;69181;Leimen;8226;Rhein-Neckar-Kreis;8;BW +10929;69190;Walldorf;8226;Rhein-Neckar-Kreis;8;BW +10930;69198;Schriesheim;8226;Rhein-Neckar-Kreis;8;BW +10931;69207;Sandhausen;8226;Rhein-Neckar-Kreis;8;BW +10932;69214;Eppelheim;8226;Rhein-Neckar-Kreis;8;BW +10933;69221;Dossenheim;8226;Rhein-Neckar-Kreis;8;BW +10934;69226;Nussloch;8226;Rhein-Neckar-Kreis;8;BW +10935;69231;Rauenberg;8226;Rhein-Neckar-Kreis;8;BW +10936;69234;Dielheim;8226;Rhein-Neckar-Kreis;8;BW +10937;69239;Neckarsteinach;6431;Bergstrasse;6;HE +10938;69242;Muehlhausen;8226;Rhein-Neckar-Kreis;8;BW +10939;69245;Bammental;8226;Rhein-Neckar-Kreis;8;BW +10940;69250;Schoenau;8226;Rhein-Neckar-Kreis;8;BW +10941;69251;Gaiberg;8226;Rhein-Neckar-Kreis;8;BW +10942;69253;Heiligkreuzsteinach;8226;Rhein-Neckar-Kreis;8;BW +10943;69254;Malsch;8226;Rhein-Neckar-Kreis;8;BW +10944;69256;Mauer;8226;Rhein-Neckar-Kreis;8;BW +10945;69257;Wiesenbach;8226;Rhein-Neckar-Kreis;8;BW +10946;69259;Wilhelmsfeld;8226;Rhein-Neckar-Kreis;8;BW +10947;69412;Eberbach;8226;Rhein-Neckar-Kreis;8;BW +10948;69427;Mudau;8225;Neckar-Odenwald-Kreis;8;BW +10949;69429;Waldbrunn;8225;Neckar-Odenwald-Kreis;8;BW +10950;69434;Hirschhorn;6431;Bergstrasse;6;HE +10951;69434;Heddesbach;8226;Rhein-Neckar-Kreis;8;BW +10952;69436;Schoenbrunn;8226;Rhein-Neckar-Kreis;8;BW +10953;69437;Neckargerach;8225;Neckar-Odenwald-Kreis;8;BW +10954;69439;Zwingenberg;8225;Neckar-Odenwald-Kreis;8;BW +10955;69469;Weinheim;8226;Rhein-Neckar-Kreis;8;BW +10956;69483;Wald-Michelbach;6431;Bergstrasse;6;HE +10957;69488;Birkenau;6431;Bergstrasse;6;HE +10958;69493;Hirschberg an der Bergstrasse;8226;Rhein-Neckar-Kreis;8;BW +10959;69502;Hemsbach;8226;Rhein-Neckar-Kreis;8;BW +10960;69509;Moerlenbach;6431;Bergstrasse;6;HE +10961;69514;Laudenbach;8226;Rhein-Neckar-Kreis;8;BW +10962;69517;Gorxheimertal;6431;Bergstrasse;6;HE +10963;69518;Abtsteinach;6431;Bergstrasse;6;HE +10964;70173;Stuttgart;8111;Stuttgart;8;BW +10965;70174;Stuttgart;8111;Stuttgart;8;BW +10966;70176;Stuttgart;8111;Stuttgart;8;BW +10967;70178;Stuttgart;8111;Stuttgart;8;BW +10968;70180;Stuttgart;8111;Stuttgart;8;BW +10969;70182;Stuttgart;8111;Stuttgart;8;BW +10970;70184;Stuttgart;8111;Stuttgart;8;BW +10971;70186;Stuttgart;8111;Stuttgart;8;BW +10972;70188;Stuttgart;8111;Stuttgart;8;BW +10973;70190;Stuttgart;8111;Stuttgart;8;BW +10974;70191;Stuttgart;8111;Stuttgart;8;BW +10975;70192;Stuttgart;8111;Stuttgart;8;BW +10976;70193;Stuttgart;8111;Stuttgart;8;BW +10977;70195;Stuttgart;8111;Stuttgart;8;BW +10978;70197;Stuttgart;8111;Stuttgart;8;BW +10979;70199;Stuttgart;8111;Stuttgart;8;BW +10980;70327;Stuttgart;8111;Stuttgart;8;BW +10981;70329;Stuttgart;8111;Stuttgart;8;BW +10982;70372;Stuttgart;8111;Stuttgart;8;BW +10983;70374;Stuttgart;8111;Stuttgart;8;BW +10984;70376;Stuttgart;8111;Stuttgart;8;BW +10985;70378;Stuttgart;8111;Stuttgart;8;BW +10986;70435;Stuttgart;8111;Stuttgart;8;BW +10987;70437;Stuttgart;8111;Stuttgart;8;BW +10988;70439;Stuttgart;8111;Stuttgart;8;BW +10989;70469;Stuttgart;8111;Stuttgart;8;BW +10990;70499;Stuttgart;8111;Stuttgart;8;BW +10991;70563;Stuttgart;8111;Stuttgart;8;BW +10992;70565;Stuttgart;8111;Stuttgart;8;BW +10993;70567;Stuttgart;8111;Stuttgart;8;BW +10994;70569;Stuttgart;8111;Stuttgart;8;BW +10995;70597;Stuttgart;8111;Stuttgart;8;BW +10996;70599;Stuttgart;8111;Stuttgart;8;BW +10997;70619;Stuttgart;8111;Stuttgart;8;BW +10998;70629;Stuttgart;8111;Stuttgart;8;BW +10999;70734;Fellbach;8119;Rems-Murr-Kreis;8;BW +11000;70736;Fellbach;8119;Rems-Murr-Kreis;8;BW +11001;70771;Leinfelden-Echterdingen;8116;Esslingen;8;BW +11002;70794;Filderstadt;8116;Esslingen;8;BW +11003;70806;Kornwestheim;8118;Ludwigsburg;8;BW +11004;70825;Korntal-Muenchingen;8118;Ludwigsburg;8;BW +11005;70839;Gerlingen;8118;Ludwigsburg;8;BW +11006;71032;Boeblingen;8115;Boeblingen;8;BW +11007;71034;Boeblingen;8115;Boeblingen;8;BW +11008;71063;Sindelfingen;8115;Boeblingen;8;BW +11009;71065;Sindelfingen;8115;Boeblingen;8;BW +11010;71067;Sindelfingen;8115;Boeblingen;8;BW +11011;71069;Sindelfingen;8115;Boeblingen;8;BW +11012;71083;Herrenberg;8115;Boeblingen;8;BW +11013;71088;Holzgerlingen;8115;Boeblingen;8;BW +11014;71093;Weil im Schoenbuch;8115;Boeblingen;8;BW +11015;71101;Schoenaich;8115;Boeblingen;8;BW +11016;71106;Magstadt;8115;Boeblingen;8;BW +11017;71111;Waldenbuch;8115;Boeblingen;8;BW +11018;71116;Gaertringen;8115;Boeblingen;8;BW +11019;71120;Grafenau;8115;Boeblingen;8;BW +11020;71126;Gaeufelden;8115;Boeblingen;8;BW +11021;71131;Jettingen;8115;Boeblingen;8;BW +11022;71134;Aidlingen;8115;Boeblingen;8;BW +11023;71139;Ehningen;8115;Boeblingen;8;BW +11024;71144;Steinenbronn;8115;Boeblingen;8;BW +11025;71149;Bondorf;8115;Boeblingen;8;BW +11026;71154;Nufringen;8115;Boeblingen;8;BW +11027;71155;Altdorf;8115;Boeblingen;8;BW +11028;71157;Hildrizhausen;8115;Boeblingen;8;BW +11029;71159;Moetzingen;8115;Boeblingen;8;BW +11030;71229;Leonberg;8115;Boeblingen;8;BW +11031;71254;Ditzingen;8118;Ludwigsburg;8;BW +11032;71263;Weil der Stadt;8115;Boeblingen;8;BW +11033;71272;Renningen;8115;Boeblingen;8;BW +11034;71277;Rutesheim;8115;Boeblingen;8;BW +11035;71282;Hemmingen;8118;Ludwigsburg;8;BW +11036;71287;Weissach;8115;Boeblingen;8;BW +11037;71292;Friolzheim;8236;Enzkreis;8;BW +11038;71296;Heimsheim;8236;Enzkreis;8;BW +11039;71297;Moensheim;8236;Enzkreis;8;BW +11040;71299;Wimsheim;8236;Enzkreis;8;BW +11041;71332;Waiblingen;8119;Rems-Murr-Kreis;8;BW +11042;71334;Waiblingen;8119;Rems-Murr-Kreis;8;BW +11043;71336;Waiblingen;8119;Rems-Murr-Kreis;8;BW +11044;71364;Winnenden;8119;Rems-Murr-Kreis;8;BW +11045;71384;Weinstadt;8119;Rems-Murr-Kreis;8;BW +11046;71394;Kernen im Remstal;8119;Rems-Murr-Kreis;8;BW +11047;71397;Leutenbach;8119;Rems-Murr-Kreis;8;BW +11048;71404;Korb;8119;Rems-Murr-Kreis;8;BW +11049;71409;Schwaikheim;8119;Rems-Murr-Kreis;8;BW +11050;71522;Backnang;8119;Rems-Murr-Kreis;8;BW +11051;71540;Murrhardt;8119;Rems-Murr-Kreis;8;BW +11052;71543;Wuestenrot;8121;Heilbronn;8;BW +11053;71543;Beilstein;8121;Heilbronn;8;BW +11054;71546;Aspach;8119;Rems-Murr-Kreis;8;BW +11055;71549;Auenwald;8119;Rems-Murr-Kreis;8;BW +11056;71554;Weissach im Tal;8119;Rems-Murr-Kreis;8;BW +11057;71560;Sulzbach an der Murr;8119;Rems-Murr-Kreis;8;BW +11058;71563;Affalterbach;8118;Ludwigsburg;8;BW +11059;71566;Althuette;8119;Rems-Murr-Kreis;8;BW +11060;71570;Oppenweiler;8119;Rems-Murr-Kreis;8;BW +11061;71573;Allmersbach im Tal;8119;Rems-Murr-Kreis;8;BW +11062;71576;Burgstetten;8119;Rems-Murr-Kreis;8;BW +11063;71577;Grosserlach;8119;Rems-Murr-Kreis;8;BW +11064;71579;Spiegelberg;8119;Rems-Murr-Kreis;8;BW +11065;71634;Ludwigsburg;8118;Ludwigsburg;8;BW +11066;71636;Ludwigsburg;8118;Ludwigsburg;8;BW +11067;71638;Ludwigsburg;8118;Ludwigsburg;8;BW +11068;71640;Ludwigsburg;8118;Ludwigsburg;8;BW +11069;71642;Ludwigsburg;8118;Ludwigsburg;8;BW +11070;71665;Vaihingen an der Enz;8118;Ludwigsburg;8;BW +11071;71672;Marbach am Neckar;8118;Ludwigsburg;8;BW +11072;71679;Asperg;8118;Ludwigsburg;8;BW +11073;71686;Remseck am Neckar;8118;Ludwigsburg;8;BW +11074;71691;Freiberg am Neckar;8118;Ludwigsburg;8;BW +11075;71696;Moeglingen;8118;Ludwigsburg;8;BW +11076;71701;Schwieberdingen;8118;Ludwigsburg;8;BW +11077;71706;Markgroeningen;8118;Ludwigsburg;8;BW +11078;71711;Steinheim an der Murr;8118;Ludwigsburg;8;BW +11079;71711;Murr;8118;Ludwigsburg;8;BW +11080;71717;Beilstein;8121;Heilbronn;8;BW +11081;71720;Oberstenfeld;8118;Ludwigsburg;8;BW +11082;71723;Grossbottwar;8118;Ludwigsburg;8;BW +11083;71726;Benningen am Neckar;8118;Ludwigsburg;8;BW +11084;71729;Erdmannhausen;8118;Ludwigsburg;8;BW +11085;71732;Tamm;8118;Ludwigsburg;8;BW +11086;71735;Eberdingen;8118;Ludwigsburg;8;BW +11087;71737;Kirchberg an der Murr;8119;Rems-Murr-Kreis;8;BW +11088;71739;Oberriexingen;8118;Ludwigsburg;8;BW +11089;72070;Tuebingen;8416;Tuebingen;8;BW +11090;72072;Tuebingen;8416;Tuebingen;8;BW +11091;72074;Tuebingen;8416;Tuebingen;8;BW +11092;72076;Tuebingen;8416;Tuebingen;8;BW +11093;72108;Rottenburg am Neckar;8416;Tuebingen;8;BW +11094;72116;Moessingen;8416;Tuebingen;8;BW +11095;72119;Ammerbuch;8416;Tuebingen;8;BW +11096;72124;Pliezhausen;8415;Reutlingen;8;BW +11097;72127;Kusterdingen;8416;Tuebingen;8;BW +11098;72131;Ofterdingen;8416;Tuebingen;8;BW +11099;72135;Dettenhausen;8416;Tuebingen;8;BW +11100;72138;Kirchentellinsfurt;8416;Tuebingen;8;BW +11101;72141;Walddorfhaeslach;8415;Reutlingen;8;BW +11102;72144;Dusslingen;8416;Tuebingen;8;BW +11103;72145;Hirrlingen;8416;Tuebingen;8;BW +11104;72147;Nehren;8416;Tuebingen;8;BW +11105;72149;Neustetten;8416;Tuebingen;8;BW +11106;72160;Horb am Neckar;8237;Freudenstadt;8;BW +11107;72172;Sulz am Neckar;8325;Rottweil;8;BW +11108;72175;Dornhan;8325;Rottweil;8;BW +11109;72178;Waldachtal;8237;Freudenstadt;8;BW +11110;72181;Starzach;8416;Tuebingen;8;BW +11111;72184;Eutingen im Gaeu;8237;Freudenstadt;8;BW +11112;72186;Empfingen;8237;Freudenstadt;8;BW +11113;72189;Voehringen;8325;Rottweil;8;BW +11114;72202;Nagold;8235;Calw;8;BW +11115;72213;Altensteig;8235;Calw;8;BW +11116;72218;Wildberg;8235;Calw;8;BW +11117;72221;Haiterbach;8235;Calw;8;BW +11118;72224;Ebhausen;8235;Calw;8;BW +11119;72226;Simmersfeld;8235;Calw;8;BW +11120;72227;Egenhausen;8235;Calw;8;BW +11121;72229;Rohrdorf;8235;Calw;8;BW +11122;72250;Freudenstadt;8237;Freudenstadt;8;BW +11123;72270;Baiersbronn;8237;Freudenstadt;8;BW +11124;72275;Alpirsbach;8237;Freudenstadt;8;BW +11125;72280;Dornstetten;8237;Freudenstadt;8;BW +11126;72285;Pfalzgrafenweiler;8237;Freudenstadt;8;BW +11127;72290;Lossburg;8237;Freudenstadt;8;BW +11128;72291;Betzweiler-Waelde;8237;Freudenstadt;8;BW +11129;72293;Glatten;8237;Freudenstadt;8;BW +11130;72294;Groembach;8237;Freudenstadt;8;BW +11131;72296;Schopfloch;8237;Freudenstadt;8;BW +11132;72297;Seewald;8237;Freudenstadt;8;BW +11133;72299;Woernersberg;8237;Freudenstadt;8;BW +11134;72336;Balingen;8417;Zollernalbkreis;8;BW +11135;72348;Rosenfeld;8417;Zollernalbkreis;8;BW +11136;72351;Geislingen;8417;Zollernalbkreis;8;BW +11137;72355;Schoemberg;8417;Zollernalbkreis;8;BW +11138;72356;Dautmergen;8417;Zollernalbkreis;8;BW +11139;72358;Dormettingen;8417;Zollernalbkreis;8;BW +11140;72359;Dotternhausen;8417;Zollernalbkreis;8;BW +11141;72361;Hausen am Tann;8417;Zollernalbkreis;8;BW +11142;72362;Nusplingen;8417;Zollernalbkreis;8;BW +11143;72364;Obernheim;8417;Zollernalbkreis;8;BW +11144;72365;Ratshausen;8417;Zollernalbkreis;8;BW +11145;72367;Weilen unter den Rinnen;8417;Zollernalbkreis;8;BW +11146;72369;Zimmern unter der Burg;8417;Zollernalbkreis;8;BW +11147;72379;Hechingen;8417;Zollernalbkreis;8;BW +11148;72393;Burladingen;8417;Zollernalbkreis;8;BW +11149;72401;Haigerloch;8417;Zollernalbkreis;8;BW +11150;72406;Bisingen;8417;Zollernalbkreis;8;BW +11151;72411;Bodelshausen;8416;Tuebingen;8;BW +11152;72414;Rangendingen;8417;Zollernalbkreis;8;BW +11153;72415;Grosselfingen;8417;Zollernalbkreis;8;BW +11154;72417;Jungingen;8417;Zollernalbkreis;8;BW +11155;72419;Neufra;8437;Sigmaringen;8;BW +11156;72458;Albstadt;8417;Zollernalbkreis;8;BW +11157;72459;Albstadt;8417;Zollernalbkreis;8;BW +11158;72461;Albstadt;8417;Zollernalbkreis;8;BW +11159;72469;Messstetten;8417;Zollernalbkreis;8;BW +11160;72474;Winterlingen;8417;Zollernalbkreis;8;BW +11161;72475;Bitz;8417;Zollernalbkreis;8;BW +11162;72477;Schwenningen;8437;Sigmaringen;8;BW +11163;72479;Strassberg;8417;Zollernalbkreis;8;BW +11164;72488;Sigmaringen;8437;Sigmaringen;8;BW +11165;72501;Gammertingen;8437;Sigmaringen;8;BW +11166;72505;Krauchenwies;8437;Sigmaringen;8;BW +11167;72510;Stetten am kalten Markt;8437;Sigmaringen;8;BW +11168;72511;Bingen;8437;Sigmaringen;8;BW +11169;72513;Hettingen;8437;Sigmaringen;8;BW +11170;72514;Inzigkofen;8437;Sigmaringen;8;BW +11171;72516;Scheer;8437;Sigmaringen;8;BW +11172;72517;Sigmaringendorf;8437;Sigmaringen;8;BW +11173;72519;Veringenstadt;8437;Sigmaringen;8;BW +11174;72525;Muensingen;8415;Reutlingen;8;BW +11175;72531;Hohenstein;8415;Reutlingen;8;BW +11176;72532;Gomadingen;8415;Reutlingen;8;BW +11177;72534;Hayingen;8415;Reutlingen;8;BW +11178;72535;Heroldstatt;8425;Alb-Donau-Kreis;8;BW +11179;72537;Mehrstetten;8415;Reutlingen;8;BW +11180;72539;Pfronstetten;8415;Reutlingen;8;BW +11181;72555;Metzingen;8415;Reutlingen;8;BW +11182;72574;Bad Urach;8415;Reutlingen;8;BW +11183;72581;Dettingen an der Erms;8415;Reutlingen;8;BW +11184;72582;Grabenstetten;8415;Reutlingen;8;BW +11185;72584;Huelben;8415;Reutlingen;8;BW +11186;72585;Riederich;8415;Reutlingen;8;BW +11187;72587;Roemerstein;8415;Reutlingen;8;BW +11188;72589;Westerheim;8425;Alb-Donau-Kreis;8;BW +11189;72622;Nuertingen;8116;Esslingen;8;BW +11190;72631;Aichtal;8116;Esslingen;8;BW +11191;72636;Frickenhausen;8116;Esslingen;8;BW +11192;72639;Neuffen;8116;Esslingen;8;BW +11193;72644;Oberboihingen;8116;Esslingen;8;BW +11194;72649;Wolfschlugen;8116;Esslingen;8;BW +11195;72654;Neckartenzlingen;8116;Esslingen;8;BW +11196;72655;Altdorf;8116;Esslingen;8;BW +11197;72657;Altenriet;8116;Esslingen;8;BW +11198;72658;Bempflingen;8116;Esslingen;8;BW +11199;72660;Beuren;8116;Esslingen;8;BW +11200;72661;Grafenberg;8415;Reutlingen;8;BW +11201;72663;Grossbettlingen;8116;Esslingen;8;BW +11202;72664;Kohlberg;8116;Esslingen;8;BW +11203;72666;Neckartailfingen;8116;Esslingen;8;BW +11204;72667;Schlaitdorf;8116;Esslingen;8;BW +11205;72669;Unterensingen;8116;Esslingen;8;BW +11206;72760;Reutlingen;8415;Reutlingen;8;BW +11207;72762;Reutlingen;8415;Reutlingen;8;BW +11208;72764;Reutlingen;8415;Reutlingen;8;BW +11209;72766;Reutlingen;8415;Reutlingen;8;BW +11210;72768;Reutlingen;8415;Reutlingen;8;BW +11211;72770;Reutlingen;8415;Reutlingen;8;BW +11212;72793;Pfullingen;8415;Reutlingen;8;BW +11213;72800;Eningen unter Achalm;8415;Reutlingen;8;BW +11214;72805;Lichtenstein;8415;Reutlingen;8;BW +11215;72810;Gomaringen;8416;Tuebingen;8;BW +11216;72813;Sankt Johann;8415;Reutlingen;8;BW +11217;72818;Trochtelfingen;8415;Reutlingen;8;BW +11218;72820;Sonnenbuehl;8415;Reutlingen;8;BW +11219;72827;Wannweil;8415;Reutlingen;8;BW +11220;72829;Engstingen;8415;Reutlingen;8;BW +11221;73033;Goeppingen;8117;Goeppingen;8;BW +11222;73035;Goeppingen;8117;Goeppingen;8;BW +11223;73037;Goeppingen;8117;Goeppingen;8;BW +11224;73054;Eislingen/Fils;8117;Goeppingen;8;BW +11225;73061;Ebersbach an der Fils;8117;Goeppingen;8;BW +11226;73066;Uhingen;8117;Goeppingen;8;BW +11227;73072;Donzdorf;8117;Goeppingen;8;BW +11228;73079;Suessen;8117;Goeppingen;8;BW +11229;73084;Salach;8117;Goeppingen;8;BW +11230;73087;Boll;8117;Goeppingen;8;BW +11231;73092;Heiningen;8117;Goeppingen;8;BW +11232;73095;Albershausen;8117;Goeppingen;8;BW +11233;73098;Rechberghausen;8117;Goeppingen;8;BW +11234;73099;Adelberg;8117;Goeppingen;8;BW +11235;73101;Aichelberg;8117;Goeppingen;8;BW +11236;73102;Birenbach;8117;Goeppingen;8;BW +11237;73104;Boertlingen;8117;Goeppingen;8;BW +11238;73105;Duernau;8117;Goeppingen;8;BW +11239;73107;Eschenbach;8117;Goeppingen;8;BW +11240;73108;Gammelshausen;8117;Goeppingen;8;BW +11241;73110;Hattenhofen;8117;Goeppingen;8;BW +11242;73111;Lauterstein;8117;Goeppingen;8;BW +11243;73113;Ottenbach;8117;Goeppingen;8;BW +11244;73114;Schlat;8117;Goeppingen;8;BW +11245;73116;Waeschenbeuren;8117;Goeppingen;8;BW +11246;73117;Wangen;8117;Goeppingen;8;BW +11247;73119;Zell unter Aichelberg;8117;Goeppingen;8;BW +11248;73207;Plochingen;8116;Esslingen;8;BW +11249;73230;Kirchheim unter Teck;8116;Esslingen;8;BW +11250;73235;Weilheim an der Teck;8116;Esslingen;8;BW +11251;73240;Wendlingen am Neckar;8116;Esslingen;8;BW +11252;73249;Wernau;8116;Esslingen;8;BW +11253;73252;Lenningen;8116;Esslingen;8;BW +11254;73257;Koengen;8116;Esslingen;8;BW +11255;73262;Reichenbach an der Fils;8116;Esslingen;8;BW +11256;73265;Dettingen unter Teck;8116;Esslingen;8;BW +11257;73266;Bissingen an der Teck;8116;Esslingen;8;BW +11258;73268;Erkenbrechtsweiler;8116;Esslingen;8;BW +11259;73269;Hochdorf;8116;Esslingen;8;BW +11260;73271;Holzmaden;8116;Esslingen;8;BW +11261;73272;Neidlingen;8116;Esslingen;8;BW +11262;73274;Notzingen;8116;Esslingen;8;BW +11263;73275;Ohmden;8116;Esslingen;8;BW +11264;73277;Owen;8116;Esslingen;8;BW +11265;73278;Schlierbach;8117;Goeppingen;8;BW +11266;73312;Geislingen an der Steige;8117;Goeppingen;8;BW +11267;73326;Deggingen;8117;Goeppingen;8;BW +11268;73329;Kuchen;8117;Goeppingen;8;BW +11269;73333;Gingen an der Fils;8117;Goeppingen;8;BW +11270;73337;Bad Überkingen;8117;Goeppingen;8;BW +11271;73340;Amstetten;8425;Alb-Donau-Kreis;8;BW +11272;73342;Bad Ditzenbach;8117;Goeppingen;8;BW +11273;73344;Gruibingen;8117;Goeppingen;8;BW +11274;73345;Hohenstadt;8117;Goeppingen;8;BW +11275;73345;Drackenstein;8117;Goeppingen;8;BW +11276;73347;Muehlhausen im Taele;8117;Goeppingen;8;BW +11277;73349;Wiesensteig;8117;Goeppingen;8;BW +11278;73430;Aalen;8136;Ostalbkreis;8;BW +11279;73431;Aalen;8136;Ostalbkreis;8;BW +11280;73432;Aalen;8136;Ostalbkreis;8;BW +11281;73433;Aalen;8136;Ostalbkreis;8;BW +11282;73434;Aalen;8136;Ostalbkreis;8;BW +11283;73441;Bopfingen;8136;Ostalbkreis;8;BW +11284;73447;Oberkochen;8136;Ostalbkreis;8;BW +11285;73450;Neresheim;8136;Ostalbkreis;8;BW +11286;73453;Abtsgmuend;8136;Ostalbkreis;8;BW +11287;73457;Essingen;8136;Ostalbkreis;8;BW +11288;73460;Huettlingen;8136;Ostalbkreis;8;BW +11289;73463;Westhausen;8136;Ostalbkreis;8;BW +11290;73466;Lauchheim;8136;Ostalbkreis;8;BW +11291;73467;Kirchheim am Ries;8136;Ostalbkreis;8;BW +11292;73469;Riesbuerg;8136;Ostalbkreis;8;BW +11293;73479;Ellwangen (Jagst);8136;Ostalbkreis;8;BW +11294;73485;Unterschneidheim;8136;Ostalbkreis;8;BW +11295;73486;Adelmannsfelden;8136;Ostalbkreis;8;BW +11296;73488;Ellenberg;8136;Ostalbkreis;8;BW +11297;73489;Jagstzell;8136;Ostalbkreis;8;BW +11298;73491;Neuler;8136;Ostalbkreis;8;BW +11299;73492;Rainau;8136;Ostalbkreis;8;BW +11300;73494;Rosenberg;8136;Ostalbkreis;8;BW +11301;73495;Stoedtlen;8136;Ostalbkreis;8;BW +11302;73497;Tannhausen;8136;Ostalbkreis;8;BW +11303;73499;Woert;8136;Ostalbkreis;8;BW +11304;73525;Schwaebisch Gmuend;8136;Ostalbkreis;8;BW +11305;73527;Taeferrot;8136;Ostalbkreis;8;BW +11306;73527;Schwaebisch Gmuend;8136;Ostalbkreis;8;BW +11307;73529;Schwaebisch Gmuend;8136;Ostalbkreis;8;BW +11308;73540;Heubach;8136;Ostalbkreis;8;BW +11309;73547;Lorch;8136;Ostalbkreis;8;BW +11310;73550;Waldstetten;8136;Ostalbkreis;8;BW +11311;73553;Alfdorf;8119;Rems-Murr-Kreis;8;BW +11312;73557;Mutlangen;8136;Ostalbkreis;8;BW +11313;73560;Boebingen an der Rems;8136;Ostalbkreis;8;BW +11314;73563;Moegglingen;8136;Ostalbkreis;8;BW +11315;73565;Spraitbach;8136;Ostalbkreis;8;BW +11316;73566;Bartholomae;8136;Ostalbkreis;8;BW +11317;73568;Durlangen;8136;Ostalbkreis;8;BW +11318;73569;Eschach;8136;Ostalbkreis;8;BW +11319;73569;Obergroeningen;8136;Ostalbkreis;8;BW +11320;73571;Goeggingen;8136;Ostalbkreis;8;BW +11321;73572;Heuchlingen;8136;Ostalbkreis;8;BW +11322;73574;Iggingen;8136;Ostalbkreis;8;BW +11323;73575;Leinzell;8136;Ostalbkreis;8;BW +11324;73577;Ruppertshofen;8136;Ostalbkreis;8;BW +11325;73579;Schechingen;8136;Ostalbkreis;8;BW +11326;73614;Schorndorf;8119;Rems-Murr-Kreis;8;BW +11327;73630;Remshalden;8119;Rems-Murr-Kreis;8;BW +11328;73635;Rudersberg;8119;Rems-Murr-Kreis;8;BW +11329;73642;Welzheim;8119;Rems-Murr-Kreis;8;BW +11330;73650;Winterbach;8119;Rems-Murr-Kreis;8;BW +11331;73655;Pluederhausen;8119;Rems-Murr-Kreis;8;BW +11332;73660;Urbach;8119;Rems-Murr-Kreis;8;BW +11333;73663;Berglen;8119;Rems-Murr-Kreis;8;BW +11334;73666;Baltmannsweiler;8116;Esslingen;8;BW +11335;73667;Kaisersbach;8119;Rems-Murr-Kreis;8;BW +11336;73669;Lichtenwald;8116;Esslingen;8;BW +11337;73728;Esslingen am Neckar;8116;Esslingen;8;BW +11338;73730;Esslingen am Neckar;8116;Esslingen;8;BW +11339;73732;Esslingen am Neckar;8116;Esslingen;8;BW +11340;73733;Esslingen am Neckar;8116;Esslingen;8;BW +11341;73734;Esslingen am Neckar;8116;Esslingen;8;BW +11342;73760;Ostfildern;8116;Esslingen;8;BW +11343;73765;Neuhausen auf den Fildern;8116;Esslingen;8;BW +11344;73770;Denkendorf;8116;Esslingen;8;BW +11345;73773;Aichwald;8116;Esslingen;8;BW +11346;73776;Altbach;8116;Esslingen;8;BW +11347;73779;Deizisau;8116;Esslingen;8;BW +11348;74072;Heilbronn;8121;Heilbronn;8;BW +11349;74074;Heilbronn;8121;Heilbronn;8;BW +11350;74076;Heilbronn;8121;Heilbronn;8;BW +11351;74078;Heilbronn;8121;Heilbronn;8;BW +11352;74080;Heilbronn;8121;Heilbronn;8;BW +11353;74081;Heilbronn;8121;Heilbronn;8;BW +11354;74172;Neckarsulm;8121;Heilbronn;8;BW +11355;74177;Bad Friedrichshall;8121;Heilbronn;8;BW +11356;74182;Obersulm;8121;Heilbronn;8;BW +11357;74189;Weinsberg;8121;Heilbronn;8;BW +11358;74193;Schwaigern;8121;Heilbronn;8;BW +11359;74196;Neuenstadt am Kocher;8121;Heilbronn;8;BW +11360;74199;Untergruppenbach;8121;Heilbronn;8;BW +11361;74206;Bad Wimpfen;8121;Heilbronn;8;BW +11362;74211;Leingarten;8121;Heilbronn;8;BW +11363;74214;Schoental;8126;Hohenlohekreis;8;BW +11364;74219;Moeckmuehl;8121;Heilbronn;8;BW +11365;74223;Flein;8121;Heilbronn;8;BW +11366;74226;Nordheim;8121;Heilbronn;8;BW +11367;74229;Oedheim;8121;Heilbronn;8;BW +11368;74232;Abstatt;8121;Heilbronn;8;BW +11369;74235;Erlenbach;8121;Heilbronn;8;BW +11370;74238;Krautheim;8126;Hohenlohekreis;8;BW +11371;74239;Hardthausen am Kocher;8121;Heilbronn;8;BW +11372;74243;Langenbrettach;8121;Heilbronn;8;BW +11373;74245;Loewenstein;8121;Heilbronn;8;BW +11374;74246;Eberstadt;8121;Heilbronn;8;BW +11375;74248;Ellhofen;8121;Heilbronn;8;BW +11376;74249;Jagsthausen;8121;Heilbronn;8;BW +11377;74251;Lehrensteinsfeld;8121;Heilbronn;8;BW +11378;74252;Massenbachhausen;8121;Heilbronn;8;BW +11379;74254;Offenau;8121;Heilbronn;8;BW +11380;74255;Roigheim;8121;Heilbronn;8;BW +11381;74257;Untereisesheim;8121;Heilbronn;8;BW +11382;74259;Widdern;8121;Heilbronn;8;BW +11383;74321;Bietigheim-Bissingen;8118;Ludwigsburg;8;BW +11384;74336;Brackenheim;8121;Heilbronn;8;BW +11385;74343;SNheim;8118;Ludwigsburg;8;BW +11386;74348;Lauffen am Neckar;8121;Heilbronn;8;BW +11387;74354;Besigheim;8118;Ludwigsburg;8;BW +11388;74357;Boennigheim;8118;Ludwigsburg;8;BW +11389;74360;Ilsfeld;8121;Heilbronn;8;BW +11390;74363;Gueglingen;8121;Heilbronn;8;BW +11391;74366;Kirchheim am Neckar;8118;Ludwigsburg;8;BW +11392;74369;Loechgau;8118;Ludwigsburg;8;BW +11393;74372;Sersheim;8118;Ludwigsburg;8;BW +11394;74374;Zaberfeld;8121;Heilbronn;8;BW +11395;74376;Gemmrigheim;8118;Ludwigsburg;8;BW +11396;74379;Ingersheim;8118;Ludwigsburg;8;BW +11397;74382;Neckarwestheim;8121;Heilbronn;8;BW +11398;74385;Pleidelsheim;8118;Ludwigsburg;8;BW +11399;74388;Talheim;8121;Heilbronn;8;BW +11400;74389;Cleebronn;8121;Heilbronn;8;BW +11401;74391;Erligheim;8118;Ludwigsburg;8;BW +11402;74392;Freudental;8118;Ludwigsburg;8;BW +11403;74394;Hessigheim;8118;Ludwigsburg;8;BW +11404;74395;Mundelsheim;8118;Ludwigsburg;8;BW +11405;74397;Pfaffenhofen;8121;Heilbronn;8;BW +11406;74399;Walheim;8118;Ludwigsburg;8;BW +11407;74405;Gaildorf;8127;Schwaebisch Hall;8;BW +11408;74417;Gschwend;8136;Ostalbkreis;8;BW +11409;74420;Oberrot;8127;Schwaebisch Hall;8;BW +11410;74423;Obersontheim;8127;Schwaebisch Hall;8;BW +11411;74424;Buehlertann;8127;Schwaebisch Hall;8;BW +11412;74426;Buehlerzell;8127;Schwaebisch Hall;8;BW +11413;74427;Fichtenberg;8127;Schwaebisch Hall;8;BW +11414;74429;Sulzbach-Laufen;8127;Schwaebisch Hall;8;BW +11415;74523;Schwaebisch Hall;8127;Schwaebisch Hall;8;BW +11416;74532;Ilshofen;8127;Schwaebisch Hall;8;BW +11417;74535;Mainhardt;8127;Schwaebisch Hall;8;BW +11418;74538;Rosengarten;8127;Schwaebisch Hall;8;BW +11419;74541;Vellberg;8127;Schwaebisch Hall;8;BW +11420;74542;Braunsbach;8127;Schwaebisch Hall;8;BW +11421;74544;Michelbach an der Bilz;8127;Schwaebisch Hall;8;BW +11422;74545;Michelfeld;8127;Schwaebisch Hall;8;BW +11423;74547;Untermuenkheim;8127;Schwaebisch Hall;8;BW +11424;74549;Wolpertshausen;8127;Schwaebisch Hall;8;BW +11425;74564;Crailsheim;8127;Schwaebisch Hall;8;BW +11426;74572;Blaufelden;8127;Schwaebisch Hall;8;BW +11427;74575;Schrozberg;8127;Schwaebisch Hall;8;BW +11428;74579;Fichtenau;8127;Schwaebisch Hall;8;BW +11429;74582;Gerabronn;8127;Schwaebisch Hall;8;BW +11430;74585;Rot am See;8127;Schwaebisch Hall;8;BW +11431;74586;Frankenhardt;8127;Schwaebisch Hall;8;BW +11432;74589;Satteldorf;8127;Schwaebisch Hall;8;BW +11433;74592;Kirchberg an der Jagst;8127;Schwaebisch Hall;8;BW +11434;74594;Kressberg;8127;Schwaebisch Hall;8;BW +11435;74595;Langenburg;8127;Schwaebisch Hall;8;BW +11436;74597;Stimpfach;8127;Schwaebisch Hall;8;BW +11437;74599;Wallhausen;8127;Schwaebisch Hall;8;BW +11438;74613;hringen;8126;Hohenlohekreis;8;BW +11439;74626;Bretzfeld;8126;Hohenlohekreis;8;BW +11440;74629;Pfedelbach;8126;Hohenlohekreis;8;BW +11441;74632;Neuenstein;8126;Hohenlohekreis;8;BW +11442;74635;Kupferzell;8126;Hohenlohekreis;8;BW +11443;74638;Waldenburg;8126;Hohenlohekreis;8;BW +11444;74639;Zweiflingen;8126;Hohenlohekreis;8;BW +11445;74653;Ingelfingen;8126;Hohenlohekreis;8;BW +11446;74653;Kuenzelsau;8126;Hohenlohekreis;8;BW +11447;74670;Forchtenberg;8126;Hohenlohekreis;8;BW +11448;74673;Mulfingen;8126;Hohenlohekreis;8;BW +11449;74676;Niedernhall;8126;Hohenlohekreis;8;BW +11450;74677;Doerzbach;8126;Hohenlohekreis;8;BW +11451;74679;Weissbach;8126;Hohenlohekreis;8;BW +11452;74706;Osterburken;8225;Neckar-Odenwald-Kreis;8;BW +11453;74722;Buchen (Odenwald);8225;Neckar-Odenwald-Kreis;8;BW +11454;74731;Wallduern;8225;Neckar-Odenwald-Kreis;8;BW +11455;74736;Hardheim;8225;Neckar-Odenwald-Kreis;8;BW +11456;74740;Adelsheim;8225;Neckar-Odenwald-Kreis;8;BW +11457;74743;Seckach;8225;Neckar-Odenwald-Kreis;8;BW +11458;74744;Ahorn;8128;Main-Tauber-Kreis;8;BW +11459;74746;Hoepfingen;8225;Neckar-Odenwald-Kreis;8;BW +11460;74747;Ravenstein;8225;Neckar-Odenwald-Kreis;8;BW +11461;74749;Rosenberg;8225;Neckar-Odenwald-Kreis;8;BW +11462;74821;Mosbach;8225;Neckar-Odenwald-Kreis;8;BW +11463;74831;Gundelsheim;8121;Heilbronn;8;BW +11464;74834;Elztal;8225;Neckar-Odenwald-Kreis;8;BW +11465;74838;Limbach;8225;Neckar-Odenwald-Kreis;8;BW +11466;74842;Billigheim;8225;Neckar-Odenwald-Kreis;8;BW +11467;74847;Obrigheim;8225;Neckar-Odenwald-Kreis;8;BW +11468;74850;Schefflenz;8225;Neckar-Odenwald-Kreis;8;BW +11469;74855;Hassmersheim;8225;Neckar-Odenwald-Kreis;8;BW +11470;74858;Aglasterhausen;8225;Neckar-Odenwald-Kreis;8;BW +11471;74861;Neudenau;8121;Heilbronn;8;BW +11472;74862;Binau;8225;Neckar-Odenwald-Kreis;8;BW +11473;74864;Fahrenbach;8225;Neckar-Odenwald-Kreis;8;BW +11474;74865;Neckarzimmern;8225;Neckar-Odenwald-Kreis;8;BW +11475;74867;Neunkirchen;8225;Neckar-Odenwald-Kreis;8;BW +11476;74869;Schwarzach;8225;Neckar-Odenwald-Kreis;8;BW +11477;74889;Sinsheim;8226;Rhein-Neckar-Kreis;8;BW +11478;74906;Bad Rappenau;8121;Heilbronn;8;BW +11479;74909;Meckesheim;8226;Rhein-Neckar-Kreis;8;BW +11480;74912;Kirchardt;8121;Heilbronn;8;BW +11481;74915;Waibstadt;8226;Rhein-Neckar-Kreis;8;BW +11482;74918;Angelbachtal;8226;Rhein-Neckar-Kreis;8;BW +11483;74921;Helmstadt-Bargen;8226;Rhein-Neckar-Kreis;8;BW +11484;74924;Neckarbischofsheim;8226;Rhein-Neckar-Kreis;8;BW +11485;74925;Epfenbach;8226;Rhein-Neckar-Kreis;8;BW +11486;74927;Eschelbronn;8226;Rhein-Neckar-Kreis;8;BW +11487;74928;Hueffenhardt;8225;Neckar-Odenwald-Kreis;8;BW +11488;74930;Ittlingen;8121;Heilbronn;8;BW +11489;74931;Lobbach;8226;Rhein-Neckar-Kreis;8;BW +11490;74933;Neidenstein;8226;Rhein-Neckar-Kreis;8;BW +11491;74934;Reichartshausen;8226;Rhein-Neckar-Kreis;8;BW +11492;74936;Siegelsbach;8121;Heilbronn;8;BW +11493;74937;Spechbach;8226;Rhein-Neckar-Kreis;8;BW +11494;74939;Zuzenhausen;8226;Rhein-Neckar-Kreis;8;BW +11495;75015;Bretten;8212;Karlsruhe;8;BW +11496;75031;Eppingen;8121;Heilbronn;8;BW +11497;75038;Oberderdingen;8212;Karlsruhe;8;BW +11498;75045;Walzbachtal;8212;Karlsruhe;8;BW +11499;75050;Gemmingen;8121;Heilbronn;8;BW +11500;75053;Gondelsheim;8212;Karlsruhe;8;BW +11501;75056;Sulzfeld;8212;Karlsruhe;8;BW +11502;75057;Kuernbach;8212;Karlsruhe;8;BW +11503;75059;Zaisenhausen;8212;Karlsruhe;8;BW +11504;75172;Pforzheim;8231;Pforzheim;8;BW +11505;75173;Pforzheim;8231;Pforzheim;8;BW +11506;75175;Pforzheim;8231;Pforzheim;8;BW +11507;75177;Pforzheim;8231;Pforzheim;8;BW +11508;75179;Pforzheim;8231;Pforzheim;8;BW +11509;75180;Pforzheim;8231;Pforzheim;8;BW +11510;75181;Pforzheim;8231;Pforzheim;8;BW +11511;75196;Remchingen;8236;Enzkreis;8;BW +11512;75203;Koenigsbach-Stein;8236;Enzkreis;8;BW +11513;75210;Keltern;8236;Enzkreis;8;BW +11514;75217;Birkenfeld;8236;Enzkreis;8;BW +11515;75223;Niefern-Öschelbronn;8236;Enzkreis;8;BW +11516;75228;Ispringen;8236;Enzkreis;8;BW +11517;75233;Tiefenbronn;8236;Enzkreis;8;BW +11518;75236;Kaempfelbach;8236;Enzkreis;8;BW +11519;75239;Eisingen;8236;Enzkreis;8;BW +11520;75242;Neuhausen;8236;Enzkreis;8;BW +11521;75245;Neulingen;8236;Enzkreis;8;BW +11522;75248;lbronn-Duerrn;8236;Enzkreis;8;BW +11523;75249;Kieselbronn;8236;Enzkreis;8;BW +11524;75305;Neuenbuerg;8236;Enzkreis;8;BW +11525;75323;Bad Wildbad im Schwarzwald;8235;Calw;8;BW +11526;75328;Schoemberg;8235;Calw;8;BW +11527;75331;Engelsbrand;8236;Enzkreis;8;BW +11528;75334;Straubenhardt;8236;Enzkreis;8;BW +11529;75335;Dobel;8235;Calw;8;BW +11530;75337;Enzkloesterle;8235;Calw;8;BW +11531;75339;Hoefen an der Enz;8235;Calw;8;BW +11532;75365;Calw;8235;Calw;8;BW +11533;75378;Bad Liebenzell;8235;Calw;8;BW +11534;75382;Althengstett;8235;Calw;8;BW +11535;75385;Bad Teinach-Zavelstein;8235;Calw;8;BW +11536;75387;Neubulach;8235;Calw;8;BW +11537;75389;Neuweiler;8235;Calw;8;BW +11538;75391;Gechingen;8235;Calw;8;BW +11539;75392;Deckenpfronn;8115;Boeblingen;8;BW +11540;75394;Oberreichenbach;8235;Calw;8;BW +11541;75395;Ostelsheim;8235;Calw;8;BW +11542;75397;Simmozheim;8235;Calw;8;BW +11543;75399;Unterreichenbach;8235;Calw;8;BW +11544;75417;Muehlacker;8236;Enzkreis;8;BW +11545;75428;Illingen;8236;Enzkreis;8;BW +11546;75433;Maulbronn;8236;Enzkreis;8;BW +11547;75438;Knittlingen;8236;Enzkreis;8;BW +11548;75443;tisheim;8236;Enzkreis;8;BW +11549;75446;Wiernsheim;8236;Enzkreis;8;BW +11550;75447;Sternenfels;8236;Enzkreis;8;BW +11551;75449;Wurmberg;8236;Enzkreis;8;BW +11552;76131;Karlsruhe;8212;Karlsruhe;8;BW +11553;76133;Karlsruhe;8212;Karlsruhe;8;BW +11554;76135;Karlsruhe;8212;Karlsruhe;8;BW +11555;76137;Karlsruhe;8212;Karlsruhe;8;BW +11556;76139;Karlsruhe;8212;Karlsruhe;8;BW +11557;76149;Karlsruhe;8212;Karlsruhe;8;BW +11558;76185;Karlsruhe;8212;Karlsruhe;8;BW +11559;76187;Karlsruhe;8212;Karlsruhe;8;BW +11560;76189;Karlsruhe;8212;Karlsruhe;8;BW +11561;76199;Karlsruhe;8212;Karlsruhe;8;BW +11562;76227;Karlsruhe;8212;Karlsruhe;8;BW +11563;76228;Karlsruhe;8212;Karlsruhe;8;BW +11564;76229;Karlsruhe;8212;Karlsruhe;8;BW +11565;76275;Ettlingen;8212;Karlsruhe;8;BW +11566;76287;Rheinstetten;8212;Karlsruhe;8;BW +11567;76297;Stutensee;8212;Karlsruhe;8;BW +11568;76307;Karlsbad;8212;Karlsruhe;8;BW +11569;76316;Malsch;8212;Karlsruhe;8;BW +11570;76327;Pfinztal;8212;Karlsruhe;8;BW +11571;76332;Bad Herrenalb;8235;Calw;8;BW +11572;76337;Waldbronn;8212;Karlsruhe;8;BW +11573;76344;Eggenstein-Leopoldshafen;8212;Karlsruhe;8;BW +11574;76351;Linkenheim-Hochstetten;8212;Karlsruhe;8;BW +11575;76356;Weingarten;8212;Karlsruhe;8;BW +11576;76359;Marxzell;8212;Karlsruhe;8;BW +11577;76437;Rastatt;8216;Rastatt;8;BW +11578;76448;Durmersheim;8216;Rastatt;8;BW +11579;76456;Kuppenheim;8216;Rastatt;8;BW +11580;76461;Muggensturm;8216;Rastatt;8;BW +11581;76467;Bietigheim;8216;Rastatt;8;BW +11582;76470;tigheim;8216;Rastatt;8;BW +11583;76473;Iffezheim;8216;Rastatt;8;BW +11584;76474;Au am Rhein;8216;Rastatt;8;BW +11585;76476;Bischweier;8216;Rastatt;8;BW +11586;76477;Elchesheim-Illingen;8216;Rastatt;8;BW +11587;76479;Steinmauern;8216;Rastatt;8;BW +11588;76530;Baden-Baden;8211;Baden-Baden;8;BW +11589;76532;Baden-Baden;8211;Baden-Baden;8;BW +11590;76534;Baden-Baden;8211;Baden-Baden;8;BW +11591;76547;Sinzheim;8216;Rastatt;8;BW +11592;76549;Huegelsheim;8216;Rastatt;8;BW +11593;76571;Gaggenau;8216;Rastatt;8;BW +11594;76593;Gernsbach;8216;Rastatt;8;BW +11595;76596;Forbach;8216;Rastatt;8;BW +11596;76597;Loffenau;8216;Rastatt;8;BW +11597;76599;Weisenbach;8216;Rastatt;8;BW +11598;76646;Bruchsal;8212;Karlsruhe;8;BW +11599;76661;Philippsburg;8212;Karlsruhe;8;BW +11600;76669;Bad Schoenborn;8212;Karlsruhe;8;BW +11601;76676;Graben-Neudorf;8212;Karlsruhe;8;BW +11602;76684;stringen;8212;Karlsruhe;8;BW +11603;76689;Karlsdorf-Neuthard;8212;Karlsruhe;8;BW +11604;76694;Forst;8212;Karlsruhe;8;BW +11605;76698;Ubstadt-Weiher;8212;Karlsruhe;8;BW +11606;76703;Kraichtal;8212;Karlsruhe;8;BW +11607;76706;Dettenheim;8212;Karlsruhe;8;BW +11608;76707;Hambruecken;8212;Karlsruhe;8;BW +11609;76709;Kronau;8212;Karlsruhe;8;BW +11610;76726;Germersheim;7334;Germersheim;7;RP +11611;76744;Vollmersweiler;7334;Germersheim;7;RP +11612;76744;Woerth am Rhein;7334;Germersheim;7;RP +11613;76751;Jockgrim;7334;Germersheim;7;RP +11614;76756;Bellheim;7334;Germersheim;7;RP +11615;76761;Ruelzheim;7334;Germersheim;7;RP +11616;76764;Rheinzabern;7334;Germersheim;7;RP +11617;76767;Hagenbach;7334;Germersheim;7;RP +11618;76768;Berg (Pfalz);7334;Germersheim;7;RP +11619;76770;Hatzenbuehl;7334;Germersheim;7;RP +11620;76771;Hoerdt;7334;Germersheim;7;RP +11621;76773;Kuhardt;7334;Germersheim;7;RP +11622;76774;Leimersheim;7334;Germersheim;7;RP +11623;76776;Neuburg am Rhein;7334;Germersheim;7;RP +11624;76777;Neupotz;7334;Germersheim;7;RP +11625;76779;Scheibenhardt;7334;Germersheim;7;RP +11626;76829;Leinsweiler;7337;Suedliche Weinstrasse;7;RP +11627;76829;Landau in der Pfalz;7313;Landau in der Pfalz, Stadt;7;RP +11628;76829;Ranschbach;7337;Suedliche Weinstrasse;7;RP +11629;76831;Goecklingen;7337;Suedliche Weinstrasse;7;RP +11630;76831;Heuchelheim-Klingen;7337;Suedliche Weinstrasse;7;RP +11631;76831;Eschbach;7337;Suedliche Weinstrasse;7;RP +11632;76831;Billigheim-Ingenheim;7337;Suedliche Weinstrasse;7;RP +11633;76831;Birkweiler;7337;Suedliche Weinstrasse;7;RP +11634;76831;Impflingen;7337;Suedliche Weinstrasse;7;RP +11635;76831;Ilbesheim bei Landau in der Pfalz;7337;Suedliche Weinstrasse;7;RP +11636;76833;Knoeringen;7337;Suedliche Weinstrasse;7;RP +11637;76833;Siebeldingen;7337;Suedliche Weinstrasse;7;RP +11638;76833;Walsheim;7337;Suedliche Weinstrasse;7;RP +11639;76833;Frankweiler;7337;Suedliche Weinstrasse;7;RP +11640;76833;Boechingen;7337;Suedliche Weinstrasse;7;RP +11641;76835;Hainfeld;7337;Suedliche Weinstrasse;7;RP +11642;76835;Weyher in der Pfalz;7337;Suedliche Weinstrasse;7;RP +11643;76835;Gleisweiler;7337;Suedliche Weinstrasse;7;RP +11644;76835;Burrweiler;7337;Suedliche Weinstrasse;7;RP +11645;76835;Roschbach;7337;Suedliche Weinstrasse;7;RP +11646;76835;Flemlingen;7337;Suedliche Weinstrasse;7;RP +11647;76835;Rhodt unter Rietburg;7337;Suedliche Weinstrasse;7;RP +11648;76846;Hauenstein;7340;Suedwestpfalz;7;RP +11649;76848;Dimbach;7340;Suedwestpfalz;7;RP +11650;76848;Lug;7340;Suedwestpfalz;7;RP +11651;76848;Darstein;7340;Suedwestpfalz;7;RP +11652;76848;Schwanheim;7340;Suedwestpfalz;7;RP +11653;76848;Wilgartswiesen;7340;Suedwestpfalz;7;RP +11654;76848;Spirkelbach;7340;Suedwestpfalz;7;RP +11655;76855;Annweiler am Trifels;7337;Suedliche Weinstrasse;7;RP +11656;76857;Silz;7337;Suedliche Weinstrasse;7;RP +11657;76857;Eusserthal;7337;Suedliche Weinstrasse;7;RP +11658;76857;Wernersberg;7337;Suedliche Weinstrasse;7;RP +11659;76857;Albersweiler;7337;Suedliche Weinstrasse;7;RP +11660;76857;Dernbach;7337;Suedliche Weinstrasse;7;RP +11661;76857;Voelkersweiler;7337;Suedliche Weinstrasse;7;RP +11662;76857;Muenchweiler am Klingbach;7337;Suedliche Weinstrasse;7;RP +11663;76857;Ramberg;7337;Suedliche Weinstrasse;7;RP +11664;76857;Rinnthal;7337;Suedliche Weinstrasse;7;RP +11665;76857;Waldrohrbach;7337;Suedliche Weinstrasse;7;RP +11666;76857;Gossersweiler-Stein;7337;Suedliche Weinstrasse;7;RP +11667;76857;Waldhambach;7337;Suedliche Weinstrasse;7;RP +11668;76863;Herxheimweyher;7337;Suedliche Weinstrasse;7;RP +11669;76863;Herxheim bei Landau/Pfalz;7337;Suedliche Weinstrasse;7;RP +11670;76865;Rohrbach;7337;Suedliche Weinstrasse;7;RP +11671;76865;Insheim;7337;Suedliche Weinstrasse;7;RP +11672;76870;Kandel;7334;Germersheim;7;RP +11673;76872;Steinweiler;7334;Germersheim;7;RP +11674;76872;Erlenbach;7334;Germersheim;7;RP +11675;76872;Hergersweiler;7337;Suedliche Weinstrasse;7;RP +11676;76872;Winden;7334;Germersheim;7;RP +11677;76872;Minfeld;7334;Germersheim;7;RP +11678;76872;Freckenfeld;7334;Germersheim;7;RP +11679;76877;Offenbach an der Queich;7337;Suedliche Weinstrasse;7;RP +11680;76879;Essingen;7337;Suedliche Weinstrasse;7;RP +11681;76879;Ottersheim;7334;Germersheim;7;RP +11682;76879;Bornheim;7337;Suedliche Weinstrasse;7;RP +11683;76879;Knittelsheim;7334;Germersheim;7;RP +11684;76879;Hochstadt;7337;Suedliche Weinstrasse;7;RP +11685;76887;Oberhausen;7337;Suedliche Weinstrasse;7;RP +11686;76887;Boellenborn;7337;Suedliche Weinstrasse;7;RP +11687;76887;Bad Bergzabern;7337;Suedliche Weinstrasse;7;RP +11688;76889;Pleisweiler-Oberhofen;7337;Suedliche Weinstrasse;7;RP +11689;76889;Kapellen-Drusweiler;7337;Suedliche Weinstrasse;7;RP +11690;76889;Steinfeld;7337;Suedliche Weinstrasse;7;RP +11691;76889;Schweigen-Rechtenbach;7337;Suedliche Weinstrasse;7;RP +11692;76889;Oberotterbach;7337;Suedliche Weinstrasse;7;RP +11693;76889;Schweighofen;7337;Suedliche Weinstrasse;7;RP +11694;76889;Oberschlettenbach;7337;Suedliche Weinstrasse;7;RP +11695;76889;Niederotterbach;7337;Suedliche Weinstrasse;7;RP +11696;76889;Barbelroth;7337;Suedliche Weinstrasse;7;RP +11697;76889;Kapsweyer;7337;Suedliche Weinstrasse;7;RP +11698;76889;Vorderweidenthal;7337;Suedliche Weinstrasse;7;RP +11699;76889;Dierbach;7337;Suedliche Weinstrasse;7;RP +11700;76889;Gleiszellen-Gleishorbach;7337;Suedliche Weinstrasse;7;RP +11701;76889;Niederhorbach;7337;Suedliche Weinstrasse;7;RP +11702;76889;Birkenhoerdt;7337;Suedliche Weinstrasse;7;RP +11703;76889;Doerrenbach;7337;Suedliche Weinstrasse;7;RP +11704;76889;Klingenmuenster;7337;Suedliche Weinstrasse;7;RP +11705;76891;Bundenthal;7340;Suedwestpfalz;7;RP +11706;76891;Bobenthal;7340;Suedwestpfalz;7;RP +11707;76891;Erlenbach;7340;Suedwestpfalz;7;RP +11708;76891;Nothweiler;7340;Suedwestpfalz;7;RP +11709;76891;Bruchweiler-Baerenbach;7340;Suedwestpfalz;7;RP +11710;76891;Niederschlettenbach;7340;Suedwestpfalz;7;RP +11711;76891;Busenberg;7340;Suedwestpfalz;7;RP +11712;76891;Rumbach;7340;Suedwestpfalz;7;RP +11713;77652;Offenburg;8317;Ortenaukreis;8;BW +11714;77654;Offenburg;8317;Ortenaukreis;8;BW +11715;77656;Offenburg;8317;Ortenaukreis;8;BW +11716;77694;Kehl;8317;Ortenaukreis;8;BW +11717;77704;Oberkirch;8317;Ortenaukreis;8;BW +11718;77709;Wolfach;8317;Ortenaukreis;8;BW +11719;77709;Oberwolfach;8317;Ortenaukreis;8;BW +11720;77716;Hofstetten;8317;Ortenaukreis;8;BW +11721;77716;Haslach im Kinzigtal;8317;Ortenaukreis;8;BW +11722;77716;Fischerbach;8317;Ortenaukreis;8;BW +11723;77723;Gengenbach;8317;Ortenaukreis;8;BW +11724;77728;Oppenau;8317;Ortenaukreis;8;BW +11725;77731;Willstaett;8317;Ortenaukreis;8;BW +11726;77736;Zell am Harmersbach;8317;Ortenaukreis;8;BW +11727;77740;Bad Peterstal-Griesbach;8317;Ortenaukreis;8;BW +11728;77743;Neuried;8317;Ortenaukreis;8;BW +11729;77746;Schutterwald;8317;Ortenaukreis;8;BW +11730;77749;Hohberg;8317;Ortenaukreis;8;BW +11731;77756;Hausach;8317;Ortenaukreis;8;BW +11732;77761;Schiltach;8325;Rottweil;8;BW +11733;77767;Appenweier;8317;Ortenaukreis;8;BW +11734;77770;Durbach;8317;Ortenaukreis;8;BW +11735;77773;Schenkenzell;8325;Rottweil;8;BW +11736;77776;Bad Rippoldsau-Schapbach;8237;Freudenstadt;8;BW +11737;77781;Biberach;8317;Ortenaukreis;8;BW +11738;77784;Oberharmersbach;8317;Ortenaukreis;8;BW +11739;77787;Nordrach;8317;Ortenaukreis;8;BW +11740;77790;Steinach;8317;Ortenaukreis;8;BW +11741;77791;Berghaupten;8317;Ortenaukreis;8;BW +11742;77793;Gutach (Schwarzwaldbahn);8317;Ortenaukreis;8;BW +11743;77794;Lautenbach;8317;Ortenaukreis;8;BW +11744;77796;Muehlenbach;8317;Ortenaukreis;8;BW +11745;77797;Ohlsbach;8317;Ortenaukreis;8;BW +11746;77799;Ortenberg;8317;Ortenaukreis;8;BW +11747;77815;Buehl;8216;Rastatt;8;BW +11748;77830;Buehlertal;8216;Rastatt;8;BW +11749;77833;Ottersweier;8216;Rastatt;8;BW +11750;77836;Rheinmuenster;8216;Rastatt;8;BW +11751;77839;Lichtenau;8216;Rastatt;8;BW +11752;77855;Achern;8317;Ortenaukreis;8;BW +11753;77866;Rheinau;8317;Ortenaukreis;8;BW +11754;77871;Renchen;8317;Ortenaukreis;8;BW +11755;77876;Kappelrodeck;8317;Ortenaukreis;8;BW +11756;77880;Sasbach;8317;Ortenaukreis;8;BW +11757;77883;Ottenhoefen im Schwarzwald;8317;Ortenaukreis;8;BW +11758;77886;Lauf;8317;Ortenaukreis;8;BW +11759;77887;Sasbachwalden;8317;Ortenaukreis;8;BW +11760;77889;Seebach;8317;Ortenaukreis;8;BW +11761;77933;Lahr/Schwarzwald;8317;Ortenaukreis;8;BW +11762;77948;Friesenheim;8317;Ortenaukreis;8;BW +11763;77955;Ettenheim;8317;Ortenaukreis;8;BW +11764;77960;Seelbach;8317;Ortenaukreis;8;BW +11765;77963;Schwanau;8317;Ortenaukreis;8;BW +11766;77966;Kappel-Grafenhausen;8317;Ortenaukreis;8;BW +11767;77971;Kippenheim;8317;Ortenaukreis;8;BW +11768;77972;Mahlberg;8317;Ortenaukreis;8;BW +11769;77974;Meissenheim;8317;Ortenaukreis;8;BW +11770;77975;Ringsheim;8317;Ortenaukreis;8;BW +11771;77977;Rust;8317;Ortenaukreis;8;BW +11772;77978;Schuttertal;8317;Ortenaukreis;8;BW +11773;78048;Villingen-Schwenningen;8326;Schwarzwald-Baar-Kreis;8;BW +11774;78050;Villingen-Schwenningen;8326;Schwarzwald-Baar-Kreis;8;BW +11775;78052;Villingen-Schwenningen;8326;Schwarzwald-Baar-Kreis;8;BW +11776;78054;Villingen-Schwenningen;8326;Schwarzwald-Baar-Kreis;8;BW +11777;78056;Villingen-Schwenningen;8326;Schwarzwald-Baar-Kreis;8;BW +11778;78073;Bad Duerrheim;8326;Schwarzwald-Baar-Kreis;8;BW +11779;78078;Niedereschach;8326;Schwarzwald-Baar-Kreis;8;BW +11780;78083;Dauchingen;8326;Schwarzwald-Baar-Kreis;8;BW +11781;78086;Brigachtal;8326;Schwarzwald-Baar-Kreis;8;BW +11782;78087;Moenchweiler;8326;Schwarzwald-Baar-Kreis;8;BW +11783;78089;Unterkirnach;8326;Schwarzwald-Baar-Kreis;8;BW +11784;78098;Triberg;8326;Schwarzwald-Baar-Kreis;8;BW +11785;78112;Sankt Georgen im Schwarzwald;8326;Schwarzwald-Baar-Kreis;8;BW +11786;78120;Furtwangen im Schwarzwald;8326;Schwarzwald-Baar-Kreis;8;BW +11787;78126;Koenigsfeld im Schwarzwald;8326;Schwarzwald-Baar-Kreis;8;BW +11788;78132;Hornberg;8317;Ortenaukreis;8;BW +11789;78136;Schonach im Schwarzwald;8326;Schwarzwald-Baar-Kreis;8;BW +11790;78141;Schoenwald im Schwarzwald;8326;Schwarzwald-Baar-Kreis;8;BW +11791;78144;Tennenbronn;8325;Rottweil;8;BW +11792;78147;Voehrenbach;8326;Schwarzwald-Baar-Kreis;8;BW +11793;78148;Guetenbach;8326;Schwarzwald-Baar-Kreis;8;BW +11794;78166;Donaueschingen;8326;Schwarzwald-Baar-Kreis;8;BW +11795;78176;Blumberg;8326;Schwarzwald-Baar-Kreis;8;BW +11796;78183;Huefingen;8326;Schwarzwald-Baar-Kreis;8;BW +11797;78187;Geisingen;8327;Tuttlingen;8;BW +11798;78194;Immendingen;8327;Tuttlingen;8;BW +11799;78199;Braeunlingen;8326;Schwarzwald-Baar-Kreis;8;BW +11800;78224;Singen;8335;Konstanz;8;BW +11801;78234;Engen;8335;Konstanz;8;BW +11802;78239;Rielasingen-Worblingen;8335;Konstanz;8;BW +11803;78244;Gottmadingen;8335;Konstanz;8;BW +11804;78247;Hilzingen;8335;Konstanz;8;BW +11805;78250;Tengen;8335;Konstanz;8;BW +11806;78253;Eigeltingen;8335;Konstanz;8;BW +11807;78256;Steisslingen;8335;Konstanz;8;BW +11808;78259;Muehlhausen-Ehingen;8335;Konstanz;8;BW +11809;78262;Gailingen am Hochrhein;8335;Konstanz;8;BW +11810;78266;Buesingen am Hochrhein;8335;Konstanz;8;BW +11811;78267;Aach;8335;Konstanz;8;BW +11812;78269;Volkertshausen;8335;Konstanz;8;BW +11813;78315;Radolfzell am Bodensee;8335;Konstanz;8;BW +11814;78333;Stockach;8335;Konstanz;8;BW +11815;78337;hningen;8335;Konstanz;8;BW +11816;78343;Gaienhofen;8335;Konstanz;8;BW +11817;78345;Moos;8335;Konstanz;8;BW +11818;78351;Bodman-Ludwigshafen;8335;Konstanz;8;BW +11819;78354;Sipplingen;8435;Bodenseekreis;8;BW +11820;78355;Hohenfels;8335;Konstanz;8;BW +11821;78357;Muehlingen;8335;Konstanz;8;BW +11822;78359;Orsingen-Nenzingen;8335;Konstanz;8;BW +11823;78462;Konstanz;8335;Konstanz;8;BW +11824;78464;Konstanz;8335;Konstanz;8;BW +11825;78465;Konstanz;8335;Konstanz;8;BW +11826;78467;Konstanz;8335;Konstanz;8;BW +11827;78476;Allensbach;8335;Konstanz;8;BW +11828;78479;Reichenau;8335;Konstanz;8;BW +11829;78532;Tuttlingen;8327;Tuttlingen;8;BW +11830;78549;Spaichingen;8327;Tuttlingen;8;BW +11831;78554;Aldingen;8327;Tuttlingen;8;BW +11832;78559;Gosheim;8327;Tuttlingen;8;BW +11833;78564;Wehingen;8327;Tuttlingen;8;BW +11834;78564;Reichenbach am Heuberg;8327;Tuttlingen;8;BW +11835;78567;Fridingen an der Donau;8327;Tuttlingen;8;BW +11836;78570;Muehlheim an der Donau;8327;Tuttlingen;8;BW +11837;78573;Wurmlingen;8327;Tuttlingen;8;BW +11838;78576;Emmingen-Liptingen;8327;Tuttlingen;8;BW +11839;78579;Neuhausen ob Eck;8327;Tuttlingen;8;BW +11840;78580;Baerenthal;8327;Tuttlingen;8;BW +11841;78582;Balgheim;8327;Tuttlingen;8;BW +11842;78583;Boettingen;8327;Tuttlingen;8;BW +11843;78585;Bubsheim;8327;Tuttlingen;8;BW +11844;78586;Deilingen;8327;Tuttlingen;8;BW +11845;78588;Denkingen;8327;Tuttlingen;8;BW +11846;78589;Duerbheim;8327;Tuttlingen;8;BW +11847;78591;Durchhausen;8327;Tuttlingen;8;BW +11848;78592;Egesheim;8327;Tuttlingen;8;BW +11849;78594;Gunningen;8327;Tuttlingen;8;BW +11850;78595;Hausen ob Verena;8327;Tuttlingen;8;BW +11851;78597;Irndorf;8327;Tuttlingen;8;BW +11852;78598;Koenigsheim;8327;Tuttlingen;8;BW +11853;78600;Kolbingen;8327;Tuttlingen;8;BW +11854;78601;Mahlstetten;8327;Tuttlingen;8;BW +11855;78603;Renquishausen;8327;Tuttlingen;8;BW +11856;78604;Rietheim-Weilheim;8327;Tuttlingen;8;BW +11857;78606;Seitingen-Oberflacht;8327;Tuttlingen;8;BW +11858;78607;Talheim;8327;Tuttlingen;8;BW +11859;78609;Tuningen;8326;Schwarzwald-Baar-Kreis;8;BW +11860;78628;Rottweil;8325;Rottweil;8;BW +11861;78647;Trossingen;8327;Tuttlingen;8;BW +11862;78652;Deisslingen;8325;Rottweil;8;BW +11863;78655;Dunningen;8325;Rottweil;8;BW +11864;78658;Zimmern ob Rottweil;8325;Rottweil;8;BW +11865;78661;Dietingen;8325;Rottweil;8;BW +11866;78662;Boesingen;8325;Rottweil;8;BW +11867;78664;Eschbronn;8325;Rottweil;8;BW +11868;78665;Frittlingen;8327;Tuttlingen;8;BW +11869;78667;Villingendorf;8325;Rottweil;8;BW +11870;78669;Wellendingen;8325;Rottweil;8;BW +11871;78713;Schramberg;8325;Rottweil;8;BW +11872;78727;Oberndorf am Neckar;8325;Rottweil;8;BW +11873;78730;Lauterbach;8325;Rottweil;8;BW +11874;78733;Aichhalden;8325;Rottweil;8;BW +11875;78736;Epfendorf;8325;Rottweil;8;BW +11876;78737;Fluorn-Winzeln;8325;Rottweil;8;BW +11877;78739;Hardt;8325;Rottweil;8;BW +11878;79098;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11879;79100;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11880;79102;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11881;79104;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11882;79106;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11883;79108;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11884;79110;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11885;79111;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11886;79112;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11887;79114;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11888;79115;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11889;79117;Freiburg im Breisgau;8311;Freiburg im Breisgau;8;BW +11890;79183;Waldkirch;8316;Emmendingen;8;BW +11891;79189;Bad Krozingen;8315;Breisgau-Hochschwarzwald;8;BW +11892;79194;Heuweiler;8315;Breisgau-Hochschwarzwald;8;BW +11893;79194;Gundelfingen;8315;Breisgau-Hochschwarzwald;8;BW +11894;79199;Kirchzarten;8315;Breisgau-Hochschwarzwald;8;BW +11895;79206;Breisach am Rhein;8315;Breisgau-Hochschwarzwald;8;BW +11896;79211;Denzlingen;8316;Emmendingen;8;BW +11897;79215;Biederbach;8316;Emmendingen;8;BW +11898;79215;Elzach;8316;Emmendingen;8;BW +11899;79219;Staufen im Breisgau;8315;Breisgau-Hochschwarzwald;8;BW +11900;79224;Umkirch;8315;Breisgau-Hochschwarzwald;8;BW +11901;79227;Schallstadt;8315;Breisgau-Hochschwarzwald;8;BW +11902;79232;March;8315;Breisgau-Hochschwarzwald;8;BW +11903;79235;Vogtsburg im Kaiserstuhl;8315;Breisgau-Hochschwarzwald;8;BW +11904;79238;Ehrenkirchen;8315;Breisgau-Hochschwarzwald;8;BW +11905;79241;Ihringen;8315;Breisgau-Hochschwarzwald;8;BW +11906;79244;Muenstertal;8315;Breisgau-Hochschwarzwald;8;BW +11907;79249;Merzhausen;8315;Breisgau-Hochschwarzwald;8;BW +11908;79252;Stegen;8315;Breisgau-Hochschwarzwald;8;BW +11909;79254;Oberried;8315;Breisgau-Hochschwarzwald;8;BW +11910;79256;Buchenbach;8315;Breisgau-Hochschwarzwald;8;BW +11911;79258;Hartheim;8315;Breisgau-Hochschwarzwald;8;BW +11912;79261;Gutach im Breisgau;8316;Emmendingen;8;BW +11913;79263;Simonswald;8316;Emmendingen;8;BW +11914;79268;Boetzingen;8315;Breisgau-Hochschwarzwald;8;BW +11915;79271;Sankt Peter;8315;Breisgau-Hochschwarzwald;8;BW +11916;79274;Sankt Maergen;8315;Breisgau-Hochschwarzwald;8;BW +11917;79276;Reute;8316;Emmendingen;8;BW +11918;79279;Voerstetten;8316;Emmendingen;8;BW +11919;79280;Au;8315;Breisgau-Hochschwarzwald;8;BW +11920;79282;Ballrechten-Dottingen;8315;Breisgau-Hochschwarzwald;8;BW +11921;79283;Bollschweil;8315;Breisgau-Hochschwarzwald;8;BW +11922;79285;Ebringen;8315;Breisgau-Hochschwarzwald;8;BW +11923;79286;Glottertal;8315;Breisgau-Hochschwarzwald;8;BW +11924;79288;Gottenheim;8315;Breisgau-Hochschwarzwald;8;BW +11925;79289;Horben;8315;Breisgau-Hochschwarzwald;8;BW +11926;79291;Merdingen;8315;Breisgau-Hochschwarzwald;8;BW +11927;79292;Pfaffenweiler;8315;Breisgau-Hochschwarzwald;8;BW +11928;79294;Soelden;8315;Breisgau-Hochschwarzwald;8;BW +11929;79295;Sulzburg;8315;Breisgau-Hochschwarzwald;8;BW +11930;79297;Winden im Elztal;8316;Emmendingen;8;BW +11931;79299;Wittnau;8315;Breisgau-Hochschwarzwald;8;BW +11932;79312;Emmendingen;8316;Emmendingen;8;BW +11933;79331;Teningen;8316;Emmendingen;8;BW +11934;79336;Herbolzheim;8316;Emmendingen;8;BW +11935;79341;Kenzingen;8316;Emmendingen;8;BW +11936;79346;Endingen am Kaiserstuhl;8316;Emmendingen;8;BW +11937;79348;Freiamt;8316;Emmendingen;8;BW +11938;79350;Sexau;8316;Emmendingen;8;BW +11939;79353;Bahlingen am Kaiserstuhl;8316;Emmendingen;8;BW +11940;79356;Eichstetten am Kaiserstuhl;8315;Breisgau-Hochschwarzwald;8;BW +11941;79359;Riegel am Kaiserstuhl;8316;Emmendingen;8;BW +11942;79361;Sasbach am Kaiserstuhl;8316;Emmendingen;8;BW +11943;79362;Forchheim;8316;Emmendingen;8;BW +11944;79364;Malterdingen;8316;Emmendingen;8;BW +11945;79365;Rheinhausen;8316;Emmendingen;8;BW +11946;79367;Weisweil;8316;Emmendingen;8;BW +11947;79369;Wyhl am Kaiserstuhl;8316;Emmendingen;8;BW +11948;79379;Muellheim;8315;Breisgau-Hochschwarzwald;8;BW +11949;79395;Neuenburg am Rhein;8315;Breisgau-Hochschwarzwald;8;BW +11950;79400;Kandern;8336;Loerrach;8;BW +11951;79410;Badenweiler;8315;Breisgau-Hochschwarzwald;8;BW +11952;79415;Bad Bellingen;8336;Loerrach;8;BW +11953;79418;Schliengen;8336;Loerrach;8;BW +11954;79423;Heitersheim;8315;Breisgau-Hochschwarzwald;8;BW +11955;79424;Auggen;8315;Breisgau-Hochschwarzwald;8;BW +11956;79426;Buggingen;8315;Breisgau-Hochschwarzwald;8;BW +11957;79427;Eschbach;8315;Breisgau-Hochschwarzwald;8;BW +11958;79429;Malsburg-Marzell;8336;Loerrach;8;BW +11959;79539;Loerrach;8336;Loerrach;8;BW +11960;79540;Loerrach;8336;Loerrach;8;BW +11961;79541;Loerrach;8336;Loerrach;8;BW +11962;79576;Weil am Rhein;8336;Loerrach;8;BW +11963;79585;Steinen;8336;Loerrach;8;BW +11964;79588;Efringen-Kirchen;8336;Loerrach;8;BW +11965;79589;Binzen;8336;Loerrach;8;BW +11966;79591;Eimeldingen;8336;Loerrach;8;BW +11967;79592;Fischingen;8336;Loerrach;8;BW +11968;79594;Inzlingen;8336;Loerrach;8;BW +11969;79595;Ruemmingen;8336;Loerrach;8;BW +11970;79597;Schallbach;8336;Loerrach;8;BW +11971;79599;Wittlingen;8336;Loerrach;8;BW +11972;79618;Rheinfelden;8336;Loerrach;8;BW +11973;79639;Grenzach-Wyhlen;8336;Loerrach;8;BW +11974;79650;Schopfheim;8336;Loerrach;8;BW +11975;79664;Wehr;8337;Waldshut;8;BW +11976;79669;Zell im Wiesental;8336;Loerrach;8;BW +11977;79674;Todtnau;8336;Loerrach;8;BW +11978;79677;Aitern;8336;Loerrach;8;BW +11979;79677;Schoenenberg;8336;Loerrach;8;BW +11980;79677;Schoenau im Schwarzwald;8336;Loerrach;8;BW +11981;79677;Boellen;8336;Loerrach;8;BW +11982;79677;Wembach;8336;Loerrach;8;BW +11983;79677;Tunau;8336;Loerrach;8;BW +11984;79677;Froehnd;8336;Loerrach;8;BW +11985;79682;Todtmoos;8337;Waldshut;8;BW +11986;79683;Buerchau;8336;Loerrach;8;BW +11987;79685;Haeg-Ehrsberg;8336;Loerrach;8;BW +11988;79686;Hasel;8336;Loerrach;8;BW +11989;79688;Hausen im Wiesental;8336;Loerrach;8;BW +11990;79689;Maulburg;8336;Loerrach;8;BW +11991;79691;Neuenweg;8336;Loerrach;8;BW +11992;79692;Raich;8336;Loerrach;8;BW +11993;79692;Tegernau;8336;Loerrach;8;BW +11994;79692;Sallneck;8336;Loerrach;8;BW +11995;79692;Elbenschwand;8336;Loerrach;8;BW +11996;79694;Utzenfeld;8336;Loerrach;8;BW +11997;79695;Wieden;8336;Loerrach;8;BW +11998;79697;Wies;8336;Loerrach;8;BW +11999;79699;Wieslet;8336;Loerrach;8;BW +12000;79713;Bad Saeckingen;8337;Waldshut;8;BW +12001;79725;Laufenburg;8337;Waldshut;8;BW +12002;79730;Murg;8337;Waldshut;8;BW +12003;79733;Goerwihl;8337;Waldshut;8;BW +12004;79736;Rickenbach;8337;Waldshut;8;BW +12005;79737;Herrischried;8337;Waldshut;8;BW +12006;79739;Schwoerstadt;8336;Loerrach;8;BW +12007;79761;Waldshut-Tiengen;8337;Waldshut;8;BW +12008;79771;Klettgau;8337;Waldshut;8;BW +12009;79774;Albbruck;8337;Waldshut;8;BW +12010;79777;hlingen-Birkendorf;8337;Waldshut;8;BW +12011;79780;Stuehlingen;8337;Waldshut;8;BW +12012;79787;Lauchringen;8337;Waldshut;8;BW +12013;79790;Kuessaberg;8337;Waldshut;8;BW +12014;79793;Wutoeschingen;8337;Waldshut;8;BW +12015;79798;Jestetten;8337;Waldshut;8;BW +12016;79801;Hohentengen am Hochrhein;8337;Waldshut;8;BW +12017;79802;Dettighofen;8337;Waldshut;8;BW +12018;79804;Dogern;8337;Waldshut;8;BW +12019;79805;Eggingen;8337;Waldshut;8;BW +12020;79807;Lottstetten;8337;Waldshut;8;BW +12021;79809;Weilheim;8337;Waldshut;8;BW +12022;79822;Titisee-Neustadt;8315;Breisgau-Hochschwarzwald;8;BW +12023;79837;Haeusern;8337;Waldshut;8;BW +12024;79837;Sankt Blasien;8337;Waldshut;8;BW +12025;79837;Ibach;8337;Waldshut;8;BW +12026;79843;Loeffingen;8315;Breisgau-Hochschwarzwald;8;BW +12027;79848;Bonndorf im Schwarzwald;8337;Waldshut;8;BW +12028;79853;Lenzkirch;8315;Breisgau-Hochschwarzwald;8;BW +12029;79856;Hinterzarten;8315;Breisgau-Hochschwarzwald;8;BW +12030;79859;Schluchsee;8315;Breisgau-Hochschwarzwald;8;BW +12031;79862;Hoechenschwand;8337;Waldshut;8;BW +12032;79865;Grafenhausen;8337;Waldshut;8;BW +12033;79868;Feldberg;8315;Breisgau-Hochschwarzwald;8;BW +12034;79871;Eisenbach (Hochschwarzwald);8315;Breisgau-Hochschwarzwald;8;BW +12035;79872;Bernau;8337;Waldshut;8;BW +12036;79874;Breitnau;8315;Breisgau-Hochschwarzwald;8;BW +12037;79875;Dachsberg;8337;Waldshut;8;BW +12038;79877;Friedenweiler;8315;Breisgau-Hochschwarzwald;8;BW +12039;79879;Wutach;8337;Waldshut;8;BW +12040;80331;Muenchen;9184;Muenchen;9;BY +12041;80333;Muenchen;9184;Muenchen;9;BY +12042;80335;Muenchen;9184;Muenchen;9;BY +12043;80336;Muenchen;9184;Muenchen;9;BY +12044;80337;Muenchen;9184;Muenchen;9;BY +12045;80339;Muenchen;9184;Muenchen;9;BY +12046;80469;Muenchen;9184;Muenchen;9;BY +12047;80538;Muenchen;9184;Muenchen;9;BY +12048;80539;Muenchen;9184;Muenchen;9;BY +12049;80634;Muenchen;9184;Muenchen;9;BY +12050;80636;Muenchen;9184;Muenchen;9;BY +12051;80637;Muenchen;9184;Muenchen;9;BY +12052;80638;Muenchen;9184;Muenchen;9;BY +12053;80639;Muenchen;9184;Muenchen;9;BY +12054;80686;Muenchen;9184;Muenchen;9;BY +12055;80687;Muenchen;9184;Muenchen;9;BY +12056;80689;Muenchen;9184;Muenchen;9;BY +12057;80796;Muenchen;9184;Muenchen;9;BY +12058;80797;Muenchen;9184;Muenchen;9;BY +12059;80798;Muenchen;9184;Muenchen;9;BY +12060;80799;Muenchen;9184;Muenchen;9;BY +12061;80801;Muenchen;9184;Muenchen;9;BY +12062;80802;Muenchen;9184;Muenchen;9;BY +12063;80803;Muenchen;9184;Muenchen;9;BY +12064;80804;Muenchen;9184;Muenchen;9;BY +12065;80805;Muenchen;9184;Muenchen;9;BY +12066;80807;Muenchen;9184;Muenchen;9;BY +12067;80809;Muenchen;9184;Muenchen;9;BY +12068;80933;Muenchen;9184;Muenchen;9;BY +12069;80935;Muenchen;9184;Muenchen;9;BY +12070;80937;Muenchen;9184;Muenchen;9;BY +12071;80939;Muenchen;9184;Muenchen;9;BY +12072;80992;Muenchen;9184;Muenchen;9;BY +12073;80993;Muenchen;9184;Muenchen;9;BY +12074;80995;Muenchen;9184;Muenchen;9;BY +12075;80997;Muenchen;9184;Muenchen;9;BY +12076;80999;Muenchen;9184;Muenchen;9;BY +12077;81241;Muenchen;9184;Muenchen;9;BY +12078;81243;Muenchen;9184;Muenchen;9;BY +12079;81245;Muenchen;9184;Muenchen;9;BY +12080;81247;Muenchen;9184;Muenchen;9;BY +12081;81249;Muenchen;9184;Muenchen;9;BY +12082;81369;Muenchen;9184;Muenchen;9;BY +12083;81371;Muenchen;9184;Muenchen;9;BY +12084;81373;Muenchen;9184;Muenchen;9;BY +12085;81375;Muenchen;9184;Muenchen;9;BY +12086;81377;Muenchen;9184;Muenchen;9;BY +12087;81379;Muenchen;9184;Muenchen;9;BY +12088;81475;Muenchen;9184;Muenchen;9;BY +12089;81476;Muenchen;9184;Muenchen;9;BY +12090;81477;Muenchen;9184;Muenchen;9;BY +12091;81479;Muenchen;9184;Muenchen;9;BY +12092;81539;Muenchen;9184;Muenchen;9;BY +12093;81541;Muenchen;9184;Muenchen;9;BY +12094;81543;Muenchen;9184;Muenchen;9;BY +12095;81545;Muenchen;9184;Muenchen;9;BY +12096;81547;Muenchen;9184;Muenchen;9;BY +12097;81549;Muenchen;9184;Muenchen;9;BY +12098;81667;Muenchen;9184;Muenchen;9;BY +12099;81669;Muenchen;9184;Muenchen;9;BY +12100;81671;Muenchen;9184;Muenchen;9;BY +12101;81673;Muenchen;9184;Muenchen;9;BY +12102;81675;Muenchen;9184;Muenchen;9;BY +12103;81677;Muenchen;9184;Muenchen;9;BY +12104;81679;Muenchen;9184;Muenchen;9;BY +12105;81735;Muenchen;9184;Muenchen;9;BY +12106;81737;Muenchen;9184;Muenchen;9;BY +12107;81739;Muenchen;9184;Muenchen;9;BY +12108;81825;Muenchen;9184;Muenchen;9;BY +12109;81827;Muenchen;9184;Muenchen;9;BY +12110;81829;Muenchen;9184;Muenchen;9;BY +12111;81925;Muenchen;9184;Muenchen;9;BY +12112;81927;Muenchen;9184;Muenchen;9;BY +12113;81929;Muenchen;9184;Muenchen;9;BY +12114;82008;Unterhaching;9184;Muenchen;9;BY +12115;82024;Taufkirchen;9184;Muenchen;9;BY +12116;82031;Gruenwald;9184;Muenchen;9;BY +12117;82041;Oberhaching;9184;Muenchen;9;BY +12118;82049;Pullach im Isartal;9184;Muenchen;9;BY +12119;82054;Sauerlach;9184;Muenchen;9;BY +12120;82057;Icking;9173;Bad Toelz-Wolfratshausen;9;BY +12121;82061;Neuried;9184;Muenchen;9;BY +12122;82064;Strasslach-Dingharting;9184;Muenchen;9;BY +12123;82065;Baierbrunn;9184;Muenchen;9;BY +12124;82069;Schaeftlarn;9184;Muenchen;9;BY +12125;82110;Germering;9179;Fuerstenfeldbruck;9;BY +12126;82131;Gauting;9188;Starnberg;9;BY +12127;82140;Olching;9179;Fuerstenfeldbruck;9;BY +12128;82152;Planegg;9184;Muenchen;9;BY +12129;82152;Krailling;9188;Starnberg;9;BY +12130;82166;Graefelfing;9184;Muenchen;9;BY +12131;82178;Puchheim;9179;Fuerstenfeldbruck;9;BY +12132;82194;Groebenzell;9179;Fuerstenfeldbruck;9;BY +12133;82205;Gilching;9188;Starnberg;9;BY +12134;82211;Herrsching am Ammersee;9188;Starnberg;9;BY +12135;82216;Maisach;9179;Fuerstenfeldbruck;9;BY +12136;82223;Eichenau;9179;Fuerstenfeldbruck;9;BY +12137;82229;Seefeld;9188;Starnberg;9;BY +12138;82234;Wessling;9188;Starnberg;9;BY +12139;82237;Woerthsee;9188;Starnberg;9;BY +12140;82239;Alling;9179;Fuerstenfeldbruck;9;BY +12141;82256;Fuerstenfeldbruck;9179;Fuerstenfeldbruck;9;BY +12142;82266;Inning am Ammersee;9188;Starnberg;9;BY +12143;82269;Geltendorf;9181;Landsberg am Lech;9;BY +12144;82272;Moorenweis;9179;Fuerstenfeldbruck;9;BY +12145;82275;Emmering;9179;Fuerstenfeldbruck;9;BY +12146;82276;Adelshofen;9179;Fuerstenfeldbruck;9;BY +12147;82278;Althegnenberg;9179;Fuerstenfeldbruck;9;BY +12148;82279;Eching am Ammersee;9181;Landsberg am Lech;9;BY +12149;82281;Egenhofen;9179;Fuerstenfeldbruck;9;BY +12150;82284;Grafrath;9179;Fuerstenfeldbruck;9;BY +12151;82285;Hattenhofen;9179;Fuerstenfeldbruck;9;BY +12152;82287;Jesenwang;9179;Fuerstenfeldbruck;9;BY +12153;82288;Kottgeisering;9179;Fuerstenfeldbruck;9;BY +12154;82290;Landsberied;9179;Fuerstenfeldbruck;9;BY +12155;82291;Mammendorf;9179;Fuerstenfeldbruck;9;BY +12156;82293;Mittelstetten;9179;Fuerstenfeldbruck;9;BY +12157;82294;Oberschweinbach;9179;Fuerstenfeldbruck;9;BY +12158;82296;Schoengeising;9179;Fuerstenfeldbruck;9;BY +12159;82297;Steindorf;9771;Aichach-Friedberg;9;BY +12160;82299;Tuerkenfeld;9179;Fuerstenfeldbruck;9;BY +12161;82319;Starnberg;9188;Starnberg;9;BY +12162;82327;Tutzing;9188;Starnberg;9;BY +12163;82335;Berg;9188;Starnberg;9;BY +12164;82340;Feldafing;9188;Starnberg;9;BY +12165;82343;Poecking;9188;Starnberg;9;BY +12166;82346;Andechs;9188;Starnberg;9;BY +12167;82347;Bernried;9190;Weilheim-Schongau;9;BY +12168;82362;Weilheim in OberBY;9190;Weilheim-Schongau;9;BY +12169;82377;Penzberg;9190;Weilheim-Schongau;9;BY +12170;82380;Peissenberg;9190;Weilheim-Schongau;9;BY +12171;82383;Hohenpeissenberg;9190;Weilheim-Schongau;9;BY +12172;82386;Oberhausen;9190;Weilheim-Schongau;9;BY +12173;82386;Huglfing;9190;Weilheim-Schongau;9;BY +12174;82387;Antdorf;9190;Weilheim-Schongau;9;BY +12175;82389;Boebing;9190;Weilheim-Schongau;9;BY +12176;82390;Eberfing;9190;Weilheim-Schongau;9;BY +12177;82392;Habach;9190;Weilheim-Schongau;9;BY +12178;82393;Iffeldorf;9190;Weilheim-Schongau;9;BY +12179;82395;Obersoechering;9190;Weilheim-Schongau;9;BY +12180;82396;Paehl;9190;Weilheim-Schongau;9;BY +12181;82398;Polling;9190;Weilheim-Schongau;9;BY +12182;82399;Raisting;9190;Weilheim-Schongau;9;BY +12183;82401;Rottenbuch;9190;Weilheim-Schongau;9;BY +12184;82402;Seeshaupt;9190;Weilheim-Schongau;9;BY +12185;82404;Sindelsdorf;9190;Weilheim-Schongau;9;BY +12186;82405;Wessobrunn;9190;Weilheim-Schongau;9;BY +12187;82407;Wielenbach;9190;Weilheim-Schongau;9;BY +12188;82409;Wildsteig;9190;Weilheim-Schongau;9;BY +12189;82418;Murnau am Staffelsee;9180;Garmisch-Partenkirchen;9;BY +12190;82418;Riegsee;9180;Garmisch-Partenkirchen;9;BY +12191;82418;Seehausen am Staffelsee;9180;Garmisch-Partenkirchen;9;BY +12192;82431;Kochel am See;9173;Bad Toelz-Wolfratshausen;9;BY +12193;82433;Bad Kohlgrub;9180;Garmisch-Partenkirchen;9;BY +12194;82435;Bad Bayersoien;9180;Garmisch-Partenkirchen;9;BY +12195;82436;Eglfing;9190;Weilheim-Schongau;9;BY +12196;82438;Eschenlohe;9180;Garmisch-Partenkirchen;9;BY +12197;82439;Grossweil;9180;Garmisch-Partenkirchen;9;BY +12198;82441;Ohlstadt;9180;Garmisch-Partenkirchen;9;BY +12199;82442;Saulgrub;9180;Garmisch-Partenkirchen;9;BY +12200;82444;Schlehdorf;9173;Bad Toelz-Wolfratshausen;9;BY +12201;82445;Schwaigen;9180;Garmisch-Partenkirchen;9;BY +12202;82447;Spatzenhausen;9180;Garmisch-Partenkirchen;9;BY +12203;82449;Uffing am Staffelsee;9180;Garmisch-Partenkirchen;9;BY +12204;82467;Garmisch-Partenkirchen;9180;Garmisch-Partenkirchen;9;BY +12205;82481;Mittenwald;9180;Garmisch-Partenkirchen;9;BY +12206;82487;Oberammergau;9180;Garmisch-Partenkirchen;9;BY +12207;82488;Ettal;9180;Garmisch-Partenkirchen;9;BY +12208;82490;Farchant;9180;Garmisch-Partenkirchen;9;BY +12209;82491;Grainau;9180;Garmisch-Partenkirchen;9;BY +12210;82494;Kruen;9180;Garmisch-Partenkirchen;9;BY +12211;82496;Oberau;9180;Garmisch-Partenkirchen;9;BY +12212;82497;Unterammergau;9180;Garmisch-Partenkirchen;9;BY +12213;82499;Wallgau;9180;Garmisch-Partenkirchen;9;BY +12214;82515;Wolfratshausen;9173;Bad Toelz-Wolfratshausen;9;BY +12215;82538;Geretsried;9173;Bad Toelz-Wolfratshausen;9;BY +12216;82541;Muensing;9173;Bad Toelz-Wolfratshausen;9;BY +12217;82544;Egling;9173;Bad Toelz-Wolfratshausen;9;BY +12218;82547;Eurasburg;9173;Bad Toelz-Wolfratshausen;9;BY +12219;82549;Koenigsdorf;9173;Bad Toelz-Wolfratshausen;9;BY +12220;83022;Rosenheim;9163;Rosenheim, Stadt;9;BY +12221;83024;Rosenheim;9163;Rosenheim, Stadt;9;BY +12222;83026;Rosenheim;9163;Rosenheim, Stadt;9;BY +12223;83043;Bad Aibling;9187;Rosenheim;9;BY +12224;83052;Bruckmuehl;9187;Rosenheim;9;BY +12225;83059;Kolbermoor;9187;Rosenheim;9;BY +12226;83064;Raubling;9187;Rosenheim;9;BY +12227;83071;Stephanskirchen;9187;Rosenheim;9;BY +12228;83075;Bad Feilnbach;9187;Rosenheim;9;BY +12229;83080;Oberaudorf;9187;Rosenheim;9;BY +12230;83083;Riedering;9187;Rosenheim;9;BY +12231;83088;Kiefersfelden;9187;Rosenheim;9;BY +12232;83093;Bad Endorf;9187;Rosenheim;9;BY +12233;83098;Brannenburg;9187;Rosenheim;9;BY +12234;83101;Rohrdorf;9187;Rosenheim;9;BY +12235;83104;Tuntenhausen;9187;Rosenheim;9;BY +12236;83109;Grosskarolinenfeld;9187;Rosenheim;9;BY +12237;83112;Frasdorf;9187;Rosenheim;9;BY +12238;83115;Neubeuern;9187;Rosenheim;9;BY +12239;83119;Obing;9189;Traunstein;9;BY +12240;83122;Samerberg;9187;Rosenheim;9;BY +12241;83123;Amerang;9187;Rosenheim;9;BY +12242;83125;Eggstaett;9187;Rosenheim;9;BY +12243;83126;Flintsbach;9187;Rosenheim;9;BY +12244;83128;Halfing;9187;Rosenheim;9;BY +12245;83129;Hoeslwang;9187;Rosenheim;9;BY +12246;83131;Nussdorf am Inn;9187;Rosenheim;9;BY +12247;83132;Pittenhart;9189;Traunstein;9;BY +12248;83134;Prutting;9187;Rosenheim;9;BY +12249;83135;Schechen;9187;Rosenheim;9;BY +12250;83137;Schonstett;9187;Rosenheim;9;BY +12251;83139;Soechtenau;9187;Rosenheim;9;BY +12252;83209;Prien am Chiemsee;9187;Rosenheim;9;BY +12253;83224;Grassau;9189;Traunstein;9;BY +12254;83224;Staudach-Egerndach;9189;Traunstein;9;BY +12255;83229;Aschau im Chiemgau;9187;Rosenheim;9;BY +12256;83233;Bernau am Chiemsee;9187;Rosenheim;9;BY +12257;83236;bersee;9189;Traunstein;9;BY +12258;83242;Reit im Winkl;9189;Traunstein;9;BY +12259;83246;Unterwoessen;9189;Traunstein;9;BY +12260;83250;Marquartstein;9189;Traunstein;9;BY +12261;83253;Rimsting;9187;Rosenheim;9;BY +12262;83254;Breitbrunn am Chiemsee;9187;Rosenheim;9;BY +12263;83256;Chiemsee;9187;Rosenheim;9;BY +12264;83257;Gstadt am Chiemsee;9187;Rosenheim;9;BY +12265;83259;Schleching;9189;Traunstein;9;BY +12266;83278;Traunstein;9189;Traunstein;9;BY +12267;83301;Traunreut;9189;Traunstein;9;BY +12268;83308;Trostberg;9189;Traunstein;9;BY +12269;83313;Siegsdorf;9189;Traunstein;9;BY +12270;83317;Teisendorf;9172;Berchtesgadener Land;9;BY +12271;83324;Ruhpolding;9189;Traunstein;9;BY +12272;83329;Wonneberg;9189;Traunstein;9;BY +12273;83329;Waging am See;9189;Traunstein;9;BY +12274;83334;Inzell;9189;Traunstein;9;BY +12275;83339;Chieming;9189;Traunstein;9;BY +12276;83342;Tacherting;9189;Traunstein;9;BY +12277;83346;Bergen;9189;Traunstein;9;BY +12278;83349;Palling;9189;Traunstein;9;BY +12279;83352;Altenmarkt an der Alz;9189;Traunstein;9;BY +12280;83355;Grabenstaett;9189;Traunstein;9;BY +12281;83358;Seeon-Seebruck;9189;Traunstein;9;BY +12282;83361;Kienberg;9189;Traunstein;9;BY +12283;83362;Surberg;9189;Traunstein;9;BY +12284;83365;Nussdorf;9189;Traunstein;9;BY +12285;83367;Petting;9189;Traunstein;9;BY +12286;83370;Seeon-Seebruck;9189;Traunstein;9;BY +12287;83373;Taching am See;9189;Traunstein;9;BY +12288;83377;Vachendorf;9189;Traunstein;9;BY +12289;83395;Freilassing;9172;Berchtesgadener Land;9;BY +12290;83404;Ainring;9172;Berchtesgadener Land;9;BY +12291;83410;Laufen;9172;Berchtesgadener Land;9;BY +12292;83413;Fridolfing;9189;Traunstein;9;BY +12293;83416;Saaldorf-Surheim;9172;Berchtesgadener Land;9;BY +12294;83417;Kirchanschoering;9189;Traunstein;9;BY +12295;83435;Bad Reichenhall;9172;Berchtesgadener Land;9;BY +12296;83451;Piding;9172;Berchtesgadener Land;9;BY +12297;83454;Anger;9172;Berchtesgadener Land;9;BY +12298;83457;Bayerisch Gmain;9172;Berchtesgadener Land;9;BY +12299;83458;Schneizlreuth;9172;Berchtesgadener Land;9;BY +12300;83471;Schoenau am Koenigssee;9172;Berchtesgadener Land;9;BY +12301;83471;Berchtesgaden;9172;Berchtesgadener Land;9;BY +12302;83483;Bischofswiesen;9172;Berchtesgadener Land;9;BY +12303;83486;Ramsau;9172;Berchtesgadener Land;9;BY +12304;83487;Marktschellenberg;9172;Berchtesgadener Land;9;BY +12305;83512;Wasserburg am Inn;9187;Rosenheim;9;BY +12306;83527;Kirchdorf;9183;Muehldorf a. Inn;9;BY +12307;83527;Haag in OberBY;9183;Muehldorf a. Inn;9;BY +12308;83530;Schnaitsee;9189;Traunstein;9;BY +12309;83533;Edling;9187;Rosenheim;9;BY +12310;83536;Gars am Inn;9183;Muehldorf a. Inn;9;BY +12311;83539;Albaching;9187;Rosenheim;9;BY +12312;83539;Pfaffing;9187;Rosenheim;9;BY +12313;83543;Rott am Inn;9187;Rosenheim;9;BY +12314;83547;Babensham;9187;Rosenheim;9;BY +12315;83549;Eiselfing;9187;Rosenheim;9;BY +12316;83550;Emmering;9175;Ebersberg;9;BY +12317;83553;Frauenneuharting;9175;Ebersberg;9;BY +12318;83556;Griesstaett;9187;Rosenheim;9;BY +12319;83558;Maitenbeth;9183;Muehldorf a. Inn;9;BY +12320;83561;Ramerberg;9187;Rosenheim;9;BY +12321;83562;Rechtmehring;9183;Muehldorf a. Inn;9;BY +12322;83564;Soyen;9187;Rosenheim;9;BY +12323;83567;Unterreit;9183;Muehldorf a. Inn;9;BY +12324;83569;Vogtareuth;9187;Rosenheim;9;BY +12325;83607;Holzkirchen;9182;Miesbach;9;BY +12326;83620;Feldkirchen-Westerham;9187;Rosenheim;9;BY +12327;83623;Dietramszell;9173;Bad Toelz-Wolfratshausen;9;BY +12328;83624;Otterfing;9182;Miesbach;9;BY +12329;83626;Valley;9182;Miesbach;9;BY +12330;83627;Warngau;9182;Miesbach;9;BY +12331;83629;Weyarn;9182;Miesbach;9;BY +12332;83646;Bad Toelz;9173;Bad Toelz-Wolfratshausen;9;BY +12333;83646;Wackersberg;9173;Bad Toelz-Wolfratshausen;9;BY +12334;83661;Lenggries;9173;Bad Toelz-Wolfratshausen;9;BY +12335;83666;Waakirchen;9182;Miesbach;9;BY +12336;83670;Bad Heilbrunn;9173;Bad Toelz-Wolfratshausen;9;BY +12337;83671;Benediktbeuern;9173;Bad Toelz-Wolfratshausen;9;BY +12338;83673;Bichl;9173;Bad Toelz-Wolfratshausen;9;BY +12339;83674;Gaissach;9173;Bad Toelz-Wolfratshausen;9;BY +12340;83676;Jachenau;9173;Bad Toelz-Wolfratshausen;9;BY +12341;83677;Greiling;9173;Bad Toelz-Wolfratshausen;9;BY +12342;83677;Reichersbeuern;9173;Bad Toelz-Wolfratshausen;9;BY +12343;83679;SNkam;9173;Bad Toelz-Wolfratshausen;9;BY +12344;83684;Tegernsee;9182;Miesbach;9;BY +12345;83700;Rottach-Egern;9182;Miesbach;9;BY +12346;83703;Gmund am Tegernsee;9182;Miesbach;9;BY +12347;83707;Bad Wiessee;9182;Miesbach;9;BY +12348;83708;Kreuth;9182;Miesbach;9;BY +12349;83714;Miesbach;9182;Miesbach;9;BY +12350;83727;Schliersee;9182;Miesbach;9;BY +12351;83730;Fischbachau;9182;Miesbach;9;BY +12352;83734;Hausham;9182;Miesbach;9;BY +12353;83735;Bayrischzell;9182;Miesbach;9;BY +12354;83737;Irschenberg;9182;Miesbach;9;BY +12355;84028;Landshut;9261;Landshut, Stadt;9;BY +12356;84030;Landshut;9261;Landshut, Stadt;9;BY +12357;84030;Ergolding;9274;Landshut;9;BY +12358;84032;Landshut;9261;Landshut, Stadt;9;BY +12359;84032;Altdorf;9274;Landshut;9;BY +12360;84034;Landshut;9261;Landshut, Stadt;9;BY +12361;84036;Landshut;9261;Landshut, Stadt;9;BY +12362;84036;Kumhausen;9274;Landshut;9;BY +12363;84048;Mainburg;9273;Kelheim;9;BY +12364;84051;Essenbach;9274;Landshut;9;BY +12365;84056;Rottenburg an der Laaber;9274;Landshut;9;BY +12366;84061;Ergoldsbach;9274;Landshut;9;BY +12367;84066;Mallersdorf-Pfaffenberg;9278;Straubing-Bogen;9;BY +12368;84069;Schierling;9375;Regensburg;9;BY +12369;84072;Au in der Hallertau;9178;Freising;9;BY +12370;84076;Pfeffenhausen;9274;Landshut;9;BY +12371;84079;Bruckberg;9274;Landshut;9;BY +12372;84082;Laberweinting;9278;Straubing-Bogen;9;BY +12373;84085;Langquaid;9273;Kelheim;9;BY +12374;84088;Neufahrn in NiederBY;9274;Landshut;9;BY +12375;84089;Aiglsbach;9273;Kelheim;9;BY +12376;84091;Attenhofen;9273;Kelheim;9;BY +12377;84092;Bayerbach;9274;Landshut;9;BY +12378;84094;Elsendorf;9273;Kelheim;9;BY +12379;84095;Furth;9274;Landshut;9;BY +12380;84097;Herrngiersdorf;9273;Kelheim;9;BY +12381;84098;Hohenthann;9274;Landshut;9;BY +12382;84100;Niederaichbach;9274;Landshut;9;BY +12383;84101;Obersuessbach;9274;Landshut;9;BY +12384;84103;Postau;9274;Landshut;9;BY +12385;84104;Rudelzhausen;9178;Freising;9;BY +12386;84106;Volkenschwand;9273;Kelheim;9;BY +12387;84107;Weihmichl;9274;Landshut;9;BY +12388;84109;Woerth an der Isar;9274;Landshut;9;BY +12389;84130;Dingolfing;9279;Dingolfing-Landau;9;BY +12390;84137;Vilsbiburg;9274;Landshut;9;BY +12391;84140;Gangkofen;9277;Rottal-Inn;9;BY +12392;84144;Geisenhausen;9274;Landshut;9;BY +12393;84149;Velden;9274;Landshut;9;BY +12394;84152;Mengkofen;9279;Dingolfing-Landau;9;BY +12395;84155;Bodenkirchen;9274;Landshut;9;BY +12396;84160;Frontenhausen;9279;Dingolfing-Landau;9;BY +12397;84163;Marklkofen;9279;Dingolfing-Landau;9;BY +12398;84164;Moosthenning;9279;Dingolfing-Landau;9;BY +12399;84166;Adlkofen;9274;Landshut;9;BY +12400;84168;Aham;9274;Landshut;9;BY +12401;84169;Altfraunhofen;9274;Landshut;9;BY +12402;84171;Baierbach;9274;Landshut;9;BY +12403;84172;Buch am Erlbach;9274;Landshut;9;BY +12404;84174;Eching;9274;Landshut;9;BY +12405;84175;Schalkham;9274;Landshut;9;BY +12406;84175;Gerzen;9274;Landshut;9;BY +12407;84177;Gottfrieding;9279;Dingolfing-Landau;9;BY +12408;84178;Kroening;9274;Landshut;9;BY +12409;84180;Loiching;9279;Dingolfing-Landau;9;BY +12410;84181;Neufraunhofen;9274;Landshut;9;BY +12411;84183;Niederviehbach;9279;Dingolfing-Landau;9;BY +12412;84184;Tiefenbach;9274;Landshut;9;BY +12413;84186;Vilsheim;9274;Landshut;9;BY +12414;84187;Weng;9274;Landshut;9;BY +12415;84189;Wurmsham;9274;Landshut;9;BY +12416;84307;Eggenfelden;9277;Rottal-Inn;9;BY +12417;84323;Massing;9277;Rottal-Inn;9;BY +12418;84326;Falkenberg;9277;Rottal-Inn;9;BY +12419;84326;Rimbach;9277;Rottal-Inn;9;BY +12420;84329;Wurmannsquick;9277;Rottal-Inn;9;BY +12421;84332;Hebertsfelden;9277;Rottal-Inn;9;BY +12422;84333;Malgersdorf;9277;Rottal-Inn;9;BY +12423;84335;Mitterskirchen;9277;Rottal-Inn;9;BY +12424;84337;Schoenau;9277;Rottal-Inn;9;BY +12425;84339;Unterdietfurt;9277;Rottal-Inn;9;BY +12426;84347;Pfarrkirchen;9277;Rottal-Inn;9;BY +12427;84359;Simbach am Inn;9277;Rottal-Inn;9;BY +12428;84364;Bad Birnbach;9277;Rottal-Inn;9;BY +12429;84367;Tann;9277;Rottal-Inn;9;BY +12430;84367;Reut;9277;Rottal-Inn;9;BY +12431;84367;Zeilarn;9277;Rottal-Inn;9;BY +12432;84371;Triftern;9277;Rottal-Inn;9;BY +12433;84375;Kirchdorf am Inn;9277;Rottal-Inn;9;BY +12434;84378;Dietersburg;9277;Rottal-Inn;9;BY +12435;84381;Johanniskirchen;9277;Rottal-Inn;9;BY +12436;84384;Wittibreut;9277;Rottal-Inn;9;BY +12437;84385;Egglham;9277;Rottal-Inn;9;BY +12438;84387;Julbach;9277;Rottal-Inn;9;BY +12439;84389;Postmuenster;9277;Rottal-Inn;9;BY +12440;84405;Dorfen;9177;Erding;9;BY +12441;84416;Taufkirchen (Vils);9177;Erding;9;BY +12442;84416;Inning am Holz;9177;Erding;9;BY +12443;84419;Obertaufkirchen;9183;Muehldorf a. Inn;9;BY +12444;84419;Schwindegg;9183;Muehldorf a. Inn;9;BY +12445;84424;Isen;9177;Erding;9;BY +12446;84427;Sankt Wolfgang;9177;Erding;9;BY +12447;84428;Buchbach;9183;Muehldorf a. Inn;9;BY +12448;84431;Rattenkirchen;9183;Muehldorf a. Inn;9;BY +12449;84431;Heldenstein;9183;Muehldorf a. Inn;9;BY +12450;84432;Hohenpolding;9177;Erding;9;BY +12451;84434;Kirchberg;9177;Erding;9;BY +12452;84435;Lengdorf;9177;Erding;9;BY +12453;84437;Reichertsheim;9183;Muehldorf a. Inn;9;BY +12454;84439;Steinkirchen;9177;Erding;9;BY +12455;84453;Muehldorf am Inn;9183;Muehldorf a. Inn;9;BY +12456;84478;Waldkraiburg;9183;Muehldorf a. Inn;9;BY +12457;84489;Burghausen;9171;Altoetting;9;BY +12458;84494;Lohkirchen;9183;Muehldorf a. Inn;9;BY +12459;84494;Niedertaufkirchen;9183;Muehldorf a. Inn;9;BY +12460;84494;Neumarkt-Sankt Veit;9183;Muehldorf a. Inn;9;BY +12461;84494;Niederbergkirchen;9183;Muehldorf a. Inn;9;BY +12462;84503;Altoetting;9171;Altoetting;9;BY +12463;84508;Burgkirchen an der Alz;9171;Altoetting;9;BY +12464;84513;Toeging am Inn;9171;Altoetting;9;BY +12465;84513;Erharting;9183;Muehldorf a. Inn;9;BY +12466;84518;Garching an der Alz;9171;Altoetting;9;BY +12467;84524;Neuoetting;9171;Altoetting;9;BY +12468;84529;Tittmoning;9189;Traunstein;9;BY +12469;84533;Stammham;9171;Altoetting;9;BY +12470;84533;Marktl;9171;Altoetting;9;BY +12471;84533;Haiming;9171;Altoetting;9;BY +12472;84539;Ampfing;9183;Muehldorf a. Inn;9;BY +12473;84539;Zangberg;9183;Muehldorf a. Inn;9;BY +12474;84543;Winhoering;9171;Altoetting;9;BY +12475;84544;Aschau am Inn;9183;Muehldorf a. Inn;9;BY +12476;84546;Egglkofen;9183;Muehldorf a. Inn;9;BY +12477;84547;Emmerting;9171;Altoetting;9;BY +12478;84549;Engelsberg;9189;Traunstein;9;BY +12479;84550;Feichten an der Alz;9171;Altoetting;9;BY +12480;84552;Geratskirchen;9277;Rottal-Inn;9;BY +12481;84555;Jettenbach;9183;Muehldorf a. Inn;9;BY +12482;84556;Kastl;9171;Altoetting;9;BY +12483;84558;Halsbach;9171;Altoetting;9;BY +12484;84558;Tyrlaching;9171;Altoetting;9;BY +12485;84558;Kirchweidach;9171;Altoetting;9;BY +12486;84559;Kraiburg am Inn;9183;Muehldorf a. Inn;9;BY +12487;84561;Mehring;9171;Altoetting;9;BY +12488;84562;Mettenheim;9183;Muehldorf a. Inn;9;BY +12489;84564;Oberbergkirchen;9183;Muehldorf a. Inn;9;BY +12490;84565;Oberneukirchen;9183;Muehldorf a. Inn;9;BY +12491;84567;Perach;9171;Altoetting;9;BY +12492;84567;Erlbach;9171;Altoetting;9;BY +12493;84568;Pleiskirchen;9171;Altoetting;9;BY +12494;84570;Polling;9183;Muehldorf a. Inn;9;BY +12495;84571;Reischach;9171;Altoetting;9;BY +12496;84573;Schoenberg;9183;Muehldorf a. Inn;9;BY +12497;84574;Taufkirchen;9183;Muehldorf a. Inn;9;BY +12498;84576;Teising;9171;Altoetting;9;BY +12499;84577;Tuessling;9171;Altoetting;9;BY +12500;84579;Unterneukirchen;9171;Altoetting;9;BY +12501;85049;Ingolstadt;9161;Ingolstadt, Stadt;9;BY +12502;85051;Ingolstadt;9161;Ingolstadt, Stadt;9;BY +12503;85053;Ingolstadt;9161;Ingolstadt, Stadt;9;BY +12504;85055;Ingolstadt;9161;Ingolstadt, Stadt;9;BY +12505;85057;Ingolstadt;9161;Ingolstadt, Stadt;9;BY +12506;85072;Eichstaett;9176;Eichstaett;9;BY +12507;85077;Manching;9186;Pfaffenhofen a.d. Ilm;9;BY +12508;85080;Gaimersheim;9176;Eichstaett;9;BY +12509;85084;Reichertshofen;9186;Pfaffenhofen a.d. Ilm;9;BY +12510;85088;Vohburg an der Donau;9186;Pfaffenhofen a.d. Ilm;9;BY +12511;85092;Koesching;9176;Eichstaett;9;BY +12512;85095;Denkendorf;9176;Eichstaett;9;BY +12513;85098;Grossmehring;9176;Eichstaett;9;BY +12514;85101;Lenting;9176;Eichstaett;9;BY +12515;85104;Pfoerring;9176;Eichstaett;9;BY +12516;85107;Baar-Ebenhausen;9186;Pfaffenhofen a.d. Ilm;9;BY +12517;85110;Kipfenberg;9176;Eichstaett;9;BY +12518;85111;Adelschlag;9176;Eichstaett;9;BY +12519;85113;Boehmfeld;9176;Eichstaett;9;BY +12520;85114;Buxheim;9176;Eichstaett;9;BY +12521;85116;Egweil;9176;Eichstaett;9;BY +12522;85117;Eitensheim;9176;Eichstaett;9;BY +12523;85119;Ernsgaden;9186;Pfaffenhofen a.d. Ilm;9;BY +12524;85120;Hepberg;9176;Eichstaett;9;BY +12525;85122;Hitzhofen;9176;Eichstaett;9;BY +12526;85123;Karlskron;9185;Neuburg-Schrobenhausen;9;BY +12527;85125;Kinding;9176;Eichstaett;9;BY +12528;85126;Muenchsmuenster;9186;Pfaffenhofen a.d. Ilm;9;BY +12529;85128;Nassenfels;9176;Eichstaett;9;BY +12530;85129;Oberdolling;9176;Eichstaett;9;BY +12531;85131;Pollenfeld;9176;Eichstaett;9;BY +12532;85132;Schernfeld;9176;Eichstaett;9;BY +12533;85134;Stammham;9176;Eichstaett;9;BY +12534;85135;Titting;9176;Eichstaett;9;BY +12535;85137;Walting;9176;Eichstaett;9;BY +12536;85139;Wettstetten;9176;Eichstaett;9;BY +12537;85221;Dachau;9174;Dachau;9;BY +12538;85229;Markt Indersdorf;9174;Dachau;9;BY +12539;85232;Bergkirchen;9174;Dachau;9;BY +12540;85235;Odelzhausen;9174;Dachau;9;BY +12541;85235;Pfaffenhofen an der Glonn;9174;Dachau;9;BY +12542;85238;Petershausen;9174;Dachau;9;BY +12543;85241;Hebertshausen;9174;Dachau;9;BY +12544;85244;Roehrmoos;9174;Dachau;9;BY +12545;85247;Schwabhausen;9174;Dachau;9;BY +12546;85250;Altomuenster;9174;Dachau;9;BY +12547;85253;Erdweg;9174;Dachau;9;BY +12548;85254;Sulzemoos;9174;Dachau;9;BY +12549;85256;Vierkirchen;9174;Dachau;9;BY +12550;85258;Weichs;9174;Dachau;9;BY +12551;85276;Hettenshausen;9186;Pfaffenhofen a.d. Ilm;9;BY +12552;85276;Pfaffenhofen an der Ilm;9186;Pfaffenhofen a.d. Ilm;9;BY +12553;85283;Wolnzach;9186;Pfaffenhofen a.d. Ilm;9;BY +12554;85290;Geisenfeld;9186;Pfaffenhofen a.d. Ilm;9;BY +12555;85293;Reichertshausen;9186;Pfaffenhofen a.d. Ilm;9;BY +12556;85296;Rohrbach;9186;Pfaffenhofen a.d. Ilm;9;BY +12557;85298;Scheyern;9186;Pfaffenhofen a.d. Ilm;9;BY +12558;85301;Schweitenkirchen;9186;Pfaffenhofen a.d. Ilm;9;BY +12559;85302;Gerolsbach;9186;Pfaffenhofen a.d. Ilm;9;BY +12560;85304;Ilmmuenster;9186;Pfaffenhofen a.d. Ilm;9;BY +12561;85305;Jetzendorf;9186;Pfaffenhofen a.d. Ilm;9;BY +12562;85307;Paunzhausen;9178;Freising;9;BY +12563;85309;Poernbach;9186;Pfaffenhofen a.d. Ilm;9;BY +12564;85354;Freising;9178;Freising;9;BY +12565;85356;Freising;9178;Freising;9;BY +12566;85368;Wang;9178;Freising;9;BY +12567;85368;Moosburg;9178;Freising;9;BY +12568;85375;Neufahrn bei Freising;9178;Freising;9;BY +12569;85386;Eching;9178;Freising;9;BY +12570;85391;Allershausen;9178;Freising;9;BY +12571;85395;Attenkirchen;9178;Freising;9;BY +12572;85395;Wolfersdorf;9178;Freising;9;BY +12573;85399;Hallbergmoos;9178;Freising;9;BY +12574;85402;Kranzberg;9178;Freising;9;BY +12575;85405;Nandlstadt;9178;Freising;9;BY +12576;85406;Zolling;9178;Freising;9;BY +12577;85408;Gammelsdorf;9178;Freising;9;BY +12578;85410;Haag an der Amper;9178;Freising;9;BY +12579;85411;Hohenkammer;9178;Freising;9;BY +12580;85413;Hoergertshausen;9178;Freising;9;BY +12581;85414;Kirchdorf an der Amper;9178;Freising;9;BY +12582;85416;Langenbach;9178;Freising;9;BY +12583;85417;Marzling;9178;Freising;9;BY +12584;85419;Mauern;9178;Freising;9;BY +12585;85435;Erding;9177;Erding;9;BY +12586;85445;Oberding;9177;Erding;9;BY +12587;85447;Fraunberg;9177;Erding;9;BY +12588;85452;Moosinning;9177;Erding;9;BY +12589;85456;Wartenberg;9177;Erding;9;BY +12590;85457;Woerth;9177;Erding;9;BY +12591;85459;Berglern;9177;Erding;9;BY +12592;85461;Bockhorn;9177;Erding;9;BY +12593;85462;Eitting;9177;Erding;9;BY +12594;85464;Finsing;9177;Erding;9;BY +12595;85465;Langenpreising;9177;Erding;9;BY +12596;85467;Neuching;9177;Erding;9;BY +12597;85469;Walpertskirchen;9177;Erding;9;BY +12598;85521;Ottobrunn;9184;Muenchen;9;BY +12599;85540;Haar;9184;Muenchen;9;BY +12600;85551;Kirchheim bei Muenchen;9184;Muenchen;9;BY +12601;85560;Ebersberg;9175;Ebersberg;9;BY +12602;85567;Bruck;9175;Ebersberg;9;BY +12603;85567;Grafing bei Muenchen;9175;Ebersberg;9;BY +12604;85570;Markt Schwaben;9175;Ebersberg;9;BY +12605;85570;Ottenhofen;9177;Erding;9;BY +12606;85579;Neubiberg;9184;Muenchen;9;BY +12607;85586;Poing;9175;Ebersberg;9;BY +12608;85591;Vaterstetten;9175;Ebersberg;9;BY +12609;85604;Zorneding;9175;Ebersberg;9;BY +12610;85609;Aschheim;9184;Muenchen;9;BY +12611;85614;Kirchseeon;9175;Ebersberg;9;BY +12612;85617;Assling;9175;Ebersberg;9;BY +12613;85622;Feldkirchen;9184;Muenchen;9;BY +12614;85625;Baiern;9175;Ebersberg;9;BY +12615;85625;Glonn;9175;Ebersberg;9;BY +12616;85630;Grasbrunn;9184;Muenchen;9;BY +12617;85635;Hoehenkirchen-Siegertsbrunn;9184;Muenchen;9;BY +12618;85640;Putzbrunn;9184;Muenchen;9;BY +12619;85643;Steinhoering;9175;Ebersberg;9;BY +12620;85646;Anzing;9175;Ebersberg;9;BY +12621;85649;Brunnthal;9184;Muenchen;9;BY +12622;85652;Pliening;9175;Ebersberg;9;BY +12623;85653;Aying;9184;Muenchen;9;BY +12624;85656;Buch am Buchrain;9177;Erding;9;BY +12625;85658;Egmating;9175;Ebersberg;9;BY +12626;85659;Forstern;9177;Erding;9;BY +12627;85661;Forstinning;9175;Ebersberg;9;BY +12628;85662;Hohenbrunn;9184;Muenchen;9;BY +12629;85664;Hohenlinden;9175;Ebersberg;9;BY +12630;85665;Moosach;9175;Ebersberg;9;BY +12631;85667;Oberpframmern;9175;Ebersberg;9;BY +12632;85669;Pastetten;9177;Erding;9;BY +12633;85716;Unterschleissheim;9184;Muenchen;9;BY +12634;85737;Ismaning;9184;Muenchen;9;BY +12635;85748;Garching bei Muenchen;9184;Muenchen;9;BY +12636;85757;Karlsfeld;9174;Dachau;9;BY +12637;85764;Oberschleissheim;9184;Muenchen;9;BY +12638;85774;Unterfoehring;9184;Muenchen;9;BY +12639;85777;Fahrenzhausen;9178;Freising;9;BY +12640;85778;Haimhausen;9174;Dachau;9;BY +12641;86150;Augsburg;9761;Augsburg, Stadt;9;BY +12642;86152;Augsburg;9761;Augsburg, Stadt;9;BY +12643;86153;Augsburg;9761;Augsburg, Stadt;9;BY +12644;86154;Augsburg;9761;Augsburg, Stadt;9;BY +12645;86156;Augsburg;9761;Augsburg, Stadt;9;BY +12646;86157;Augsburg;9761;Augsburg, Stadt;9;BY +12647;86159;Augsburg;9761;Augsburg, Stadt;9;BY +12648;86161;Augsburg;9761;Augsburg, Stadt;9;BY +12649;86163;Augsburg;9761;Augsburg, Stadt;9;BY +12650;86165;Augsburg;9761;Augsburg, Stadt;9;BY +12651;86167;Augsburg;9761;Augsburg, Stadt;9;BY +12652;86169;Augsburg;9761;Augsburg, Stadt;9;BY +12653;86179;Augsburg;9761;Augsburg, Stadt;9;BY +12654;86199;Augsburg;9761;Augsburg, Stadt;9;BY +12655;86316;Friedberg;9771;Aichach-Friedberg;9;BY +12656;86343;Koenigsbrunn;9772;Augsburg;9;BY +12657;86356;Neusaess;9772;Augsburg;9;BY +12658;86368;Gersthofen;9772;Augsburg;9;BY +12659;86381;Krumbach;9774;Guenzburg;9;BY +12660;86391;Stadtbergen;9772;Augsburg;9;BY +12661;86399;Bobingen;9772;Augsburg;9;BY +12662;86405;Meitingen;9772;Augsburg;9;BY +12663;86415;Mering;9771;Aichach-Friedberg;9;BY +12664;86420;Diedorf;9772;Augsburg;9;BY +12665;86424;Dinkelscherben;9772;Augsburg;9;BY +12666;86438;Kissing;9771;Aichach-Friedberg;9;BY +12667;86441;Zusmarshausen;9772;Augsburg;9;BY +12668;86444;Affing;9771;Aichach-Friedberg;9;BY +12669;86447;Aindling;9771;Aichach-Friedberg;9;BY +12670;86447;Todtenweis;9771;Aichach-Friedberg;9;BY +12671;86450;Altenmuenster;9772;Augsburg;9;BY +12672;86453;Dasing;9771;Aichach-Friedberg;9;BY +12673;86456;Gablingen;9772;Augsburg;9;BY +12674;86459;Gessertshausen;9772;Augsburg;9;BY +12675;86462;Langweid am Lech;9772;Augsburg;9;BY +12676;86465;Heretsried;9772;Augsburg;9;BY +12677;86465;Welden;9772;Augsburg;9;BY +12678;86470;Thannhausen;9774;Guenzburg;9;BY +12679;86473;Ziemetshausen;9774;Guenzburg;9;BY +12680;86476;Neuburg an der Kammel;9774;Guenzburg;9;BY +12681;86477;Adelsried;9772;Augsburg;9;BY +12682;86479;Aichen;9774;Guenzburg;9;BY +12683;86480;Aletshausen;9774;Guenzburg;9;BY +12684;86480;Waltenhausen;9774;Guenzburg;9;BY +12685;86482;Aystetten;9772;Augsburg;9;BY +12686;86483;Balzhausen;9774;Guenzburg;9;BY +12687;86485;Biberbach;9772;Augsburg;9;BY +12688;86486;Bonstetten;9772;Augsburg;9;BY +12689;86488;Breitenthal;9774;Guenzburg;9;BY +12690;86489;Deisenhausen;9774;Guenzburg;9;BY +12691;86491;Ebershausen;9774;Guenzburg;9;BY +12692;86492;Egling an der Paar;9181;Landsberg am Lech;9;BY +12693;86494;Emersacker;9772;Augsburg;9;BY +12694;86495;Eurasburg;9771;Aichach-Friedberg;9;BY +12695;86497;Horgau;9772;Augsburg;9;BY +12696;86498;Kettershausen;9778;Unterallgaeu;9;BY +12697;86500;Kutzenhausen;9772;Augsburg;9;BY +12698;86502;Laugna;9773;Dillingen a.d. Donau;9;BY +12699;86504;Merching;9771;Aichach-Friedberg;9;BY +12700;86505;Muensterhausen;9774;Guenzburg;9;BY +12701;86507;Oberottmarshausen;9772;Augsburg;9;BY +12702;86507;Kleinaitingen;9772;Augsburg;9;BY +12703;86508;Rehling;9771;Aichach-Friedberg;9;BY +12704;86510;Ried;9771;Aichach-Friedberg;9;BY +12705;86511;Schmiechen;9771;Aichach-Friedberg;9;BY +12706;86513;Ursberg;9774;Guenzburg;9;BY +12707;86514;Ustersbach;9772;Augsburg;9;BY +12708;86517;Wehringen;9772;Augsburg;9;BY +12709;86519;Wiesenbach;9774;Guenzburg;9;BY +12710;86529;Schrobenhausen;9185;Neuburg-Schrobenhausen;9;BY +12711;86551;Aichach;9771;Aichach-Friedberg;9;BY +12712;86554;Poettmes;9771;Aichach-Friedberg;9;BY +12713;86556;Kuehbach;9771;Aichach-Friedberg;9;BY +12714;86558;Hohenwart;9186;Pfaffenhofen a.d. Ilm;9;BY +12715;86559;Adelzhausen;9771;Aichach-Friedberg;9;BY +12716;86561;Aresing;9185;Neuburg-Schrobenhausen;9;BY +12717;86562;Berg im Gau;9185;Neuburg-Schrobenhausen;9;BY +12718;86564;Brunnen;9185;Neuburg-Schrobenhausen;9;BY +12719;86565;Gachenbach;9185;Neuburg-Schrobenhausen;9;BY +12720;86567;Hilgertshausen-Tandern;9174;Dachau;9;BY +12721;86568;Hollenbach;9771;Aichach-Friedberg;9;BY +12722;86570;Inchenhofen;9771;Aichach-Friedberg;9;BY +12723;86571;Langenmosen;9185;Neuburg-Schrobenhausen;9;BY +12724;86573;Obergriesbach;9771;Aichach-Friedberg;9;BY +12725;86574;Petersdorf;9771;Aichach-Friedberg;9;BY +12726;86576;Schiltberg;9771;Aichach-Friedberg;9;BY +12727;86577;Sielenbach;9771;Aichach-Friedberg;9;BY +12728;86579;Waidhofen;9185;Neuburg-Schrobenhausen;9;BY +12729;86609;Donauwoerth;9779;Donau-Ries;9;BY +12730;86633;Neuburg an der Donau;9185;Neuburg-Schrobenhausen;9;BY +12731;86637;Wertingen;9773;Dillingen a.d. Donau;9;BY +12732;86641;Rain;9779;Donau-Ries;9;BY +12733;86643;Rennertshofen;9185;Neuburg-Schrobenhausen;9;BY +12734;86647;Buttenwiesen;9773;Dillingen a.d. Donau;9;BY +12735;86650;Wemding;9779;Donau-Ries;9;BY +12736;86653;Monheim;9779;Donau-Ries;9;BY +12737;86653;Daiting;9779;Donau-Ries;9;BY +12738;86655;Harburg;9779;Donau-Ries;9;BY +12739;86657;Bissingen;9773;Dillingen a.d. Donau;9;BY +12740;86660;Tapfheim;9779;Donau-Ries;9;BY +12741;86663;Asbach-Baeumenheim;9779;Donau-Ries;9;BY +12742;86666;Burgheim;9185;Neuburg-Schrobenhausen;9;BY +12743;86668;Karlshuld;9185;Neuburg-Schrobenhausen;9;BY +12744;86669;Koenigsmoos;9185;Neuburg-Schrobenhausen;9;BY +12745;86672;Baar;9771;Aichach-Friedberg;9;BY +12746;86672;Thierhaupten;9772;Augsburg;9;BY +12747;86673;Bergheim;9185;Neuburg-Schrobenhausen;9;BY +12748;86675;Buchdorf;9779;Donau-Ries;9;BY +12749;86676;Ehekirchen;9185;Neuburg-Schrobenhausen;9;BY +12750;86678;Ehingen;9772;Augsburg;9;BY +12751;86679;Ellgau;9772;Augsburg;9;BY +12752;86681;Fuenfstetten;9779;Donau-Ries;9;BY +12753;86682;Genderkingen;9779;Donau-Ries;9;BY +12754;86684;Holzheim;9779;Donau-Ries;9;BY +12755;86685;Huisheim;9779;Donau-Ries;9;BY +12756;86687;Kaisheim;9779;Donau-Ries;9;BY +12757;86688;Marxheim;9779;Donau-Ries;9;BY +12758;86690;Mertingen;9779;Donau-Ries;9;BY +12759;86692;Muenster;9779;Donau-Ries;9;BY +12760;86694;Niederschoenenfeld;9779;Donau-Ries;9;BY +12761;86695;Allmannshofen;9772;Augsburg;9;BY +12762;86695;Nordendorf;9772;Augsburg;9;BY +12763;86697;Oberhausen;9185;Neuburg-Schrobenhausen;9;BY +12764;86698;Oberndorf am Lech;9779;Donau-Ries;9;BY +12765;86700;Otting;9779;Donau-Ries;9;BY +12766;86701;Rohrenfels;9185;Neuburg-Schrobenhausen;9;BY +12767;86703;Roegling;9779;Donau-Ries;9;BY +12768;86704;Tagmersheim;9779;Donau-Ries;9;BY +12769;86706;Weichering;9185;Neuburg-Schrobenhausen;9;BY +12770;86707;Kuehlenthal;9772;Augsburg;9;BY +12771;86707;Westendorf;9772;Augsburg;9;BY +12772;86709;Wolferstadt;9779;Donau-Ries;9;BY +12773;86720;Noerdlingen;9779;Donau-Ries;9;BY +12774;86732;Oettingen in BY;9779;Donau-Ries;9;BY +12775;86733;Alerheim;9779;Donau-Ries;9;BY +12776;86735;Forheim;9779;Donau-Ries;9;BY +12777;86735;Amerdingen;9779;Donau-Ries;9;BY +12778;86736;Auhausen;9779;Donau-Ries;9;BY +12779;86738;Deiningen;9779;Donau-Ries;9;BY +12780;86739;Ederheim;9779;Donau-Ries;9;BY +12781;86741;Ehingen am Ries;9779;Donau-Ries;9;BY +12782;86742;Fremdingen;9779;Donau-Ries;9;BY +12783;86744;Hainsfarth;9779;Donau-Ries;9;BY +12784;86745;Hohenaltheim;9779;Donau-Ries;9;BY +12785;86747;Maihingen;9779;Donau-Ries;9;BY +12786;86748;Marktoffingen;9779;Donau-Ries;9;BY +12787;86750;Megesheim;9779;Donau-Ries;9;BY +12788;86751;Moenchsdeggingen;9779;Donau-Ries;9;BY +12789;86753;Moettingen;9779;Donau-Ries;9;BY +12790;86754;Munningen;9779;Donau-Ries;9;BY +12791;86756;Reimlingen;9779;Donau-Ries;9;BY +12792;86757;Wallerstein;9779;Donau-Ries;9;BY +12793;86759;Wechingen;9779;Donau-Ries;9;BY +12794;86807;Buchloe;9777;Ostallgaeu;9;BY +12795;86825;Bad Woerishofen;9778;Unterallgaeu;9;BY +12796;86830;Schwabmuenchen;9772;Augsburg;9;BY +12797;86833;Ettringen;9778;Unterallgaeu;9;BY +12798;86836;Untermeitingen;9772;Augsburg;9;BY +12799;86836;Graben;9772;Augsburg;9;BY +12800;86836;Klosterlechfeld;9772;Augsburg;9;BY +12801;86836;Obermeitingen;9181;Landsberg am Lech;9;BY +12802;86842;Tuerkheim;9778;Unterallgaeu;9;BY +12803;86845;Grossaitingen;9772;Augsburg;9;BY +12804;86850;Fischach;9772;Augsburg;9;BY +12805;86853;Langerringen;9772;Augsburg;9;BY +12806;86854;Amberg;9778;Unterallgaeu;9;BY +12807;86856;Hiltenfingen;9772;Augsburg;9;BY +12808;86857;Hurlach;9181;Landsberg am Lech;9;BY +12809;86859;Igling;9181;Landsberg am Lech;9;BY +12810;86860;Jengen;9777;Ostallgaeu;9;BY +12811;86862;Lamerdingen;9777;Ostallgaeu;9;BY +12812;86863;Langenneufnach;9772;Augsburg;9;BY +12813;86865;Markt Wald;9778;Unterallgaeu;9;BY +12814;86866;Mickhausen;9772;Augsburg;9;BY +12815;86868;Mittelneufnach;9772;Augsburg;9;BY +12816;86869;Oberostendorf;9777;Ostallgaeu;9;BY +12817;86871;Rammingen;9778;Unterallgaeu;9;BY +12818;86872;Scherstetten;9772;Augsburg;9;BY +12819;86874;Tussenhausen;9778;Unterallgaeu;9;BY +12820;86875;Waal;9777;Ostallgaeu;9;BY +12821;86877;Walkertshofen;9772;Augsburg;9;BY +12822;86879;Wiedergeltingen;9778;Unterallgaeu;9;BY +12823;86899;Landsberg am Lech;9181;Landsberg am Lech;9;BY +12824;86911;Diessen am Ammersee;9181;Landsberg am Lech;9;BY +12825;86916;Kaufering;9181;Landsberg am Lech;9;BY +12826;86919;Utting am Ammersee;9181;Landsberg am Lech;9;BY +12827;86920;Denklingen;9181;Landsberg am Lech;9;BY +12828;86922;Eresing;9181;Landsberg am Lech;9;BY +12829;86923;Finning;9181;Landsberg am Lech;9;BY +12830;86925;Fuchstal;9181;Landsberg am Lech;9;BY +12831;86926;Greifenberg;9181;Landsberg am Lech;9;BY +12832;86928;Hofstetten;9181;Landsberg am Lech;9;BY +12833;86929;Penzing;9181;Landsberg am Lech;9;BY +12834;86931;Prittriching;9181;Landsberg am Lech;9;BY +12835;86932;Puergen;9181;Landsberg am Lech;9;BY +12836;86934;Reichling;9181;Landsberg am Lech;9;BY +12837;86935;Rott;9181;Landsberg am Lech;9;BY +12838;86937;Scheuring;9181;Landsberg am Lech;9;BY +12839;86938;Schondorf am Ammersee;9181;Landsberg am Lech;9;BY +12840;86940;Schwifting;9181;Landsberg am Lech;9;BY +12841;86943;Thaining;9181;Landsberg am Lech;9;BY +12842;86944;Unterdiessen;9181;Landsberg am Lech;9;BY +12843;86946;Vilgertshofen;9181;Landsberg am Lech;9;BY +12844;86947;Weil;9181;Landsberg am Lech;9;BY +12845;86949;Windach;9181;Landsberg am Lech;9;BY +12846;86956;Schongau;9190;Weilheim-Schongau;9;BY +12847;86971;Peiting;9190;Weilheim-Schongau;9;BY +12848;86972;Altenstadt;9190;Weilheim-Schongau;9;BY +12849;86974;Apfeldorf;9181;Landsberg am Lech;9;BY +12850;86975;Bernbeuren;9190;Weilheim-Schongau;9;BY +12851;86977;Burggen;9190;Weilheim-Schongau;9;BY +12852;86978;Hohenfurch;9190;Weilheim-Schongau;9;BY +12853;86980;Ingenried;9190;Weilheim-Schongau;9;BY +12854;86981;Kinsau;9181;Landsberg am Lech;9;BY +12855;86983;Lechbruck;9777;Ostallgaeu;9;BY +12856;86984;Prem;9190;Weilheim-Schongau;9;BY +12857;86986;Schwabbruck;9190;Weilheim-Schongau;9;BY +12858;86987;Schwabsoien;9190;Weilheim-Schongau;9;BY +12859;86989;Steingaden;9190;Weilheim-Schongau;9;BY +12860;87435;Kempten;9763;Kempten (Allgaeu), Stadt;9;BY +12861;87437;Kempten;9763;Kempten (Allgaeu), Stadt;9;BY +12862;87439;Kempten;9763;Kempten (Allgaeu), Stadt;9;BY +12863;87448;Waltenhofen;9780;Oberallgaeu;9;BY +12864;87452;Altusried;9780;Oberallgaeu;9;BY +12865;87459;Pfronten;9777;Ostallgaeu;9;BY +12866;87463;Dietmannsried;9780;Oberallgaeu;9;BY +12867;87466;Oy-Mittelberg;9780;Oberallgaeu;9;BY +12868;87471;Durach;9780;Oberallgaeu;9;BY +12869;87474;Buchenberg;9780;Oberallgaeu;9;BY +12870;87477;Sulzberg;9780;Oberallgaeu;9;BY +12871;87480;Weitnau;9780;Oberallgaeu;9;BY +12872;87484;Nesselwang;9777;Ostallgaeu;9;BY +12873;87487;Wiggensbach;9780;Oberallgaeu;9;BY +12874;87488;Betzigau;9780;Oberallgaeu;9;BY +12875;87490;Haldenwang;9780;Oberallgaeu;9;BY +12876;87493;Lauben;9780;Oberallgaeu;9;BY +12877;87494;Rueckholz;9777;Ostallgaeu;9;BY +12878;87496;Untrasried;9777;Ostallgaeu;9;BY +12879;87497;Wertach;9780;Oberallgaeu;9;BY +12880;87499;Wildpoldsried;9780;Oberallgaeu;9;BY +12881;87509;Immenstadt im Allgaeu;9780;Oberallgaeu;9;BY +12882;87527;Sonthofen;9780;Oberallgaeu;9;BY +12883;87527;Ofterschwang;9780;Oberallgaeu;9;BY +12884;87534;Oberstaufen;9780;Oberallgaeu;9;BY +12885;87538;Bolsterlang;9780;Oberallgaeu;9;BY +12886;87538;Obermaiselstein;9780;Oberallgaeu;9;BY +12887;87538;Balderschwang;9780;Oberallgaeu;9;BY +12888;87538;Fischen im Allgaeu;9780;Oberallgaeu;9;BY +12889;87541;Bad Hindelang;9780;Oberallgaeu;9;BY +12890;87544;Blaichach;9780;Oberallgaeu;9;BY +12891;87545;Burgberg im Allgaeu;9780;Oberallgaeu;9;BY +12892;87547;Missen-Wilhams;9780;Oberallgaeu;9;BY +12893;87549;Rettenberg;9780;Oberallgaeu;9;BY +12894;87561;Oberstdorf;9780;Oberallgaeu;9;BY +12895;87600;Kaufbeuren;9762;Kaufbeuren, Stadt;9;BY +12896;87616;Marktoberdorf;9777;Ostallgaeu;9;BY +12897;87616;Wald;9777;Ostallgaeu;9;BY +12898;87629;Fuessen;9777;Ostallgaeu;9;BY +12899;87634;Guenzach;9777;Ostallgaeu;9;BY +12900;87634;Oberguenzburg;9777;Ostallgaeu;9;BY +12901;87637;Seeg;9777;Ostallgaeu;9;BY +12902;87637;Eisenberg;9777;Ostallgaeu;9;BY +12903;87640;Biessenhofen;9777;Ostallgaeu;9;BY +12904;87642;Halblech;9777;Ostallgaeu;9;BY +12905;87645;Schwangau;9777;Ostallgaeu;9;BY +12906;87647;Kraftisried;9777;Ostallgaeu;9;BY +12907;87647;Unterthingau;9777;Ostallgaeu;9;BY +12908;87648;Aitrang;9777;Ostallgaeu;9;BY +12909;87650;Baisweil;9777;Ostallgaeu;9;BY +12910;87651;Bidingen;9777;Ostallgaeu;9;BY +12911;87653;Eggenthal;9777;Ostallgaeu;9;BY +12912;87654;Friesenried;9777;Ostallgaeu;9;BY +12913;87656;Germaringen;9777;Ostallgaeu;9;BY +12914;87657;Goerisried;9777;Ostallgaeu;9;BY +12915;87659;Hopferau;9777;Ostallgaeu;9;BY +12916;87660;Irsee;9777;Ostallgaeu;9;BY +12917;87662;Kaltental;9777;Ostallgaeu;9;BY +12918;87662;Osterzell;9777;Ostallgaeu;9;BY +12919;87663;Lengenwang;9777;Ostallgaeu;9;BY +12920;87665;Mauerstetten;9777;Ostallgaeu;9;BY +12921;87666;Pforzen;9777;Ostallgaeu;9;BY +12922;87668;Rieden;9777;Ostallgaeu;9;BY +12923;87669;Rieden am Forggensee;9777;Ostallgaeu;9;BY +12924;87671;Ronsberg;9777;Ostallgaeu;9;BY +12925;87672;Rosshaupten;9777;Ostallgaeu;9;BY +12926;87674;Ruderatshofen;9777;Ostallgaeu;9;BY +12927;87675;Stoetten am Auerberg;9777;Ostallgaeu;9;BY +12928;87675;Rettenbach am Auerberg;9777;Ostallgaeu;9;BY +12929;87677;Stoettwang;9777;Ostallgaeu;9;BY +12930;87679;Westendorf;9777;Ostallgaeu;9;BY +12931;87700;Memmingen;9764;Memmingen, Stadt;9;BY +12932;87719;Mindelheim;9778;Unterallgaeu;9;BY +12933;87724;Ottobeuren;9778;Unterallgaeu;9;BY +12934;87727;Babenhausen;9778;Unterallgaeu;9;BY +12935;87730;Bad Groenenbach;9778;Unterallgaeu;9;BY +12936;87733;Markt Rettenbach;9778;Unterallgaeu;9;BY +12937;87734;Benningen;9778;Unterallgaeu;9;BY +12938;87736;Boehen;9778;Unterallgaeu;9;BY +12939;87737;Boos;9778;Unterallgaeu;9;BY +12940;87739;Breitenbrunn;9778;Unterallgaeu;9;BY +12941;87740;Buxheim;9778;Unterallgaeu;9;BY +12942;87742;Apfeltrach;9778;Unterallgaeu;9;BY +12943;87742;Dirlewang;9778;Unterallgaeu;9;BY +12944;87743;Egg an der Guenz;9778;Unterallgaeu;9;BY +12945;87745;Eppishausen;9778;Unterallgaeu;9;BY +12946;87746;Erkheim;9778;Unterallgaeu;9;BY +12947;87748;Fellheim;9778;Unterallgaeu;9;BY +12948;87749;Hawangen;9778;Unterallgaeu;9;BY +12949;87751;Heimertingen;9778;Unterallgaeu;9;BY +12950;87752;Holzguenz;9778;Unterallgaeu;9;BY +12951;87754;Kammlach;9778;Unterallgaeu;9;BY +12952;87755;Kirchhaslach;9778;Unterallgaeu;9;BY +12953;87757;Kirchheim in Schwaben;9778;Unterallgaeu;9;BY +12954;87758;Kronburg;9778;Unterallgaeu;9;BY +12955;87760;Lachen;9778;Unterallgaeu;9;BY +12956;87761;Lauben;9778;Unterallgaeu;9;BY +12957;87763;Lautrach;9778;Unterallgaeu;9;BY +12958;87764;Legau;9778;Unterallgaeu;9;BY +12959;87766;Memmingerberg;9778;Unterallgaeu;9;BY +12960;87767;Niederrieden;9778;Unterallgaeu;9;BY +12961;87769;Oberrieden;9778;Unterallgaeu;9;BY +12962;87770;Oberschoenegg;9778;Unterallgaeu;9;BY +12963;87772;Pfaffenhausen;9778;Unterallgaeu;9;BY +12964;87773;Pless;9778;Unterallgaeu;9;BY +12965;87775;Salgen;9778;Unterallgaeu;9;BY +12966;87776;Sontheim;9778;Unterallgaeu;9;BY +12967;87778;Stetten;9778;Unterallgaeu;9;BY +12968;87779;Trunkelsberg;9778;Unterallgaeu;9;BY +12969;87781;Ungerhausen;9778;Unterallgaeu;9;BY +12970;87782;Unteregg;9778;Unterallgaeu;9;BY +12971;87784;Westerheim;9778;Unterallgaeu;9;BY +12972;87785;Winterrieden;9778;Unterallgaeu;9;BY +12973;87787;Wolfertschwenden;9778;Unterallgaeu;9;BY +12974;87789;Woringen;9778;Unterallgaeu;9;BY +12975;88045;Friedrichshafen;8435;Bodenseekreis;8;BW +12976;88046;Friedrichshafen;8435;Bodenseekreis;8;BW +12977;88048;Friedrichshafen;8435;Bodenseekreis;8;BW +12978;88069;Tettnang;8435;Bodenseekreis;8;BW +12979;88074;Meckenbeuren;8435;Bodenseekreis;8;BW +12980;88079;Kressbronn am Bodensee;8435;Bodenseekreis;8;BW +12981;88085;Langenargen;8435;Bodenseekreis;8;BW +12982;88090;Immenstaad am Bodensee;8435;Bodenseekreis;8;BW +12983;88094;Oberteuringen;8435;Bodenseekreis;8;BW +12984;88097;Eriskirch;8435;Bodenseekreis;8;BW +12985;88099;Neukirch;8435;Bodenseekreis;8;BW +12986;88131;Bodolz;9776;Lindau (Bodensee);9;BY +12987;88131;Lindau (Bodensee);9776;Lindau (Bodensee);9;BY +12988;88138;Weissensberg;9776;Lindau (Bodensee);9;BY +12989;88138;Hergensweiler;9776;Lindau (Bodensee);9;BY +12990;88138;Sigmarszell;9776;Lindau (Bodensee);9;BY +12991;88142;Wasserburg (Bodensee);9776;Lindau (Bodensee);9;BY +12992;88145;Opfenbach;9776;Lindau (Bodensee);9;BY +12993;88145;Hergatz;9776;Lindau (Bodensee);9;BY +12994;88147;Achberg;8436;Ravensburg;8;BW +12995;88149;Nonnenhorn;9776;Lindau (Bodensee);9;BY +12996;88161;Lindenberg im Allgaeu;9776;Lindau (Bodensee);9;BY +12997;88167;Gestratz;9776;Lindau (Bodensee);9;BY +12998;88167;Maierhoefen;9776;Lindau (Bodensee);9;BY +12999;88167;Roethenbach (Allgaeu);9776;Lindau (Bodensee);9;BY +13000;88167;Stiefenhofen;9776;Lindau (Bodensee);9;BY +13001;88167;Gruenenbach;9776;Lindau (Bodensee);9;BY +13002;88171;Weiler-Simmerberg;9776;Lindau (Bodensee);9;BY +13003;88175;Scheidegg;9776;Lindau (Bodensee);9;BY +13004;88178;Heimenkirch;9776;Lindau (Bodensee);9;BY +13005;88179;Oberreute;9776;Lindau (Bodensee);9;BY +13006;88212;Ravensburg;8436;Ravensburg;8;BW +13007;88213;Ravensburg;8436;Ravensburg;8;BW +13008;88214;Ravensburg;8436;Ravensburg;8;BW +13009;88239;Wangen im Allgaeu;8436;Ravensburg;8;BW +13010;88250;Weingarten;8436;Ravensburg;8;BW +13011;88255;Baindt;8436;Ravensburg;8;BW +13012;88255;Baienfurt;8436;Ravensburg;8;BW +13013;88260;Argenbuehl;8436;Ravensburg;8;BW +13014;88263;Horgenzell;8436;Ravensburg;8;BW +13015;88267;Vogt;8436;Ravensburg;8;BW +13016;88271;Wilhelmsdorf;8436;Ravensburg;8;BW +13017;88273;Fronreute;8436;Ravensburg;8;BW +13018;88276;Berg;8436;Ravensburg;8;BW +13019;88279;Amtzell;8436;Ravensburg;8;BW +13020;88281;Schlier;8436;Ravensburg;8;BW +13021;88284;Wolpertswende;8436;Ravensburg;8;BW +13022;88285;Bodnegg;8436;Ravensburg;8;BW +13023;88287;Gruenkraut;8436;Ravensburg;8;BW +13024;88289;Waldburg;8436;Ravensburg;8;BW +13025;88299;Leutkirch im Allgaeu;8436;Ravensburg;8;BW +13026;88316;Isny im Allgaeu;8436;Ravensburg;8;BW +13027;88317;Aichstetten;8436;Ravensburg;8;BW +13028;88319;Aitrach;8436;Ravensburg;8;BW +13029;88326;Aulendorf;8436;Ravensburg;8;BW +13030;88339;Bad Waldsee;8436;Ravensburg;8;BW +13031;88348;Allmannsweiler;8426;Biberach;8;BW +13032;88348;Bad Saulgau;8437;Sigmaringen;8;BW +13033;88353;Kisslegg;8436;Ravensburg;8;BW +13034;88356;Ostrach;8437;Sigmaringen;8;BW +13035;88361;Boms;8436;Ravensburg;8;BW +13036;88361;Eichstegen;8436;Ravensburg;8;BW +13037;88361;Altshausen;8436;Ravensburg;8;BW +13038;88364;Wolfegg;8436;Ravensburg;8;BW +13039;88367;Hohentengen;8437;Sigmaringen;8;BW +13040;88368;Bergatreute;8436;Ravensburg;8;BW +13041;88370;Ebenweiler;8436;Ravensburg;8;BW +13042;88371;Ebersbach-Musbach;8436;Ravensburg;8;BW +13043;88373;Fleischwangen;8436;Ravensburg;8;BW +13044;88374;Hosskirch;8436;Ravensburg;8;BW +13045;88376;Koenigseggwald;8436;Ravensburg;8;BW +13046;88377;Riedhausen;8436;Ravensburg;8;BW +13047;88379;Guggenhausen;8436;Ravensburg;8;BW +13048;88379;Unterwaldhausen;8436;Ravensburg;8;BW +13049;88400;Biberach an der Riss;8426;Biberach;8;BW +13050;88410;Bad Wurzach;8436;Ravensburg;8;BW +13051;88416;Erlenmoos;8426;Biberach;8;BW +13052;88416;Ochsenhausen;8426;Biberach;8;BW +13053;88416;Steinhausen an der Rottum;8426;Biberach;8;BW +13054;88422;Oggelshausen;8426;Biberach;8;BW +13055;88422;Betzenweiler;8426;Biberach;8;BW +13056;88422;Bad Buchau;8426;Biberach;8;BW +13057;88422;Seekirch;8426;Biberach;8;BW +13058;88422;Kanzach;8426;Biberach;8;BW +13059;88422;Duernau;8426;Biberach;8;BW +13060;88422;Alleshausen;8426;Biberach;8;BW +13061;88422;Tiefenbach;8426;Biberach;8;BW +13062;88422;Moosburg;8426;Biberach;8;BW +13063;88427;Bad Schussenried;8426;Biberach;8;BW +13064;88430;Rot an der Rot;8426;Biberach;8;BW +13065;88433;Schemmerhofen;8426;Biberach;8;BW +13066;88436;Eberhardzell;8426;Biberach;8;BW +13067;88437;Maselheim;8426;Biberach;8;BW +13068;88441;Mittelbiberach;8426;Biberach;8;BW +13069;88444;Ummendorf;8426;Biberach;8;BW +13070;88447;Warthausen;8426;Biberach;8;BW +13071;88448;Attenweiler;8426;Biberach;8;BW +13072;88450;Berkheim;8426;Biberach;8;BW +13073;88451;Dettingen an der Iller;8426;Biberach;8;BW +13074;88453;Erolzheim;8426;Biberach;8;BW +13075;88454;Hochdorf;8426;Biberach;8;BW +13076;88456;Ingoldingen;8426;Biberach;8;BW +13077;88457;Kirchdorf an der Iller;8426;Biberach;8;BW +13078;88459;Tannheim;8426;Biberach;8;BW +13079;88471;Laupheim;8426;Biberach;8;BW +13080;88477;Schwendi;8426;Biberach;8;BW +13081;88480;Achstetten;8426;Biberach;8;BW +13082;88481;Balzheim;8425;Alb-Donau-Kreis;8;BW +13083;88483;Burgrieden;8426;Biberach;8;BW +13084;88484;Gutenzell-Huerbel;8426;Biberach;8;BW +13085;88486;Kirchberg an der Iller;8426;Biberach;8;BW +13086;88487;Mietingen;8426;Biberach;8;BW +13087;88489;Wain;8426;Biberach;8;BW +13088;88499;Emeringen;8425;Alb-Donau-Kreis;8;BW +13089;88499;Riedlingen;8426;Biberach;8;BW +13090;88499;Altheim;8426;Biberach;8;BW +13091;88512;Mengen;8437;Sigmaringen;8;BW +13092;88515;Langenenslingen;8426;Biberach;8;BW +13093;88518;Herbertingen;8437;Sigmaringen;8;BW +13094;88521;Ertingen;8426;Biberach;8;BW +13095;88524;Uttenweiler;8426;Biberach;8;BW +13096;88525;Duermentingen;8426;Biberach;8;BW +13097;88527;Unlingen;8426;Biberach;8;BW +13098;88529;Zwiefalten;8415;Reutlingen;8;BW +13099;88605;Messkirch;8437;Sigmaringen;8;BW +13100;88605;Sauldorf;8437;Sigmaringen;8;BW +13101;88630;Pfullendorf;8437;Sigmaringen;8;BW +13102;88631;Beuron;8437;Sigmaringen;8;BW +13103;88633;Heiligenberg;8435;Bodenseekreis;8;BW +13104;88634;Herdwangen-Schoenach;8437;Sigmaringen;8;BW +13105;88636;Illmensee;8437;Sigmaringen;8;BW +13106;88637;Buchheim;8327;Tuttlingen;8;BW +13107;88637;Leibertingen;8437;Sigmaringen;8;BW +13108;88639;Wald;8437;Sigmaringen;8;BW +13109;88662;BEgen;8435;Bodenseekreis;8;BW +13110;88677;Markdorf;8435;Bodenseekreis;8;BW +13111;88682;Salem;8435;Bodenseekreis;8;BW +13112;88690;Uhldingen-Muehlhofen;8435;Bodenseekreis;8;BW +13113;88693;Deggenhausertal;8435;Bodenseekreis;8;BW +13114;88696;Owingen;8435;Bodenseekreis;8;BW +13115;88697;Bermatingen;8435;Bodenseekreis;8;BW +13116;88699;Frickingen;8435;Bodenseekreis;8;BW +13117;88709;Meersburg;8435;Bodenseekreis;8;BW +13118;88709;Hagnau am Bodensee;8435;Bodenseekreis;8;BW +13119;88718;Daisendorf;8435;Bodenseekreis;8;BW +13120;88719;Stetten;8435;Bodenseekreis;8;BW +13121;89073;Ulm;8421;Ulm;8;BW +13122;89075;Ulm;8421;Ulm;8;BW +13123;89077;Ulm;8421;Ulm;8;BW +13124;89079;Ulm;8421;Ulm;8;BW +13125;89081;Ulm;8421;Ulm;8;BW +13126;89129;Nerenstetten;8425;Alb-Donau-Kreis;8;BW +13127;89129;llingen;8425;Alb-Donau-Kreis;8;BW +13128;89129;Langenau;8425;Alb-Donau-Kreis;8;BW +13129;89129;Setzingen;8425;Alb-Donau-Kreis;8;BW +13130;89134;Blaustein;8425;Alb-Donau-Kreis;8;BW +13131;89143;Blaubeuren;8425;Alb-Donau-Kreis;8;BW +13132;89150;Laichingen;8425;Alb-Donau-Kreis;8;BW +13133;89155;Erbach;8425;Alb-Donau-Kreis;8;BW +13134;89160;Dornstadt;8425;Alb-Donau-Kreis;8;BW +13135;89165;Dietenheim;8425;Alb-Donau-Kreis;8;BW +13136;89168;Niederstotzingen;8135;Heidenheim;8;BW +13137;89171;Illerkirchberg;8425;Alb-Donau-Kreis;8;BW +13138;89173;Lonsee;8425;Alb-Donau-Kreis;8;BW +13139;89174;Altheim (Alb);8425;Alb-Donau-Kreis;8;BW +13140;89176;Asselfingen;8425;Alb-Donau-Kreis;8;BW +13141;89177;Boerslingen;8425;Alb-Donau-Kreis;8;BW +13142;89177;Ballendorf;8425;Alb-Donau-Kreis;8;BW +13143;89179;Beimerstetten;8425;Alb-Donau-Kreis;8;BW +13144;89180;Berghuelen;8425;Alb-Donau-Kreis;8;BW +13145;89182;Bernstadt;8425;Alb-Donau-Kreis;8;BW +13146;89183;Breitingen;8425;Alb-Donau-Kreis;8;BW +13147;89183;Holzkirch;8425;Alb-Donau-Kreis;8;BW +13148;89185;Huettisheim;8425;Alb-Donau-Kreis;8;BW +13149;89186;Illerrieden;8425;Alb-Donau-Kreis;8;BW +13150;89188;Merklingen;8425;Alb-Donau-Kreis;8;BW +13151;89189;Neenstetten;8425;Alb-Donau-Kreis;8;BW +13152;89191;Nellingen;8425;Alb-Donau-Kreis;8;BW +13153;89192;Rammingen;8425;Alb-Donau-Kreis;8;BW +13154;89194;Schnuerpflingen;8425;Alb-Donau-Kreis;8;BW +13155;89195;Staig;8425;Alb-Donau-Kreis;8;BW +13156;89197;Weidenstetten;8425;Alb-Donau-Kreis;8;BW +13157;89198;Westerstetten;8425;Alb-Donau-Kreis;8;BW +13158;89231;Neu-Ulm;9775;Neu-Ulm;9;BY +13159;89233;Neu-Ulm;9775;Neu-Ulm;9;BY +13160;89250;Senden;9775;Neu-Ulm;9;BY +13161;89257;Illertissen;9775;Neu-Ulm;9;BY +13162;89264;Weissenhorn;9775;Neu-Ulm;9;BY +13163;89269;Voehringen;9775;Neu-Ulm;9;BY +13164;89275;Elchingen;9775;Neu-Ulm;9;BY +13165;89278;Nersingen;9775;Neu-Ulm;9;BY +13166;89281;Altenstadt;9775;Neu-Ulm;9;BY +13167;89284;Pfaffenhofen an der Roth;9775;Neu-Ulm;9;BY +13168;89287;Bellenberg;9775;Neu-Ulm;9;BY +13169;89290;Buch;9775;Neu-Ulm;9;BY +13170;89291;Holzheim;9775;Neu-Ulm;9;BY +13171;89293;Kellmuenz;9775;Neu-Ulm;9;BY +13172;89294;Oberroth;9775;Neu-Ulm;9;BY +13173;89296;Osterberg;9775;Neu-Ulm;9;BY +13174;89297;Roggenburg;9775;Neu-Ulm;9;BY +13175;89299;Unterroth;9775;Neu-Ulm;9;BY +13176;89312;Guenzburg;9774;Guenzburg;9;BY +13177;89331;Burgau;9774;Guenzburg;9;BY +13178;89335;Ichenhausen;9774;Guenzburg;9;BY +13179;89340;Leipheim;9774;Guenzburg;9;BY +13180;89343;Jettingen-Scheppach;9774;Guenzburg;9;BY +13181;89344;Aislingen;9773;Dillingen a.d. Donau;9;BY +13182;89346;Bibertal;9774;Guenzburg;9;BY +13183;89347;Bubesheim;9774;Guenzburg;9;BY +13184;89349;Burtenbach;9774;Guenzburg;9;BY +13185;89350;Duerrlauingen;9774;Guenzburg;9;BY +13186;89352;Ellzee;9774;Guenzburg;9;BY +13187;89353;Gloett;9773;Dillingen a.d. Donau;9;BY +13188;89355;Gundremmingen;9774;Guenzburg;9;BY +13189;89356;Haldenwang;9774;Guenzburg;9;BY +13190;89358;Kammeltal;9774;Guenzburg;9;BY +13191;89359;Koetz;9774;Guenzburg;9;BY +13192;89361;Landensberg;9774;Guenzburg;9;BY +13193;89362;Offingen;9774;Guenzburg;9;BY +13194;89364;Rettenbach;9774;Guenzburg;9;BY +13195;89365;Roefingen;9774;Guenzburg;9;BY +13196;89367;Waldstetten;9774;Guenzburg;9;BY +13197;89368;Winterbach;9774;Guenzburg;9;BY +13198;89407;Dillingen an der Donau;9773;Dillingen a.d. Donau;9;BY +13199;89415;Lauingen (Donau);9773;Dillingen a.d. Donau;9;BY +13200;89420;Hoechstaedt an der Donau;9773;Dillingen a.d. Donau;9;BY +13201;89423;Gundelfingen an der Donau;9773;Dillingen a.d. Donau;9;BY +13202;89426;Moedingen;9773;Dillingen a.d. Donau;9;BY +13203;89426;Wittislingen;9773;Dillingen a.d. Donau;9;BY +13204;89428;Syrgenstein;9773;Dillingen a.d. Donau;9;BY +13205;89429;Bachhagel;9773;Dillingen a.d. Donau;9;BY +13206;89431;Baechingen an der Brenz;9773;Dillingen a.d. Donau;9;BY +13207;89432;Binswangen;9773;Dillingen a.d. Donau;9;BY +13208;89434;Blindheim;9773;Dillingen a.d. Donau;9;BY +13209;89435;Finningen;9773;Dillingen a.d. Donau;9;BY +13210;89437;Haunsheim;9773;Dillingen a.d. Donau;9;BY +13211;89438;Holzheim;9773;Dillingen a.d. Donau;9;BY +13212;89440;Lutzingen;9773;Dillingen a.d. Donau;9;BY +13213;89441;Medlingen;9773;Dillingen a.d. Donau;9;BY +13214;89443;Schwenningen;9773;Dillingen a.d. Donau;9;BY +13215;89444;Villenbach;9773;Dillingen a.d. Donau;9;BY +13216;89446;Ziertheim;9773;Dillingen a.d. Donau;9;BY +13217;89447;Zoeschingen;9773;Dillingen a.d. Donau;9;BY +13218;89449;Zusamaltheim;9773;Dillingen a.d. Donau;9;BY +13219;89518;Heidenheim an der Brenz;8135;Heidenheim;8;BW +13220;89520;Heidenheim an der Brenz;8135;Heidenheim;8;BW +13221;89522;Heidenheim an der Brenz;8135;Heidenheim;8;BW +13222;89537;Giengen an der Brenz;8135;Heidenheim;8;BW +13223;89542;Herbrechtingen;8135;Heidenheim;8;BW +13224;89547;Gerstetten;8135;Heidenheim;8;BW +13225;89551;Koenigsbronn;8135;Heidenheim;8;BW +13226;89555;Steinheim am Albuch;8135;Heidenheim;8;BW +13227;89558;Boehmenkirch;8117;Goeppingen;8;BW +13228;89561;Dischingen;8135;Heidenheim;8;BW +13229;89564;Nattheim;8135;Heidenheim;8;BW +13230;89567;Sontheim an der Brenz;8135;Heidenheim;8;BW +13231;89568;Hermaringen;8135;Heidenheim;8;BW +13232;89584;Ehingen an der Donau;8425;Alb-Donau-Kreis;8;BW +13233;89584;Lauterach;8425;Alb-Donau-Kreis;8;BW +13234;89597;Munderkingen;8425;Alb-Donau-Kreis;8;BW +13235;89597;Unterwachingen;8425;Alb-Donau-Kreis;8;BW +13236;89597;Hausen am Bussen;8425;Alb-Donau-Kreis;8;BW +13237;89601;Schelklingen;8425;Alb-Donau-Kreis;8;BW +13238;89604;Allmendingen;8425;Alb-Donau-Kreis;8;BW +13239;89605;Altheim;8425;Alb-Donau-Kreis;8;BW +13240;89607;Emerkingen;8425;Alb-Donau-Kreis;8;BW +13241;89608;Griesingen;8425;Alb-Donau-Kreis;8;BW +13242;89610;Oberdischingen;8425;Alb-Donau-Kreis;8;BW +13243;89611;Rechtenstein;8425;Alb-Donau-Kreis;8;BW +13244;89611;Obermarchtal;8425;Alb-Donau-Kreis;8;BW +13245;89613;Oberstadion;8425;Alb-Donau-Kreis;8;BW +13246;89613;Grundsheim;8425;Alb-Donau-Kreis;8;BW +13247;89614;pfingen;8425;Alb-Donau-Kreis;8;BW +13248;89616;Rottenacker;8425;Alb-Donau-Kreis;8;BW +13249;89617;Untermarchtal;8425;Alb-Donau-Kreis;8;BW +13250;89619;Unterstadion;8425;Alb-Donau-Kreis;8;BW +13251;90402;Nuernberg;9564;Nuernberg, Stadt;9;BY +13252;90403;Nuernberg;9564;Nuernberg, Stadt;9;BY +13253;90408;Nuernberg;9564;Nuernberg, Stadt;9;BY +13254;90409;Nuernberg;9564;Nuernberg, Stadt;9;BY +13255;90411;Nuernberg;9564;Nuernberg, Stadt;9;BY +13256;90419;Nuernberg;9564;Nuernberg, Stadt;9;BY +13257;90425;Nuernberg;9564;Nuernberg, Stadt;9;BY +13258;90427;Nuernberg;9564;Nuernberg, Stadt;9;BY +13259;90429;Nuernberg;9564;Nuernberg, Stadt;9;BY +13260;90431;Nuernberg;9564;Nuernberg, Stadt;9;BY +13261;90439;Nuernberg;9564;Nuernberg, Stadt;9;BY +13262;90441;Nuernberg;9564;Nuernberg, Stadt;9;BY +13263;90443;Nuernberg;9564;Nuernberg, Stadt;9;BY +13264;90449;Nuernberg;9564;Nuernberg, Stadt;9;BY +13265;90451;Nuernberg;9564;Nuernberg, Stadt;9;BY +13266;90453;Nuernberg;9564;Nuernberg, Stadt;9;BY +13267;90455;Nuernberg;9564;Nuernberg, Stadt;9;BY +13268;90459;Nuernberg;9564;Nuernberg, Stadt;9;BY +13269;90461;Nuernberg;9564;Nuernberg, Stadt;9;BY +13270;90469;Nuernberg;9564;Nuernberg, Stadt;9;BY +13271;90471;Nuernberg;9564;Nuernberg, Stadt;9;BY +13272;90473;Nuernberg;9564;Nuernberg, Stadt;9;BY +13273;90475;Nuernberg;9564;Nuernberg, Stadt;9;BY +13274;90478;Nuernberg;9564;Nuernberg, Stadt;9;BY +13275;90480;Nuernberg;9564;Nuernberg, Stadt;9;BY +13276;90482;Nuernberg;9564;Nuernberg, Stadt;9;BY +13277;90489;Nuernberg;9564;Nuernberg, Stadt;9;BY +13278;90491;Nuernberg;9564;Nuernberg, Stadt;9;BY +13279;90513;Zirndorf;9573;Fuerth;9;BY +13280;90518;Altdorf;9574;Nuernberger Land;9;BY +13281;90522;Oberasbach;9573;Fuerth;9;BY +13282;90530;Wendelstein;9576;Roth;9;BY +13283;90537;Feucht;9574;Nuernberger Land;9;BY +13284;90542;Eckental;9572;Erlangen-Hoechstadt;9;BY +13285;90547;Stein bei Nuernberg;9573;Fuerth;9;BY +13286;90552;Roethenbach an der Pegnitz;9574;Nuernberger Land;9;BY +13287;90556;Cadolzburg;9573;Fuerth;9;BY +13288;90556;Seukendorf;9573;Fuerth;9;BY +13289;90559;Burgthann;9574;Nuernberger Land;9;BY +13290;90562;Heroldsberg;9572;Erlangen-Hoechstadt;9;BY +13291;90562;Kalchreuth;9572;Erlangen-Hoechstadt;9;BY +13292;90571;Schwaig;9574;Nuernberger Land;9;BY +13293;90574;Rosstal;9573;Fuerth;9;BY +13294;90579;Langenzenn;9573;Fuerth;9;BY +13295;90584;Allersberg;9576;Roth;9;BY +13296;90587;Tuchenbach;9573;Fuerth;9;BY +13297;90587;Veitsbronn;9573;Fuerth;9;BY +13298;90587;Obermichelbach;9573;Fuerth;9;BY +13299;90592;Schwarzenbruck;9574;Nuernberger Land;9;BY +13300;90596;Schwanstetten;9576;Roth;9;BY +13301;90599;Dietenhofen;9571;Ansbach;9;BY +13302;90602;Pyrbaum;9373;Neumarkt i.d. OPf.;9;BY +13303;90607;Rueckersdorf;9574;Nuernberger Land;9;BY +13304;90610;Winkelhaid;9574;Nuernberger Land;9;BY +13305;90613;Grosshabersdorf;9573;Fuerth;9;BY +13306;90614;Ammerndorf;9573;Fuerth;9;BY +13307;90616;Neuhof an der Zenn;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13308;90617;Puschendorf;9573;Fuerth;9;BY +13309;90619;Trautskirchen;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13310;90762;Fuerth;9563;Fuerth, Stadt;9;BY +13311;90763;Fuerth;9563;Fuerth, Stadt;9;BY +13312;90765;Fuerth;9563;Fuerth, Stadt;9;BY +13313;90766;Fuerth;9563;Fuerth, Stadt;9;BY +13314;90768;Fuerth;9563;Fuerth, Stadt;9;BY +13315;91052;Erlangen;9562;Erlangen, Stadt;9;BY +13316;91054;Erlangen;9562;Erlangen, Stadt;9;BY +13317;91054;Buckenhof;9572;Erlangen-Hoechstadt;9;BY +13318;91056;Erlangen;9562;Erlangen, Stadt;9;BY +13319;91058;Erlangen;9562;Erlangen, Stadt;9;BY +13320;91074;Herzogenaurach;9572;Erlangen-Hoechstadt;9;BY +13321;91077;Hetzles;9474;Forchheim;9;BY +13322;91077;Neunkirchen am Brand;9474;Forchheim;9;BY +13323;91077;Dormitz;9474;Forchheim;9;BY +13324;91077;Kleinsendelbach;9474;Forchheim;9;BY +13325;91080;Spardorf;9572;Erlangen-Hoechstadt;9;BY +13326;91080;Uttenreuth;9572;Erlangen-Hoechstadt;9;BY +13327;91080;Marloffstein;9572;Erlangen-Hoechstadt;9;BY +13328;91083;Baiersdorf;9572;Erlangen-Hoechstadt;9;BY +13329;91085;Weisendorf;9572;Erlangen-Hoechstadt;9;BY +13330;91086;Aurachtal;9572;Erlangen-Hoechstadt;9;BY +13331;91088;Bubenreuth;9572;Erlangen-Hoechstadt;9;BY +13332;91090;Effeltrich;9474;Forchheim;9;BY +13333;91091;Grossenseebach;9572;Erlangen-Hoechstadt;9;BY +13334;91093;Hessdorf;9572;Erlangen-Hoechstadt;9;BY +13335;91094;Langensendelbach;9474;Forchheim;9;BY +13336;91096;Moehrendorf;9572;Erlangen-Hoechstadt;9;BY +13337;91097;Oberreichenbach;9572;Erlangen-Hoechstadt;9;BY +13338;91099;Poxdorf;9474;Forchheim;9;BY +13339;91126;Schwabach;9565;Schwabach, Stadt;9;BY +13340;91126;Kammerstein;9576;Roth;9;BY +13341;91126;Rednitzhembach;9576;Roth;9;BY +13342;91154;Roth;9576;Roth;9;BY +13343;91161;Hilpoltstein;9576;Roth;9;BY +13344;91166;Georgensgmuend;9576;Roth;9;BY +13345;91171;Greding;9576;Roth;9;BY +13346;91174;Spalt;9576;Roth;9;BY +13347;91177;Thalmaessing;9576;Roth;9;BY +13348;91180;Heideck;9576;Roth;9;BY +13349;91183;Abenberg;9576;Roth;9;BY +13350;91186;Buechenbach;9576;Roth;9;BY +13351;91187;Roettenbach;9576;Roth;9;BY +13352;91189;Rohr;9576;Roth;9;BY +13353;91207;Lauf an der Pegnitz;9574;Nuernberger Land;9;BY +13354;91217;Hersbruck;9574;Nuernberger Land;9;BY +13355;91220;Schnaittach;9574;Nuernberger Land;9;BY +13356;91224;Pommelsbrunn;9574;Nuernberger Land;9;BY +13357;91227;Leinburg;9574;Nuernberger Land;9;BY +13358;91230;Happurg;9574;Nuernberger Land;9;BY +13359;91233;Neunkirchen am Sand;9574;Nuernberger Land;9;BY +13360;91235;Hartenstein;9574;Nuernberger Land;9;BY +13361;91235;Velden;9574;Nuernberger Land;9;BY +13362;91236;Alfeld;9574;Nuernberger Land;9;BY +13363;91238;Engelthal;9574;Nuernberger Land;9;BY +13364;91238;Offenhausen;9574;Nuernberger Land;9;BY +13365;91239;Henfenfeld;9574;Nuernberger Land;9;BY +13366;91241;Kirchensittenbach;9574;Nuernberger Land;9;BY +13367;91242;Ottensoos;9574;Nuernberger Land;9;BY +13368;91244;Reichenschwand;9574;Nuernberger Land;9;BY +13369;91245;Simmelsdorf;9574;Nuernberger Land;9;BY +13370;91247;Vorra;9574;Nuernberger Land;9;BY +13371;91249;Weigendorf;9371;Amberg-Sulzbach;9;BY +13372;91257;Pegnitz;9472;Bayreuth;9;BY +13373;91275;Auerbach in der Oberpfalz;9371;Amberg-Sulzbach;9;BY +13374;91278;Pottenstein;9472;Bayreuth;9;BY +13375;91281;Kirchenthumbach;9374;Neustadt a.d. Waldnaab;9;BY +13376;91282;Betzenstein;9472;Bayreuth;9;BY +13377;91284;Neuhaus an der Pegnitz;9574;Nuernberger Land;9;BY +13378;91286;Obertrubach;9474;Forchheim;9;BY +13379;91287;Plech;9472;Bayreuth;9;BY +13380;91289;Schnabelwaid;9472;Bayreuth;9;BY +13381;91301;Forchheim;9474;Forchheim;9;BY +13382;91315;Hoechstadt an der Aisch;9572;Erlangen-Hoechstadt;9;BY +13383;91320;Ebermannstadt;9474;Forchheim;9;BY +13384;91322;Graefenberg;9474;Forchheim;9;BY +13385;91325;Adelsdorf;9572;Erlangen-Hoechstadt;9;BY +13386;91327;Goessweinstein;9474;Forchheim;9;BY +13387;91330;Eggolsheim;9474;Forchheim;9;BY +13388;91332;Heiligenstadt;9471;Bamberg;9;BY +13389;91334;Hemhofen;9572;Erlangen-Hoechstadt;9;BY +13390;91336;Heroldsbach;9474;Forchheim;9;BY +13391;91338;Igensdorf;9474;Forchheim;9;BY +13392;91341;Roettenbach;9572;Erlangen-Hoechstadt;9;BY +13393;91344;Waischenfeld;9472;Bayreuth;9;BY +13394;91346;Wiesenttal;9474;Forchheim;9;BY +13395;91347;Aufsess;9472;Bayreuth;9;BY +13396;91349;Egloffstein;9474;Forchheim;9;BY +13397;91350;Gremsdorf;9572;Erlangen-Hoechstadt;9;BY +13398;91352;Hallerndorf;9474;Forchheim;9;BY +13399;91353;Hausen;9474;Forchheim;9;BY +13400;91355;Hiltpoltstein;9474;Forchheim;9;BY +13401;91356;Kirchehrenbach;9474;Forchheim;9;BY +13402;91358;Kunreuth;9474;Forchheim;9;BY +13403;91359;Leutenbach;9474;Forchheim;9;BY +13404;91361;Pinzberg;9474;Forchheim;9;BY +13405;91362;Pretzfeld;9474;Forchheim;9;BY +13406;91364;Unterleinleiter;9474;Forchheim;9;BY +13407;91365;Weilersbach;9474;Forchheim;9;BY +13408;91367;Weissenohe;9474;Forchheim;9;BY +13409;91369;Wiesenthau;9474;Forchheim;9;BY +13410;91413;Neustadt an der Aisch;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13411;91438;Bad Windsheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13412;91443;Scheinfeld;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13413;91448;Emskirchen;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13414;91452;Wilhermsdorf;9573;Fuerth;9;BY +13415;91456;Diespeck;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13416;91459;Markt Erlbach;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13417;91460;Baudenbach;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13418;91462;Dachsbach;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13419;91463;Dietersheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13420;91465;Ergersheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13421;91466;Gerhardshofen;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13422;91468;Gutenstetten;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13423;91469;Hagenbuechach;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13424;91471;Illesheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13425;91472;Ipsheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13426;91474;Langenfeld;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13427;91475;Lonnerstadt;9572;Erlangen-Hoechstadt;9;BY +13428;91477;Markt Bibart;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13429;91478;Markt Nordheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13430;91480;Markt Taschendorf;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13431;91481;Muenchsteinach;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13432;91483;Oberscheinfeld;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13433;91484;Sugenheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13434;91486;Uehlfeld;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13435;91487;Vestenbergsgreuth;9572;Erlangen-Hoechstadt;9;BY +13436;91489;Wilhelmsdorf;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13437;91522;Ansbach;9561;Ansbach, Stadt;9;BY +13438;91541;Rothenburg ob der Tauber;9571;Ansbach;9;BY +13439;91550;Dinkelsbuehl;9571;Ansbach;9;BY +13440;91555;Feuchtwangen;9571;Ansbach;9;BY +13441;91560;Heilsbronn;9571;Ansbach;9;BY +13442;91564;Neuendettelsau;9571;Ansbach;9;BY +13443;91567;Herrieden;9571;Ansbach;9;BY +13444;91572;Bechhofen;9571;Ansbach;9;BY +13445;91575;Windsbach;9571;Ansbach;9;BY +13446;91578;Leutershausen;9571;Ansbach;9;BY +13447;91580;Petersaurach;9571;Ansbach;9;BY +13448;91583;Schillingsfuerst;9571;Ansbach;9;BY +13449;91583;Diebach;9571;Ansbach;9;BY +13450;91586;Lichtenau;9571;Ansbach;9;BY +13451;91587;Adelshofen;9571;Ansbach;9;BY +13452;91589;Aurach;9571;Ansbach;9;BY +13453;91590;Bruckberg;9571;Ansbach;9;BY +13454;91592;Buch am Wald;9571;Ansbach;9;BY +13455;91593;Burgbernheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13456;91595;Burgoberbach;9571;Ansbach;9;BY +13457;91596;Burk;9571;Ansbach;9;BY +13458;91598;Colmberg;9571;Ansbach;9;BY +13459;91599;Dentlein am Forst;9571;Ansbach;9;BY +13460;91601;Dombuehl;9571;Ansbach;9;BY +13461;91602;Duerrwangen;9571;Ansbach;9;BY +13462;91604;Flachslanden;9571;Ansbach;9;BY +13463;91605;Gallmersgarten;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13464;91607;Gebsattel;9571;Ansbach;9;BY +13465;91608;Geslau;9571;Ansbach;9;BY +13466;91610;Insingen;9571;Ansbach;9;BY +13467;91611;Lehrberg;9571;Ansbach;9;BY +13468;91613;Marktbergel;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13469;91614;Moenchsroth;9571;Ansbach;9;BY +13470;91616;Neusitz;9571;Ansbach;9;BY +13471;91617;Oberdachstetten;9571;Ansbach;9;BY +13472;91619;Obernzenn;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +13473;91620;Ohrenbach;9571;Ansbach;9;BY +13474;91622;Ruegland;9571;Ansbach;9;BY +13475;91623;SN;9571;Ansbach;9;BY +13476;91625;Schnelldorf;9571;Ansbach;9;BY +13477;91626;Schopfloch;9571;Ansbach;9;BY +13478;91628;Steinsfeld;9571;Ansbach;9;BY +13479;91629;Weihenzell;9571;Ansbach;9;BY +13480;91631;Wettringen;9571;Ansbach;9;BY +13481;91632;Wieseth;9571;Ansbach;9;BY +13482;91634;Wilburgstetten;9571;Ansbach;9;BY +13483;91635;Windelsbach;9571;Ansbach;9;BY +13484;91637;Woernitz;9571;Ansbach;9;BY +13485;91639;Wolframs-Eschenbach;9571;Ansbach;9;BY +13486;91710;Gunzenhausen;9577;Weissenburg-Gunzenhausen;9;BY +13487;91717;Wassertruedingen;9571;Ansbach;9;BY +13488;91719;Heidenheim;9577;Weissenburg-Gunzenhausen;9;BY +13489;91720;Absberg;9577;Weissenburg-Gunzenhausen;9;BY +13490;91722;Arberg;9571;Ansbach;9;BY +13491;91723;Dittenheim;9577;Weissenburg-Gunzenhausen;9;BY +13492;91725;Ehingen;9571;Ansbach;9;BY +13493;91726;Gerolfingen;9571;Ansbach;9;BY +13494;91728;Gnotzheim;9577;Weissenburg-Gunzenhausen;9;BY +13495;91729;Haundorf;9577;Weissenburg-Gunzenhausen;9;BY +13496;91731;Langfurth;9571;Ansbach;9;BY +13497;91732;Merkendorf;9571;Ansbach;9;BY +13498;91734;Mitteleschenbach;9571;Ansbach;9;BY +13499;91735;Muhr am See;9577;Weissenburg-Gunzenhausen;9;BY +13500;91737;Ornbau;9571;Ansbach;9;BY +13501;91738;Pfofeld;9577;Weissenburg-Gunzenhausen;9;BY +13502;91740;Roeckingen;9571;Ansbach;9;BY +13503;91741;Theilenhofen;9577;Weissenburg-Gunzenhausen;9;BY +13504;91743;Unterschwaningen;9571;Ansbach;9;BY +13505;91744;Weiltingen;9571;Ansbach;9;BY +13506;91746;Weidenbach;9571;Ansbach;9;BY +13507;91747;Westheim;9577;Weissenburg-Gunzenhausen;9;BY +13508;91749;Wittelshofen;9571;Ansbach;9;BY +13509;91757;Treuchtlingen;9577;Weissenburg-Gunzenhausen;9;BY +13510;91781;Weissenburg in BY;9577;Weissenburg-Gunzenhausen;9;BY +13511;91785;Pleinfeld;9577;Weissenburg-Gunzenhausen;9;BY +13512;91788;Pappenheim;9577;Weissenburg-Gunzenhausen;9;BY +13513;91790;Burgsalach;9577;Weissenburg-Gunzenhausen;9;BY +13514;91790;Raitenbuch;9577;Weissenburg-Gunzenhausen;9;BY +13515;91790;Bergen;9577;Weissenburg-Gunzenhausen;9;BY +13516;91790;Nennslingen;9577;Weissenburg-Gunzenhausen;9;BY +13517;91792;Ellingen;9577;Weissenburg-Gunzenhausen;9;BY +13518;91793;Alesheim;9577;Weissenburg-Gunzenhausen;9;BY +13519;91795;Dollnstein;9176;Eichstaett;9;BY +13520;91796;Ettenstatt;9577;Weissenburg-Gunzenhausen;9;BY +13521;91798;Hoettingen;9577;Weissenburg-Gunzenhausen;9;BY +13522;91799;Langenaltheim;9577;Weissenburg-Gunzenhausen;9;BY +13523;91801;Markt Berolzheim;9577;Weissenburg-Gunzenhausen;9;BY +13524;91802;Meinheim;9577;Weissenburg-Gunzenhausen;9;BY +13525;91804;Moernsheim;9176;Eichstaett;9;BY +13526;91805;Polsingen;9577;Weissenburg-Gunzenhausen;9;BY +13527;91807;Solnhofen;9577;Weissenburg-Gunzenhausen;9;BY +13528;91809;Wellheim;9176;Eichstaett;9;BY +13529;92224;Amberg;9361;Amberg, Stadt;9;BY +13530;92237;Sulzbach-Rosenberg;9371;Amberg-Sulzbach;9;BY +13531;92242;Hirschau;9371;Amberg-Sulzbach;9;BY +13532;92245;Kuemmersbruck;9371;Amberg-Sulzbach;9;BY +13533;92249;Vilseck;9371;Amberg-Sulzbach;9;BY +13534;92253;Schnaittenbach;9371;Amberg-Sulzbach;9;BY +13535;92256;Hahnbach;9371;Amberg-Sulzbach;9;BY +13536;92259;Neukirchen bei Sulzbach-Rosenberg;9371;Amberg-Sulzbach;9;BY +13537;92260;Ammerthal;9371;Amberg-Sulzbach;9;BY +13538;92262;Birgland;9371;Amberg-Sulzbach;9;BY +13539;92263;Ebermannsdorf;9371;Amberg-Sulzbach;9;BY +13540;92265;Edelsfeld;9371;Amberg-Sulzbach;9;BY +13541;92266;Ensdorf;9371;Amberg-Sulzbach;9;BY +13542;92268;Etzelwang;9371;Amberg-Sulzbach;9;BY +13543;92269;Fensterbach;9376;Schwandorf;9;BY +13544;92271;Freihung;9371;Amberg-Sulzbach;9;BY +13545;92272;Freudenberg;9371;Amberg-Sulzbach;9;BY +13546;92274;Gebenbach;9371;Amberg-Sulzbach;9;BY +13547;92275;Hirschbach;9371;Amberg-Sulzbach;9;BY +13548;92277;Hohenburg;9371;Amberg-Sulzbach;9;BY +13549;92278;Illschwang;9371;Amberg-Sulzbach;9;BY +13550;92280;Kastl;9371;Amberg-Sulzbach;9;BY +13551;92281;Koenigstein;9371;Amberg-Sulzbach;9;BY +13552;92283;Lauterhofen;9373;Neumarkt i.d. OPf.;9;BY +13553;92284;Poppenricht;9371;Amberg-Sulzbach;9;BY +13554;92286;Rieden;9371;Amberg-Sulzbach;9;BY +13555;92287;Schmidmuehlen;9371;Amberg-Sulzbach;9;BY +13556;92289;Ursensollen;9371;Amberg-Sulzbach;9;BY +13557;92318;Neumarkt in der Oberpfalz;9373;Neumarkt i.d. OPf.;9;BY +13558;92331;Parsberg;9373;Neumarkt i.d. OPf.;9;BY +13559;92331;Lupburg;9373;Neumarkt i.d. OPf.;9;BY +13560;92334;Berching;9373;Neumarkt i.d. OPf.;9;BY +13561;92339;Beilngries;9176;Eichstaett;9;BY +13562;92342;Freystadt;9373;Neumarkt i.d. OPf.;9;BY +13563;92345;Dietfurt an der Altmuehl;9373;Neumarkt i.d. OPf.;9;BY +13564;92348;Berg bei Neumarkt in der Oberpfalz;9373;Neumarkt i.d. OPf.;9;BY +13565;92353;Postbauer-Heng;9373;Neumarkt i.d. OPf.;9;BY +13566;92355;Velburg;9373;Neumarkt i.d. OPf.;9;BY +13567;92358;Seubersdorf in der Oberpfalz;9373;Neumarkt i.d. OPf.;9;BY +13568;92360;Muehlhausen;9373;Neumarkt i.d. OPf.;9;BY +13569;92361;Berngau;9373;Neumarkt i.d. OPf.;9;BY +13570;92363;Breitenbrunn;9373;Neumarkt i.d. OPf.;9;BY +13571;92364;Deining;9373;Neumarkt i.d. OPf.;9;BY +13572;92366;Hohenfels;9373;Neumarkt i.d. OPf.;9;BY +13573;92367;Pilsach;9373;Neumarkt i.d. OPf.;9;BY +13574;92369;Sengenthal;9373;Neumarkt i.d. OPf.;9;BY +13575;92421;Schwandorf;9376;Schwandorf;9;BY +13576;92431;Neunburg vorm Wald;9376;Schwandorf;9;BY +13577;92436;Bruck in der Oberpfalz;9376;Schwandorf;9;BY +13578;92439;Bodenwoehr;9376;Schwandorf;9;BY +13579;92442;Wackersdorf;9376;Schwandorf;9;BY +13580;92444;Roetz;9372;Cham;9;BY +13581;92445;Neukirchen-Balbini;9376;Schwandorf;9;BY +13582;92447;Schwarzhofen;9376;Schwandorf;9;BY +13583;92449;Steinberg;9376;Schwandorf;9;BY +13584;92507;Nabburg;9376;Schwandorf;9;BY +13585;92521;Schwarzenfeld;9376;Schwandorf;9;BY +13586;92526;Oberviechtach;9376;Schwandorf;9;BY +13587;92533;Wernberg-Koeblitz;9376;Schwandorf;9;BY +13588;92536;Pfreimd;9376;Schwandorf;9;BY +13589;92539;Schoensee;9376;Schwandorf;9;BY +13590;92540;Altendorf;9376;Schwandorf;9;BY +13591;92542;Dieterskirchen;9376;Schwandorf;9;BY +13592;92543;Guteneck;9376;Schwandorf;9;BY +13593;92545;Niedermurach;9376;Schwandorf;9;BY +13594;92546;Schmidgaden;9376;Schwandorf;9;BY +13595;92548;Schwarzach bei Nabburg;9376;Schwandorf;9;BY +13596;92549;Stadlern;9376;Schwandorf;9;BY +13597;92551;Stulln;9376;Schwandorf;9;BY +13598;92552;Teunz;9376;Schwandorf;9;BY +13599;92554;Thanstein;9376;Schwandorf;9;BY +13600;92555;Trausnitz;9376;Schwandorf;9;BY +13601;92557;Weiding;9376;Schwandorf;9;BY +13602;92559;Winklarn;9376;Schwandorf;9;BY +13603;92637;Theisseil;9374;Neustadt a.d. Waldnaab;9;BY +13604;92637;Weiden;9363;Weiden i.d. OPf., Stadt;9;BY +13605;92648;Vohenstrauss;9374;Neustadt a.d. Waldnaab;9;BY +13606;92655;Grafenwoehr;9374;Neustadt a.d. Waldnaab;9;BY +13607;92660;Neustadt an der Waldnaab;9374;Neustadt a.d. Waldnaab;9;BY +13608;92665;Kirchendemenreuth;9374;Neustadt a.d. Waldnaab;9;BY +13609;92665;Altenstadt an der Waldnaab;9374;Neustadt a.d. Waldnaab;9;BY +13610;92670;Windischeschenbach;9374;Neustadt a.d. Waldnaab;9;BY +13611;92676;Eschenbach in der Oberpfalz;9374;Neustadt a.d. Waldnaab;9;BY +13612;92676;Speinshart;9374;Neustadt a.d. Waldnaab;9;BY +13613;92681;Erbendorf;9377;Tirschenreuth;9;BY +13614;92685;Floss;9374;Neustadt a.d. Waldnaab;9;BY +13615;92690;Pressath;9374;Neustadt a.d. Waldnaab;9;BY +13616;92693;Eslarn;9374;Neustadt a.d. Waldnaab;9;BY +13617;92694;Etzenricht;9374;Neustadt a.d. Waldnaab;9;BY +13618;92696;Flossenbuerg;9374;Neustadt a.d. Waldnaab;9;BY +13619;92697;Georgenberg;9374;Neustadt a.d. Waldnaab;9;BY +13620;92699;Irchenrieth;9374;Neustadt a.d. Waldnaab;9;BY +13621;92699;Bechtsrieth;9374;Neustadt a.d. Waldnaab;9;BY +13622;92702;Kohlberg;9374;Neustadt a.d. Waldnaab;9;BY +13623;92703;Krummennaab;9377;Tirschenreuth;9;BY +13624;92705;Leuchtenberg;9374;Neustadt a.d. Waldnaab;9;BY +13625;92706;Luhe-Wildenau;9374;Neustadt a.d. Waldnaab;9;BY +13626;92708;Mantel;9374;Neustadt a.d. Waldnaab;9;BY +13627;92709;Moosbach;9374;Neustadt a.d. Waldnaab;9;BY +13628;92711;Parkstein;9374;Neustadt a.d. Waldnaab;9;BY +13629;92712;Pirk;9374;Neustadt a.d. Waldnaab;9;BY +13630;92714;Pleystein;9374;Neustadt a.d. Waldnaab;9;BY +13631;92715;Puechersreuth;9374;Neustadt a.d. Waldnaab;9;BY +13632;92717;Reuth bei Erbendorf;9377;Tirschenreuth;9;BY +13633;92718;Schirmitz;9374;Neustadt a.d. Waldnaab;9;BY +13634;92720;Schwarzenbach;9374;Neustadt a.d. Waldnaab;9;BY +13635;92721;Stoernstein;9374;Neustadt a.d. Waldnaab;9;BY +13636;92723;Taennesberg;9374;Neustadt a.d. Waldnaab;9;BY +13637;92723;Gleiritsch;9376;Schwandorf;9;BY +13638;92724;Trabitz;9374;Neustadt a.d. Waldnaab;9;BY +13639;92726;Waidhaus;9374;Neustadt a.d. Waldnaab;9;BY +13640;92727;Waldthurn;9374;Neustadt a.d. Waldnaab;9;BY +13641;92729;Weiherhammer;9374;Neustadt a.d. Waldnaab;9;BY +13642;93047;Regensburg;9362;Regensburg, Stadt;9;BY +13643;93049;Regensburg;9362;Regensburg, Stadt;9;BY +13644;93051;Regensburg;9362;Regensburg, Stadt;9;BY +13645;93053;Regensburg;9362;Regensburg, Stadt;9;BY +13646;93055;Regensburg;9362;Regensburg, Stadt;9;BY +13647;93057;Regensburg;9362;Regensburg, Stadt;9;BY +13648;93059;Regensburg;9362;Regensburg, Stadt;9;BY +13649;93073;Neutraubling;9375;Regensburg;9;BY +13650;93077;Bad Abbach;9273;Kelheim;9;BY +13651;93080;Pentling;9375;Regensburg;9;BY +13652;93083;Obertraubling;9375;Regensburg;9;BY +13653;93086;Woerth an der Donau;9375;Regensburg;9;BY +13654;93087;Alteglofsheim;9375;Regensburg;9;BY +13655;93089;Aufhausen;9375;Regensburg;9;BY +13656;93090;Bach an der Donau;9375;Regensburg;9;BY +13657;93092;Barbing;9375;Regensburg;9;BY +13658;93093;Donaustauf;9375;Regensburg;9;BY +13659;93095;Hagelstadt;9375;Regensburg;9;BY +13660;93096;Koefering;9375;Regensburg;9;BY +13661;93098;Mintraching;9375;Regensburg;9;BY +13662;93099;Moetzing;9375;Regensburg;9;BY +13663;93101;Pfakofen;9375;Regensburg;9;BY +13664;93102;Pfatter;9375;Regensburg;9;BY +13665;93104;Riekofen;9375;Regensburg;9;BY +13666;93104;Suenching;9375;Regensburg;9;BY +13667;93105;Tegernheim;9375;Regensburg;9;BY +13668;93107;Thalmassing;9375;Regensburg;9;BY +13669;93109;Wiesent;9375;Regensburg;9;BY +13670;93128;Regenstauf;9375;Regensburg;9;BY +13671;93133;Burglengenfeld;9376;Schwandorf;9;BY +13672;93138;Lappersdorf;9375;Regensburg;9;BY +13673;93142;Maxhuette-Haidhof;9376;Schwandorf;9;BY +13674;93149;Nittenau;9376;Schwandorf;9;BY +13675;93152;Nittendorf;9375;Regensburg;9;BY +13676;93155;Hemau;9375;Regensburg;9;BY +13677;93158;Teublitz;9376;Schwandorf;9;BY +13678;93161;Sinzing;9375;Regensburg;9;BY +13679;93164;Brunn;9375;Regensburg;9;BY +13680;93164;Laaber;9375;Regensburg;9;BY +13681;93167;Falkenstein;9372;Cham;9;BY +13682;93170;Bernhardswald;9375;Regensburg;9;BY +13683;93173;Wenzenbach;9375;Regensburg;9;BY +13684;93176;Beratzhausen;9375;Regensburg;9;BY +13685;93177;Altenthann;9375;Regensburg;9;BY +13686;93179;Brennberg;9375;Regensburg;9;BY +13687;93180;Deuerling;9375;Regensburg;9;BY +13688;93182;Duggendorf;9375;Regensburg;9;BY +13689;93183;Holzheim am Forst;9375;Regensburg;9;BY +13690;93183;Kallmuenz;9375;Regensburg;9;BY +13691;93185;Michelsneukirchen;9372;Cham;9;BY +13692;93186;Pettendorf;9375;Regensburg;9;BY +13693;93188;Pielenhofen;9375;Regensburg;9;BY +13694;93189;Reichenbach;9372;Cham;9;BY +13695;93191;Rettenbach;9372;Cham;9;BY +13696;93192;Wald;9372;Cham;9;BY +13697;93194;Walderbach;9372;Cham;9;BY +13698;93195;Wolfsegg;9375;Regensburg;9;BY +13699;93197;Zeitlarn;9375;Regensburg;9;BY +13700;93199;Zell;9372;Cham;9;BY +13701;93309;Kelheim;9273;Kelheim;9;BY +13702;93326;Abensberg;9273;Kelheim;9;BY +13703;93333;Neustadt an der Donau;9273;Kelheim;9;BY +13704;93336;Altmannstein;9176;Eichstaett;9;BY +13705;93339;Riedenburg;9273;Kelheim;9;BY +13706;93342;Saal an der Donau;9273;Kelheim;9;BY +13707;93343;Essing;9273;Kelheim;9;BY +13708;93345;Hausen;9273;Kelheim;9;BY +13709;93346;Ihrlerstein;9273;Kelheim;9;BY +13710;93348;Kirchdorf;9273;Kelheim;9;BY +13711;93349;Mindelstetten;9176;Eichstaett;9;BY +13712;93351;Painten;9273;Kelheim;9;BY +13713;93352;Rohr in NiederBY;9273;Kelheim;9;BY +13714;93354;Biburg;9273;Kelheim;9;BY +13715;93354;Siegenburg;9273;Kelheim;9;BY +13716;93356;Teugn;9273;Kelheim;9;BY +13717;93358;Train;9273;Kelheim;9;BY +13718;93359;Wildenberg;9273;Kelheim;9;BY +13719;93413;Cham;9372;Cham;9;BY +13720;93426;Roding;9372;Cham;9;BY +13721;93437;Furth im Wald;9372;Cham;9;BY +13722;93444;Koetzting;9372;Cham;9;BY +13723;93449;Waldmuenchen;9372;Cham;9;BY +13724;93453;Neukirchen beim Heiligen Blut;9372;Cham;9;BY +13725;93455;Traitsching;9372;Cham;9;BY +13726;93458;Eschlkam;9372;Cham;9;BY +13727;93462;Lam;9372;Cham;9;BY +13728;93464;Tiefenbach;9372;Cham;9;BY +13729;93466;Chamerau;9372;Cham;9;BY +13730;93468;Miltach;9372;Cham;9;BY +13731;93470;Lohberg;9372;Cham;9;BY +13732;93471;Arnbruck;9276;Regen;9;BY +13733;93473;Arnschwang;9372;Cham;9;BY +13734;93474;Arrach;9372;Cham;9;BY +13735;93476;Blaibach;9372;Cham;9;BY +13736;93477;Gleissenberg;9372;Cham;9;BY +13737;93479;Grafenwiesen;9372;Cham;9;BY +13738;93480;Hohenwarth;9372;Cham;9;BY +13739;93482;Pemfling;9372;Cham;9;BY +13740;93483;Poesing;9372;Cham;9;BY +13741;93485;Rimbach;9372;Cham;9;BY +13742;93486;Runding;9372;Cham;9;BY +13743;93488;Schoenthal;9372;Cham;9;BY +13744;93489;Schorndorf;9372;Cham;9;BY +13745;93491;Stamsried;9372;Cham;9;BY +13746;93492;Treffelstein;9372;Cham;9;BY +13747;93494;Waffenbrunn;9372;Cham;9;BY +13748;93495;Weiding;9372;Cham;9;BY +13749;93497;Willmering;9372;Cham;9;BY +13750;93499;Zandt;9372;Cham;9;BY +13751;94032;Passau;9262;Passau, Stadt;9;BY +13752;94034;Passau;9262;Passau, Stadt;9;BY +13753;94036;Passau;9262;Passau, Stadt;9;BY +13754;94051;Hauzenberg;9275;Passau;9;BY +13755;94060;Pocking;9275;Passau;9;BY +13756;94065;Waldkirchen;9272;Freyung-Grafenau;9;BY +13757;94072;Bad Fuessing;9275;Passau;9;BY +13758;94078;Freyung;9272;Freyung-Grafenau;9;BY +13759;94081;Fuerstenzell;9275;Passau;9;BY +13760;94086;Bad Griesbach im Rottal;9275;Passau;9;BY +13761;94089;Neureichenau;9272;Freyung-Grafenau;9;BY +13762;94094;Malching;9275;Passau;9;BY +13763;94094;Rotthalmuenster;9275;Passau;9;BY +13764;94099;Ruhstorf an der Rott;9275;Passau;9;BY +13765;94104;Tittling;9275;Passau;9;BY +13766;94104;Witzmannsberg;9275;Passau;9;BY +13767;94107;Untergriesbach;9275;Passau;9;BY +13768;94110;Wegscheid;9275;Passau;9;BY +13769;94113;Tiefenbach;9275;Passau;9;BY +13770;94116;Hutthurm;9275;Passau;9;BY +13771;94118;Jandelsbrunn;9272;Freyung-Grafenau;9;BY +13772;94121;Salzweg;9275;Passau;9;BY +13773;94124;Buechlberg;9275;Passau;9;BY +13774;94127;Neuburg am Inn;9275;Passau;9;BY +13775;94130;Obernzell;9275;Passau;9;BY +13776;94133;Roehrnbach;9272;Freyung-Grafenau;9;BY +13777;94136;Thyrnau;9275;Passau;9;BY +13778;94137;Bayerbach;9277;Rottal-Inn;9;BY +13779;94139;Breitenberg;9275;Passau;9;BY +13780;94140;Ering;9277;Rottal-Inn;9;BY +13781;94142;Fuersteneck;9272;Freyung-Grafenau;9;BY +13782;94143;Grainet;9272;Freyung-Grafenau;9;BY +13783;94145;Haidmuehle;9272;Freyung-Grafenau;9;BY +13784;94146;Hinterschmiding;9272;Freyung-Grafenau;9;BY +13785;94148;Kirchham;9275;Passau;9;BY +13786;94149;Koesslarn;9275;Passau;9;BY +13787;94151;Mauth;9272;Freyung-Grafenau;9;BY +13788;94152;Neuhaus am Inn;9275;Passau;9;BY +13789;94154;Neukirchen vorm Wald;9275;Passau;9;BY +13790;94157;Perlesreut;9272;Freyung-Grafenau;9;BY +13791;94158;Philippsreut;9272;Freyung-Grafenau;9;BY +13792;94160;Ringelai;9272;Freyung-Grafenau;9;BY +13793;94161;Ruderting;9275;Passau;9;BY +13794;94163;Saldenburg;9272;Freyung-Grafenau;9;BY +13795;94164;Sonnen;9275;Passau;9;BY +13796;94166;Stubenberg;9277;Rottal-Inn;9;BY +13797;94167;Tettenweis;9275;Passau;9;BY +13798;94169;Thurmansbang;9272;Freyung-Grafenau;9;BY +13799;94209;Regen;9276;Regen;9;BY +13800;94227;Lindberg;9276;Regen;9;BY +13801;94227;Zwiesel;9276;Regen;9;BY +13802;94234;Viechtach;9276;Regen;9;BY +13803;94239;Zachenberg;9276;Regen;9;BY +13804;94239;Gotteszell;9276;Regen;9;BY +13805;94239;Ruhmannsfelden;9276;Regen;9;BY +13806;94244;Geiersthal;9276;Regen;9;BY +13807;94244;Teisnach;9276;Regen;9;BY +13808;94249;Bodenmais;9276;Regen;9;BY +13809;94250;Achslach;9276;Regen;9;BY +13810;94252;Bayerisch Eisenstein;9276;Regen;9;BY +13811;94253;Bischofsmais;9276;Regen;9;BY +13812;94255;Boebrach;9276;Regen;9;BY +13813;94256;Drachselsried;9276;Regen;9;BY +13814;94258;Frauenau;9276;Regen;9;BY +13815;94259;Kirchberg im Wald;9276;Regen;9;BY +13816;94261;Kirchdorf im Wald;9276;Regen;9;BY +13817;94262;Kollnburg;9276;Regen;9;BY +13818;94264;Langdorf;9276;Regen;9;BY +13819;94265;Patersdorf;9276;Regen;9;BY +13820;94267;Prackenbach;9276;Regen;9;BY +13821;94269;Rinchnach;9276;Regen;9;BY +13822;94315;Straubing;9263;Straubing, Stadt;9;BY +13823;94327;Bogen;9278;Straubing-Bogen;9;BY +13824;94330;Aiterhofen;9278;Straubing-Bogen;9;BY +13825;94330;Salching;9278;Straubing-Bogen;9;BY +13826;94333;Geiselhoering;9278;Straubing-Bogen;9;BY +13827;94336;Windberg;9278;Straubing-Bogen;9;BY +13828;94336;Hunderdorf;9278;Straubing-Bogen;9;BY +13829;94339;Leiblfing;9278;Straubing-Bogen;9;BY +13830;94342;Irlbach;9278;Straubing-Bogen;9;BY +13831;94342;Strasskirchen;9278;Straubing-Bogen;9;BY +13832;94344;Wiesenfelden;9278;Straubing-Bogen;9;BY +13833;94345;Aholfing;9278;Straubing-Bogen;9;BY +13834;94347;Ascha;9278;Straubing-Bogen;9;BY +13835;94348;Atting;9278;Straubing-Bogen;9;BY +13836;94350;Falkenfels;9278;Straubing-Bogen;9;BY +13837;94351;Feldkirchen;9278;Straubing-Bogen;9;BY +13838;94353;Haibach;9278;Straubing-Bogen;9;BY +13839;94354;Haselbach;9278;Straubing-Bogen;9;BY +13840;94356;Kirchroth;9278;Straubing-Bogen;9;BY +13841;94357;Konzell;9278;Straubing-Bogen;9;BY +13842;94359;Loitzendorf;9278;Straubing-Bogen;9;BY +13843;94360;Mitterfels;9278;Straubing-Bogen;9;BY +13844;94362;Neukirchen;9278;Straubing-Bogen;9;BY +13845;94363;Oberschneiding;9278;Straubing-Bogen;9;BY +13846;94365;Parkstetten;9278;Straubing-Bogen;9;BY +13847;94366;Perasdorf;9278;Straubing-Bogen;9;BY +13848;94368;Perkam;9278;Straubing-Bogen;9;BY +13849;94369;Rain;9278;Straubing-Bogen;9;BY +13850;94371;Rattenberg;9278;Straubing-Bogen;9;BY +13851;94372;Rattiszell;9278;Straubing-Bogen;9;BY +13852;94374;Schwarzach;9278;Straubing-Bogen;9;BY +13853;94375;Stallwang;9278;Straubing-Bogen;9;BY +13854;94377;Steinach;9278;Straubing-Bogen;9;BY +13855;94379;Sankt Englmar;9278;Straubing-Bogen;9;BY +13856;94405;Landau an der Isar;9279;Dingolfing-Landau;9;BY +13857;94419;Reisbach;9279;Dingolfing-Landau;9;BY +13858;94424;Arnstorf;9277;Rottal-Inn;9;BY +13859;94428;Eichendorf;9279;Dingolfing-Landau;9;BY +13860;94431;Pilsting;9279;Dingolfing-Landau;9;BY +13861;94436;Simbach;9279;Dingolfing-Landau;9;BY +13862;94437;Mamming;9279;Dingolfing-Landau;9;BY +13863;94439;Rossbach;9277;Rottal-Inn;9;BY +13864;94447;Plattling;9271;Deggendorf;9;BY +13865;94469;Deggendorf;9271;Deggendorf;9;BY +13866;94474;Vilshofen;9275;Passau;9;BY +13867;94481;Grafenau;9272;Freyung-Grafenau;9;BY +13868;94486;Osterhofen;9271;Deggendorf;9;BY +13869;94491;Hengersberg;9271;Deggendorf;9;BY +13870;94496;Ortenburg;9275;Passau;9;BY +13871;94501;Beutelsbach;9275;Passau;9;BY +13872;94501;Aidenbach;9275;Passau;9;BY +13873;94501;Aldersbach;9275;Passau;9;BY +13874;94505;Bernried;9271;Deggendorf;9;BY +13875;94508;Schoellnach;9271;Deggendorf;9;BY +13876;94513;Schoenberg;9272;Freyung-Grafenau;9;BY +13877;94518;Spiegelau;9272;Freyung-Grafenau;9;BY +13878;94522;Wallersdorf;9279;Dingolfing-Landau;9;BY +13879;94526;Metten;9271;Deggendorf;9;BY +13880;94527;Aholming;9271;Deggendorf;9;BY +13881;94529;Aicha vorm Wald;9275;Passau;9;BY +13882;94530;Auerbach;9271;Deggendorf;9;BY +13883;94532;Aussernzell;9271;Deggendorf;9;BY +13884;94533;Buchhofen;9271;Deggendorf;9;BY +13885;94535;Eging am See;9275;Passau;9;BY +13886;94536;Eppenschlag;9272;Freyung-Grafenau;9;BY +13887;94538;Fuerstenstein;9275;Passau;9;BY +13888;94539;Grafling;9271;Deggendorf;9;BY +13889;94541;Grattersdorf;9271;Deggendorf;9;BY +13890;94542;Haarbach;9275;Passau;9;BY +13891;94544;Hofkirchen;9275;Passau;9;BY +13892;94545;Hohenau;9272;Freyung-Grafenau;9;BY +13893;94547;Iggensbach;9271;Deggendorf;9;BY +13894;94548;Innernzell;9272;Freyung-Grafenau;9;BY +13895;94550;Kuenzing;9271;Deggendorf;9;BY +13896;94551;Hunding;9271;Deggendorf;9;BY +13897;94551;Lalling;9271;Deggendorf;9;BY +13898;94553;Mariaposching;9278;Straubing-Bogen;9;BY +13899;94554;Moos;9271;Deggendorf;9;BY +13900;94556;Neuschoenau;9272;Freyung-Grafenau;9;BY +13901;94557;Niederalteich;9271;Deggendorf;9;BY +13902;94559;Niederwinkling;9278;Straubing-Bogen;9;BY +13903;94560;Offenberg;9271;Deggendorf;9;BY +13904;94562;Oberpoering;9271;Deggendorf;9;BY +13905;94563;Otzing;9271;Deggendorf;9;BY +13906;94566;Sankt Oswald-Riedlhuette;9272;Freyung-Grafenau;9;BY +13907;94568;Sankt Oswald-Riedlhuette;9272;Freyung-Grafenau;9;BY +13908;94569;Stephansposching;9271;Deggendorf;9;BY +13909;94571;Schaufling;9271;Deggendorf;9;BY +13910;94572;Schoefweg;9272;Freyung-Grafenau;9;BY +13911;94574;Wallerfing;9271;Deggendorf;9;BY +13912;94575;Windorf;9275;Passau;9;BY +13913;94577;Winzer;9271;Deggendorf;9;BY +13914;94579;Zenting;9272;Freyung-Grafenau;9;BY +13915;95028;Hof;9464;Hof, Stadt;9;BY +13916;95030;Hof;9464;Hof, Stadt;9;BY +13917;95032;Hof;9464;Hof, Stadt;9;BY +13918;95100;Selb;9479;Wunsiedel i. Fichtelgebirge;9;BY +13919;95111;Rehau;9475;Hof;9;BY +13920;95119;Naila;9475;Hof;9;BY +13921;95126;Schwarzenbach an der Saale;9475;Hof;9;BY +13922;95131;Schwarzenbach am Wald;9475;Hof;9;BY +13923;95138;Bad Steben;9475;Hof;9;BY +13924;95145;Oberkotzau;9475;Hof;9;BY +13925;95152;Selbitz;9475;Hof;9;BY +13926;95158;Kirchenlamitz;9479;Wunsiedel i. Fichtelgebirge;9;BY +13927;95163;Weissenstadt;9479;Wunsiedel i. Fichtelgebirge;9;BY +13928;95168;Marktleuthen;9479;Wunsiedel i. Fichtelgebirge;9;BY +13929;95173;Schoenwald;9479;Wunsiedel i. Fichtelgebirge;9;BY +13930;95176;Konradsreuth;9475;Hof;9;BY +13931;95179;Geroldsgruen;9475;Hof;9;BY +13932;95180;Berg;9475;Hof;9;BY +13933;95182;Doehlau;9475;Hof;9;BY +13934;95183;Feilitzsch;9475;Hof;9;BY +13935;95183;Trogen;9475;Hof;9;BY +13936;95183;Toepen;9475;Hof;9;BY +13937;95185;Gattendorf;9475;Hof;9;BY +13938;95186;Hoechstaedt im Fichtelgebirge;9479;Wunsiedel i. Fichtelgebirge;9;BY +13939;95188;Issigau;9475;Hof;9;BY +13940;95189;Koeditz;9475;Hof;9;BY +13941;95191;Leupoldsgruen;9475;Hof;9;BY +13942;95192;Lichtenberg;9475;Hof;9;BY +13943;95194;Regnitzlosau;9475;Hof;9;BY +13944;95195;Roeslau;9479;Wunsiedel i. Fichtelgebirge;9;BY +13945;95197;Schauenstein;9475;Hof;9;BY +13946;95199;Thierstein;9479;Wunsiedel i. Fichtelgebirge;9;BY +13947;95213;Muenchberg;9475;Hof;9;BY +13948;95233;Helmbrechts;9475;Hof;9;BY +13949;95234;Sparneck;9475;Hof;9;BY +13950;95236;Stammbach;9475;Hof;9;BY +13951;95237;Weissdorf;9475;Hof;9;BY +13952;95239;Zell;9475;Hof;9;BY +13953;95326;Kulmbach;9477;Kulmbach;9;BY +13954;95336;Mainleus;9477;Kulmbach;9;BY +13955;95339;Wirsberg;9477;Kulmbach;9;BY +13956;95339;Neuenmarkt;9477;Kulmbach;9;BY +13957;95346;Stadtsteinach;9477;Kulmbach;9;BY +13958;95349;Thurnau;9477;Kulmbach;9;BY +13959;95352;Marktleugast;9477;Kulmbach;9;BY +13960;95355;Presseck;9477;Kulmbach;9;BY +13961;95356;Grafengehaig;9477;Kulmbach;9;BY +13962;95358;Guttenberg;9477;Kulmbach;9;BY +13963;95359;Kasendorf;9477;Kulmbach;9;BY +13964;95361;Koednitz;9477;Kulmbach;9;BY +13965;95362;Kupferberg;9477;Kulmbach;9;BY +13966;95364;Ludwigschorgast;9477;Kulmbach;9;BY +13967;95365;Rugendorf;9477;Kulmbach;9;BY +13968;95367;Trebgast;9477;Kulmbach;9;BY +13969;95369;Untersteinach;9477;Kulmbach;9;BY +13970;95444;Bayreuth;9462;Bayreuth, Stadt;9;BY +13971;95445;Bayreuth;9462;Bayreuth, Stadt;9;BY +13972;95447;Bayreuth;9462;Bayreuth, Stadt;9;BY +13973;95448;Bayreuth;9462;Bayreuth, Stadt;9;BY +13974;95460;Bad Berneck im Fichtelgebirge;9472;Bayreuth;9;BY +13975;95463;Bindlach;9472;Bayreuth;9;BY +13976;95466;Weidenberg;9472;Bayreuth;9;BY +13977;95466;Kirchenpingarten;9472;Bayreuth;9;BY +13978;95469;Speichersdorf;9472;Bayreuth;9;BY +13979;95473;Prebitz;9472;Bayreuth;9;BY +13980;95473;Creussen;9472;Bayreuth;9;BY +13981;95473;Haag;9472;Bayreuth;9;BY +13982;95478;Kemnath;9377;Tirschenreuth;9;BY +13983;95482;Gefrees;9472;Bayreuth;9;BY +13984;95485;Warmensteinach;9472;Bayreuth;9;BY +13985;95488;Eckersdorf;9472;Bayreuth;9;BY +13986;95490;Mistelgau;9472;Bayreuth;9;BY +13987;95491;Ahorntal;9472;Bayreuth;9;BY +13988;95493;Bischofsgruen;9472;Bayreuth;9;BY +13989;95494;Gesees;9472;Bayreuth;9;BY +13990;95496;Glashuetten;9472;Bayreuth;9;BY +13991;95497;Goldkronach;9472;Bayreuth;9;BY +13992;95499;Harsdorf;9477;Kulmbach;9;BY +13993;95500;Heinersreuth;9472;Bayreuth;9;BY +13994;95502;Himmelkron;9477;Kulmbach;9;BY +13995;95503;Hummeltal;9472;Bayreuth;9;BY +13996;95505;Immenreuth;9377;Tirschenreuth;9;BY +13997;95506;Kastl;9377;Tirschenreuth;9;BY +13998;95508;Kulmain;9377;Tirschenreuth;9;BY +13999;95509;Marktschorgast;9477;Kulmbach;9;BY +14000;95511;Mistelbach;9472;Bayreuth;9;BY +14001;95512;Neudrossenfeld;9477;Kulmbach;9;BY +14002;95514;Neustadt am Kulm;9374;Neustadt a.d. Waldnaab;9;BY +14003;95515;Plankenfels;9472;Bayreuth;9;BY +14004;95517;Emtmannsberg;9472;Bayreuth;9;BY +14005;95517;Seybothenreuth;9472;Bayreuth;9;BY +14006;95519;Vorbach;9374;Neustadt a.d. Waldnaab;9;BY +14007;95519;Schlammersdorf;9374;Neustadt a.d. Waldnaab;9;BY +14008;95615;Marktredwitz;9479;Wunsiedel i. Fichtelgebirge;9;BY +14009;95632;Wunsiedel;9479;Wunsiedel i. Fichtelgebirge;9;BY +14010;95643;Tirschenreuth;9377;Tirschenreuth;9;BY +14011;95652;Waldsassen;9377;Tirschenreuth;9;BY +14012;95659;Arzberg;9479;Wunsiedel i. Fichtelgebirge;9;BY +14013;95666;Leonberg;9377;Tirschenreuth;9;BY +14014;95666;Mitterteich;9377;Tirschenreuth;9;BY +14015;95671;Baernau;9377;Tirschenreuth;9;BY +14016;95676;Wiesau;9377;Tirschenreuth;9;BY +14017;95679;Waldershof;9377;Tirschenreuth;9;BY +14018;95680;Bad Alexandersbad;9479;Wunsiedel i. Fichtelgebirge;9;BY +14019;95682;Brand;9377;Tirschenreuth;9;BY +14020;95683;Ebnath;9377;Tirschenreuth;9;BY +14021;95685;Falkenberg;9377;Tirschenreuth;9;BY +14022;95686;Fichtelberg;9472;Bayreuth;9;BY +14023;95688;Friedenfels;9377;Tirschenreuth;9;BY +14024;95689;Fuchsmuehl;9377;Tirschenreuth;9;BY +14025;95691;Hohenberg an der Eger;9479;Wunsiedel i. Fichtelgebirge;9;BY +14026;95692;Konnersreuth;9377;Tirschenreuth;9;BY +14027;95694;Mehlmeisel;9472;Bayreuth;9;BY +14028;95695;Maehring;9377;Tirschenreuth;9;BY +14029;95697;Nagel;9479;Wunsiedel i. Fichtelgebirge;9;BY +14030;95698;Neualbenreuth;9377;Tirschenreuth;9;BY +14031;95700;Neusorg;9377;Tirschenreuth;9;BY +14032;95701;Pechbrunn;9377;Tirschenreuth;9;BY +14033;95703;Ploessberg;9377;Tirschenreuth;9;BY +14034;95704;Pullenreuth;9377;Tirschenreuth;9;BY +14035;95706;Schirnding;9479;Wunsiedel i. Fichtelgebirge;9;BY +14036;95707;Thiersheim;9479;Wunsiedel i. Fichtelgebirge;9;BY +14037;95709;Troestau;9479;Wunsiedel i. Fichtelgebirge;9;BY +14038;96047;Bamberg;9461;Bamberg, Stadt;9;BY +14039;96049;Bamberg;9461;Bamberg, Stadt;9;BY +14040;96050;Bamberg;9461;Bamberg, Stadt;9;BY +14041;96052;Bamberg;9461;Bamberg, Stadt;9;BY +14042;96103;Hallstadt;9471;Bamberg;9;BY +14043;96106;Ebern;9674;Hassberge;9;BY +14044;96110;Schesslitz;9471;Bamberg;9;BY +14045;96114;Hirschaid;9471;Bamberg;9;BY +14046;96117;Memmelsdorf;9471;Bamberg;9;BY +14047;96120;Bischberg;9471;Bamberg;9;BY +14048;96123;Litzendorf;9471;Bamberg;9;BY +14049;96126;Ermershausen;9674;Hassberge;9;BY +14050;96126;Maroldsweisach;9674;Hassberge;9;BY +14051;96129;Strullendorf;9471;Bamberg;9;BY +14052;96132;Schluesselfeld;9471;Bamberg;9;BY +14053;96135;Stegaurach;9471;Bamberg;9;BY +14054;96138;Burgebrach;9471;Bamberg;9;BY +14055;96142;Hollfeld;9472;Bayreuth;9;BY +14056;96145;Sesslach;9473;Coburg;9;BY +14057;96146;Altendorf;9471;Bamberg;9;BY +14058;96148;Baunach;9471;Bamberg;9;BY +14059;96149;Breitenguessbach;9471;Bamberg;9;BY +14060;96151;Breitbrunn;9674;Hassberge;9;BY +14061;96152;Burghaslach;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14062;96154;Burgwindheim;9471;Bamberg;9;BY +14063;96155;Buttenheim;9471;Bamberg;9;BY +14064;96157;Ebrach;9471;Bamberg;9;BY +14065;96158;Frensdorf;9471;Bamberg;9;BY +14066;96160;Geiselwind;9675;Kitzingen;9;BY +14067;96161;Gerach;9471;Bamberg;9;BY +14068;96163;Gundelsheim;9471;Bamberg;9;BY +14069;96164;Kemmern;9471;Bamberg;9;BY +14070;96166;Kirchlauter;9674;Hassberge;9;BY +14071;96167;Koenigsfeld;9471;Bamberg;9;BY +14072;96169;Lauter;9471;Bamberg;9;BY +14073;96170;Priesendorf;9471;Bamberg;9;BY +14074;96170;Lisberg;9471;Bamberg;9;BY +14075;96172;Muehlhausen;9572;Erlangen-Hoechstadt;9;BY +14076;96173;Oberhaid;9471;Bamberg;9;BY +14077;96175;Pettstadt;9471;Bamberg;9;BY +14078;96176;Pfarrweisach;9674;Hassberge;9;BY +14079;96178;Pommersfelden;9471;Bamberg;9;BY +14080;96179;Rattelsdorf;9471;Bamberg;9;BY +14081;96181;Rauhenebrach;9674;Hassberge;9;BY +14082;96182;Reckendorf;9471;Bamberg;9;BY +14083;96184;Rentweinsdorf;9674;Hassberge;9;BY +14084;96185;Schoenbrunn;9471;Bamberg;9;BY +14085;96187;Stadelhofen;9471;Bamberg;9;BY +14086;96188;Stettfeld;9674;Hassberge;9;BY +14087;96190;Untermerzbach;9674;Hassberge;9;BY +14088;96191;Viereth-Trunstadt;9471;Bamberg;9;BY +14089;96193;Wachenroth;9572;Erlangen-Hoechstadt;9;BY +14090;96194;Walsdorf;9471;Bamberg;9;BY +14091;96196;Wattendorf;9471;Bamberg;9;BY +14092;96197;Wonsees;9477;Kulmbach;9;BY +14093;96199;Zapfendorf;9471;Bamberg;9;BY +14094;96215;Lichtenfels;9478;Lichtenfels;9;BY +14095;96224;Burgkunstadt;9478;Lichtenfels;9;BY +14096;96231;Bad Staffelstein;9478;Lichtenfels;9;BY +14097;96237;Ebersdorf;9473;Coburg;9;BY +14098;96242;Sonnefeld;9473;Coburg;9;BY +14099;96247;Michelau in Oberfranken;9478;Lichtenfels;9;BY +14100;96250;Ebensfeld;9478;Lichtenfels;9;BY +14101;96253;Untersiemau;9473;Coburg;9;BY +14102;96257;Marktgraitz;9478;Lichtenfels;9;BY +14103;96257;Redwitz an der Rodach;9478;Lichtenfels;9;BY +14104;96260;Weismain;9478;Lichtenfels;9;BY +14105;96264;Altenkunstadt;9478;Lichtenfels;9;BY +14106;96268;Mitwitz;9476;Kronach;9;BY +14107;96269;Grossheirath;9473;Coburg;9;BY +14108;96271;Grub am Forst;9473;Coburg;9;BY +14109;96272;Hochstadt am Main;9478;Lichtenfels;9;BY +14110;96274;Itzgrund;9473;Coburg;9;BY +14111;96275;Marktzeuln;9478;Lichtenfels;9;BY +14112;96277;Schneckenlohe;9476;Kronach;9;BY +14113;96279;Weidhausen bei Coburg;9473;Coburg;9;BY +14114;96317;Kronach;9476;Kronach;9;BY +14115;96328;Kueps;9476;Kronach;9;BY +14116;96332;Pressig;9476;Kronach;9;BY +14117;96337;Ludwigsstadt;9476;Kronach;9;BY +14118;96342;Stockheim;9476;Kronach;9;BY +14119;96346;Wallenfels;9476;Kronach;9;BY +14120;96349;Steinwiesen;9476;Kronach;9;BY +14121;96352;Wilhelmsthal;9476;Kronach;9;BY +14122;96355;Tettau;9476;Kronach;9;BY +14123;96358;Teuschnitz;9476;Kronach;9;BY +14124;96358;Reichenbach;9476;Kronach;9;BY +14125;96361;Steinbach am Wald;9476;Kronach;9;BY +14126;96364;Marktrodach;9476;Kronach;9;BY +14127;96365;Nordhalben;9476;Kronach;9;BY +14128;96367;Tschirn;9476;Kronach;9;BY +14129;96369;Weissenbrunn;9476;Kronach;9;BY +14130;96450;Coburg;9463;Coburg, Stadt;9;BY +14131;96465;Neustadt bei Coburg;9473;Coburg;9;BY +14132;96472;Roedental;9473;Coburg;9;BY +14133;96476;Bad Rodach;9473;Coburg;9;BY +14134;96479;Weitramsdorf;9473;Coburg;9;BY +14135;96482;Ahorn;9473;Coburg;9;BY +14136;96484;Meeder;9473;Coburg;9;BY +14137;96486;Lautertal;9473;Coburg;9;BY +14138;96487;Doerfles-Esbach;9473;Coburg;9;BY +14139;96489;Niederfuellbach;9473;Coburg;9;BY +14140;96515;Sonneberg;16072;Sonneberg;16;TH +14141;96515;Oberland am Rennsteig;16072;Sonneberg;16;TH +14142;96515;Judenbach;16072;Sonneberg;16;TH +14143;96523;Oberland am Rennsteig;16072;Sonneberg;16;TH +14144;96523;Steinach;16072;Sonneberg;16;TH +14145;96524;Neuhaus-Schierschnitz;16072;Sonneberg;16;TH +14146;96524;Foeritz;16072;Sonneberg;16;TH +14147;96528;Effelder-Rauenstein;16072;Sonneberg;16;TH +14148;96528;Schalkau;16072;Sonneberg;16;TH +14149;96528;Bachfeld;16072;Sonneberg;16;TH +14150;96529;Mengersgereuth-Haemmern;16072;Sonneberg;16;TH +14151;97070;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14152;97072;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14153;97074;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14154;97076;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14155;97078;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14156;97080;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14157;97082;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14158;97084;Wuerzburg;9663;Wuerzburg, Stadt;9;BY +14159;97199;Ochsenfurt;9679;Wuerzburg;9;BY +14160;97204;Hoechberg;9679;Wuerzburg;9;BY +14161;97209;Veitshoechheim;9679;Wuerzburg;9;BY +14162;97215;Uffenheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14163;97215;Weigenheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14164;97215;Simmershofen;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14165;97218;Gerbrunn;9679;Wuerzburg;9;BY +14166;97222;Rimpar;9679;Wuerzburg;9;BY +14167;97225;Zellingen;9677;Main-Spessart;9;BY +14168;97228;Rottendorf;9679;Wuerzburg;9;BY +14169;97230;Estenfeld;9679;Wuerzburg;9;BY +14170;97232;Giebelstadt;9679;Wuerzburg;9;BY +14171;97234;Reichenberg;9679;Wuerzburg;9;BY +14172;97236;Randersacker;9679;Wuerzburg;9;BY +14173;97237;Altertheim;9679;Wuerzburg;9;BY +14174;97239;Aub;9679;Wuerzburg;9;BY +14175;97241;Bergtheim;9679;Wuerzburg;9;BY +14176;97241;Oberpleichfeld;9679;Wuerzburg;9;BY +14177;97243;Bieberehren;9679;Wuerzburg;9;BY +14178;97244;Buetthard;9679;Wuerzburg;9;BY +14179;97246;Eibelstadt;9679;Wuerzburg;9;BY +14180;97247;Eisenheim;9679;Wuerzburg;9;BY +14181;97249;Eisingen;9679;Wuerzburg;9;BY +14182;97250;Erlabrunn;9679;Wuerzburg;9;BY +14183;97252;Frickenhausen am Main;9679;Wuerzburg;9;BY +14184;97253;Gaukoenigshofen;9679;Wuerzburg;9;BY +14185;97255;Sonderhofen;9679;Wuerzburg;9;BY +14186;97255;Gelchsheim;9679;Wuerzburg;9;BY +14187;97256;Geroldshausen;9679;Wuerzburg;9;BY +14188;97258;Oberickelsheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14189;97258;Gollhofen;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14190;97258;Ippesheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14191;97258;Hemmersheim;9575;Neustadt a.d. Aisch-Bad Windsheim;9;BY +14192;97259;Greussenheim;9679;Wuerzburg;9;BY +14193;97261;Guentersleben;9679;Wuerzburg;9;BY +14194;97262;Hausen bei Wuerzburg;9679;Wuerzburg;9;BY +14195;97264;Helmstadt;9679;Wuerzburg;9;BY +14196;97265;Hettstadt;9679;Wuerzburg;9;BY +14197;97267;Himmelstadt;9677;Main-Spessart;9;BY +14198;97268;Kirchheim;9679;Wuerzburg;9;BY +14199;97270;Kist;9679;Wuerzburg;9;BY +14200;97271;Kleinrinderfeld;9679;Wuerzburg;9;BY +14201;97273;Kuernach;9679;Wuerzburg;9;BY +14202;97274;Leinach;9679;Wuerzburg;9;BY +14203;97276;Margetshoechheim;9679;Wuerzburg;9;BY +14204;97277;Neubrunn;9679;Wuerzburg;9;BY +14205;97279;Prosselsheim;9679;Wuerzburg;9;BY +14206;97280;Remlingen;9679;Wuerzburg;9;BY +14207;97282;Retzstadt;9677;Main-Spessart;9;BY +14208;97283;Riedenheim;9679;Wuerzburg;9;BY +14209;97285;Roettingen;9679;Wuerzburg;9;BY +14210;97285;Tauberrettersheim;9679;Wuerzburg;9;BY +14211;97286;Sommerhausen;9679;Wuerzburg;9;BY +14212;97286;Winterhausen;9679;Wuerzburg;9;BY +14213;97288;Theilheim;9679;Wuerzburg;9;BY +14214;97289;Thuengen;9677;Main-Spessart;9;BY +14215;97291;Thuengersheim;9679;Wuerzburg;9;BY +14216;97292;Holzkirchen;9679;Wuerzburg;9;BY +14217;97292;Uettingen;9679;Wuerzburg;9;BY +14218;97294;Unterpleichfeld;9679;Wuerzburg;9;BY +14219;97295;Waldbrunn;9679;Wuerzburg;9;BY +14220;97297;Waldbuettelbrunn;9679;Wuerzburg;9;BY +14221;97299;Zell am Main;9679;Wuerzburg;9;BY +14222;97318;Kitzingen;9675;Kitzingen;9;BY +14223;97318;Biebelried;9675;Kitzingen;9;BY +14224;97320;Sulzfeld am Main;9675;Kitzingen;9;BY +14225;97320;Mainstockheim;9675;Kitzingen;9;BY +14226;97320;Albertshofen;9675;Kitzingen;9;BY +14227;97320;Grosslangheim;9675;Kitzingen;9;BY +14228;97320;Buchbrunn;9675;Kitzingen;9;BY +14229;97332;Volkach;9675;Kitzingen;9;BY +14230;97334;Sommerach;9675;Kitzingen;9;BY +14231;97334;Nordheim am Main;9675;Kitzingen;9;BY +14232;97337;Dettelbach;9675;Kitzingen;9;BY +14233;97340;Marktbreit;9675;Kitzingen;9;BY +14234;97340;Segnitz;9675;Kitzingen;9;BY +14235;97340;Martinsheim;9675;Kitzingen;9;BY +14236;97342;Seinsheim;9675;Kitzingen;9;BY +14237;97342;Obernbreit;9675;Kitzingen;9;BY +14238;97342;Marktsteft;9675;Kitzingen;9;BY +14239;97346;Iphofen;9675;Kitzingen;9;BY +14240;97348;Willanzheim;9675;Kitzingen;9;BY +14241;97348;Roedelsee;9675;Kitzingen;9;BY +14242;97348;Markt Einersheim;9675;Kitzingen;9;BY +14243;97350;Mainbernheim;9675;Kitzingen;9;BY +14244;97353;Wiesentheid;9675;Kitzingen;9;BY +14245;97355;Castell;9675;Kitzingen;9;BY +14246;97355;Ruedenhausen;9675;Kitzingen;9;BY +14247;97355;Wiesenbronn;9675;Kitzingen;9;BY +14248;97355;Abtswind;9675;Kitzingen;9;BY +14249;97355;Kleinlangheim;9675;Kitzingen;9;BY +14250;97357;Prichsenstadt;9675;Kitzingen;9;BY +14251;97359;Schwarzach am Main;9675;Kitzingen;9;BY +14252;97421;Schweinfurt;9662;Schweinfurt, Stadt;9;BY +14253;97422;Schweinfurt;9662;Schweinfurt, Stadt;9;BY +14254;97424;Schweinfurt;9662;Schweinfurt, Stadt;9;BY +14255;97437;Hassfurt;9674;Hassberge;9;BY +14256;97440;Werneck;9678;Schweinfurt;9;BY +14257;97447;Gerolzhofen;9678;Schweinfurt;9;BY +14258;97447;Frankenwinheim;9678;Schweinfurt;9;BY +14259;97450;Arnstein;9677;Main-Spessart;9;BY +14260;97453;Schonungen;9678;Schweinfurt;9;BY +14261;97456;Dittelbrunn;9678;Schweinfurt;9;BY +14262;97461;Hofheim in Unterfranken;9674;Hassberge;9;BY +14263;97464;Niederwerrn;9678;Schweinfurt;9;BY +14264;97469;Gochsheim;9678;Schweinfurt;9;BY +14265;97475;Zeil am Main;9674;Hassberge;9;BY +14266;97478;Knetzgau;9674;Hassberge;9;BY +14267;97483;Eltmann;9674;Hassberge;9;BY +14268;97486;Koenigsberg in BY;9674;Hassberge;9;BY +14269;97488;Stadtlauringen;9678;Schweinfurt;9;BY +14270;97490;Poppenhausen;9678;Schweinfurt;9;BY +14271;97491;Aidhausen;9674;Hassberge;9;BY +14272;97493;Bergrheinfeld;9678;Schweinfurt;9;BY +14273;97494;Bundorf;9674;Hassberge;9;BY +14274;97496;Burgpreppach;9674;Hassberge;9;BY +14275;97497;Dingolshausen;9678;Schweinfurt;9;BY +14276;97499;Donnersdorf;9678;Schweinfurt;9;BY +14277;97500;Ebelsbach;9674;Hassberge;9;BY +14278;97502;Euerbach;9678;Schweinfurt;9;BY +14279;97503;Gaedheim;9674;Hassberge;9;BY +14280;97505;Geldersheim;9678;Schweinfurt;9;BY +14281;97506;Grafenrheinfeld;9678;Schweinfurt;9;BY +14282;97508;Grettstadt;9678;Schweinfurt;9;BY +14283;97509;Kolitzheim;9678;Schweinfurt;9;BY +14284;97511;Luelsfeld;9678;Schweinfurt;9;BY +14285;97513;Michelau im Steigerwald;9678;Schweinfurt;9;BY +14286;97514;Oberaurach;9674;Hassberge;9;BY +14287;97516;Oberschwarzach;9678;Schweinfurt;9;BY +14288;97517;Rannungen;9672;Bad Kissingen;9;BY +14289;97519;Riedbach;9674;Hassberge;9;BY +14290;97520;Roethlein;9678;Schweinfurt;9;BY +14291;97522;Sand am Main;9674;Hassberge;9;BY +14292;97523;Schwanfeld;9678;Schweinfurt;9;BY +14293;97525;Schwebheim;9678;Schweinfurt;9;BY +14294;97526;Sennfeld;9678;Schweinfurt;9;BY +14295;97528;Sulzdorf an der Lederhecke;9673;Rhoen-Grabfeld;9;BY +14296;97529;Sulzheim;9678;Schweinfurt;9;BY +14297;97531;Theres;9674;Hassberge;9;BY +14298;97532;chtelhausen;9678;Schweinfurt;9;BY +14299;97534;Waigolshausen;9678;Schweinfurt;9;BY +14300;97535;Wasserlosen;9678;Schweinfurt;9;BY +14301;97537;Wipfeld;9678;Schweinfurt;9;BY +14302;97539;Wonfurt;9674;Hassberge;9;BY +14303;97616;Bad Neustadt an der Saale;9673;Rhoen-Grabfeld;9;BY +14304;97616;Salz;9673;Rhoen-Grabfeld;9;BY +14305;97618;Heustreu;9673;Rhoen-Grabfeld;9;BY +14306;97618;Hohenroth;9673;Rhoen-Grabfeld;9;BY +14307;97618;Unsleben;9673;Rhoen-Grabfeld;9;BY +14308;97618;Wuelfershausen an der Saale;9673;Rhoen-Grabfeld;9;BY +14309;97618;Strahlungen;9673;Rhoen-Grabfeld;9;BY +14310;97618;Hollstadt;9673;Rhoen-Grabfeld;9;BY +14311;97618;Roedelmaier;9673;Rhoen-Grabfeld;9;BY +14312;97618;Wollbach;9673;Rhoen-Grabfeld;9;BY +14313;97618;Niederlauer;9673;Rhoen-Grabfeld;9;BY +14314;97631;Bad Koenigshofen im Grabfeld;9673;Rhoen-Grabfeld;9;BY +14315;97633;Sulzfeld;9673;Rhoen-Grabfeld;9;BY +14316;97633;Grossbardorf;9673;Rhoen-Grabfeld;9;BY +14317;97633;Hoechheim;9673;Rhoen-Grabfeld;9;BY +14318;97633;Aubstadt;9673;Rhoen-Grabfeld;9;BY +14319;97633;Trappstadt;9673;Rhoen-Grabfeld;9;BY +14320;97633;Grosseibstadt;9673;Rhoen-Grabfeld;9;BY +14321;97633;Herbstadt;9673;Rhoen-Grabfeld;9;BY +14322;97633;Saal an der Saale;9673;Rhoen-Grabfeld;9;BY +14323;97638;Mellrichstadt;9673;Rhoen-Grabfeld;9;BY +14324;97640;Oberstreu;9673;Rhoen-Grabfeld;9;BY +14325;97640;Hendungen;9673;Rhoen-Grabfeld;9;BY +14326;97640;Stockheim;9673;Rhoen-Grabfeld;9;BY +14327;97645;Ostheim vor der Rhoen;9673;Rhoen-Grabfeld;9;BY +14328;97647;Willmars;9673;Rhoen-Grabfeld;9;BY +14329;97647;Hausen;9673;Rhoen-Grabfeld;9;BY +14330;97647;Sondheim vor der Rhoen;9673;Rhoen-Grabfeld;9;BY +14331;97647;Nordheim vor der Rhoen;9673;Rhoen-Grabfeld;9;BY +14332;97650;Fladungen;9673;Rhoen-Grabfeld;9;BY +14333;97653;Bischofsheim an der Rhoen;9673;Rhoen-Grabfeld;9;BY +14334;97654;Bastheim;9673;Rhoen-Grabfeld;9;BY +14335;97656;Oberelsbach;9673;Rhoen-Grabfeld;9;BY +14336;97657;Sandberg;9673;Rhoen-Grabfeld;9;BY +14337;97659;Schoenau an der Brend;9673;Rhoen-Grabfeld;9;BY +14338;97688;Bad Kissingen;9672;Bad Kissingen;9;BY +14339;97702;Muennerstadt;9672;Bad Kissingen;9;BY +14340;97705;Burkardroth;9672;Bad Kissingen;9;BY +14341;97708;Bad Bocklet;9672;Bad Kissingen;9;BY +14342;97711;Thundorf in Unterfranken;9672;Bad Kissingen;9;BY +14343;97711;Massbach;9672;Bad Kissingen;9;BY +14344;97714;Oerlenbach;9672;Bad Kissingen;9;BY +14345;97717;Euerdorf;9672;Bad Kissingen;9;BY +14346;97717;Aura an der Saale;9672;Bad Kissingen;9;BY +14347;97717;Sulzthal;9672;Bad Kissingen;9;BY +14348;97720;Nuedlingen;9672;Bad Kissingen;9;BY +14349;97723;Oberthulba;9672;Bad Kissingen;9;BY +14350;97724;Burglauer;9673;Rhoen-Grabfeld;9;BY +14351;97725;Elfershausen;9672;Bad Kissingen;9;BY +14352;97727;Fuchsstadt;9672;Bad Kissingen;9;BY +14353;97729;Ramsthal;9672;Bad Kissingen;9;BY +14354;97737;Gemuenden am Main;9677;Main-Spessart;9;BY +14355;97753;Karlstadt;9677;Main-Spessart;9;BY +14356;97762;Hammelburg;9672;Bad Kissingen;9;BY +14357;97769;Bad Brueckenau;9672;Bad Kissingen;9;BY +14358;97772;Wildflecken;9672;Bad Kissingen;9;BY +14359;97773;Aura im Sinngrund;9677;Main-Spessart;9;BY +14360;97775;Burgsinn;9677;Main-Spessart;9;BY +14361;97776;Eussenheim;9677;Main-Spessart;9;BY +14362;97778;Fellen;9677;Main-Spessart;9;BY +14363;97779;Geroda;9672;Bad Kissingen;9;BY +14364;97780;Goessenheim;9677;Main-Spessart;9;BY +14365;97782;Graefendorf;9677;Main-Spessart;9;BY +14366;97783;Karsbach;9677;Main-Spessart;9;BY +14367;97785;Mittelsinn;9677;Main-Spessart;9;BY +14368;97786;Motten;9672;Bad Kissingen;9;BY +14369;97788;Neuendorf;9677;Main-Spessart;9;BY +14370;97789;Oberleichtersbach;9672;Bad Kissingen;9;BY +14371;97791;Obersinn;9677;Main-Spessart;9;BY +14372;97792;Riedenberg;9672;Bad Kissingen;9;BY +14373;97794;Rieneck;9677;Main-Spessart;9;BY +14374;97795;Schondra;9672;Bad Kissingen;9;BY +14375;97797;Wartmannsroth;9672;Bad Kissingen;9;BY +14376;97799;Zeitlofs;9672;Bad Kissingen;9;BY +14377;97816;Lohr am Main;9677;Main-Spessart;9;BY +14378;97828;Marktheidenfeld;9677;Main-Spessart;9;BY +14379;97833;Frammersbach;9677;Main-Spessart;9;BY +14380;97834;Birkenfeld;9677;Main-Spessart;9;BY +14381;97836;Bischbrunn;9677;Main-Spessart;9;BY +14382;97837;Erlenbach bei Marktheidenfeld;9677;Main-Spessart;9;BY +14383;97839;Esselbach;9677;Main-Spessart;9;BY +14384;97840;Hafenlohr;9677;Main-Spessart;9;BY +14385;97842;Karbach;9677;Main-Spessart;9;BY +14386;97843;Neuhuetten;9677;Main-Spessart;9;BY +14387;97845;Neustadt am Main;9677;Main-Spessart;9;BY +14388;97846;Partenstein;9677;Main-Spessart;9;BY +14389;97848;Rechtenbach;9677;Main-Spessart;9;BY +14390;97849;Roden;9677;Main-Spessart;9;BY +14391;97851;Rothenfels;9677;Main-Spessart;9;BY +14392;97852;Schollbrunn;9677;Main-Spessart;9;BY +14393;97854;Steinfeld;9677;Main-Spessart;9;BY +14394;97855;Triefenstein;9677;Main-Spessart;9;BY +14395;97857;Urspringen;9677;Main-Spessart;9;BY +14396;97859;Wiesthal;9677;Main-Spessart;9;BY +14397;97877;Wertheim;8128;Main-Tauber-Kreis;8;BW +14398;97892;Kreuzwertheim;9677;Main-Spessart;9;BY +14399;97896;Freudenberg;8128;Main-Tauber-Kreis;8;BW +14400;97900;Kuelsheim;8128;Main-Tauber-Kreis;8;BW +14401;97901;Altenbuch;9676;Miltenberg;9;BY +14402;97903;Collenberg;9676;Miltenberg;9;BY +14403;97904;Dorfprozelten;9676;Miltenberg;9;BY +14404;97906;Faulbach;9676;Miltenberg;9;BY +14405;97907;Hasloch;9677;Main-Spessart;9;BY +14406;97909;Stadtprozelten;9676;Miltenberg;9;BY +14407;97922;Lauda-Koenigshofen;8128;Main-Tauber-Kreis;8;BW +14408;97941;Tauberbischofsheim;8128;Main-Tauber-Kreis;8;BW +14409;97944;Boxberg;8128;Main-Tauber-Kreis;8;BW +14410;97947;Gruensfeld;8128;Main-Tauber-Kreis;8;BW +14411;97950;Grossrinderfeld;8128;Main-Tauber-Kreis;8;BW +14412;97953;Koenigheim;8128;Main-Tauber-Kreis;8;BW +14413;97956;Werbach;8128;Main-Tauber-Kreis;8;BW +14414;97957;Wittighausen;8128;Main-Tauber-Kreis;8;BW +14415;97959;Assamstadt;8128;Main-Tauber-Kreis;8;BW +14416;97980;Bad Mergentheim;8128;Main-Tauber-Kreis;8;BW +14417;97990;Weikersheim;8128;Main-Tauber-Kreis;8;BW +14418;97993;Creglingen;8128;Main-Tauber-Kreis;8;BW +14419;97996;Niederstetten;8128;Main-Tauber-Kreis;8;BW +14420;97999;Igersheim;8128;Main-Tauber-Kreis;8;BW +14421;98527;Suhl;16054;Suhl, Stadt;16;TH +14422;98528;Suhl;16054;Suhl, Stadt;16;TH +14423;98529;Suhl;16054;Suhl, Stadt;16;TH +14424;98530;Rohr;16066;Schmalkalden-Meiningen;16;TH +14425;98530;Oberstadt;16069;Hildburghausen;16;TH +14426;98530;Marisfeld;16069;Hildburghausen;16;TH +14427;98530;Dillstaedt;16066;Schmalkalden-Meiningen;16;TH +14428;98530;Schmeheim;16069;Hildburghausen;16;TH +14429;98544;Zella-Mehlis;16066;Schmalkalden-Meiningen;16;TH +14430;98547;Christes;16066;Schmalkalden-Meiningen;16;TH +14431;98547;Kuehndorf;16066;Schmalkalden-Meiningen;16;TH +14432;98547;Schwarza;16066;Schmalkalden-Meiningen;16;TH +14433;98547;Viernau;16066;Schmalkalden-Meiningen;16;TH +14434;98553;Eichenberg;16069;Hildburghausen;16;TH +14435;98553;Schleusingen;16069;Hildburghausen;16;TH +14436;98553;Bischofrod;16069;Hildburghausen;16;TH +14437;98553;Nahetal-Waldau;16069;Hildburghausen;16;TH +14438;98553;Sankt Kilian;16069;Hildburghausen;16;TH +14439;98553;Ahlstaedt;16069;Hildburghausen;16;TH +14440;98554;Benshausen;16066;Schmalkalden-Meiningen;16;TH +14441;98559;Oberhof;16066;Schmalkalden-Meiningen;16;TH +14442;98559;Gehlberg;16070;Ilm-Kreis;16;TH +14443;98574;Schmalkalden;16066;Schmalkalden-Meiningen;16;TH +14444;98587;Unterschoenau;16066;Schmalkalden-Meiningen;16;TH +14445;98587;Oberschoenau;16066;Schmalkalden-Meiningen;16;TH +14446;98587;Steinbach-Hallenberg;16066;Schmalkalden-Meiningen;16;TH +14447;98587;Altersbach;16066;Schmalkalden-Meiningen;16;TH +14448;98587;Bermbach;16066;Schmalkalden-Meiningen;16;TH +14449;98587;Springstille;16066;Schmalkalden-Meiningen;16;TH +14450;98587;Rotterode;16066;Schmalkalden-Meiningen;16;TH +14451;98590;Wernshausen;16066;Schmalkalden-Meiningen;16;TH +14452;98590;Rossdorf;16066;Schmalkalden-Meiningen;16;TH +14453;98590;Schwallungen;16066;Schmalkalden-Meiningen;16;TH +14454;98590;Rosa;16066;Schmalkalden-Meiningen;16;TH +14455;98593;Floh-Seligenthal;16066;Schmalkalden-Meiningen;16;TH +14456;98593;Kleinschmalkalden;16066;Schmalkalden-Meiningen;16;TH +14457;98596;Trusetal;16066;Schmalkalden-Meiningen;16;TH +14458;98597;Fambach;16066;Schmalkalden-Meiningen;16;TH +14459;98597;Breitungen;16066;Schmalkalden-Meiningen;16;TH +14460;98597;Hessles;16066;Schmalkalden-Meiningen;16;TH +14461;98599;Brotterode;16066;Schmalkalden-Meiningen;16;TH +14462;98617;Leutersdorf;16066;Schmalkalden-Meiningen;16;TH +14463;98617;Suelzfeld;16066;Schmalkalden-Meiningen;16;TH +14464;98617;Bauerbach;16066;Schmalkalden-Meiningen;16;TH +14465;98617;Woelfershausen;16066;Schmalkalden-Meiningen;16;TH +14466;98617;Obermassfeld-Grimmenthal;16066;Schmalkalden-Meiningen;16;TH +14467;98617;Einhausen;16066;Schmalkalden-Meiningen;16;TH +14468;98617;Ellingshausen;16066;Schmalkalden-Meiningen;16;TH +14469;98617;Stepfershausen;16066;Schmalkalden-Meiningen;16;TH +14470;98617;Henneberg;16066;Schmalkalden-Meiningen;16;TH +14471;98617;Ritschenhausen;16066;Schmalkalden-Meiningen;16;TH +14472;98617;Untermassfeld;16066;Schmalkalden-Meiningen;16;TH +14473;98617;Neubrunn;16066;Schmalkalden-Meiningen;16;TH +14474;98617;Belrieth;16066;Schmalkalden-Meiningen;16;TH +14475;98617;Vachdorf;16066;Schmalkalden-Meiningen;16;TH +14476;98617;Utendorf;16066;Schmalkalden-Meiningen;16;TH +14477;98617;Meiningen;16066;Schmalkalden-Meiningen;16;TH +14478;98617;Herpf;16066;Schmalkalden-Meiningen;16;TH +14479;98617;Rhoenblick;16066;Schmalkalden-Meiningen;16;TH +14480;98631;Bibra;16066;Schmalkalden-Meiningen;16;TH +14481;98631;Behrungen;16066;Schmalkalden-Meiningen;16;TH +14482;98631;Queienfeld;16066;Schmalkalden-Meiningen;16;TH +14483;98631;Mendhausen;16069;Hildburghausen;16;TH +14484;98631;Nordheim;16066;Schmalkalden-Meiningen;16;TH +14485;98631;Berkach;16066;Schmalkalden-Meiningen;16;TH +14486;98631;Wolfmannshausen;16066;Schmalkalden-Meiningen;16;TH +14487;98631;Juechsen;16066;Schmalkalden-Meiningen;16;TH +14488;98631;Rentwertshausen;16066;Schmalkalden-Meiningen;16;TH +14489;98631;Westenfeld;16069;Hildburghausen;16;TH +14490;98631;Milz;16069;Hildburghausen;16;TH +14491;98631;Schweickershausen;16069;Hildburghausen;16;TH +14492;98631;Roemhild;16069;Hildburghausen;16;TH +14493;98631;Exdorf;16066;Schmalkalden-Meiningen;16;TH +14494;98631;Schwickershausen;16066;Schmalkalden-Meiningen;16;TH +14495;98634;Unterweid;16066;Schmalkalden-Meiningen;16;TH +14496;98634;Kaltensundheim;16066;Schmalkalden-Meiningen;16;TH +14497;98634;Mehmels;16066;Schmalkalden-Meiningen;16;TH +14498;98634;Birx;16066;Schmalkalden-Meiningen;16;TH +14499;98634;Wasungen;16066;Schmalkalden-Meiningen;16;TH +14500;98634;Melpers;16066;Schmalkalden-Meiningen;16;TH +14501;98634;Oepfershausen;16066;Schmalkalden-Meiningen;16;TH +14502;98634;Aschenhausen;16066;Schmalkalden-Meiningen;16;TH +14503;98634;Erbenhausen;16066;Schmalkalden-Meiningen;16;TH +14504;98634;Huempfershausen;16066;Schmalkalden-Meiningen;16;TH +14505;98634;Kaltenwestheim;16066;Schmalkalden-Meiningen;16;TH +14506;98634;Unterkatz;16066;Schmalkalden-Meiningen;16;TH +14507;98634;Oberkatz;16066;Schmalkalden-Meiningen;16;TH +14508;98634;Wahns;16066;Schmalkalden-Meiningen;16;TH +14509;98634;Friedelshausen;16066;Schmalkalden-Meiningen;16;TH +14510;98634;Oberweid;16066;Schmalkalden-Meiningen;16;TH +14511;98634;Frankenheim;16066;Schmalkalden-Meiningen;16;TH +14512;98639;Walldorf;16066;Schmalkalden-Meiningen;16;TH +14513;98639;Wallbach;16066;Schmalkalden-Meiningen;16;TH +14514;98639;Rippershausen;16066;Schmalkalden-Meiningen;16;TH +14515;98639;Metzels;16066;Schmalkalden-Meiningen;16;TH +14516;98646;Gleichamberg;16069;Hildburghausen;16;TH +14517;98646;Dingsleben;16069;Hildburghausen;16;TH +14518;98646;Straufhain;16069;Hildburghausen;16;TH +14519;98646;Reurieth;16069;Hildburghausen;16;TH +14520;98646;Trostadt;16069;Hildburghausen;16;TH +14521;98646;Hildburghausen;16069;Hildburghausen;16;TH +14522;98646;Siegritz;16069;Hildburghausen;16;TH +14523;98660;Henfstaedt;16069;Hildburghausen;16;TH +14524;98660;Sankt Bernhard;16069;Hildburghausen;16;TH +14525;98660;Beinerstadt;16069;Hildburghausen;16;TH +14526;98660;Themar;16069;Hildburghausen;16;TH +14527;98660;Ehrenberg;16069;Hildburghausen;16;TH +14528;98660;Grimmelshausen;16069;Hildburghausen;16;TH +14529;98660;Lengfeld;16069;Hildburghausen;16;TH +14530;98660;Kloster Vessra;16069;Hildburghausen;16;TH +14531;98663;Bad Colberg-Heldburg;16069;Hildburghausen;16;TH +14532;98663;Gompertshausen;16069;Hildburghausen;16;TH +14533;98663;Hellingen;16069;Hildburghausen;16;TH +14534;98663;Ummerstadt;16069;Hildburghausen;16;TH +14535;98663;Westhausen;16069;Hildburghausen;16;TH +14536;98666;Masserberg;16069;Hildburghausen;16;TH +14537;98667;Schleusegrund;16069;Hildburghausen;16;TH +14538;98669;Schlechtsart;16069;Hildburghausen;16;TH +14539;98669;Veilsdorf;16069;Hildburghausen;16;TH +14540;98673;Auengrund;16069;Hildburghausen;16;TH +14541;98673;Eisfeld;16069;Hildburghausen;16;TH +14542;98673;Bruenn;16069;Hildburghausen;16;TH +14543;98678;SNbrunn;16069;Hildburghausen;16;TH +14544;98693;Ilmenau;16070;Ilm-Kreis;16;TH +14545;98693;Martinroda;16070;Ilm-Kreis;16;TH +14546;98701;Friedersdorf;16070;Ilm-Kreis;16;TH +14547;98701;Wildenspring;16070;Ilm-Kreis;16;TH +14548;98701;Boehlen;16070;Ilm-Kreis;16;TH +14549;98701;Grossbreitenbach;16070;Ilm-Kreis;16;TH +14550;98701;Herschdorf;16070;Ilm-Kreis;16;TH +14551;98701;Gillersdorf;16070;Ilm-Kreis;16;TH +14552;98701;Altenfeld;16070;Ilm-Kreis;16;TH +14553;98701;Neustadt am Rennsteig;16070;Ilm-Kreis;16;TH +14554;98704;Langewiesen;16070;Ilm-Kreis;16;TH +14555;98704;Wolfsberg;16070;Ilm-Kreis;16;TH +14556;98708;Gehren;16070;Ilm-Kreis;16;TH +14557;98708;Moehrenbach;16070;Ilm-Kreis;16;TH +14558;98708;Pennewitz;16070;Ilm-Kreis;16;TH +14559;98711;Schmiedefeld am Rennsteig;16070;Ilm-Kreis;16;TH +14560;98711;Frauenwald;16070;Ilm-Kreis;16;TH +14561;98714;Stuetzerbach;16070;Ilm-Kreis;16;TH +14562;98716;Elgersburg;16070;Ilm-Kreis;16;TH +14563;98716;Geschwenda;16070;Ilm-Kreis;16;TH +14564;98716;Geraberg;16070;Ilm-Kreis;16;TH +14565;98724;Lauscha;16072;Sonneberg;16;TH +14566;98724;Neuhaus am Rennweg;16072;Sonneberg;16;TH +14567;98739;Schmiedefeld;16073;Saalfeld-Rudolstadt;16;TH +14568;98739;Lichte;16073;Saalfeld-Rudolstadt;16;TH +14569;98739;Reichmannsdorf;16073;Saalfeld-Rudolstadt;16;TH +14570;98739;Piesau;16073;Saalfeld-Rudolstadt;16;TH +14571;98743;Graefenthal;16073;Saalfeld-Rudolstadt;16;TH +14572;98744;Oberweissbach;16073;Saalfeld-Rudolstadt;16;TH +14573;98744;Deesbach;16073;Saalfeld-Rudolstadt;16;TH +14574;98744;Lichtenhain/Bergbahn;16073;Saalfeld-Rudolstadt;16;TH +14575;98744;Cursdorf;16073;Saalfeld-Rudolstadt;16;TH +14576;98744;Unterweissbach;16073;Saalfeld-Rudolstadt;16;TH +14577;98744;Meura;16073;Saalfeld-Rudolstadt;16;TH +14578;98746;Meuselbach-Schwarzmuehle;16073;Saalfeld-Rudolstadt;16;TH +14579;98746;Mellenbach-Glasbach;16073;Saalfeld-Rudolstadt;16;TH +14580;98746;Katzhuette;16073;Saalfeld-Rudolstadt;16;TH +14581;98746;Goldisthal;16072;Sonneberg;16;TH +14582;98749;Steinheid;16072;Sonneberg;16;TH +14583;98749;Scheibe-Alsbach;16072;Sonneberg;16;TH +14584;98749;Siegmundsburg;16072;Sonneberg;16;TH +14585;99084;Erfurt;16051;Erfurt, Stadt;16;TH +14586;99085;Erfurt;16051;Erfurt, Stadt;16;TH +14587;99086;Erfurt;16051;Erfurt, Stadt;16;TH +14588;99087;Erfurt;16051;Erfurt, Stadt;16;TH +14589;99089;Erfurt;16051;Erfurt, Stadt;16;TH +14590;99091;Erfurt;16051;Erfurt, Stadt;16;TH +14591;99092;Erfurt;16051;Erfurt, Stadt;16;TH +14592;99094;Erfurt;16051;Erfurt, Stadt;16;TH +14593;99096;Erfurt;16051;Erfurt, Stadt;16;TH +14594;99097;Erfurt;16051;Erfurt, Stadt;16;TH +14595;99099;Erfurt;16051;Erfurt, Stadt;16;TH +14596;99100;Grossfahner;16067;Gotha;16;TH +14597;99100;Bienstaedt;16067;Gotha;16;TH +14598;99100;Dachwig;16067;Gotha;16;TH +14599;99100;Zimmernsupra;16067;Gotha;16;TH +14600;99100;Gierstaedt/Kleinfahner;16067;Gotha;16;TH +14601;99100;Doellstaedt;16067;Gotha;16;TH +14602;99102;Rockhausen;16070;Ilm-Kreis;16;TH +14603;99102;Klettbach;16071;Weimarer Land;16;TH +14604;99189;Witterda;16068;Soemmerda;16;TH +14605;99189;Elxleben;16068;Soemmerda;16;TH +14606;99189;Hassleben;16068;Soemmerda;16;TH +14607;99189;Andisleben;16068;Soemmerda;16;TH +14608;99189;Walschleben;16068;Soemmerda;16;TH +14609;99189;Gebesee;16068;Soemmerda;16;TH +14610;99189;Ringleben;16068;Soemmerda;16;TH +14611;99192;Neudietendorf;16067;Gotha;16;TH +14612;99192;Gamstaedt;16067;Gotha;16;TH +14613;99192;Apfelstaedt;16067;Gotha;16;TH +14614;99192;Nottleben;16067;Gotha;16;TH +14615;99192;Ingersleben;16067;Gotha;16;TH +14616;99195;Markvippach;16068;Soemmerda;16;TH +14617;99195;Schlossvippach;16068;Soemmerda;16;TH +14618;99195;Alperstedt;16068;Soemmerda;16;TH +14619;99195;Noeda;16068;Soemmerda;16;TH +14620;99195;Eckstedt;16068;Soemmerda;16;TH +14621;99195;Riethnordhausen;16068;Soemmerda;16;TH +14622;99195;Grossrudestedt;16068;Soemmerda;16;TH +14623;99198;Grossmoelsen;16068;Soemmerda;16;TH +14624;99198;Ollendorf;16068;Soemmerda;16;TH +14625;99198;Moenchenholzhausen;16071;Weimarer Land;16;TH +14626;99198;Kleinmoelsen;16068;Soemmerda;16;TH +14627;99198;Udestedt;16068;Soemmerda;16;TH +14628;99310;Dornheim;16070;Ilm-Kreis;16;TH +14629;99310;Witzleben;16070;Ilm-Kreis;16;TH +14630;99310;Boesleben-Wuellersleben;16070;Ilm-Kreis;16;TH +14631;99310;Osthausen-Wuelfershausen;16070;Ilm-Kreis;16;TH +14632;99310;Wachsenburggemeinde;16070;Ilm-Kreis;16;TH +14633;99310;Wipfratal;16070;Ilm-Kreis;16;TH +14634;99310;Alkersleben;16070;Ilm-Kreis;16;TH +14635;99310;Arnstadt;16070;Ilm-Kreis;16;TH +14636;99326;Ilmtal;16070;Ilm-Kreis;16;TH +14637;99326;Stadtilm;16070;Ilm-Kreis;16;TH +14638;99330;Graefenroda;16070;Ilm-Kreis;16;TH +14639;99330;Frankenhain;16070;Ilm-Kreis;16;TH +14640;99330;Liebenstein;16070;Ilm-Kreis;16;TH +14641;99330;Crawinkel;16067;Gotha;16;TH +14642;99334;Ichtershausen;16070;Ilm-Kreis;16;TH +14643;99334;Elxleben;16070;Ilm-Kreis;16;TH +14644;99334;Kirchheim;16070;Ilm-Kreis;16;TH +14645;99334;Elleben;16070;Ilm-Kreis;16;TH +14646;99338;Gossel;16070;Ilm-Kreis;16;TH +14647;99338;Angelroda;16070;Ilm-Kreis;16;TH +14648;99338;Neusiss;16070;Ilm-Kreis;16;TH +14649;99338;Plaue;16070;Ilm-Kreis;16;TH +14650;99423;Weimar;16055;Weimar, Stadt;16;TH +14651;99425;Weimar;16055;Weimar, Stadt;16;TH +14652;99427;Weimar;16055;Weimar, Stadt;16;TH +14653;99428;Hopfgarten;16071;Weimarer Land;16;TH +14654;99428;Bechstedtstrass;16071;Weimarer Land;16;TH +14655;99428;Ottstedt am Berge;16071;Weimarer Land;16;TH +14656;99428;Niederzimmern;16071;Weimarer Land;16;TH +14657;99428;Nohra;16071;Weimarer Land;16;TH +14658;99428;Daasdorf am Berge;16071;Weimarer Land;16;TH +14659;99428;Utzberg;16071;Weimarer Land;16;TH +14660;99428;Isseroda;16071;Weimarer Land;16;TH +14661;99438;Bad Berka;16071;Weimarer Land;16;TH +14662;99438;Vollersroda;16071;Weimarer Land;16;TH +14663;99438;Hetschburg;16071;Weimarer Land;16;TH +14664;99438;Troistedt;16071;Weimarer Land;16;TH +14665;99438;Tonndorf;16071;Weimarer Land;16;TH +14666;99438;Oettern;16071;Weimarer Land;16;TH +14667;99438;Gutendorf;16071;Weimarer Land;16;TH +14668;99438;Buchfart;16071;Weimarer Land;16;TH +14669;99439;SNhausen;16071;Weimarer Land;16;TH +14670;99439;Buttelstedt;16071;Weimarer Land;16;TH +14671;99439;Rohrbach;16071;Weimarer Land;16;TH +14672;99439;Neumark;16071;Weimarer Land;16;TH +14673;99439;Vippachedelhausen;16071;Weimarer Land;16;TH +14674;99439;Wohlsborn;16071;Weimarer Land;16;TH +14675;99439;Heichelheim;16071;Weimarer Land;16;TH +14676;99439;Ettersburg;16071;Weimarer Land;16;TH +14677;99439;Leutenthal;16071;Weimarer Land;16;TH +14678;99439;Kleinobringen;16071;Weimarer Land;16;TH +14679;99439;Ballstedt;16071;Weimarer Land;16;TH +14680;99439;Ramsla;16071;Weimarer Land;16;TH +14681;99439;Berlstedt;16071;Weimarer Land;16;TH +14682;99439;Schwerstedt;16071;Weimarer Land;16;TH +14683;99439;Krautheim;16071;Weimarer Land;16;TH +14684;99439;Grossobringen;16071;Weimarer Land;16;TH +14685;99439;Hottelstedt;16071;Weimarer Land;16;TH +14686;99441;Magdala;16071;Weimarer Land;16;TH +14687;99441;Doebritschen;16071;Weimarer Land;16;TH +14688;99441;Grossschwabhausen;16071;Weimarer Land;16;TH +14689;99441;Umpferstedt;16071;Weimarer Land;16;TH +14690;99441;Mechelroda;16071;Weimarer Land;16;TH +14691;99441;Lehnstedt;16071;Weimarer Land;16;TH +14692;99441;Frankendorf;16071;Weimarer Land;16;TH +14693;99441;Kiliansroda;16071;Weimarer Land;16;TH +14694;99441;Hohlstedt;16071;Weimarer Land;16;TH +14695;99441;Hammerstedt;16071;Weimarer Land;16;TH +14696;99441;Mellingen;16071;Weimarer Land;16;TH +14697;99441;Kleinschwabhausen;16071;Weimarer Land;16;TH +14698;99441;Kromsdorf;16071;Weimarer Land;16;TH +14699;99444;Blankenhain;16071;Weimarer Land;16;TH +14700;99448;Rittersdorf;16071;Weimarer Land;16;TH +14701;99448;Nauendorf;16071;Weimarer Land;16;TH +14702;99448;Hohenfelden;16071;Weimarer Land;16;TH +14703;99448;Kranichfeld;16071;Weimarer Land;16;TH +14704;99510;Nirmsdorf;16071;Weimarer Land;16;TH +14705;99510;Obertrebra;16071;Weimarer Land;16;TH +14706;99510;Mattstedt;16071;Weimarer Land;16;TH +14707;99510;Saaleplatte;16071;Weimarer Land;16;TH +14708;99510;Oberreissen;16071;Weimarer Land;16;TH +14709;99510;Niederrossla;16071;Weimarer Land;16;TH +14710;99510;Pfiffelbach;16071;Weimarer Land;16;TH +14711;99510;Kapellendorf;16071;Weimarer Land;16;TH +14712;99510;Niederreissen;16071;Weimarer Land;16;TH +14713;99510;Flurstedt;16071;Weimarer Land;16;TH +14714;99510;Apolda;16071;Weimarer Land;16;TH +14715;99510;Willerstedt;16071;Weimarer Land;16;TH +14716;99510;Gebstedt;16071;Weimarer Land;16;TH +14717;99510;Liebstedt;16071;Weimarer Land;16;TH +14718;99510;Wiegendorf;16071;Weimarer Land;16;TH +14719;99510;Wickerstedt;16071;Weimarer Land;16;TH +14720;99510;Ossmannstedt;16071;Weimarer Land;16;TH +14721;99518;Grossheringen;16071;Weimarer Land;16;TH +14722;99518;Rannstedt;16071;Weimarer Land;16;TH +14723;99518;Schmiedehausen;16071;Weimarer Land;16;TH +14724;99518;Koedderitzsch;16071;Weimarer Land;16;TH +14725;99518;Niedertrebra;16071;Weimarer Land;16;TH +14726;99518;Eberstedt;16071;Weimarer Land;16;TH +14727;99518;Bad Sulza;16071;Weimarer Land;16;TH +14728;99518;Auerstedt;16071;Weimarer Land;16;TH +14729;99518;Reisdorf;16071;Weimarer Land;16;TH +14730;99610;Wundersleben;16068;Soemmerda;16;TH +14731;99610;Kleinbrembach;16068;Soemmerda;16;TH +14732;99610;Soemmerda;16068;Soemmerda;16;TH +14733;99610;Grossbrembach;16068;Soemmerda;16;TH +14734;99610;Sproetau;16068;Soemmerda;16;TH +14735;99610;Vogelsberg;16068;Soemmerda;16;TH +14736;99625;Koelleda;16068;Soemmerda;16;TH +14737;99625;Grossneuhausen;16068;Soemmerda;16;TH +14738;99625;Schillingstedt;16068;Soemmerda;16;TH +14739;99625;Kleinneuhausen;16068;Soemmerda;16;TH +14740;99625;Beichlingen;16068;Soemmerda;16;TH +14741;99625;Grossmonra;16068;Soemmerda;16;TH +14742;99628;Essleben-Teutleben;16068;Soemmerda;16;TH +14743;99628;Guthmannshausen;16068;Soemmerda;16;TH +14744;99628;Hardisleben;16068;Soemmerda;16;TH +14745;99628;Ellersleben;16068;Soemmerda;16;TH +14746;99628;Rudersdorf;16068;Soemmerda;16;TH +14747;99628;Buttstaedt;16068;Soemmerda;16;TH +14748;99628;Mannstedt;16068;Soemmerda;16;TH +14749;99628;Olbersleben;16068;Soemmerda;16;TH +14750;99631;Weissensee;16068;Soemmerda;16;TH +14751;99631;Guenstedt;16068;Soemmerda;16;TH +14752;99631;Herrnschwende;16068;Soemmerda;16;TH +14753;99634;Schwerstedt;16068;Soemmerda;16;TH +14754;99634;Gangloffsoemmern;16068;Soemmerda;16;TH +14755;99634;Henschleben;16068;Soemmerda;16;TH +14756;99634;Straussfurt;16068;Soemmerda;16;TH +14757;99634;Werningshausen;16068;Soemmerda;16;TH +14758;99636;Rastenberg;16068;Soemmerda;16;TH +14759;99636;Ostramondra;16068;Soemmerda;16;TH +14760;99638;Riethgen;16068;Soemmerda;16;TH +14761;99638;Froemmstedt;16068;Soemmerda;16;TH +14762;99638;Kindelbrueck;16068;Soemmerda;16;TH +14763;99638;Buechel;16068;Soemmerda;16;TH +14764;99638;Griefstedt;16068;Soemmerda;16;TH +14765;99706;Bendeleben;16065;Kyffhaeuserkreis;16;TH +14766;99706;Sondershausen;16065;Kyffhaeuserkreis;16;TH +14767;99706;Badra;16065;Kyffhaeuserkreis;16;TH +14768;99706;Hachelbich;16065;Kyffhaeuserkreis;16;TH +14769;99713;Abtsbessingen;16065;Kyffhaeuserkreis;16;TH +14770;99713;THhausen;16065;Kyffhaeuserkreis;16;TH +14771;99713;Wolferschwenda;16065;Kyffhaeuserkreis;16;TH +14772;99713;Helbeduendorf;16065;Kyffhaeuserkreis;16;TH +14773;99713;Bellstedt;16065;Kyffhaeuserkreis;16;TH +14774;99713;Freienbessingen;16065;Kyffhaeuserkreis;16;TH +14775;99713;Rockstedt;16065;Kyffhaeuserkreis;16;TH +14776;99713;Schernberg;16065;Kyffhaeuserkreis;16;TH +14777;99713;Ebeleben;16065;Kyffhaeuserkreis;16;TH +14778;99713;Holzsussra;16065;Kyffhaeuserkreis;16;TH +14779;99718;Greussen;16065;Kyffhaeuserkreis;16;TH +14780;99718;Grossenehrich;16065;Kyffhaeuserkreis;16;TH +14781;99718;Trebra;16065;Kyffhaeuserkreis;16;TH +14782;99718;Westgreussen;16065;Kyffhaeuserkreis;16;TH +14783;99718;Wasserthaleben;16065;Kyffhaeuserkreis;16;TH +14784;99718;Oberboesa;16065;Kyffhaeuserkreis;16;TH +14785;99718;Niederboesa;16065;Kyffhaeuserkreis;16;TH +14786;99718;Topfstedt;16065;Kyffhaeuserkreis;16;TH +14787;99718;Clingen;16065;Kyffhaeuserkreis;16;TH +14788;99734;Nordhausen;16062;Nordhausen;16;TH +14789;99735;Nohra;16062;Nordhausen;16;TH +14790;99735;Werther;16062;Nordhausen;16;TH +14791;99735;Kleinfurra;16062;Nordhausen;16;TH +14792;99735;Wolkramshausen;16062;Nordhausen;16;TH +14793;99735;Hohenstein;16062;Nordhausen;16;TH +14794;99735;Friedrichsthal;16062;Nordhausen;16;TH +14795;99735;Etzelsrode;16062;Nordhausen;16;TH +14796;99735;Petersdorf;16062;Nordhausen;16;TH +14797;99735;Hainrode;16062;Nordhausen;16;TH +14798;99752;Kleinbodungen;16062;Nordhausen;16;TH +14799;99752;Kraja;16062;Nordhausen;16;TH +14800;99752;Wipperdorf;16062;Nordhausen;16;TH +14801;99752;Lipprechterode;16062;Nordhausen;16;TH +14802;99752;Kehmstedt;16062;Nordhausen;16;TH +14803;99755;Ellrich;16062;Nordhausen;16;TH +14804;99755;Hohenstein;16062;Nordhausen;16;TH +14805;99759;Obergebra;16062;Nordhausen;16;TH +14806;99759;Niedergebra;16062;Nordhausen;16;TH +14807;99759;Rehungen;16062;Nordhausen;16;TH +14808;99759;Grosslohra;16062;Nordhausen;16;TH +14809;99762;Buchholz;16062;Nordhausen;16;TH +14810;99762;Harzungen;16062;Nordhausen;16;TH +14811;99762;Niedersachswerfen;16062;Nordhausen;16;TH +14812;99762;Herrmannsacker;16062;Nordhausen;16;TH +14813;99762;Neustadt/Harz;16062;Nordhausen;16;TH +14814;99762;Stempeda;16062;Nordhausen;16;TH +14815;99762;Rodishain;16062;Nordhausen;16;TH +14816;99765;Goersbach;16062;Nordhausen;16;TH +14817;99765;Urbach;16062;Nordhausen;16;TH +14818;99765;Auleben;16062;Nordhausen;16;TH +14819;99765;Heringen/Helme;16062;Nordhausen;16;TH +14820;99765;Hamma;16062;Nordhausen;16;TH +14821;99765;Uthleben;16062;Nordhausen;16;TH +14822;99765;Windehausen;16062;Nordhausen;16;TH +14823;99768;Ilfeld;16062;Nordhausen;16;TH +14824;99817;Eisenach;16056;Eisenach, Stadt;16;TH +14825;99819;Unterellen;16063;Wartburgkreis;16;TH +14826;99819;Wolfsburg-Unkeroda;16063;Wartburgkreis;16;TH +14827;99819;Oberellen;16063;Wartburgkreis;16;TH +14828;99819;Krauthausen;16063;Wartburgkreis;16;TH +14829;99819;Ettenhausen an der Suhl;16063;Wartburgkreis;16;TH +14830;99819;Hoerselberg;16063;Wartburgkreis;16;TH +14831;99819;Marksuhl;16063;Wartburgkreis;16;TH +14832;99819;Lauchroeden;16063;Wartburgkreis;16;TH +14833;99826;Berka vor der Hainich;16063;Wartburgkreis;16;TH +14834;99826;Hallungen;16063;Wartburgkreis;16;TH +14835;99826;Ebenshausen;16063;Wartburgkreis;16;TH +14836;99826;Nazza;16063;Wartburgkreis;16;TH +14837;99826;Bischofroda;16063;Wartburgkreis;16;TH +14838;99826;Lauterbach;16063;Wartburgkreis;16;TH +14839;99826;Mihla;16063;Wartburgkreis;16;TH +14840;99826;Frankenroda;16063;Wartburgkreis;16;TH +14841;99830;Treffurt;16063;Wartburgkreis;16;TH +14842;99831;Creuzburg;16063;Wartburgkreis;16;TH +14843;99831;Ifta;16063;Wartburgkreis;16;TH +14844;99834;Gerstungen;16063;Wartburgkreis;16;TH +14845;99837;Berka/Werra;16063;Wartburgkreis;16;TH +14846;99837;Grossensee;16063;Wartburgkreis;16;TH +14847;99837;Dankmarshausen;16063;Wartburgkreis;16;TH +14848;99837;Dippach;16063;Wartburgkreis;16;TH +14849;99842;Ruhla;16063;Wartburgkreis;16;TH +14850;99846;Seebach;16063;Wartburgkreis;16;TH +14851;99848;Wutha-Farnroda;16063;Wartburgkreis;16;TH +14852;99848;Hoerselberg;16063;Wartburgkreis;16;TH +14853;99867;Gotha;16067;Gotha;16;TH +14854;99869;Brueheim;16067;Gotha;16;TH +14855;99869;Haina;16067;Gotha;16;TH +14856;99869;Muehlberg;16067;Gotha;16;TH +14857;99869;Remstaedt;16067;Gotha;16;TH +14858;99869;Tuettleben;16067;Gotha;16;TH +14859;99869;Hochheim;16067;Gotha;16;TH +14860;99869;Emleben;16067;Gotha;16;TH +14861;99869;Ebenheim;16067;Gotha;16;TH +14862;99869;Wandersleben;16067;Gotha;16;TH +14863;99869;Weingarten;16067;Gotha;16;TH +14864;99869;Ballstaedt;16067;Gotha;16;TH +14865;99869;Wangenheim;16067;Gotha;16;TH +14866;99869;Bufleben;16067;Gotha;16;TH +14867;99869;Troechtelborn;16067;Gotha;16;TH +14868;99869;Eschenbergen;16067;Gotha;16;TH +14869;99869;Sonneborn;16067;Gotha;16;TH +14870;99869;Westhausen;16067;Gotha;16;TH +14871;99869;Grabsleben;16067;Gotha;16;TH +14872;99869;Seebergen;16067;Gotha;16;TH +14873;99869;Friemar;16067;Gotha;16;TH +14874;99869;Molschleben;16067;Gotha;16;TH +14875;99869;Wechmar;16067;Gotha;16;TH +14876;99869;Goldbach;16067;Gotha;16;TH +14877;99869;Friedrichswerth;16067;Gotha;16;TH +14878;99869;Warza;16067;Gotha;16;TH +14879;99869;Guenthersleben;16067;Gotha;16;TH +14880;99869;Schwabhausen;16067;Gotha;16;TH +14881;99869;Pferdingsleben;16067;Gotha;16;TH +14882;99880;Teutleben;16067;Gotha;16;TH +14883;99880;Froettstaedt;16067;Gotha;16;TH +14884;99880;Leinatal;16067;Gotha;16;TH +14885;99880;Mechterstaedt;16067;Gotha;16;TH +14886;99880;Truegleben;16067;Gotha;16;TH +14887;99880;Metebach;16067;Gotha;16;TH +14888;99880;Waltershausen;16067;Gotha;16;TH +14889;99880;Hoerselgau;16067;Gotha;16;TH +14890;99880;Aspach;16067;Gotha;16;TH +14891;99880;Laucha;16067;Gotha;16;TH +14892;99885;Ohrdruf;16067;Gotha;16;TH +14893;99885;Woelfis;16067;Gotha;16;TH +14894;99885;Luisenthal;16067;Gotha;16;TH +14895;99887;Hohenkirchen;16067;Gotha;16;TH +14896;99887;Petriroda;16067;Gotha;16;TH +14897;99887;Georgenthal;16067;Gotha;16;TH +14898;99887;Herrenhof;16067;Gotha;16;TH +14899;99887;Graefenhain;16067;Gotha;16;TH +14900;99891;Emsetal;16067;Gotha;16;TH +14901;99891;Tabarz;16067;Gotha;16;TH +14902;99894;Ernstroda;16067;Gotha;16;TH +14903;99894;Friedrichroda;16067;Gotha;16;TH +14904;99897;Tambach-Dietharz;16067;Gotha;16;TH +14905;99898;Finsterbergen;16067;Gotha;16;TH +14906;99947;Bothenheilingen;16064;Unstrut-Hainich-Kreis;16;TH +14907;99947;Behringen;16063;Wartburgkreis;16;TH +14908;99947;Kleinwelsbach;16064;Unstrut-Hainich-Kreis;16;TH +14909;99947;Tottleben;16064;Unstrut-Hainich-Kreis;16;TH +14910;99947;Issersheilingen;16064;Unstrut-Hainich-Kreis;16;TH +14911;99947;Weberstedt;16064;Unstrut-Hainich-Kreis;16;TH +14912;99947;Schoenstedt;16064;Unstrut-Hainich-Kreis;16;TH +14913;99947;Neunheilingen;16064;Unstrut-Hainich-Kreis;16;TH +14914;99947;Sundhausen;16064;Unstrut-Hainich-Kreis;16;TH +14915;99947;Muelverstedt;16064;Unstrut-Hainich-Kreis;16;TH +14916;99947;Kirchheilingen;16064;Unstrut-Hainich-Kreis;16;TH +14917;99947;Bad Langensalza;16064;Unstrut-Hainich-Kreis;16;TH +14918;99955;Bruchstedt;16064;Unstrut-Hainich-Kreis;16;TH +14919;99955;Klettstedt;16064;Unstrut-Hainich-Kreis;16;TH +14920;99955;Kutzleben;16064;Unstrut-Hainich-Kreis;16;TH +14921;99955;Herbsleben;16064;Unstrut-Hainich-Kreis;16;TH +14922;99955;Bad Tennstedt;16064;Unstrut-Hainich-Kreis;16;TH +14923;99955;Blankenburg;16064;Unstrut-Hainich-Kreis;16;TH +14924;99955;Urleben;16064;Unstrut-Hainich-Kreis;16;TH +14925;99955;Ballhausen;16064;Unstrut-Hainich-Kreis;16;TH +14926;99955;Hornsoemmern;16064;Unstrut-Hainich-Kreis;16;TH +14927;99955;Haussoemmern;16064;Unstrut-Hainich-Kreis;16;TH +14928;99955;Mittelsoemmern;16064;Unstrut-Hainich-Kreis;16;TH +14929;99958;Tonna;16067;Gotha;16;TH +14930;99958;Grossvargula;16064;Unstrut-Hainich-Kreis;16;TH +14931;99974;Muehlhausen;16064;Unstrut-Hainich-Kreis;16;TH +14932;99974;Unstruttal;16064;Unstrut-Hainich-Kreis;16;TH +14933;99976;Anrode;16064;Unstrut-Hainich-Kreis;16;TH +14934;99976;Lengenfeld unterm Stein;16064;Unstrut-Hainich-Kreis;16;TH +14935;99976;Hildebrandshausen;16064;Unstrut-Hainich-Kreis;16;TH +14936;99976;Unstruttal;16064;Unstrut-Hainich-Kreis;16;TH +14937;99976;Duenwald;16064;Unstrut-Hainich-Kreis;16;TH +14938;99976;Rodeberg;16064;Unstrut-Hainich-Kreis;16;TH +14939;99986;Flarchheim;16064;Unstrut-Hainich-Kreis;16;TH +14940;99986;Oppershausen;16064;Unstrut-Hainich-Kreis;16;TH +14941;99986;Langula;16064;Unstrut-Hainich-Kreis;16;TH +14942;99986;Niederdorla;16064;Unstrut-Hainich-Kreis;16;TH +14943;99986;Oberdorla;16064;Unstrut-Hainich-Kreis;16;TH +14944;99986;Kammerforst;16064;Unstrut-Hainich-Kreis;16;TH +14945;99988;Katharinenberg;16064;Unstrut-Hainich-Kreis;16;TH +14946;99988;Heyerode;16064;Unstrut-Hainich-Kreis;16;TH +14947;99991;Grossengottern;16064;Unstrut-Hainich-Kreis;16;TH +14948;99991;Altengottern;16064;Unstrut-Hainich-Kreis;16;TH +14949;99991;Heroldishausen;16064;Unstrut-Hainich-Kreis;16;TH +14950;99994;Schlotheim;16064;Unstrut-Hainich-Kreis;16;TH +14951;99994;Marolterode;16064;Unstrut-Hainich-Kreis;16;TH +14952;99996;Obermehler;16064;Unstrut-Hainich-Kreis;16;TH +14953;99996;Menteroda;16064;Unstrut-Hainich-Kreis;16;TH +14954;99998;Koerner;16064;Unstrut-Hainich-Kreis;16;TH +14955;99998;Weinbergen;16064;Unstrut-Hainich-Kreis;16;TH diff --git a/users/static/users/img/.DS_Store b/users/static/users/img/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/users/static/users/img/.DS_Store differ diff --git a/users/static/users/img/VVE-Logo.png b/users/static/users/img/VVE-Logo.png new file mode 100644 index 0000000..48f1645 Binary files /dev/null and b/users/static/users/img/VVE-Logo.png differ diff --git a/users/static/users/img/ag_default.jpg b/users/static/users/img/ag_default.jpg new file mode 100644 index 0000000..c8d0904 Binary files /dev/null and b/users/static/users/img/ag_default.jpg differ diff --git a/users/static/users/img/default.jpg b/users/static/users/img/default.jpg new file mode 100644 index 0000000..1fb7d8c Binary files /dev/null and b/users/static/users/img/default.jpg differ diff --git a/users/static/users/img/favicon_OLD.ico b/users/static/users/img/favicon_OLD.ico new file mode 100644 index 0000000..40bdf60 Binary files /dev/null and b/users/static/users/img/favicon_OLD.ico differ diff --git a/users/static/users/img/favicon_neu.ico b/users/static/users/img/favicon_neu.ico new file mode 100644 index 0000000..b9ef142 Binary files /dev/null and b/users/static/users/img/favicon_neu.ico differ diff --git a/users/static/users/img/favicon_neu_OLD.ico b/users/static/users/img/favicon_neu_OLD.ico new file mode 100644 index 0000000..b928244 Binary files /dev/null and b/users/static/users/img/favicon_neu_OLD.ico differ diff --git a/users/static/users/img/linkdefault.png b/users/static/users/img/linkdefault.png new file mode 100644 index 0000000..d742a6b Binary files /dev/null and b/users/static/users/img/linkdefault.png differ diff --git a/users/static/users/img/logo_ALT.png b/users/static/users/img/logo_ALT.png new file mode 100644 index 0000000..95a064f Binary files /dev/null and b/users/static/users/img/logo_ALT.png differ diff --git a/users/static/users/img/logo_fin_OLD.png b/users/static/users/img/logo_fin_OLD.png new file mode 100644 index 0000000..7df7d4f Binary files /dev/null and b/users/static/users/img/logo_fin_OLD.png differ diff --git a/users/static/users/img/logo_neu.png b/users/static/users/img/logo_neu.png new file mode 100644 index 0000000..a0aba13 Binary files /dev/null and b/users/static/users/img/logo_neu.png differ diff --git a/users/static/users/img/logo_neu_OLD.png b/users/static/users/img/logo_neu_OLD.png new file mode 100644 index 0000000..7df7d4f Binary files /dev/null and b/users/static/users/img/logo_neu_OLD.png differ diff --git a/users/static/users/img/registerbackground.jpg b/users/static/users/img/registerbackground.jpg new file mode 100644 index 0000000..49841c9 Binary files /dev/null and b/users/static/users/img/registerbackground.jpg differ diff --git a/users/static/users/img/vvelogo.png b/users/static/users/img/vvelogo.png new file mode 100644 index 0000000..e97e9c2 Binary files /dev/null and b/users/static/users/img/vvelogo.png differ diff --git a/users/static/users/js/bs4_dt.js b/users/static/users/js/bs4_dt.js new file mode 100644 index 0000000..2517be1 --- /dev/null +++ b/users/static/users/js/bs4_dt.js @@ -0,0 +1,11 @@ +/*! + DataTables Bootstrap 4 integration + ©2011-2017 SpryMedia Ltd - datatables.net/license +*/ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,b,c){a instanceof String&&(a=String(a));for(var e=a.length,d=0;d<'col-sm-12 col-md-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", +renderer:"bootstrap"});a.extend(d.ext.classes,{sWrapper:"dataTables_wrapper dt-bootstrap4",sFilterInput:"form-control form-control-sm",sLengthSelect:"custom-select custom-select-sm form-control form-control-sm",sProcessing:"dataTables_processing card",sPageButton:"paginate_button page-item"});d.ext.renderer.pageButton.bootstrap=function(b,l,v,w,m,r){var k=new d.Api(b),x=b.oClasses,n=b.oLanguage.oPaginate,y=b.oLanguage.oAria.paginate||{},g,h,t=0,u=function(c,d){var e,l=function(b){b.preventDefault(); +a(b.currentTarget).hasClass("disabled")||k.page()==b.data.action||k.page(b.data.action).draw("page")};var q=0;for(e=d.length;q",{"class":x.sPageButton+" "+h,id:0===v&&"string"===typeof f?b.sTableId+"_"+f:null}).append(a("",{href:"#","aria-controls":b.sTableId,"aria-label":y[f],"data-dt-idx":t,tabindex:b.iTabIndex,"class":"page-link"}).html(g)).appendTo(c);b.oApi._fnBindAction(p,{action:f},l);t++}}}};try{var p=a(l).find(c.activeElement).data("dt-idx")}catch(z){}u(a(l).empty().html('