Anzeige des Mwst.-Satzes in der Produktübersicht.

  • Liebe Community, ich bin am Verzweifeln und finde keine Lösung.

    Ich betreue einen Shop, welcher von der neuen Ust-Regelung (MOSS) betroffen ist. Dieser muss die Mwst. des Lieferlandes im Shop ausweisen. Dazu habe ich mittlerweile ein Plugin gefunden und gekauft (Virtuemart MOSS in Verbindung mit MaxMind GeoLocator) , welches dieses Problem löst. Dieses zeigt den Endpreis mit der richtigen Steuer als angemeldeter Besucher korrekt an. Nun möchte ich aber, das der Besucher bei der Produktbeschreibung nicht nur den Text (inkl. Mwst. zzgl. Versandkosten) angezeigt bekommt, sondern

    (inkl. 19% Mwst. oder inkl. 20% Mwst.)

    Jetzt versuche ich mich bereits seit Tagen daran, in dem Override /template/NAME/html/com_virtuemart/productdetails/default.php den entsprechenden Code zu hinterlegen. Es gelingt mir einfach nicht.

    Auch eine Suche in den Weiten des www ergab keine konkrete Lösung. Bin ich denn tatsächlich der einzigste, welcher vor dieser Aufgabe sitzt und auf der Seite den MWST. Satz angezeigt bekommen möchte. Es müssen doch viele andere User von diesem Ust.Problem, welche auch Virtuemart verwenden, betroffen sein.

    Gibt es hier vielleicht jemanden, welcher mir helfen und mir sagen kann, welcher Code an welcher Stelle geändert werden muss, damit das klappt?
    (gern auch per PM und gegen Bezahlung)

    Ich verwende übrigens Joomal 3.10.11 und VM 4.0.6

  • Servus,


    ich bin mir nicht sicher, ob die Variable für den MwSt.-Prozentsatz.in den Produktdetails zur Verfügung steht.

    MwSt. und Endpreis stehen jedoch als Zahlenwert zur Verfügung, damit kann man den Prozentsatz notfalls über Dreisatz berechnen.


    Die beste Stelle für eine Änderung dürfte das Sublayout prices.php sein.
    Dort einfach über var_dump die Variable

    $product->prices

    ausgeben lassen und schauen, was zur Verfügung steht.


    Grüße

    Stefan

    PS. Natürlich mache ich solche Arbeiten auch für Kunden, aber zur Zeit ist die ToDo-Liste voll. Das würde etwas dauern. Vielleicht passt es ja mit den oben genannten Hinweisen.

  • Hallo Stefan, erst einmal Danke für dein Feedback. Ich denke, dein Ansatz könnte erfolgsversprechend sein.
    Ich konnte nun mit Hilfe von var_dump($product->prices); das Array auslesen. Hierbei habe ich aber noch ein kleines Verständnisproblem. Die Zeile, in welcher die Mwst. zu finden ist, lautet:


    ["VatTax"]=> array(1) { [27]=> array(8) { [0]=> string(16) "MwSt. 19%" [1]=> string(7) "19.0000" [2]=> string(2) "+%" [3]=> string(1) "0" [4]=> string(2) "47" [5]=> string(0) "" [6]=> string(1) "1" [7]=> string(2) "27" } }


    Daher habe ich äuivalent zu der nachfolgenden Zeile

    echo $currency->createPriceDiv ('priceWithoutTaxTt', 'COM_VIRTUEMART_PRODUCT_SALESPRICE_WITHOUT_TAX_TT', $product->prices);

    eine neue Zeile untendrunter angelegt.


    echo $currency->createPriceDiv ('VatTax', 'Mwst-Wert', $product->prices);

    Als Ergebnis wird mir im Frontend nun folgendes angezeigt: Mwst-Wert 1,00 €
    Vermutlich muss noch die Klammer mit der [0] irgendwo mit hin, damit stattdessen => MwSt. 19% angezeigt wird.

    Kannst Du mir vielleicht sagen, wie die Zeile richtig aussehen muss?

  • Es ist alles da. Es ist günstig die debug möglichkeiten von vm zu nutzen. Also bau mal in der default.php das ein

    Code
    1. vmdebug('My product',$this->product->loadFieldValues());
    2. //bzw in prices.php
    3. vmdebug('My product',$product->loadFieldValues());

    Man kann vmdebug grundsätzlich wie console.log in js benutzen. Also

    Code
    1. vmdebug('My product',$myValue1, $interestingValue2, $WasIshier, ...);

    Im oben Falle braucht man das loadFieldValues, damit der nicht die verlinkte db des VmTables mitlädt.


    Dann vmdebug für admins aktivieren, auf der Seite einloggen und man sieht die Ausgabe (geht daher live!). Da sieht man dann die Ausgabe für "My product" und ne menge anderen Krempel, das einfach ignorieren. My product is auf jeden Fall die größte Ausgabe darin, also nicht zu übersehen. Ganz oben bei der Ausgabe für "My product" steht "Array", das liegt an loadFieldValues, es ist eigentlich ein Object! Also eigentlich sollte da Object stehen und nicht Array. Ansonsten wirds jetzt einfach.

    Man sieht da ein Array "allPrices", das erstmal ignorieren, wir scrollen weiter zu "prices" was wieder ein array ist. Dort gibts wieder ein Unterarray und das heisst VatTax, dort steht die benutzte Tax drin. Also bei mir sieht in etwa so aus.


    Also bekommt man mit

    Code
    1. $this->product->prices['VatTax'][1][1]

    den exakten Steuerbetrag.

    Sollte ich wohl mal in ein manual packen. Ich wüßte nicht, wie ich das über das EuvatId plugin machen könnte, da nach meiner Erfahrung gerade das Preislayout am ehesten angepasst wird.

    Ahja, und weil du im sublayout bist, ist es immer $product und nicht $this->product

  • Danke Milbo,

    irgendetwas mache ich bei mir falsch oder verstehe es nicht richtig.

    1. In der Datei /template/NAME/html/com_virtuemart/productdetails/default.php habe ich folgenden Block, welcher mir den Preis anzeigt, gefunden:
    echo shopFunctionsF::renderVmSubLayout('prices',array('product'=>$this->product,'currency'=>$this->currency));
    Wenn ich diese Zeile entferne, verschwindet der gesamte Preisblock. Hier komme ich also nicht an die einzelnen Daten heran.

    2. Nun habe ich in der Datei /template/NAME/html/com_virtuemart/sublayouts/prices.php weitergesucht und folgende Änderungen ausprobiert:

    2.1. Aktivierung des VMDebug
    Ergebnis: Egal, an welche Stelle ich die Zeile vmdebug('My product',$product->loadFieldValues()); hinterlege; es kommt beim Aufruf im Frontend immer die Warnung => Call to undefined method stdClass::loadFieldValues()


    2.2. Als nächstes habe ich dann versucht, die Zeile $product->prices['VatTax'][1][1]; mit zu integrieren. Das habe zwischen folgende Zeilen gepackt:


    $infotax = vmConfig::get('vm_prices_info_tax', 0);

    $product->prices['VatTax'][1][1];

    $infodelivery = vmConfig::get('vm_prices_info_delivery', 0);

    Nach meinem Verständnis, müsste ja nun etwas zwischen "inkl. MwSt. zzgl. Versandkosten" dazwischengepackt werden. Aber leider keine Erfolg.
    Wo habe ich denn hier einen Denkfehler?


    Übrigens, wie kann ich den den Quelltext als Code, wie bei Dir oben in diesen Editor einfügen? Der Quellcode und auch der Inlinecode funktioniert dazu nicht.

  • signmaxone

    Hat den Titel des Themas von „Anzeige des Mwst.-Betrages in der Produktübersicht.“ zu „Anzeige des Mwst.-Satzes in der Produktübersicht.“ geändert.
  • Die Funktion createPriceDiv wird nicht benötigt. Die Prozentzahl ist kein Preis und benötigt keine Währung/Berechnung.

    Ein einfacher echo-Befehl im Sublayout prices.php sollte reichen.


    Sofern $this->product->prices['VatTax'][1][0] hier ein passender Name der Rechenregel ist.


    echo '(inkl. ' . $this->product->prices['VatTax'][1][0] . ')';


    oder etwas verständlicher für den Code-Leser.


    $aktuellerMwstRegelName = $this->product->prices['VatTax'][1][0];

    echo '(inkl. ' . $aktuellerMwstRegelName . ')';


    Grüße

    Stefan

    Edit: 0 statt 1.

  • Danke Milbo,
    .....
    2. Nun habe ich in der Datei /template/NAME/html/com_virtuemart/sublayouts/prices.php weitergesucht und folgende Änderungen ausprobiert:

    2.1. Aktivierung des VMDebug Ergebnis: Egal, an welche Stelle ich die Zeile vmdebug('My product',$product->loadFieldValues()); hinterlege; es kommt beim Aufruf im Frontend immer die Warnung => Call to undefined method stdClass::loadFieldValues()

    Ja, "lustig", oder? Den Fehler hatte ich dann einen Tag später auch und wunderte mich, wie ich die Ausgabe erhalten habe. Werde mich aber um das Rätsel später kümmern

    2.2. Als nächstes habe ich dann versucht, die Zeile $product->prices['VatTax'][1][1]; mit zu integrieren. Das habe zwischen folgende Zeilen gepackt:


    $infotax = vmConfig::get('vm_prices_info_tax', 0);

    $product->prices['VatTax'][1][1];

    $infodelivery = vmConfig::get('vm_prices_info_delivery', 0);

    Nach meinem Verständnis, müsste ja nun etwas zwischen "inkl. MwSt. zzgl. Versandkosten" dazwischengepackt werden. Aber leider keine Erfolg.
    Wo habe ich denn hier einen Denkfehler?

    Eigentlich keinen wirklichen. Also letztendlich geht der Code für eine schöne formattierte Ausgabe doch etwas anders, merk ich grade. Entweder man nimmt den Namen, in meinem Falle steht dann da Tax 20%. Also

    Code
    1. echo $product->prices['VatTax'][1][0];

    Oder man baut es sich zusammen, also das wäre so

    Code
    1. echo 'inkl MwSt: '.round($product->prices['VatTax'][1][1],0).'%';


    Übrigens, wie kann ich den den Quelltext als Code, wie bei Dir oben in diesen Editor einfügen? Der Quellcode und auch der Inlinecode funktioniert dazu nicht.

    Im hintergrund arbeitet ein html editor. Kann man oben ganz links ansehen, was im Hintergrund passiert. Oben rechts neben der Sprechblase kann man Absätze als Code definieren. Aber in meinem Falle hat der das beim kopieren erkannt und automatisch gemacht. Mußte auch erstmal suchen.

    Haste dir das schonmal durchgelesen? https://docs.virtuemart.net/tu…basics-for-templater.html

  • Ich habe soeben mal etwas weiter getestet und dabei folgendes herausgefunden. Dazu bin ich als erstes mal an das Array herangegangen

    Hier habe ich die eckigen Klammer analysiert und meinen Fehler gefunden. Der Code muß so lauten:

    Code
    1. echo 'inkl. '.round($product->prices['VatTax'][27][1]).'% Mwst.';

    Und siehe da, im Frontend wird nun angezeigt: inkl. 19% Mwst. Die Freude hielt aber nicht lange an. Nach einem Länderwechsel zeigt es nur noch folgendes an: inkl. 0% Mwst. Also wieder das Array verglichen und was soll ich sagen. Alles ähnlich, aber eben doch anders mit folgendem Code:

    Also ist die erste Zahl in der Klammer aus dem Array und der Block [7] das Land. Das bedeutet, das meine Codezeile nun nicht mehr passt.

    [27] Deutschland
    [28] Dänemark
    [22] Schweiz


    Könnte man vielleicht die Zahl aus der ersten Klammer mit einem Platzhalter ersetzen wie z.B.:

    Code
    1. echo 'inkl. '.round($product->prices['VatTax'][??][1]).'% Mwst.';

    Hier enden leider meine Kennnisse zu PHP. Wenn das nicht geht, wäre vielleicht auch der Ansatz von Stefan mit dem Dreisatz aus MwSt., Endpreis und Prozentsatz eine Variante zur Problemlösung.

  • TADA !!!! Ich habe vermutlich soeben das Problem folgendermaßen lösen können:

    Code
    1. foreach($product->prices['VatTax'] as $VatTax){
    2. $mwst = $VatTax;
    3. } echo 'inkl. '.round($mwst[1]).'% Mwst.';

    Jetzt muß ich nur noch die hardgecodeten Sprachfiles in einem Sprach-Override austauschen und die Anzeige an die richtige Stelle bringen. Ich lasse das Ticket erst noch mal geöffnet, mache ein paar Tests mit Anmeldungen aus verschiedenen Ländern und halte Euch auf dem Laufenden.

  • Hahah, interessante Lösung. Das gefällt mir. Aber es gibt eine einfachere lösung für das Problem. Aber ja das ist "nasty", da mußte ich mich auch erst reindenken und schrieb jahrelang PHP ohne dieses Wissen (haha, welche "Schande", naja es ist halt wirklich nur selten notwendig, aber ich stolperte immer wieder über dieses Problem, "hol den ersten eintrag, keine Ahnung die Id ist, interessiert mich auch nicht").

    Code
    1. reset($product->prices['VatTax']);    //setzt den array Zeiger auf die erste Position https://www.php.net/manual/de/function.reset.php
    2. $mwStWert = current($product->prices['VatTax']);    //holt den Wert, wo der Zeiger gerade steht. https://www.php.net/manual/de/function.current.php
    3. echo 'inkl. '.round($mwStWert).'% Mwst.';

    Da in deinem Falle die Foreach sowieso nur einen Eintrag hat (imho immer), ist es sogar fraglich ob deine Version soviel langsamer wäre. Naja, im Zweifel doch einige Takte mehr. Allerdings frage ich mich, ob ich das nicht umschreiben sollte. Ich glaube die Zahl ist die ID der Steuerregel.

    Btw, das ganze ist komplett mit den Befehlen "end", "prev" und "next". Man kann also eine foreach auch als while schleife schreiben, aber is immer kagge, wegen den Abbruch Bedingungen. eine While schleife sollte immer eine Abbruchbedingung haben. Gab da mal ne Untersuchung darüber. 95% der Schleifen (oder so) sind daher mit for bzw foreach.

  • signmaxone

    Hat das Label Gelöst: hinzugefügt