# Eigene Funktionen

# Ortsteil überOpenstreetmap holen

### Beschreibung:

Eine Frontendfunktion die über einen Button ausgelöst werden kann um den Ortsteil zu holen.  
Übergeben werden die Felder aus dem Formular wo die Funktion drin ist.  
Und als Rückgabe der Ortsteil der dann dem Feld zugewiesen wird.  
Frontend Funktionen sind Java Script Funktionen

### Die Funktion ist in zwei teile geteilt.

Einmal die httpget Funktion die ein Data Objekt zurück gibt  
Und die parse Funktion in der httpget aufgerufen wird

```
function httpGet(url, onSuccess, onError) {
    console.log("Anfrage wird gestartet:", url);
    fetch(url, {
        method: "GET",
        headers: {
            "User-Agent": "Rei3-Frontend"
        }
    })
        .then(response => {
            if (!response.ok) {
                throw new Error(`HTTP-Fehler! Status: ${response.status}`);
            }
            return response.json();
        })
        .then(data => {
            if (onSuccess) {
                onSuccess(data);
            }
        })
        .catch(error => {
            console.error("Fehler bei der HTTP-Anfrage:", error);
            if (onError) {
                onError(error);
            }
        });
}


function httpGetold(url, onSuccess, onError) {
	app.dialog_show("Info","Start");
    const xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    app.dialog_show("Info","Open");
    xhr.onload = function () {
        if (xhr.status >= 200 && xhr.status < 300) {
            try {
                const response = JSON.parse(xhr.responseText);
                if (onSuccess) {
                    onSuccess(response);
                }
            } catch (error) {
                app.dialog_show("Info","Fehler beim Verarbeiten der HTTP-Antwort:"+ error);
                if (onError) {
                    onError(error);
                }
            }
        } else {
            app.dialog_show("Info","HTTP-Fehler:"+xhr.status+" "+xhr.statusText);
            if (onError) {
                onError(xhr.statusText);
            }
        }
    };

    xhr.onerror = function () {
        app.dialog_show("Info","Netzwerkfehler bei der HTTP-Anfrage.");
        if (onError) {
            onError("Netzwerkfehler");
        }
    };
	app.dialog_show("Info","Ende httpget");
    xhr.send();
    
}

function fetchSuburbFromOSM() {
    	// Werte aus den Formularfeldern abrufen
    const street = app.get_field_value({F3: 0 customer_adresses.street});
    const postcode = app.get_field_value({F5: 0 customer_adresses.plz});
    const city = app.get_field_value({F6: 0 customer_adresses.city});

    // Überprüfen, ob die erforderlichen Felder ausgefüllt sind
    if (!street || !postcode || !city) {
         app.dialog_show("Info", "Bitte füllen Sie alle erforderlichen Felder aus (Straße, Postleitzahl, Ort).");
        return;
    }

    // Anfrage-URL für die Nominatim API erstellen
    const query = `${street}, ${postcode}, ${city}`;
    const url = `https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(query)}&format=json&addressdetails=1`;

    // HTTP-GET-Aufruf
    httpGet(
        url,
        function (data) {
            // Erfolg: API-Antwort analysieren
            
            if (data.length > 0) {
            	
                const address = data[0].address;
                const suburb = address.village || address.hamlet || null;
				
                if (suburb) {
                    app.set_field_value({F9: 0 customer_adresses.district}, suburb, true);
                    app.dialog_show("Erfolg", `Ortsteil/Hamlet: ${suburb}`);
                } else {
                    app.dialog_show("Info", "Dieser Ort hat keinen spezifischen Ortsteil.");
                    app.set_field_value({F9: 0 customer_adresses.district}, "", true);
                }
            } else {
                app.dialog_show("Warnung", "Keine Ergebnisse für die eingegebene Adresse gefunden.");
                app.set_field_value({F9: 0 customer_adresses.district}, "", true);
            }
            
        },
        function (error) {
            // Fehler: Meldung ausgeben
            app.dialog_show("Fehler", "Die Anfrage an OpenStreetMap ist fehlgeschlagen.");
        }
    );
    
}
fetchSuburbFromOSM();
```

# Aktelleus Datum mit Uhrzeit in ein Feld setzten

### Beschreibung:

Man möchte das ein Datumsfeld beim speichern zum Beispiel gesetzt wird.  
Funktioniert auch, falls das Datumsfeld versteckt ist oder disabled ist.

### Lösung:

Das machen wir mit einer Frontend Funktion

Diese kann zum beispiel bei einer Wert Anderung aufgerufen werden:

[![image-1737969255929.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-01/scaled-1680-/FsnCLr3cSfyuKmCp-image-1737969255929.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-01/FsnCLr3cSfyuKmCp-image-1737969255929.png)

Wir erstellen also erst die Frontendfunktion und lassen diese auf das jeweilige Formualr verknüpfen

[![image-1737969314875.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-01/scaled-1680-/6GRbvdMRAVelLHPl-image-1737969314875.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-01/6GRbvdMRAVelLHPl-image-1737969314875.png)

Nun der Code

```
app.form_show_message("start", 10000);
	if (app.get_field_value({F6: 0 todo_programming.done}) == true)
	{
		app.form_show_message("set date", 10000);
		app.set_field_value({F8: 0 todo_programming.solved_date},  Math.floor(Date.now() / 1000), true);
		
	}
```

Was macht der Code, wir fragebn ab ob Feld 6 Ein boolean Feld wahr also true ist.  
Ist dies der Fall soll das Feld F8 ein Datumsfeld auf das Aktuelle Datum gesetzt werden.  
Der Wert ist der Wert in Sekunden, das Datumsfeld wiederum interpretiert daraus das Datum und Uhrzeit.  
So kann in dem Datumsfled in den benutzereinstellungen jede anziege von Datumsformaten genutzt werden. Entwerder AMI oder Europisch oder oder.

Der eigentliche Code für die aktuelle Zeit ist:

```
Math.floor(Date.now() / 1000)
```

Für die Erstellung eines Datensatzes mit Aktuellem Datum, brauchen wir keine Funktion, das kann man in der Tabelle/Relation hinterlegen. Wir brauchen die Funktion oben zum nachträglichen ändern.

[![image-1737969739435.png](https://wiki.hacker-net.de/uploads/images/gallery/2025-01/scaled-1680-/Z3pTCvfGbdLgaXJV-image-1737969739435.png)](https://wiki.hacker-net.de/uploads/images/gallery/2025-01/Z3pTCvfGbdLgaXJV-image-1737969739435.png)