Team Manager um eigene Funktionen erweitern dank enaio®-Event-Scripting

Hallo zusammen, wie heute Morgen im Live-Stream (Youtube Live-Streams: ECMind Tech-Talks im Sommer & Herbst) versprochen, würde ich hier noch den Beispielcode zeigen, mit dem Ihr den Team Manager um eine ERP-Anbindung zu ergänzen:

Im Beispiel werden diese beiden Server-Events genutzt:

Events

Wir haben hier JS-Events genommen, wer noch VBS schreiben möchte ist natürlich frei. Der Empty-Job ist der Einsprungpunkt, welcher vom Team Manager genutzt wird.

enaio®-Event KernelBeforeJob::krn.EmptyJob

const teamManager = rc.require("TeamManager");
teamManager.dispatchJob(rc);

Wie Ihr seht, ruft diese Funktion mehr oder weniger nur die folgende Library auf. Wer will, kann den gesamten Code auch direkt im EmptyJob eintragen, die Aufteilung in eine zusätzliche Bibliothek macht es nur etwas übersichtlicher.

Library TeamManager

class TeamManager {
	dispatchJob(rc) {
		if(!rc.apps.inputParams.has("jobName")){
			return;
		}	
		const jobName = rc.apps.inputParams.get("jobName").value;	
		switch(jobName) {
			case "demo_job":
				this.getOpenOrders(rc)
				break											
        }
    }
	
    // Diese Funktion macht die Hauptarbeit, nimmt die Daten von enaio® entgegen,
    // ruft die Metadaten des ERPs ab und formatiert diese um
	getOpenOrders() {
        const username = rc.apps.inputParams.get("dmsUsername").value;
		const response = this.getJSONSync(`https://static.ecmind.ch/sap/${username}/getOpenOrders.json`);
		
		const orders = response.map((o) => {
			let orderStr = `**Bestellung ${o.order}:**\n`;
			orderStr = orderStr + `-  Kunde: **${o.customer}**\n`;
			orderStr = orderStr + `-  Bestelldatum: **${o.order_date}**\n`;
			orderStr = orderStr + `-  Summe. **EUR ${o.order_volume}**\n`;
			return orderStr;
		});

		let responseString = `#### Offene Bestellungen von ${username}:\n`;
		responseString = responseString + orders.join('\n');
  
                // Diese Parameter steuer die Ausgabe im Team Manager
		rc.apps.outputParams.set("jobSucceeded", response.length > 0);
		rc.apps.outputParams.set("message_success", responseString);
		rc.apps.outputParams.set("message_error", `**${username} hat keine offenen Bestellungen**`);
		rc.apps.outputParams.set("displayType", "markdown");
		rc.apps.outputParams.set("displayTimeMs", 15000);
	}

    // Diese Methode hilft dabei, ein JSON von einer URL zu laden.
    // Aufgrund von Vorgaben von eniao® muss dies synchron erfolgen.
    getJSONSync(url) { 
        var xhr = new rc.com.ActiveXObject("MSXML2.XMLHTTP");
            xhr.open("GET", url, false); 
            xhr.send();
            
        if (xhr.status === 200) {
			return JSON.parse(xhr.responseText);
        } else {
			rc.apps.logger.error(xhr.status.toString());
			console.error("Error fetching JSON:", xhr.status, xhr.statusText);
            return [];
		}
    }
}

module.exports = new TeamManager();

Die REST-Schnittstelle zum ERP ist hier fiktiv, damit ich es online zeigen kann, ohne ein echtes System exponieren zu müssen:

https://static.ecmind.ch/sap/${username}/getOpenOrders.json liefert für den $(username) = BAER_ADRIAN etwa dies:

[
    {
        "order": 7326283,
        "customer": "Schmidt Renovierungsservice GmbH",
        "order_date": "2024-06-15",
        "order_volume": 15000.50
    }, {
        "order": 8427364,
        "customer": "Meisterhandwerk Müller AG",
        "order_date": "2024-07-01",
        "order_volume": 20000.00
    }, {
        "order": 9562738,
        "customer": "Zimmerei und Holzbau König GmbH",
        "order_date": "2024-07-05",
        "order_volume": 18000.75
    }
]

Details zur Erweiterung des Team Managers findet Ihr natürlich auch im Admin-Handbuch. Ich freue mich auf Eure Fragen oder Gegenbeispiele. :slight_smile: