Jetzt hast du mich so Neugierig auf meine eigene Lösung gemacht, dass ich nicht mehr anders konnte als zu schauen wie es gelöst wurde:
Wir haben und damals für eine zusätzliche Angabe "Bezugsnebenkosten UST [7|19]%" in der Zusammenfassung entschieden. Zugleich hatten wir so eine einfachere Möglichkeit beim automatisierten Export ins Warenwirtschaftssystem dies als separate Angebe zu handhaben. Sieht dann z.B: so aus:
1x Artikel 1: 1x 29,95 EUR = 29,95 EUR, UST 19%
1x Artikel 2: 1x 2,95 EUR = 2,95 EUR, UST 7%
Zwischensumme: 32,90 EUR
Versandkosten: 6,95 EUR
inkl. UST 19%: 4,78 EUR
inkl. UST 7%: 0,19 EUR
inkl. Bezugsnebenkosten UST 19%: 1,11 EUR
zu zahlender Gesamtpreis: 39,85 EUR
In der Lösung wird wie bereits angedeutet immer der höchste Steuersatz der in den Bestellten Artikeln vorkommt für die Versandkosten verwendet. Dies wurde damals so mit einem Steuerberater besprochen und von ihm als korrekt beurteilt. Ob diese Lösung immer noch Rechtskonform ist kann ich nicht sagen, habe aber veranlasst dies zu prüfen.
Zudem habe ich bei meiner eigenen Recherche zwei Möglichkeiten zur Berechnung gefunden:
- Versandkosten werden mit dem Steuersatz angegeben, von denen der summierte Warenwert höher ist (wie vom MasterChief bereits erläutert)
- Versandkosten werden je nach Anteil der bestellten Waren mit 7% und 19% besteuert besteuert.
Ob nur eine der drei Lösungen korrekt ist, oder nur zwei oder nur eine einzige habe ich ebenfalls veranlasst zu prüfen.
Nun zu meinen Anpassungen im Shop, diese können zu jeder der beiden anderen Varianten erweitert werden:
1. Es wurde eine neue Steuerklasse "Steuersatz nach Bestellung" im Backend erstellt
2. Zwei neue Steuersätze "EU" und "EU-Ausland" für die neue Steuerklasse angelegt, beide zur Identifizierung mit einem Steuersatz von 100%, später mehr dazu
3. Alle verwendeten Versandarten wurde dieser Steuersatz zugewiesen
4. Änderungen im Core:
Datei
/inc/xtc_get_tax_rate.inc.phpnach Zeile:
while ($tax = xtc_db_fetch_array($tax_query,true)) {
einfügen:
/** BOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/ if ('100.0000' == $tax['tax_rate']) { global $order; $tax['tax_rate'] = 0; if ($order instanceof order
&& count($order->products)) { foreach ($order->products as $p) { if ($p['tax'] > $tax['tax_rate']) { $tax['tax_rate'] = $p['tax']; } } } } /** EOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/ Datei
/inc/xtc_get_tax_description.inc.phpZeile:
$tax_query = xtDBquery("select tax_description from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . $country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . $zone_id . "') and tr.tax_class_id = '" . $class_id . "' order by tr.tax_priority");
ersetzt durch:
/** BOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/
//$tax_query = xtDBquery("select tax_description from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . $country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . $zone_id . "') and tr.tax_class_id = '" . $class_id . "' order by tr.tax_priority");
$tax_query = xtDBquery("select tax_description, tax_rate from " . TABLE_TAX_RATES . " tr left join " . TABLE_ZONES_TO_GEO_ZONES . " za on (tr.tax_zone_id = za.geo_zone_id) left join " . TABLE_GEO_ZONES . " tz on (tz.geo_zone_id = tr.tax_zone_id) where (za.zone_country_id is null or za.zone_country_id = '0' or za.zone_country_id = '" . $country_id . "') and (za.zone_id is null or za.zone_id = '0' or za.zone_id = '" . $zone_id . "') and tr.tax_class_id = '" . $class_id . "' order by tr.tax_priority");
/** EOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/
und nach Zeile:
while ($tax = xtc_db_fetch_array($tax_query,true)) {
einfügen:
/** BOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/ if ('100.0000' == $tax['tax_rate']) { global $order; $tax['tax_rate'] = 0; if ($order instanceof order
&& count($order->products)) { $prefix = $tax['tax_description'] . ' '; foreach ($order->products as $p) { if ($p['tax'] > $tax['tax_rate']) { $tax['tax_rate'] = $p['tax']; $tax['tax_description'] = $prefix . $p['tax'] . '%'; } } } } /** EOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/ Datei
/checkout_shipping.phpvor Zeile:
$quotes[$i]['methods'][$j]['price'] = $xtPrice->xtcFormat(xtc_add_tax
($quotes[$i]['methods'][$j]['cost'], isset($quotes[$i]['tax']) ?
$quotes[$i]['tax'] : 0), true, 0, true).xtc_draw_hidden_field
('shipping', $quotes[$i]['id'].'_'.$quotes[$i]['methods'][$j]['id']); einfügen
/** BOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/
if ('zones' == $quotes[$i]['methods'][$j]['id']) {
$quotes[$i]['methods'][$j]['price'] = $xtPrice->xtcFormat($quotes[$i]['methods'][$j]['cost'], true, 0, true).xtc_draw_hidden_field('shipping', $quotes[$i]['id'].'_'.$quotes[$i]['methods'][$j]['id']);
} else
/** EOF - Timo Paul - tax-rate for shipping is the highest rate of ordered products **/
Das ganze führt zu einem brauchbarem Ergebnis. Ob es nun Rechtskonform ist oder nicht lass ich noch offen. Wenn sich Jemand an die Umsetzung einer der beiden alternativen Berechnungen wagen möchte, kann er es gerne versuchen.
Besten Gruß,
Timo