Zuschläge berechnen

internet

Top Contributor
Hallo,

ich habe eine Klasse "ExtraSalary". Diese ist dazu gedacht um Zuschläge zu berechnen.
Man kennt das klassicherweiße aus "Samstagzuschlag", bspw. 100% auf einen Basispreis.

Ich habe nun eine Klasse:
Java:
public class ExtraSalary {

    public enum DayType {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY,
        PUBLIC_HOLIDAY,
        CUSTOM_DAY
    }

    private String dayType;

    // Uhrzeit wann der Zuschlag gilt
    private LocalTime startTime = LocalTime.of(8, 00);
    private LocalTime endTime = LocalTime.of(17, 00);

    // Geldbetrag oder Prozent (Zuschlag kann prozentual stattfinden oder mit einem fixen Betrag)
    private String salaryType = DiscountCalculationTypeEnum.PERCENTAGE.toString();

    // Prozentwert
    private BigDecimal percentageValue;
    
    // Preis
    private BigDecimal price;

Nun möchte ich anhand eine Methode prüfen, ob es zu einem Zuschlag kommt.

Hier habe ich dann folgende Methode:

Java:
private BigDecimal calculatePriceForExtraSalary(List<ExtraSalaryList> listExtraSalaryList, BigDecimal baseValue, LocalDateTime startDate,
            LocalDateTime endDate)

  • List<ExtraSalaryList> listExtraSalaryList => Definiert, wann es zu einem Zuschlag kommt
  • baseValue = Ist der Basiswert
  • StartDate und EndDate sollte selbsterklärend sein... Die Zeitspanne, die betrachtet werden soll (kann also auch über mehrere Tage sich erstrecken). Demnach kann es bspw. auch sein, dass ein Samstag mehrmals vorkommt. Dies sollte dann natürlich berücksichtigt werden
Nun bräuchte ich Hilfe, wie ich das am Besten berechne bzw. wie die Prüfung aussieht.
Insbesondere der Zeitraum bereitet mir gerade Schwierigkeiten, mit einem einzelnen Datum wäre es denke ich einfacher.

1. Ich muss natürlich die Liste (List<ExtraSalaryList>) durchgehen

Java:
for(ExtraSalaryList extraSalaryList : listExtraSalaryList){
    // Enthält Zeitspanne einen Montag?
   
}

- PUBLIC_HOLIDAY wird anhand der Datenbank geprüft
- CUSTOM_DAY wird einfach auf einen spezielles Datum geprüft

Danke für jede Hilfe
 

mihe7

Top Contributor
Da verstehe ich einige Dinge nicht. Du postest eine Klasse ExtraSalary aber was ist ExtraSalaryList? Dann definierst Du enums, verwendest aber Strings. Und dann wäre natürlich die Frage, was die Berechnung denn eigentlich liefern soll. Da kommen wir dann dorthin, worauf @Neumi5694 hinaus wollte.
 

internet

Top Contributor
Das habe ich mir noch nicht aufgemalt.
Eine Idee wäre zum Beispiel ein Hilfsobjekt zu erstellen, der mir pro Tag die Startzeit und Endzeit speichert.

Java:
class CalculationHelper {

     private LocalDate date;
    
     private LocalTime startDate;
     private LocalTime endDate;
}

Nun erstelle ich mir erstmal eine Liste von der neuen Klasse CalculationHelper anhand des Zeitraums pro Tag.
Nun gehe ich diese Liste durch und prüfen dann entsprechend:
- Ist es ein Montag (ja, dann berechne mir den Wert, addiere Geldbetrag oder prozentual)

Anschließend erstelle ich pro Tag den entsprechenden Stundensatz.
Zuschläge werden nur bei "Tagessätzen" oder "Stundenpauschalen" berechnet.

Wie wäre es damit?
 

internet

Top Contributor
Da verstehe ich einige Dinge nicht. Du postest eine Klasse ExtraSalary aber was ist ExtraSalaryList? Dann definierst Du enums, verwendest aber Strings. Und dann wäre natürlich die Frage, was die Berechnung denn eigentlich liefern soll. Da kommen wir dann dorthin, worauf @Neumi5694 hinaus wollte.
Sorry, das muss ExtraSalary heißen nicht ExtraSalaryList...
Statt dem String könnte man auch das enum nehmen...
 

mihe7

Top Contributor
Du hast z. B. eine Definition, dass es samstags zwischen 08:00 Uhr und 16:00 Uhr einen 100 % Zuschlag gibt.

Soweit verstehe ich das noch. Um bewerten zu können, ob jemand den Zuschlag erhält, bräuchtest Du doch aber auch dessen Arbeitszeit. Wie in einen einzigen Arbeitszeitraum mehrere Samstage fallen können, ist mir zwar nicht ganz klar aber man muss ja nicht alles verstehen :)

Wenn Du bestimmte Wochentage zwischen Start- und Enddatum erhalten willst, ist das ja kein Problem:
Java:
static List<LocalDate> weekdays(LocalDate startDate, LocalDate endDate, DayOfWeek dayOfWeek) {
    return startDate.datesUntil(endDate.plusDays(1))
        .filter(date -> date.getDayOfWeek() == dayOfWeek)
        .collect(Collectors.toList());
}
 

internet

Top Contributor
danke für die Antwort.

Genau, den Zeitraum der Arbeitszeit ist hier "startDate" und "endDate".
D.h. der gebuchte Zeitraum für ein Mitarbeiter kann sich auch über mehrere Tage erstrecken.
Daher war meine Idee zunächst eine Liste der Tage und Zeiten zu generieren.

Java:
private BigDecimal calculatePriceForExtraSalary(List<ExtraSalary> listExtraSalaryList, BigDecimal baseValue, LocalDateTime startDate,
            LocalDateTime endDate)

Beispiel:

Arbeitszeitraum:
Start: 01.01.2022 um 08:00 Uhr
Ende: 05.01.2022 um 17:00 Uhr

- Prüfe ich für den 01.01., ob es ein Feiertag, bestimmter Tag oder ein entsprechender Wochentag ist.
Die Prio müsste dann sein: 1) ist bestimmter Tag 2) Ist Feiertag 3) ist Wochentag
-> Wenn eines dieser Bedingungen wahr ist, dann wird in der Liste von "ExtraSalary" geprüft, ob es einen Eintrag zu dem Kriterium gibt (1) ist bestimmter Tag 2) Ist Feiertag 3) ist Wochentag).
Wenn ja, wird eben die Berechnung anhand dem Basisbetrag (das ist dann der Stundensatz oder Tagespauschale) berechnet.

Das ganze dann für jeden einzelnen Tag.
 

Jw456

Top Contributor
Bei Abrechnung kannst (musst) du doch jeden Tag einzeln rechnen.

Ist es ein Tag außerhalb der Grundarbeitszeit sind es Überstunden plus Zuschlag.
In der Woche Arbeitszeit - Grundarbeitszeit sind Überstunden plus Zuschlag zB Nacht
Zuschlag auch wenn es mehr als die Wochen Arbeitszeit ist.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Mal ungeachtet irgendwelcher rechtlichen Rahmenbedingungen: es gibt "Betriebstage", das wären Tage, denen ein Tagtyp zugeordnet ist.
Java:
record OperatingDay(LocalDate date, DayType type) {}
Du ermittelst also für jeden Tag im Zeitraum den Betriebstag. Erster Fall.

Jetzt gibts eine Policy, die Zuschläge für einen OperatingDay in einem gegebenen Zeitraum auf einen Grundpreis berechnet:
Java:
interface ExtraSalaryPolicy {
    BigDecimal calculate(LocalDateTime start, LocalDateTime end, OperatingDay day, BigDecimal basePrice);

    default ExtraSalaryPolicy andThen(ExtraSalaryPolicy next) {
        return (start, end, day, bp) -> calculate(start, end, day, bp).add(next.calculate(start, end, day, bp));
    }
}

Wie genau das berechnet wird, muss den Rest der Anwendung nicht interessieren. Letztlich bekommt die Berechnung einen Zeitraum und eine Policy, daraus ergibt sich dann:
Java:
    BigDecimal extra = startDate.toLocalDate().datesUntil(endDate.toLocalDate().plusDays(1))
            .map(this::getOperatingDay)
            .map(operatingDay -> policy.calculate(startDate, endDate, operatingDay, basePrice))
            .reduce(BigDecimal.ZERO, BigDecimal::add);

Für eine Policy kann man sich eine Klasse (hier ein record) definieren, vereinfachtes Beispiel, das je nach Tagtyp einen Zuschlag berechnet:
Java:
record PercentageExtra(DayType type, BigDecimal percentage) implements ExtraSalaryPolicy {
 
    public BigDecimal calculate(LocalDateTime start, LocalDateTime end, OperatingDay day, BigDecimal basePrice) {
        return day.type() == type() ? percentage.multiply(basePrice) : BigDecimal.ZERO;
    }
}

Damit kann man sich dann policies bauen:
Java:
ExtraSalaryPolicy customExtra = new PercentageExtra(DayType.CUSTOM_DAY, new BigDecimal("1.5")); // 150 % Zuschlag
ExtraSalaryPolicy holidayExtra = new PercentageExtra(DayType.PUBLIC_HOLIDAY, new BigDecimal("1")); // 100 % Zuschlag
ExtraSalaryPolicy sundayExtra = new PercentageExtra(DayType.SUNDAY, new BigDecimal("1")); // 100 % Zuschlag
ExtraSalaryPolicy saturdayExtra = new PercentageExtra(DayType.SATURDAY, new BigDecimal("0.5")); // 50 % Zuschlag
(EDIT: Copy & Paste-Fehler behoben)

Die kann man sich dann zusammenstecken:
Java:
ExtraSalaryPolicy policy = customExtra.andThen(holidayExtra).andThen(sundayExtra).andThen(saturdayExtra);

Das mal so als grobe Überlegung.
 
Zuletzt bearbeitet:

carlao2

Mitglied
Für unsinnige Parameter (t1, t2) wird keine Haftung übernommen!

Java:
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoField;

public class Saturdays {
    public static float countSaturdays(LocalDateTime t1, LocalDateTime t2) {
        int c = 0;
        LocalDateTime next = getNextSaturday(t1);
        while (next.plusDays(1).isBefore(t2)) {
            c++;
            next = getNextSaturday(next.plusDays(1));
        }
        if (next.isBefore(t2)) {
            return c + Duration.between(next, t2).toSeconds() / 86400f;
        }
        return c;
    }

    public static LocalDateTime getNextSaturday(LocalDateTime t1) {
        if (t1.get(ChronoField.DAY_OF_WEEK) == DayOfWeek.SATURDAY.getValue()) {
            return LocalDateTime.of(t1.toLocalDate(), LocalTime.MIDNIGHT);
        }
        t1 = t1.plusDays((13 - t1.get(ChronoField.DAY_OF_WEEK)) % 7);
        return LocalDateTime.of(t1.toLocalDate(), LocalTime.MIDNIGHT);
    }

    public static void main(String[] args) {
        System.out.println(countSaturdays(
                LocalDateTime.of(2022, 3, 1, 0, 0),
                LocalDateTime.of(2022, 4, 1, 0, 0)));
        System.out.println(countSaturdays(
                LocalDateTime.of(2022, 3, 1, 0, 0),
                LocalDateTime.of(2022, 3, 12, 12, 0)));
    }
}
 

carlao2

Mitglied
Oups, hab in countSaturdays eine Bedingung ganz vergessen...

Java:
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoField;

public class Saturdays {
    public static float countSaturdays(LocalDateTime t1, LocalDateTime t2) {
        int c = 0;
        LocalDateTime next = getNextSaturday(t1);
        while (next.plusDays(1).isBefore(t2)) {
            c++;
            next = getNextSaturday(next.plusDays(1));
        }
        if (next.isBefore(t2)) {
            if (next.isAfter(t1)) {
                return c + Duration.between(next, t2).toSeconds() / 86400f;
            } else {
                return c + Duration.between(t1, t2).toSeconds() / 86400f;
            }
        }
        return c;
    }

    public static LocalDateTime getNextSaturday(LocalDateTime t1) {
        if (t1.get(ChronoField.DAY_OF_WEEK) == DayOfWeek.SATURDAY.getValue()) {
            return LocalDateTime.of(t1.toLocalDate(), LocalTime.MIDNIGHT);
        }
        t1 = t1.plusDays((13 - t1.get(ChronoField.DAY_OF_WEEK)) % 7);
        return LocalDateTime.of(t1.toLocalDate(), LocalTime.MIDNIGHT);
    }

    public static void main(String[] args) {
        System.out.println(countSaturdays(
                LocalDateTime.of(2022, 3, 1, 0, 0),
                LocalDateTime.of(2022, 4, 1, 0, 0)));
        System.out.println(countSaturdays(
                LocalDateTime.of(2022, 3, 1, 0, 0),
                LocalDateTime.of(2022, 3, 12, 12, 0)));
        System.out.println(countSaturdays(
                LocalDateTime.of(2022, 3, 12, 10, 30),
                LocalDateTime.of(2022, 3, 12, 12, 0)));
    }
}

Diie Ausgabe ist dann:
4.0
1.5
0.0625
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M OOP Brüche nicht richtig berechnen Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
T Fibonacci mit einer Hilfsmethode berechnen Java Basics - Anfänger-Themen 10
laxla123 Quersumme berechnen Java Basics - Anfänger-Themen 1
I For Schleife Summe berechnen Java Basics - Anfänger-Themen 13
S Vollmond berechnen und ausgeben Java Basics - Anfänger-Themen 12
S Vollkommene Zahl berechnen und ausgeben Java Basics - Anfänger-Themen 16
A Berechnen Moor Nachbarschaft Java Basics - Anfänger-Themen 5
E Geburtstag im Schaltjahr berechnen Java Basics - Anfänger-Themen 24
Lion.King Schaltjahr berechnen Java Basics - Anfänger-Themen 31
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
L mit Fakultät mathematische Formel berechnen Java Basics - Anfänger-Themen 5
TanTanIsTrying Durschnitt berechnen von eingegebener Zahl bis 1 heruntergezählt Java Basics - Anfänger-Themen 9
L Präfix berechnen Java Basics - Anfänger-Themen 33
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
Poppigescorn Quersumme Berechnen mit einer While Schleife Java Basics - Anfänger-Themen 13
I Potenz berechnen mit for-Schleife Java Basics - Anfänger-Themen 3
A Standardabweichung in Java berechnen Java Basics - Anfänger-Themen 10
H Gesamtabweichung mit Array berechnen Java Basics - Anfänger-Themen 2
G Java Rabatt berechnen Java Basics - Anfänger-Themen 8
V Rückgeld berechnen Java Basics - Anfänger-Themen 6
eleonori Durchschnitt aller Werte eines Baums berechnen Java Basics - Anfänger-Themen 5
Ianatrix Zahlen von a bis b berechnen Java Basics - Anfänger-Themen 7
L Max, min, Summe und Durchschnitt berechnen Java Basics - Anfänger-Themen 4
L Anhalteweg berechnen Java Basics - Anfänger-Themen 6
Aeon Erste Schritte Preise berechnen mit do-while Java Basics - Anfänger-Themen 9
M Quadratwurzel berechnen Java Basics - Anfänger-Themen 8
V Wachstum berechnen und in Ist-Formel verwenden Java Basics - Anfänger-Themen 5
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Abschreibungsplan berechnen Java Basics - Anfänger-Themen 23
V Gehalt berechnen in Java Java Basics - Anfänger-Themen 6
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
J Array Speicherplatz berechnen Java Basics - Anfänger-Themen 35
H Eingabedaten berechnen Java Basics - Anfänger-Themen 9
B Tranportkosten berechnen mit unterschiedlichen MwSt Java Basics - Anfänger-Themen 9
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
N Ein Datum berechnen Java Basics - Anfänger-Themen 3
T Sparplan berechnen Java Basics - Anfänger-Themen 4
F Abstand zum Durchschnitt von 5 Zahlen berechnen... Java Basics - Anfänger-Themen 16
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
P Mittelwert Arrayelemente berechnen Fehler Java Basics - Anfänger-Themen 5
CptK Best Practice Schussparabel berechnen Java Basics - Anfänger-Themen 3
T Modulo / Pow berechnen Java Basics - Anfänger-Themen 4
E Statistische Kennzahlen berechnen Java Basics - Anfänger-Themen 2
F Switch Case Modulo berechnen Java Basics - Anfänger-Themen 12
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
C Preis berechnen mit Java Java Basics - Anfänger-Themen 4
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
N Best Practice Image recognition fuzzy Superhash berechnen Java Basics - Anfänger-Themen 1
Dawinartor Erste Schritte Schaltjahr berechnen Java Basics - Anfänger-Themen 1
L Pi berechnen Java Basics - Anfänger-Themen 1
CptK Term (als String) berechnen und ausgeben Java Basics - Anfänger-Themen 10
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
J Variablen arithmetischen Mittelwert berechnen Java Basics - Anfänger-Themen 5
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
R Winkel berechnen bzw. Geraden sortieren Java Basics - Anfänger-Themen 33
I Schnittpunkt zweier Geraden berechnen Java Basics - Anfänger-Themen 25
M Erste Schritte Mittelwert berechnen -> Methode in der Methode? Java Basics - Anfänger-Themen 14
S Compiler-Fehler Schaltjahr berechnen Java Basics - Anfänger-Themen 5
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
D Summe berechnen mit verändertem Wert aus Schleife Java Basics - Anfänger-Themen 1
R Liga Berechnen Java Basics - Anfänger-Themen 1
P Klassen Berechnen mehrerer Map-Werte Java Basics - Anfänger-Themen 13
R Fussballtabellen berechnen Java Basics - Anfänger-Themen 12
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
J Durchschnitt jeder Zeile und und Spalte in einem 2D Arrays berechnen Java Basics - Anfänger-Themen 6
F ISBN Prüfziffer berechnen Java Basics - Anfänger-Themen 17
F Die Teilersumme einer Eingabe berechnen Java Basics - Anfänger-Themen 11
S Negafibonacci Folge berechnen Java Basics - Anfänger-Themen 24
G Array Mittelwert berechnen, wie? Java Basics - Anfänger-Themen 8
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
N Mit LocalDate alter berechnen Java Basics - Anfänger-Themen 3
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
N Arrays mit Zufallzahlen füllen und Statistiken berechnen Java Basics - Anfänger-Themen 5
A Wochentag berechnen Java Basics - Anfänger-Themen 10
Ste3et_C0st Vectoren berechnen Java Basics - Anfänger-Themen 8
L Durchschnitt in der Schleife berechnen Java Basics - Anfänger-Themen 11
A Kreisumfang/-Fläche vom Kreis berechnen Java Basics - Anfänger-Themen 39
L Wochentag berechnen Java Basics - Anfänger-Themen 5
L Rekursive Methode a * b berechnen Java Basics - Anfänger-Themen 2
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ausdrücke berechnen Java Basics - Anfänger-Themen 2
V Mittelwert berechnen Java Basics - Anfänger-Themen 31
H Datentypen Tage zwischen zwei Datums berechnen Java Basics - Anfänger-Themen 4
P Quadrate berechnen Java Basics - Anfänger-Themen 3
S OOP Datumsunterschied in Tagen berechnen Java Basics - Anfänger-Themen 3
M Methoden Aus Timestamp das Datum berechnen Java Basics - Anfänger-Themen 3
B Schaltjahre berechnen! Java Basics - Anfänger-Themen 1
A werte in einem String berechnen Java Basics - Anfänger-Themen 3
F Checksummen aus int-Array berechnen Java Basics - Anfänger-Themen 3
F Toto-Tipp-Reihen berechnen Java Basics - Anfänger-Themen 1
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
R Quersumme berechnen - Methodenproblem Java Basics - Anfänger-Themen 1
S Button "Berechnen" geht nicht Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben