Preis per Skript anpassen

Hallo,

für eine bestimmte Benutzergruppe muss der Preis angepasst werden.
PreisA, PreisB, … sollen dafür nicht genutzt werden.

An welcher Stelle wird der Preis des Artikels gesetzt?
In der Klasse oxarticle bringen getUnitPrice() und setPrice() keinen Erfolg.

Danke Thoni

Moin :slight_smile:

das einfachste ist in der Datenbank der Artikel unter oxarticles Tabelle.

Welche Preisinfos Du im Detail über ein Skript anpassen willst musst Dir erarbeiten über Abgleich des Datenbankdesigns und wie die Preiseinstellungen im Admin und Frontend dann dargestellt werden. Also welche Daten Du über Dein Skript alles in die Datenbank einpflegen lässt bzw. aktualisierst.

Viele Grüße,
Tim

Update: Ansonsten lohnt immer ein Blick in die Dokumentation z.B. unter Interacting with the database — OXID eShop developer documentation 6.4.0 documentation oder wenn Du es mit einem ERP System oder WaWi zu tun hast dann kannst über Symfony einen eigenen Service integrieren Services — OXID eShop developer documentation 6.4.0 documentation

1 Like

Moin,

da stehen doch auch nur PreisA … drin.

Es ist ein Brutto-Shop.
B2B soll es ein Netto-Shop (Ausland) sein.
PreisA ist der B2B-Preis.
Für den ausländischen B2B- Kunde muss ich den Preis mit einem Skript anpassen.
PreisB und PreisC sind vergeben.

Für einen Tipp für die Stelle in der Doku wäre ich dankbar, Tim.

Für die Dateneingabe der Preise kann über die Grundeinstellungen unter Mehrwertsteuer die Einstellungen prüfen:

Dies wäre jetzt Beispiel für Shop in Deutschland mit 19% Standard-MwSt. Satz für alle Artikel, Artikelpreise werden beim Artikel netto gepflegt und es ist die Einstellung Nettopreise im Frontend gewählt, weil es sich um einen B2B Shop handelt.

Wenn es sich bei Deinem Shop um einen Verbraucher-Shop (B2C) handelt und Auslandskunden die eine Umsatzsteuer-Identnummer hinterlegt haben (Unternehmen) wird über die Länder Konfiguration mit gewählter Einstellung Mehrwertsteuerfrei falls Umsatzsteuer-Identnummer bekannt beim Land z.B. Frankreich im Frontend im Warenkorb dann Netto-Preise angezeigt:

Dies heißt ja im Umkehrschluss, je nach Grundeinstellung und Länder Konfiguration musst in das Feld für den PreisA der Tabelle oxarticles in der Spalte OXPRICEA über Dein Skript den Netto- oder Brutto-Preis einpflegen.

Der Fall Netto-Preis wäre bei der Umsetzung/Datenpflege am Einfachsten, weil sich die Mehrwertsteuersätze je nach Land unterscheiden.

Dann wäre ein Code-Beispiel relativ einfach:

$product = oxNew(\OxidEsales\Eshop\Application\Model\Article::class);
$product->load($oxid);
$product->oxarticles__oxpricea = new \OxidEsales\Eshop\Core\Field ($nettoprice);
$product->save();

Du bräuchtest für die Datenpflege die OXID ($oxid) welche der Artikel besitzt und die Info wie der Nettopreis ($nettoprice) sein sollte.

Aber man merkt bereits, dass dort viel Gedankenarbeit von Nöten ist um die jeweiligen Umgebungsvariablen in Form von getroffenen Grundeinstellungen, Shop Varianten CE, PE oder EE und welche bisherigen weiteren Anpassungen/Logiken bereits shopspezifisch umgesetzt wurden sind.

Viele Grüße,
Tim

Es wurden überall Bruttopreise eingegeben.
Die unterschiedlichen Umsatzsteuern in den Ländern funktionieren auch bereits.

Diese Fälle gibt es:

B2C in Deutschland: kein Problem
B2C im Ausland: kein Problem da alle B2C denselben Bruttopreis haben.

B2B in Deutschland: kein Problem über PreisA
B2B im Ausland: benötigt denselben Nettopreis, wie in Deutschland

Mit Standardeinstellungen ist das nicht zu lösen, soweit ich weiß.

Meine Versuche, das Article-Objekt anzupassen, sind gescheitert.
Ich versuche es jetzt mal beim Price-Object.

Gruß Thoni

gilt nur innerhalb der EU - ausserhalb der EU → Nettopreis

1 Like

Danke für den Hinweis.

Es handelt sich nur um die EU.

Das klappt auch nicht, weil ich dort nur den Bruttopreis habe und nicht den Steuersatz des Artikels um den Netto-Preis zu berechnen.

Kannst Du nicht einfach vom Price Object den Netto-Preis holen über den Artikel?

$product = oxNew(\OxidEsales\Eshop\Application\Model\Article::class);
$product->load($oxid);
$product->getPrice()->getNettoPrice();

Das Preis Object berücksichtigt bei der Rückgabe des Netto-Preises in der Regel bereits die gewählte Grundeinstellung ob Brutto- oder Netto-Preise gepflegt.

Du kannst Dir das Verhalten von Simple Variant Klasse abgucken wo geprüft wird ob ein ABC Preis vorliegt, dies wäre ggfs. noch ein Ansatz:

$price = oxNew(\OxidEsales\Eshop\Core\Price::class);
$price->setPrice($bruttoprice, $vat);
$price->getPrice()->getNettoPrice();

Ich sehe gerade der Hook modifyGroupPrice() für Deinen Fall sehr nützlich, wenn man annehmen darf das B2B aus dem Ausland in der Kundengruppe für A-Preise und er darüber den Brutto-Preis im Frontend erhalten sollte.
Im Hook könntest prüfen über $this->getArticleUser() ob Du das User Object hast und ob beim User Object die Umsatzsteuer-Identifikationsnummer hinterlegt und könntest den übergebenen Preis wie oben beschrieben neu nach Netto-Preis berechnen lassen.

Update: Der Steuersatz sollte doch eigentlich mit dem Land verknüpft sein der Rechnungsadresse des Kundens und nicht mit dem Artikel außer Du arbeitest mit speziellen MwSt. Sätzen in Kategorien bzw. Artikeln, was die Sache weiter verkomplizieren würde :wink:

Wichtig für dich ist der Warenkorb. Schau dazu in basketitem::getArticle(); Hier kannst den Preis anpassen und vorher prüfen, ob der Kunde in der Gruppe ist:

public function getArticle($blCheckProduct = false, $sProductId = null, $blDisableLazyLoading = false)

    {

                      if( USER IN GROUP) // Abfrage erstellen

                        {           $newprice = $this->newPrice( $data ); //INT

                                   $this->_oArticle->oxarticles__oxprice = new Field($newprice );

                        }

                        return parent::getArticle($blCheckProduct, $sProductId, $blDisableLazyLoading);

    }
;

Brutto-Netto: In Articles hast immer _getPriceObject(); und _preparePrice(…); zur Verfügung. Damit kannst Brutto oder Netto entnehmen.

1 Like

Ist basketitem nicht schon zu spät?
Den Preis benötige ich auch in der Kategorie und auf der Detailseite.

Achso, ich hatte gedacht, dass der Preis im Warenkorb per Skript angepasst wird. Dann würde ich über

protected function _getGroupPrice()

gehen. Hier kannst eine eigene Methodik zu oxpriceA,B, und C anlegen,

1 Like

Super,

das war genau die Stelle.

Danke

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.