Skip to content

Instantly share code, notes, and snippets.

@rorar
Last active November 2, 2024 10:56
Show Gist options
  • Save rorar/00b956d91ba1050cab292a518235989f to your computer and use it in GitHub Desktop.
Save rorar/00b956d91ba1050cab292a518235989f to your computer and use it in GitHub Desktop.
ECB USD-EUR Exchange Rate Fetcher for Odoo Import
/*
Dieses Python-Skript lädt die historischen Tageswechselkurse der Europäischen Zentralbank (ECB) für das Währungspaar USD-EUR herunter und bereitet sie für den Import in das ERP-System Odoo (18.0 Enterprise) vor.
Es erstellt eine CSV-Datei mit den folgenden Spalten: Datum, Unit per EUR, EUR per Unit und currency_id.
Die Spalte currency_id enthält den Wert USD, um sicherzustellen, dass Odoo die Währung korrekt zuordnet
## How To
1. Erstelle einen Ordner (bspw. auf dem Desktop)
2. Erstelle eine Textdatei, Kopiere das Script dort hinein, benenne die Textdatei um zu "ECB USD-EUR Exchange Fetcher.py"
3. In der Konsole: `pip install pandas requests lxml`
4. Führe das Script aus
--> Eine CSV-Datei"ecb_usd_eur_rates.csv" wird generiert
5. In Odoo: Gehe zu Einstellungen > Währungen > Schaltfläche: Währungen > Suche nach "USD" > Klicke auf die Zeile "USD" >
--> Eine Einstellungsseite zu der Währung erscheint
6. Klicke oben links neben USD auf das Zahnrad ⚙️ > Wechselkurse anzeigen
--> Eine Einstellungsseite zu den Wechselkursen erscheint
Info: Falls schon Datenzeilen vorhanden sind, lösche die entsprechenden Zeilen aus deiner CSV-Datei heraus
7. Klicke erneut oben links neben Wechselkurse anzeigen auf das Zahnrad ⚙️ > Datensätze importieren
--> Eine Importseite erscheint
8. Klicke auf "Datendatei hochladen"
9. Wähle ecb_usd_eur_rates.csv
--> Eine Übersichtseite mit den zu wählenden Kopfzeilen der CSV-Tabelle erscheint
10. Wähle die entsprechenden Kopfzeilen mit den Dropdown-Menü aus (siehe unten)
## Import in Odoo
Beim Import beachten:
- Unit per Euro (Feld: company_rate) = Unternehmensrate
- EUR per Unit (Feld: inverse_company_rate) = Inverser Unternehmenskurs
- currency_id leer lassen (wird automatisch erkannt)
## Disclaimer
Dieses Skript und die zugehörigen Daten werden ohne Gewähr bereitgestellt.
Die Wechselkurse werden von der Europäischen Zentralbank (ECB) bereitgestellt und unterliegen deren Genauigkeit und Verfügbarkeit.
Der Autor dieses Skripts übernimmt keine Haftung für die Richtigkeit, Vollständigkeit oder Aktualität der Informationen, die in der CSV-Datei generiert werden.
Nutzer sollten die Wechselkurse stets mit offiziellen Quellen vergleichen, bevor sie geschäftliche Entscheidungen treffen. Die Nutzung dieses Skripts erfolgt auf eigenes Risiko, und jegliche Haftungsansprüche gegen den Autor, die sich aus der Verwendung der bereitgestellten Informationen ergeben, sind ausgeschlossen.
*/
import pandas as pd
import requests
from datetime import datetime
import xml.etree.ElementTree as ET
# URL für die Tageskurse der ECB
ECB_URL = 'https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml'
def fetch_ecb_data():
# XML-Daten von der ECB-Website herunterladen
response = requests.get(ECB_URL)
response.raise_for_status()
return response.content
def parse_ecb_data(xml_data):
# XML-Daten parsen und in ein DataFrame umwandeln
root = ET.fromstring(xml_data)
namespace = {'ns': 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref'}
data = []
for cube in root.findall(".//ns:Cube[@time]", namespaces=namespace):
date = cube.get("time")
for rate in cube.findall("ns:Cube[@currency='USD']", namespaces=namespace):
usd_per_eur = float(rate.get("rate"))
eur_per_usd = 1 / usd_per_eur
data.append([date, usd_per_eur, eur_per_usd, "USD"]) # "USD" für currency_id hinzufügen
df = pd.DataFrame(data, columns=["Datum", "Unit per EUR", "EUR per Unit", "currency_id"])
return df
def save_to_csv(df, filename="ecb_usd_eur_rates.csv"):
# Speichern als CSV-Datei
df.to_csv(filename, index=False)
print(f"Datei gespeichert: {filename}")
# Hauptablauf
if __name__ == "__main__":
xml_data = fetch_ecb_data()
df = parse_ecb_data(xml_data)
save_to_csv(df)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment