Relativen Anteil von zwei Datümer auf Monatsebene umrechnen

Bitte aktiviere JavaScript!
Hallo zusammen,

ich würde gerne den relativen Anteil von zwei Datümer auf Monatsebene umrechnen.
Als Usecase wofür ich das benötige ist das Upgrade / Downgrade eines Vertrags.

Bei einem monatlichen und jährlichen Gebührenintervall wird immer der relative Anteil auf Monatsebene umgerechnet.

Als Beispiel:
- Kunde schließt einen 1 Jahresvertrag am 05.05.2019 um 16 Uhr ab.
- Ein Kunde hat vom 05.05.2019 16:00 Uhr - 07.07.2019 11:00 Produkt1 verwendet.
- Am 07.07.2019 11:00 erfolgt dann aber das Upgrade auf Produkt2.
-> Die Vertragslaufzeit ändert sich nicht, allerdings muss der Kunde für das Upgrade etwas draufzahlen
-> Kunde hat jedoch nicht die vollen 12 Monate von Produkt2 verwendet, sodass der genutzte Anteil von Produkt1 gutgeschrieben wird.

Das wären dann:
2 Monate + (1 +(19/24 ))

-> Der hintere Teil der Formel berechnet sich aus der Anzahl an Tagen zwischen 05.07.2019:16:00 - 07.07.2019:11:00, also 1 Tag + 19 von 24 Stunden = 1 + (19/24)

Erklärung:
1 = 1 Tag
19 = Differenz von 16:00 - 11:00 Uhr
24 = von 24 Stunden
31 = Tage vom 05.07.-05.08.2019 = 31


Dieser Wert soll dann auf den relativen Anteil an einem Monat normiert werden.
Anzahl an Tagen zwischen 05.07. und demselben Tag einen Monat später (05.08.) herangezogen. Daraus ergibt sich:
#Tage vom 05.07.-05.08.2019 = 31
-> Ergibt dann einen relativen Anteil von: 2,06451612903

-> Der relativ zum Jahr genutzte Teil von Produkt1 wäre dann eben:
2,06451612903 / 12 = 0,171483

Das heißt also, dass folgender Betrag gutgeschrieben würde:
1 - 0,171483 = -0,828517

Die Frage, die ich mir nun stelle, wie ich das programmiertechnisch am Besten umsetze?
Hier meine Idee:

a) "Differenz an Monaten" ausrechnen anhand dem StartDatum und dem UpgradeDatum
b) Neues Datum berechnen anhand der ausgerechneten Monate. Also startDate + 2 Monate = "Neues Datum"
c) Von "neues Datum" die Differenz an Millisekunden ausrechnen vom EndeDatum (anstatt Stunden) = "Fehlende Tage"
d) "Differenz an Monaten" + "Fehlende Tage" = "relativerAnteil"
e) Wenn Jahresvertrag = "relativerAnteil" / 12 = "GenutzterTeil"
f) 1 - "GenutzterTeil" = "Gutschreiben"

g) "JahresbetragTarif1" * "Gutschreiben" + "JahresbetragTarif2"
-> Wenn negativ, dann bekommt Kunde eine Gutschrift
-> Wenn positiv, dann bekommt Kunde eine Rechnung

Fragen:
Passt das so? Oder wie sollte man es sonst machen?
 
Wenn Du sowieso alles auf einen Haufen wirfst, dann könntest Du doch auch gleich einfach mit Stunden rechnen oder sehe ich was falsch?

(Anzahl Stunden zwischen Vertragsbeginn und -wechsel) / (Anzahl Stunden zwischen Vertragsbeginn und regulärem Ende) liefert dann den genutzten Zeitanteil
 
Bei uns auf der Arbeit ist "Datümer" auch sehr geläufig, wenn man damit Kalenderdaten meint. Als Dativ verwenden wir aber "Datümern", wie in: "den relativen Anteil von zwei Datümern."
 
Also ich sehe keinen Grund warum du nicht einfach in Stunden rechnen solltest. Damit erschlägst du alles in einem, sogar Schaltjahre
Siehe oben die Antwort vom @mihe7

Ich biete dem Kunden ja einen Vertrag entweder mit einem Gebührenintervall von einem Monat oder einem Jahr an.
Das heißt jeder Monat müsste doch gleich berechnet werden, ob 28, 29, 30 oder 31 Tage...

Bspw.:
Jahresabo: 120 EUR
-> Würde dann eben pro Monat 10 EUR sein....

Oder bedenke ich was falsch? So einfach ist das nicht... Wäre sehr schlecht, wenn die Abrechnung dadurch falsch ist....
 
Ich biete dem Kunden ja einen Vertrag entweder mit einem Gebührenintervall von einem Monat oder einem Jahr an.
Das heißt jeder Monat müsste doch gleich berechnet werden, ob 28, 29, 30 oder 31 Tage...
Das kommt ganz drauf an wie du rechnest. Viele Firmen berechnen Ihre Verträge tatsächlich auf der sog. Kaufmännischen Basis (Sprich jeder Monat hat 30 Tage). Wenn du das auch tun möchtest, dann müsstest du durch 30 statt 31 teilen.
 
@beta20 Ja, wenn Du Monatspreise angibst, muss der Preis für ein Monat unabhängig von seiner Länge gelten. Allerdings passt nicht dazu, dass Du den Anteil am Jahr ausrechnest - denn hier setzt Du ja den Jahrespreis an.

Rechnerisch mag das richtig sein, wenn der Monatspreis "zufällig" genau einem Zwölftel des Jahrespreis entspricht. Ich würde das aber trotzdem trennen, vielleicht willst Du die Preise später mal separat anpassen, z. B. Jahrespreis niedriger als Monatspreis.

Außerdem sollte man das auf der Rechnung natürlich in etwa nachvollziehen können:
Code:
Pos Bezeichnung                        Menge  Einheit    EP        Netto      MwSt     Brutto
  1 Stornierung Altvertrag Tarif A        -1    Jahre   120 €  -120,00 €  -22,80 €  -142,80 €
    Beginn: 05.05.2019, 16:00 Uhr
    Ende: 05.05.2020, 16:00 Uhr

  2 Anrechnung Altvertrag Tarif A     -2,065   Monate    10 €    20,65 €    3,92 €    24,57 €
    Beginn: 05.05.2019, 16:00 Uhr
    Ende: 07.07.2019, 11:00 Uhr
    Dauer: 2 Monate, 1 Tag, 19 Std.

  3 Neuer Vertrag Tarif B              9.935   Monate  8,33 €    82,76 €   15,72 €    98,48 €   
    Beginn: 07.07.2019, 11:00 Uhr
    Ende: 05.05.2020, 16:00 Uhr

Summen                                                          -16,95 €   -3,16 €   -19.75 €

Offene Rechnungen: 142,80 € (Kunde hat Altvertrag noch nicht bezahlt)
Rechnungsbetrag:   -19,75 €
Rest               123,05 € (aktualisierte Forderung)

oder

Offene Rechnungen:   0,00 € (bereits bezahlt)
Rechnungsbetrag:   -19,75 €
Rest               -19,75 € (Gutschrift/Überweisung an Kunde)
 
Oder du berechnest galt einfach wie viele Stunden jeder Monat hatte und wie viele davon benutzt wurden. Im Prinzip ist es bei der Stundenrechnung ja egal ob das Jahr oder der Monat die Basis ist
 
@mihe7 , vielen Dank für die Erklärung und das Rechenbeispiel.

Also im Prinzip muss man bei dem Upgrade mehrere Parameter betrachten:
a) Gebührenintervall (Tag, Woche, Monat, Jahr)
b) Wann findet das Upgrade statt: Jetzt, Letzte Abrechnung, nächste Abrechnung, Ende regulärer Vertragslaufzeit, Eigenes Datum
c) Neues Startdatum setzen: Soll das Ende der reg. Vertragslaufzeit übernommen werden oder wird durch das Upgrade ein neues reg. Ende der Vertragslaufzeit generiert
d) Als weitere Parameter eben den Vertrag selbst und der alte / neue Tarif

Ich bin mir nun wirklich nicht mehr sicher, inwiefern sich die Berechnung bei den verschiedenen Gebührenintervalle unterscheidet und was die notwendigen Schritte sind???

Außerdem auch die Frage, was passiert wenn das Gebührenintervall beim Upgrade geändert wird?
Wenn der Kunde zB ein Jahrestarif bestellt und bezahlt hat?
Aber dann nach 2 Monaten in ein Monatstarif wechselt ? Das gleiche andersherum...
 
Das meinte ich nicht :) Willst Du das in einer Schleife machen oder wie soll ich mir das vorstellen? Mir erscheint das etwas arg aufwändig, wenn Du für jeden Monat erstmal nachschaust: aha x Stunden, davon x Stunden genutzt, macht 100 %.
Was genau ist daran denn nun aufwendig? Du nimmst das Startdatum und gehst in einer Schleife durch bis zum Ende des ersten monats. danach bis zum ende des letzten ganz benutzen monats und am ende nochmal den angefangenen monat. Das ist doch nicht wirklich aufwendig.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben