sistema questo codice python per fargli inviare i dati a sap tramite la creazione e riempimento di un xml dai dati letti dall'excel o csv.
import base64
import uuid
import requests
from datetime import datetime
import pandas as pd
from openpyxl import load_workbook
import os
from zeep import Client

# Definizione di una classe per gestire le eccezioni relative all’utilizzo della classe TimeSheet
class TimeSheetException(Exception):
    pass

# Classe che gestisce l’invio dei dati del timesheet a SAP
class TimeSheet:
    def __init__(self, edi_profile):
        self.edi_profile = edi_profile
        self.client = Client(self.edi_profile["HOR SAP devel. Endpoint"])

    # Metodo per l'invio di una richiesta Post a SAP
    def post(self, environment: int, soap_action: str, request: str) -> str:
        if environment not in [1, 2]:
            raise TimeSheetException("Ambiente non valido")

        # Verifica della presenza dell'eventuale log delle richieste SOAP generate
        if self.edi_profile["HWY Log SAP Interface"]:
            with open(f"Req_{soap_action}{datetime.now():%Y%m%d%H%M%S}.xml", "w") as f:
                f.write(request)

        # Verifica della presenza dell'eventuale modalità "Dry Run"
        if self.edi_profile["HWY SAP Dry Run"]:
            raise TimeSheetException("Modalità dry run attivata")

        url = self.edi_profile["HOR SAP devel. Endpoint"]
        if environment == 1:
            url = self.edi_profile["HOR SAP Prod. Endpoint"]

        headers = {
            "Content-Type": "application/soap+xml",
            "SOAPAction": soap_action,
        }

        # Invio della richiesta Post
        response = requests.post(url, data=request.encode(), headers=headers)

        # Verifica della presenza dell'eventuale log delle risposte SOAP generati
        if self.edi_profile["HWY Log SAP Interface"]:
            with open(f"Res{soap_action}{datetime.now():%Y%m%d%H%M%S}.xml", "w") as f:
                f.write(response.text)

        return response.text

    # Metodo per l'invio del timesheet a SAP
    def send_time_sheet_to_sap(self, employee_code, date, code, company_code, file_path):
        full_file_path = os.path.join(os.getcwd(), file_path)
        if not os.path.isfile(full_file_path):
            raise TimeSheetException("Percorso del file non valido")

        # Verifica del formato del file
        if file_path.endswith(".csv"):
            df = self.read_csv(full_file_path)
        elif file_path.endswith(".xlsx"):
            df = self.read_excel(full_file_path)
        else:
            raise TimeSheetException("Formato del file non valido")

        # Iterazione sui record del file per l'invio del timesheet a SAP
        for index, row in df.iterrows():
            ts = self.client.service.Z_HR_TIME_SHEET_SYNC_REQ()
            ts.PERNR = row["Employee Code"]
            ts.BEGDA = row["Date"]
            ts.SUBTY = row["Code"]
            ts.BUKRS = row["Company Code"]
            ts.AEDTM = datetime.now()

            request = str(ts)
            soap_action = "Z_HR_TIME_SHEET_SYNC_REQ"
            environment = self.edi_profile["HOR SAP Time Sheet Integration"]
            self.post(environment, soap_action, request)

    # Metodo per la creazione del timesheet
    def _create_time_sheet(self, employee_code, date, code, company_code, ts_data):
        ts = {
            "PERNR": employee_code,
            "BEGDA": date,
            "SUBTY": code,
            "BUKRS": company_code,
            "AEDTM": datetime.now(),
        }
        ts.update(ts_data)  # Aggiunta dei dati del timesheet dal file di input
        return pd.Series(ts).to_dict()

    # Metodo per il parsing della risposta ricevuta da SAP
    def parse_response(self, response: str) -> dict:
        # Implementazione della logica di parsing della risposta qui
        return {}

    # Metodo per la lettura di un file .csv
    def read_csv(self, file_path):
        df = pd.read_csv(file_path)
        return df

    # Metodo per la lettura di un file .xlsx
    def read_excel(self, file_path):
        wb = load_workbook(filename=file_path, read_only=True)
        if wb.active:
            sheet = wb.active
            headers = [cell.value for cell in sheet[1]]
            data = []
            for row in sheet.iter_rows(min_row=2, values_only=True):
                data.append(row)
            df = pd.DataFrame(data, columns=headers)
            return df
        else:
            raise TimeSheetException("File Excel vuoto")

    # Metodo per il recupero dei dati del timesheet
    def get_timesheet_data(self, filename):
        if filename.endswith(".csv"):
            df = pd.read_csv(filename)
        elif filename.endswith(".xlsx"):
            df = pd.read_excel(filename)
        else:
            raise TimeSheetException("Formato del file non valido")

        # Pulizia e preprocessamento dei dati
        df.dropna(inplace=True)
        df["date"] = pd.to_datetime(df["date"], format="%d/%m/%Y").dt.date
        df["employee_code"] = df["employee_code"].astype(str).str.zfill(8)
        df["hours"] = df["hours"].astype(float)

        return df.to_dict("records")

# Utilizzo

# Definizione del profilo EDI
edi_profile = {
    "HOR SAP Company": "Esempio Nome",
    "HOR SAP Time Sheet Integration": 1,
    "HOR SAP Prod. Endpoint": "http://esempio.com/prod",
    "HOR SAP devel. Endpoint": "http://esempio.com/dev",
    "HWY Log SAP Interface": True,
    "HWY SAP Dry Run": False,
}
ts = TimeSheet(edi_profile)
ts.send_time_sheet_to_sap("R01", datetime(2021, 6, 25).date(), "I", "SAP0001", "timesheet_data.csv")

# Lettura dei dati da un file .csv
csv_file_path = "timesheet_data.csv"
timesheet_data = ts.read_csv(csv_file_path)
for data in timesheet_data:
    ts.send_time_sheet_to_sap(data['employee_code'], data['date'], data['code'], data['company_code'])

# Lettura dei dati da un file .xlsx
excel_file_path = "timesheet_data.xlsx"
timesheet_data = ts.read_excel(excel_file_path)
for data in timesheet_data:
    ts.send_time_sheet_to_sap(data['employee_code'], data['date'], data['code'], data['company_code'])