Anleitung Steuersatz ändern bei gleichbleibenden Brutto-Preisen über die Datenbank

Thema wurde von tannenhof_imshausen, 7. Dezember 2024 erstellt.

  1. tannenhof_imshausen

    tannenhof_imshausen Erfahrener Benutzer

    Registriert seit:
    26. Oktober 2022
    Beiträge:
    95
    Danke erhalten:
    26
    Danke vergeben:
    40
    #1 tannenhof_imshausen, 7. Dezember 2024
    Zuletzt bearbeitet: 8. Dezember 2024
    Nachdem ich als pauschalierender Landwirt jetzt jährlich mit Änderungen des Steuersatzes konfrontiert werde, habe ich mich heute hingesetzt und eine feine SQL-Lösung ausgetüftelt, wie ich den Steuersatz ändern kann und die Brutto-Preise beibehalten.
    Vor dem Ausführen natürlich eine Datenbank-Sicherung erstellen.

    Verbesserungsvorschläge oder Hinweise auf Fehler sind gerne gesehen!

    Code:
    SET @Steuersatz_ALT = 1.09, @Steuersatz_NEU = 1.084, @tax_class_id=4 ;
    
    -- in Tabelle tax_rates nachschauen, welche tax_rates_id(s) wie angepasst werden sollen und wie die zugehörige tax_class_id lautet, entsprechend die Werte hier und in den Variablen oben anpassen
    UPDATE tax_rates
        SET tax_rate = 8.4, tax_description = '8.4% MwSt.'
        WHERE tax_rates_id IN (8,9)
            AND tax_class_id = @tax_class_id;
    
    
    -- bitte prüfen, wie viele Tabellen vorhanden sind (ist abhängig von der Anzahl der Kundengruppen), und ggf. Zeilen hinzufügen oder löschen
    UPDATE personal_offers_by_customers_status_1 SET personal_offer = round(round(personal_offer *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)     WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id);
    UPDATE personal_offers_by_customers_status_2 SET personal_offer = round(round(personal_offer *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)      WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id);
    UPDATE personal_offers_by_customers_status_3 SET personal_offer = round(round(personal_offer *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)     WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id);
    -- UPDATE personal_offers_by_customers_status_4 SET personal_offer = round(round(personal_offer *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)  WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id);
    
    -- ab hier sollten keine Anpassungen mehr nötig sein:
    UPDATE products
        SET products_price = ROUND(ROUND(products_price * @Steuersatz_ALT, 4) / @Steuersatz_NEU, 4)
        WHERE  products_tax_class_id = @tax_class_id;
    UPDATE products_attributes SET options_values_price = round(round(options_values_price *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)
        WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id);
    -- products_options_values.value_price : Wert ist brutto
    UPDATE products_properties_combis SET combi_price = round(round(combi_price *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)
        WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id);
    UPDATE products_properties_combis_defaults  SET combi_price = round(round(combi_price *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)
        WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id);
    -- products_properties_index.values_price : Wert ist brutto
    -- properties_values.value_price : Wert ist brutto
    
    -- nicht getestet, da Angebote bisher nicht benutzt
    UPDATE specials SET specials_new_products_price=round(round(specials_new_products_price *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)
        WHERE products_id in (SELECT products_id FROM products WHERE products_tax_class_id = @tax_class_id) and ( expires_date is NULL OR expires_date > CURRENT_DATE() ) ;

    Um herauszufinden, welche Versandkosten angepasst werden müssen, folgenden SQL-Befehl ausführen:

    Code:
    SELECT * FROM gx_configurations where `key` like  CONCAT('configuration/MODULE_SHIPPING_','%', '_TAX_CLASS') and `value` =@tax_class_id; 
    Solange ein fester Betrag hinterlegt ist, lässt sich dieser z.B. so anpassen:
    Code:
     UPDATE gx_configurations
    SET `value` =  round(round(`value` *@Steuersatz_ALT, 4)/@Steuersatz_NEU, 4)
     where `key` like  'configuration/MODULE_SHIPPING_FLAT_COST' and `value` <> '' ;
    Nur mit Bordmitteln von SQL lassen sich die Strings mit Gewichtsstaffelungen meines Wissen nicht aufteilen, dass müsste man mit PHP erledigen.
    Da Preisanpassungen bei den Versandkosten sowieso häufiger sind, habe ich in meiner Tabellenkalkulation, mit der ich selbige kalkuliere, auch Formeln verwendet, die mir diese Strings erzeugen. Diese füge ich dann manuell ein.