Implement logic for date and service period data of invoices #40

Open
opened 2025-10-22 13:03:26 +02:00 by vollstock · 0 comments
Owner
Anforderung Details Beispiel
Leistungszeitraum Mindestens ein Datum (Tag/Monat/Jahr) muss angegeben werden. "Leistungserbringung: Oktober 2025"
Genauigkeit Der Zeitraum muss nachvollziehbar sein (für Finanzamt & Kunde). "10.10.2025" oder "01.–31.10.2025"
Fortlaufende Leistungen Bei Dauerleistungen (z. B. monatliche Betreuung) reicht ein Abrechnungsmonat. "Monatliche Wartung: September 2025"
Einmalige Leistungen Ein einzelnes Datum genügt (z. B. Tag der Beratung). "Beratung am 15.10.2025"

Wann sind Start- und Enddatum Pflicht?

Nur in diesen Fällen musst du beide Daten angeben:

  • Teilleistungen (§ 13 UStG):
    • Wenn du eine große Dienstleistung in Raten abrechnest (z. B. Projektarbeit über 6 Monate).
    • Beispiel: "Teilleistung 1: 01.07.–30.09.2025 (30% des Gesamtpreises)".
  • Vertraglich vereinbart:
    • Wenn der Kunde im Vertrag explizit Start/Ende fordert (z. B. bei Framework-Verträgen).
  • Steuerliche Nachweispflicht:
    • Bei Forschungs- oder Entwicklungsprojekten, wo das Finanzamt die Dauer prüft (z. B. für Fördermittel).

Umsetzung

Bedingte Pflichtfelder

  • Falls is_recurring = true (z. B. monatliche Buchhaltung) → nur service_date_end (Abrechnungsmonat).
  • Falls is_partial_service = true → beide Daten.

oder

  • Standardmäßig nur ein Datum (für 80% der Fälle).
  • Checkbox für Zeiträume (z. B. bei monatlichen Services oder Projekten)

Validierung

[
        'invoice_items.*.service_date' => 'required|date',
        'invoice_items.*.service_date_start' => 'nullable|date|before_or_equal:invoice_items.*.service_date_end',
        'invoice_items.*.service_date_end' => 'nullable|date|after_or_equal:invoice_items.*.service_date_start',
]
  • service_date ist immer Pflicht.
  • Falls service_date_start angegeben wird, muss service_date_end danach liegen (und umgekehrt).

XRechnung

<ram:ActualDeliveryDate>
  <udt:DateTimeString format="102">
    {{ service_date_start ? service_date_start : service_date }}
  </udt:DateTimeString>
</ram:ActualDeliveryDate>

<!-- Bei Zeitraum: zusätzlich -->

<ram:ActualDeliveryPeriod>
  <udt:StartDateTime>{{ service_date_start }}</udt:StartDateTime>
  <udt:EndDateTime>{{ service_date_end }}</udt:EndDateTime>
</ram:ActualDeliveryPeriod>
| Anforderung | Details | Beispiel | | ----------------------- | ----------------------------------------------------------------------------- | ------------------------------------ | | **Leistungszeitraum** | **Mindestens ein Datum** (Tag/Monat/Jahr) muss angegeben werden. | "Leistungserbringung: Oktober 2025" | | Genauigkeit | Der Zeitraum muss **nachvollziehbar** sein (für Finanzamt & Kunde). | "10.10.2025" oder "01.–31.10.2025" | | **Fortlaufende Leistungen** | Bei **Dauerleistungen** (z. B. monatliche Betreuung) reicht ein **Abrechnungsmonat**. | "Monatliche Wartung: September 2025" | | **Einmalige Leistungen** | Ein **einzelnes Datum** genügt (z. B. Tag der Beratung). | "Beratung am 15.10.2025" | # Wann sind Start- und Enddatum Pflicht? Nur in diesen Fällen musst du beide Daten angeben: - **Teilleistungen** (§ 13 UStG): - Wenn du eine große Dienstleistung in Raten abrechnest (z. B. Projektarbeit über 6 Monate). - Beispiel: "Teilleistung 1: 01.07.–30.09.2025 (30% des Gesamtpreises)". - **Vertraglich vereinbart:** - Wenn der Kunde im Vertrag explizit Start/Ende fordert (z. B. bei Framework-Verträgen). - **Steuerliche Nachweispflicht:** - Bei Forschungs- oder Entwicklungsprojekten, wo das Finanzamt die Dauer prüft (z. B. für Fördermittel). # Umsetzung Bedingte Pflichtfelder - Falls is_recurring = true (z. B. monatliche Buchhaltung) → nur service_date_end (Abrechnungsmonat). - Falls is_partial_service = true → beide Daten. oder - Standardmäßig nur ein Datum (für 80% der Fälle). - Checkbox für Zeiträume (z. B. bei monatlichen Services oder Projekten) # Validierung ```PHP [ 'invoice_items.*.service_date' => 'required|date', 'invoice_items.*.service_date_start' => 'nullable|date|before_or_equal:invoice_items.*.service_date_end', 'invoice_items.*.service_date_end' => 'nullable|date|after_or_equal:invoice_items.*.service_date_start', ] ``` - service_date ist immer Pflicht. - Falls service_date_start angegeben wird, muss service_date_end danach liegen (und umgekehrt). # XRechnung ```XML <ram:ActualDeliveryDate> <udt:DateTimeString format="102"> {{ service_date_start ? service_date_start : service_date }} </udt:DateTimeString> </ram:ActualDeliveryDate> <!-- Bei Zeitraum: zusätzlich --> <ram:ActualDeliveryPeriod> <udt:StartDateTime>{{ service_date_start }}</udt:StartDateTime> <udt:EndDateTime>{{ service_date_end }}</udt:EndDateTime> </ram:ActualDeliveryPeriod> ```
vollstock added the Enhancement label 2025-10-22 13:03:26 +02:00
vollstock added this to the 0.9 project 2025-10-22 13:03:26 +02:00
vollstock moved this to To Do in 0.9 on 2025-10-23 20:55:26 +02:00
vollstock added this to the 0.9 milestone 2025-12-04 10:22:06 +01:00
This repo is archived. You cannot comment on issues.