Preise und Preisberechnung

Preisberechnung mit der Default Price Calculation

  • Basispreis pro Buchung (basis_price)
  • Basispreis pro Tag (price_per_day)
  • Basispreis pro Person (price_per_person)
  • Steuern (tax)

Beispiel-Rechnungen

  • Basispreis pro Buchung: 0€
  • Basispreis pro Tag: 100€
  • Basispreis pro Person: 0€
  • Steuern: 19%
  • Tage: 3
  • => (3100€) + 0€ = 300€ 1,19 = 357€

Beispiel Florida-Ferienhäuser

  • Basis Preis: 2.400 € (OPtion: inkl. Personen, pro Tag 342,85)
  • Min. Personen: 2
  • Max. Personen: 6
  • Preis pro Person: 210 € (rechnet erst ab zus. Person zu min. Personen)
PersonenDauerPreiszus. pro PersonGesamt
27 Tage2.400 €0 €2.400 €
37 Tage2.400 €300 €2.700 €
47 Tage2.400 €600 €3.000 €
57 Tage2.400 €900 €3.300 €
67 Tage2.400 €1200 €3.600 €
29 Tage4.800 €0 €4.800 €
39 Tage4.800 €300 €5.100 €

Beispiel Mietwohnung (1-Zimmer)

  • Basis Preis: 0 €
  • Min. Personen: 1
  • Max. Personen: 1
  • Preis pro Übernachtung: 210 €
PersonenDauerPreispro ÜbernachtungGesamt
12 Tage0 €210 €420 €
13 Tage0 €210 €630 €

Beispiel Mietwohnung (2-Zimmer)

  • Basis Preis: 0 €
  • Min. Personen: 1
  • Max. Personen: 2
  • Preis pro Übernachtung: 210 €
PersonenDauerPreispro ÜbernachtungGesamtRabatt
12 Tage0 €300 €600 €0 €
22 Tage0 €300 €600 €0 €
13 Tage0 €300 €900 €0 €
23 Tage0 €300 €900 €0 €
14 Tage0 €300 €1200 €0 €
24 Tage0 €300 €1200 €

Zusätzliche Preise

Zusätzliche Preise können folgende Typen haben:

  • einmalig auf Summe Dieser zusätzliche Preis wird am Ende auf die Summe gerechnet. Diese Preise können als Betrag (amount) oder Prozent (percent). Wenn mehrere Preise dieses Types angegeben wurden, werden diese der Reihenfolge nach auf die Summe gerechnet. Dieser zusätzliche Preis eignet sich gut, um Steuern auf den Endpreis zu rechnen
  • einmalig in Positionen Dieser zusätzliche Preis wird in den Positionen aufgerechtet. Aktuell kann diese nur ein Betrag (amount) sein. Einsatzgebiet wäre z.B. Endreinigung.
  • pro Nacht & pro Person auf Summe Dieser zusätzliche Preis wird am Ende auf die Summe gerechnet. Diese Preise können nur als Betrag (amount) angegeben werden. Einsatzgebiet wären z.B. Kurtaxen.

Verwendung eines eigenen PriceCalculation-Service

Oft kann es vorkommen, das Sie ganz spezielle Regeln für Ihre Preisberechnung benötigen. Daher ist es mit der Buchungserweiterung möglich, einen eigenen Preisberechnungs-Service zu verwenden. Wie dies funktioniert, können Sie im Folgenden lesen.

In diesem Beispiel wollen wir ein Zimmer vermieten, das zwischen Sonntag und Freitag Nacht 134€ kostet und zwischen Freitag und Sonntag Nacht 154€. Wenn eine Buchung bspw. von Mittwoch bis Sonntag geht, soll immer der kleinere Preis genommen werden. Diese Berechnung finden Sie im Price Calculation: Weekend Overnights.

Vorbereitung und Registrierung des Service

Der eigene Service muss die abstrakte Klasse AbstractPriceCalculationService implementieren. Diesen Service können Sie in einer eigenen Erweiterung ablegen und würde grundsätzlich wie folgt aussehen:

namespace CodingMs\Bookings\Service;
use CodingMs\Bookings\Domain\Model\BookingObject;
class PriceCalculationExampleService extends AbstractPriceCalculationService
{

    /**
     * @param BookingObject $bookingObject
     * @param array $data
     * @return array
     */
    public function calculate($bookingObject, $data): array
    {
        $calculation = $this->prepareData($bookingObject, $data);

        // ... 

        return $calculation;
    }

}

Der vorbereitete Service muss dann im System registriert werden. Dies machen wir mit einem TCA-Override. Dazu legen wir eine Datei mit dem Namen tx_bookings_domain_model_bookingobject.php in das Verzeichnis Configuration/TCA/Overrides/ unserer Erweiterung. Sie müssen die Datei natürlich in Ihre Erweiterung/Theme legen. Wichtig ist nur, das diese geladen wird und den folgenden Inhalt erhält:

<?php
if (!defined('TYPO3_MODE')) {
    die ('Access denied.');
}

$GLOBALS['TCA']['tx_bookings_domain_model_bookingobject']['columns']['record_type']['config']['items'][] =
    ['Price Calculation: Weekend Overnights', '\CodingMs\Bookings\Service\PriceCalculationWeekendOvernightsService'];

// Display Fields
$extKey = 'bookings';
$table = 'tx_bookings_domain_model_bookingobject';
$lll = 'LLL:EXT:' . $extKey . '/Resources/Private/Language/locallang_db.xlf:' . $table;
$GLOBALS['TCA']['tx_bookings_domain_model_bookingobject']['types']['\CodingMs\Bookings\Service\PriceCalculationWeekendOvernightsService'] = [
    'showitem' => 'title, 
        subtitle,
        --palette--;' . $lll . '.palette_min_max_persons;min_max_persons_children_selection,
        --palette--;' . $lll . '.palette_min_max_days;min_max_days,
        description, 

    --div--;' . $lll . '.tab_relations,
        tags,
        categories, 
        images,

    --div--;' . $lll . '.tab_bookings, 
        booking_persons_required,
        bookings,

    --div--;' . $lll . '.tab_prices, 
        record_type,
        record_type_information,
        currency,
        price_per_overnight,
        price_per_overnight_per_additional_person,
        additional_prices,
        payment_notices,

    --div--;' . $lll . '.tab_map, 
        --palette--;' . $lll . '.palette_map_latitude_longitude;map_latitude_longitude,
        map_zoom,

    --div--;' . $lll . '.tab_language, 
        sys_language_uid, 
        l10n_parent, 
        l10n_diffsource, 

    --div--;' . $lll . '.tab_access, 
        hidden, 
        starttime, 
        endtime',
];

Hier fügen Sie Ihren Calculation-Service der Auswahl hinzu. Der Namespace und die Klasse muss natürlich mit Ihrem Namen angepasst werden. Nach dem Leeren des System-Cache sollte die neue Auswahl zur Verfügung stehen.

Im Bereich showitem können Sie festlegen, welche Felder für Ihren Service angezeigt werden.

Wählen Sie diese in einem Buchungsobjekt aus, so dass Sie diese testen können.

Ausgabe der Berechnungstabelle

Der AJAX-Service lässt seine Daten über Ihren Preisberechnungs-Service berechnen und übergibt das Ergebnis dann an das hinterlegte Fluid-Template, welches dann das HTML rendert das zurückgegeben wird. Hier bei wird das Fluid Partial EXT:bookings/Resources/Private/Partials/Bookings/PriceCalculation.html verwendet. Dieses können Sie wie gewohnt mit Hilfe von TypoScript überschreiben.

Somit sind Sie selbst bei der Ausgabe Ihrer Kalkulation maximal flexibel.