Angepasste Fremdwährungsumrechnung

Das DATEV-Export-Plugin kann auch angepasst werden, um Bestellungen in Fremdwährung automatisch umzurechnen. Das kann z.B. hilfreich sein, wenn die Buchhaltungs-Software die Fremdwährungs-Spalten in der DATEV-CSV-Datei nicht verarbeiten kann.

Die genaue Vorgehensweise sollte unbedingt mit der jeweiligen Steuerberatung abgesprochen werden. Eine zum Teil verwendete Vorgehensweise ist z.B. die Umrechnung der Beträge auf Basis des Vormonats-EZB-Referenzkurs, wie sie unten im Code dargestellt ist.

Wichtig: Keine Steuerberatung o.ä. - unbedingt mit der eigenen Steuerberatung absprechen!

/**
 * DATEV Export: Kombinierte Filterung und USD Konvertierung
 */

// Filter für USD zu EUR Konvertierung
add_filter('wcdtvfe_create_all_accounting_records', 'convert_usd_to_eur', 20, 2);

function convert_usd_to_eur($accounting_records, $order) {
    if (is_numeric($order)) {
        $order = wc_get_order($order);
    }

    if ($order && $order->get_currency() === 'USD' && !empty($accounting_records)) {
        $order_date = $order->get_date_created()->format('Y-m-d');
        $exchange_rate = get_ezb_exchange_rate($order_date);
        
        foreach ($accounting_records as $key => $record) {
            if (isset($record['001_revenue'])) {
                $usd_amount = (float)$record['001_revenue'];
                $eur_amount = round($usd_amount * $exchange_rate, 2);
                
                $accounting_records[$key]['001_revenue'] = $eur_amount;
                $accounting_records[$key]['014_posting_text'] .= sprintf(
                    ' (Original: USD %.2f @ %.4f)',
                    $usd_amount,
                    $exchange_rate
                );
            }
        }
    }
    
    return $accounting_records;
}

function get_ezb_exchange_rate($date) {
    $url = "https://api.frankfurter.app/$date?from=USD&to=EUR";
    
    $response = wp_remote_get($url);
    
    if (is_wp_error($response)) {
        error_log("Frankfurter API Fehler: " . $response->get_error_message());
        return false;
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);
    
    if (isset($body['rates']['EUR'])) {
        return $body['rates']['EUR'];
    }
    
    // Fallback: EZB Daily XML falls Frankfurter nicht verfügbar
    $xml_url = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml';
    $xml = simplexml_load_file($xml_url);
    $xml->registerXPathNamespace('ex', 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref');
    $rate_node = $xml->xpath("//ex:Cube[@currency='USD']");
    
    return !empty($rate_node) ? (float)$rate_node[0]['rate'] : 0.95;
}

Sie haben Fragen oder möchten ein Angebot anfordern?

Jetzt Kontakt aufnehmen
crosslist