Beispiel #1
0
def get_nachtstunden(schicht):
    """Gibt die Anzahl der Stunden einer Schicht zurück, die vor 6 Uhr und nach 21 Uhr stattfinden"""

    nachtstunden = 0

    null_uhr = timezone.make_aware(
        datetime(year=schicht['beginn'].year,
                 month=schicht['beginn'].month,
                 day=schicht['beginn'].day,
                 hour=0,
                 minute=0,
                 second=0))
    sechs_uhr = timezone.make_aware(
        datetime(year=schicht['beginn'].year,
                 month=schicht['beginn'].month,
                 day=schicht['beginn'].day,
                 hour=6,
                 minute=0,
                 second=0))
    einundzwanzig_uhr = timezone.make_aware(
        datetime(year=schicht['beginn'].year,
                 month=schicht['beginn'].month,
                 day=schicht['beginn'].day,
                 hour=21,
                 minute=0,
                 second=0))

    # schicht beginnt zwischen 0 und 6 uhr
    if null_uhr <= schicht['beginn'] <= sechs_uhr:
        if schicht['ende'] <= sechs_uhr:
            # schicht endet spätestens 6 uhr
            nachtstunden += get_duration(schicht['beginn'], schicht['ende'],
                                         'minutes') / 60

        elif sechs_uhr <= schicht['ende'] <= einundzwanzig_uhr:
            # schicht endet nach 6 uhr aber vor 21 uhr
            nachtstunden += get_duration(schicht['beginn'], sechs_uhr,
                                         'minutes') / 60

        else:
            # schicht beginnt vor 6 uhr und geht über 21 Uhr hinaus
            # das bedeutet ich ziehe von der kompletten schicht einfach die 15 Stunden Tagschicht ab.
            # es bleibt der Nacht-An
            nachtstunden += get_duration(schicht['beginn'], schicht['ende'],
                                         'minutes') / 60 - 15
    # schicht beginnt zwischen 6 und 21 uhr
    elif sechs_uhr <= schicht['beginn'] <= einundzwanzig_uhr:
        # fängt am tag an, geht aber bis in die nachtstunden
        if schicht['ende'] > einundzwanzig_uhr:
            nachtstunden += get_duration(einundzwanzig_uhr, schicht['ende'],
                                         'minutes') / 60
    else:
        # schicht beginnt nach 21 uhr - die komplette schicht ist in der nacht
        nachtstunden += get_duration(schicht['beginn'], schicht['ende'],
                                     'minutes') / 60

    return nachtstunden
Beispiel #2
0
def get_schicht_hauptanteil(schicht):
    # TODO: Reisebegleitungen/mehrtägig
    teilschichten = split_by_null_uhr_asn(schicht)
    maxschicht = None
    max_duration = 0
    for teilschicht in teilschichten:
        dauer = get_duration(teilschicht['beginn'], teilschicht['ende'],
                             'hours')
        if dauer > max_duration:
            max_duration = dauer
            maxschicht = teilschicht
    return maxschicht['beginn']
Beispiel #3
0
def get_erfahrungsstufe(assistent, datum=timezone.now()):
    delta = get_duration(assistent.einstellungsdatum, datum, 'years')
    # einstieg mit 1
    # nach 1 Jahr insgesamt 2
    # nach 3 jahren insgesamt 3
    # nach 6 jahren insg. 4
    # nach 10 Jahren insg. 5
    # nach 15 Jahren insg. 6
    if delta == 0:
        return 1
    elif 1 <= delta < 3:
        return 2
    elif 3 <= delta < 6:
        return 3
    elif 6 <= delta < 10:
        return 4
    elif 10 <= delta < 15:
        return 5
    else:
        return 6
Beispiel #4
0
def berechne_stunden(schicht):
    return get_duration(schicht['beginn'], schicht['ende'], "minutes") / 60
Beispiel #5
0
def berechne_sa_so_weisil_feiertagszuschlaege(schicht):
    feiertagsstunden = 0
    feiertagsstunden_steuerfrei = 0
    feiertagsstunden_steuerpflichtig = 0
    feiertagsarray = {}
    zuschlagsgrund = ''

    anfang = schicht['beginn']
    ende = schicht['ende']

    if check_feiertag(anfang) != '':
        feiertagsstunden = berechne_stunden(schicht=schicht)

        feiertagsarray = {
            'zuschlagsgrund': 'Feiertag',
            'stunden_gesamt': feiertagsstunden,
            'stunden_steuerfrei': feiertagsstunden,
            'stunden_steuerpflichtig': 0,
            'add_info': check_feiertag(anfang)
        }
    elif timezone.make_aware(datetime(year=anfang.year, month=anfang.month, day=anfang.day)) == \
            timezone.make_aware(datetime(anfang.year, 12, 24)) or \
            timezone.make_aware(datetime(anfang.year, anfang.month, anfang.day)) == \
            timezone.make_aware(datetime(anfang.year, 12, 31)):
        if timezone.make_aware(datetime(anfang.year, anfang.month, anfang.day)) == \
                timezone.make_aware(datetime(anfang.year, 12, 24)):
            zuschlagsgrund = 'Hl. Abend'
        if timezone.make_aware(datetime(anfang.year, anfang.month, anfang.day)) == \
                timezone.make_aware(datetime(anfang.year, 12, 31)):
            zuschlagsgrund = 'Silvester'

        sechsuhr = timezone.make_aware(
            datetime(anfang.year, anfang.month, anfang.day, 6, 0, 0))
        vierzehn_uhr = timezone.make_aware(
            datetime(anfang.year, anfang.month, anfang.day, 14, 0, 0))

        if anfang < sechsuhr:
            if ende <= sechsuhr:
                feiertagsstunden_steuerfrei = feiertagsstunden_steuerpflichtig = 0
            elif sechsuhr < ende <= vierzehn_uhr:
                feiertagsstunden_steuerpflichtig = get_duration(
                    ende, sechsuhr, 'hours')
                feiertagsstunden_steuerfrei = 0
            elif vierzehn_uhr < ende:
                feiertagsstunden_steuerpflichtig = 8
                feiertagsstunden_steuerfrei = get_duration(
                    vierzehn_uhr, ende, 'hours')
        elif sechsuhr <= anfang:
            if ende <= vierzehn_uhr:
                feiertagsstunden_steuerpflichtig = get_duration(
                    ende, anfang, 'hours')
                feiertagsstunden_steuerfrei = 0
            elif vierzehn_uhr < ende:
                feiertagsstunden_steuerpflichtig = get_duration(
                    anfang, vierzehn_uhr, 'hours')
                feiertagsstunden_steuerfrei = get_duration(
                    vierzehn_uhr, ende, 'hours')

        feiertagsstunden = feiertagsstunden_steuerfrei + feiertagsstunden_steuerpflichtig
        feiertagsarray = {
            'zuschlagsgrund': zuschlagsgrund,
            'stunden_gesamt': feiertagsstunden,
            'stunden_steuerfrei': feiertagsstunden_steuerfrei,
            'stunden_steuerpflichtig': feiertagsstunden_steuerpflichtig,
            'add_info': '13:00 - 21:00 Uhr'
        }
    elif anfang.weekday() == 6:
        feiertagsstunden = berechne_stunden(schicht=schicht)
        feiertagsarray = {
            'zuschlagsgrund': 'Sonntag',
            'stunden_gesamt': feiertagsstunden,
            'stunden_steuerfrei': feiertagsstunden,
            'stunden_steuerpflichtig': 0,
            'add_info': ''
        }
    elif anfang.weekday() == 5:
        dreizehn_uhr = timezone.make_aware(
            datetime(anfang.year, anfang.month, anfang.day, 13, 0, 0))
        einundzwanzig_uhr = timezone.make_aware(
            datetime(anfang.year, anfang.month, anfang.day, 21, 0, 0))

        if anfang < dreizehn_uhr:
            if ende < dreizehn_uhr:
                feiertagsstunden = 0
            elif dreizehn_uhr < ende <= einundzwanzig_uhr:
                feiertagsstunden = get_duration(dreizehn_uhr, ende, 'hours')
            else:  # ende > einundzwanzig_uhr:
                feiertagsstunden = 8  # 21 - 13
        elif dreizehn_uhr <= anfang < einundzwanzig_uhr:
            if ende < einundzwanzig_uhr:
                feiertagsstunden = berechne_stunden(schicht=schicht)
            elif ende > einundzwanzig_uhr:
                feiertagsstunden = get_duration(anfang, einundzwanzig_uhr,
                                                'hours')
        else:
            feiertagsstunden = 0

        feiertagsarray = {
            'zuschlagsgrund': 'Samstag',
            'stunden_gesamt': feiertagsstunden,
            'stunden_steuerfrei': 0,
            'stunden_steuerpflichtig': feiertagsstunden,
            'add_info': '13:00 - 21:00 Uhr'
        }

    return feiertagsarray
Beispiel #6
0
    def calculate_wege(self):
        # TODO kombinierte Schichten beachten
        # alle Schichten aus dem gewählten Jahr
        # um die schichten manipipulierbar zu machen, werden sie direkt in eine Liste gepackt.
        weg = False
        schichten = list(
            Schicht.objects.filter(beginn__year=self.act_year).filter(
                assistent=self.request.user.assistent)
            | Schicht.objects.filter(ende__year=self.act_year).filter(
                assistent=self.request.user.assistent))

        # prüfen ob der hauptanteil der randschichten im aktuellen jahr liegt.
        # wenn nicht fliegt die schicht aus der liste
        for schicht in schichten:
            if schicht.beginn.year != schicht.ende.year:
                if get_schicht_hauptanteil(schicht).year != self.act_year:
                    schichten.remove(schicht)

        user_home = Adresse.objects.get(assistent=self.request.user.assistent,
                                        is_home=True)
        if user_home.strasse == '' or user_home.plz == '':
            redirect('as_schicht_tabelle')

        # TODO Stufen für Verpflegungsmehraufwand aus DB
        stufen = {0: 0, 8: 0, 24: 0}
        an_abfahrten = 0
        for schicht in schichten:
            dauer = get_duration(schicht.beginn, schicht.ende, 'minutes')
            # TODO bessere Lösung als einfach nur weiterleiten bei fehlender Adresse
            if schicht.beginn_adresse.strasse == '' or schicht.beginn_adresse.plz == '':
                redirect('as_edit_asn', schicht.asn.pk)
            if schicht.ende_adresse.strasse == '' or schicht.ende_adresse.plz == '':
                redirect('as_edit_asn', schicht.asn.pk)

            # hinweg
            weg_id = get_weg_id(adresse1=user_home,
                                adresse2=schicht.beginn_adresse)
            if weg_id:
                weg = Weg.objects.get(pk=weg_id)
                dauer += weg.dauer_in_minuten
            else:
                weg_id = 0
                dauer = 0

            # print(weg)
            if weg_id not in self.wege:
                self.wege[weg_id] = {'count': 1, 'weg': weg}
            else:
                self.wege[weg_id]['count'] += 1
            # rückweg
            weg_id = get_weg_id(adresse1=schicht.ende_adresse,
                                adresse2=user_home)
            if weg_id:
                weg = Weg.objects.get(pk=weg_id)
                dauer += weg.dauer_in_minuten
            else:
                weg_id = 0
                dauer = 0

            if weg_id not in self.wege:
                self.wege[weg_id] = {
                    'count': 1,
                    'weg': weg,
                }
            else:
                self.wege[weg_id]['count'] += 1

            schicht_stufe = 0
            if dauer / 60 >= 48:
                # Reisebegleitung
                dm = divmod(dauer / 60, 24)
                anzahl_24 = dm[0]
                if dm[1] == 0:
                    anzahl_24 -= 1
                stufen[24] += anzahl_24
                an_abfahrten += 2
            else:
                # normale schichten unter 48 Stunden
                for stufe in stufen.keys():
                    if dauer / 60 >= float(stufe):
                        schicht_stufe = stufe
                if schicht_stufe not in stufen:
                    stufen[schicht_stufe] = 1
                else:
                    stufen[schicht_stufe] += 1

        self.abwesenheit = {
            'über 8 Stunden': stufen[8],
            'über 24 Stunden (Reise)': stufen[24],
            'An-/Abreisetage': an_abfahrten
        }

        # Berechnung der km-Pauschale
        # TODO für einige Jahre haben wege über 21 km eine erhöhte Pauschale.

        self.wege.pop('0', 0)

        for weg_id in self.wege:
            self.wege[weg_id]['formel'] = \
                str(self.wege[weg_id]['count']) + ' * ' + str(self.wege[weg_id]['weg'].entfernung) + 'km * 0.30 € '
            self.wege[weg_id]['pauschale'] = \
                self.wege[weg_id]['count'] * float(self.wege[weg_id]['weg'].entfernung) * 0.3