Zum Hauptinhalt springen

Einstellungen

info

Dies sind die Einstellungen, die die Sandbox verwenden.

Sandbox-Variablen

Dies ist eine Schlüssel-Wert-Wörterbuch-ähnliche Konfiguration. Sie ermöglicht es Ihnen, vordefinierte Variablen zu erstellen und diese in allen Sandbox-Verwendungen zugänglich zu machen.

Datenbankname abgleichen

Verwendet die Sandbox nicht direkt, sondern eine vereinfachte Version davon. Gibt den Namen der Abgleich-Datenbank (Kundendaten) zurück.

Fähigkeiten

  • Parst den Code wie ein String-Template
  • Sandbox-Variablen
  • project, branch, client Dokumente

Code-Beispiel

db-${client.name}-${project.name}-drinks

Prüffunktion

Führt benutzerdefinierte Logik aus, um festzustellen, welche Scans für eine bestimmte Zone manuell überprüft werden müssen. Die Funktion soll Flags über den bereitgestellten Helfer setVerificationNeeded setzen.

Fähigkeiten

  • setVerificationNeeded(scanIds[], boolean)
  • zone (aktuelles Zonen-Dokument)
  • sessionId (aktuelle Sitzungs-ID)
  • project, branch, client Dokumente
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer

Code-Beispiel

const sessions = await findZoneSessions({ zoneId: zone._id });

for (const zoneSession of sessions) {
const scans = await findScans({ originalSessionId: zoneSession._id });

for (const scan of scans) {
const needsReview = scan.count === 0;
await setVerificationNeeded(scan._id, needsReview);
}
}

await log(`Verify run for project ${project.code}, zone ${zone.code}`);

Scans transformieren

Führt benutzerdefinierte Logik aus, um Preise und Stückzahlen für Scans in einer Zone zu berechnen. Die Funktion setzt die Werte im Scan-Dokument über setPrice und setPieces.

Fähigkeiten

  • setPrice(scanId, value) setzt den Preis für einen Scan
  • setPieces(scanId, value) setzt die Stückzahl für einen Scan
  • scans[] Array aller Scans in der Zone
  • project, branch, client Dokumente
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer

Code-Beispiel

for (const scan of scans) {
// Round prices to 2 decimal places
const roundedPrice = Number((scan.price || 0).toFixed(2));
await setPrice(scan._id, roundedPrice);

// Calculate pieces based on case pack if available
if (scan.match?.CasePack) {
const pieces = scan.count * scan.match.CasePack;
await setPieces(scan._id, pieces);
}
}

await log(`Transformed ${scans.length} scans for zone ${zone.code}`);

QM-Modul - Scan-Konfiguration

Führt eine benutzerdefinierte Qualitätsregelprüfung als Nebeneffekt nach einer Sitzungserstellung oder -aktualisierung aus. Jede Regel sollte die Funktion setResult mit 2 Parametern verwenden: der Scan-ID (oder einer Liste von IDs) und einem Objekt. Das Objekt sollte 3 Felder enthalten:

  • result ein Boolean, der angibt, ob eine Regel ausgelöst wurde
  • value kann beliebig sein, kann aber verwendet werden, um den Wert aufzuzeichnen, der die Regel ausgelöst hat
  • level der Schweregrad der Qualitätsbrücke. Kann eines der folgenden sein:
    • info
    • warning
    • notify

Fähigkeiten

  • scans aktuelle Scans-Dokumente aller Scans der session
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer

Konfigurationsbeispiel

{
"priceWarning": {
"labels": {
"en": "Scan Price > 100",
},
"code": "scans.forEach(scan => { setResult(scan._id, {result: scan.match.price > 100, value: scan.match.price, level: 'warning'}); });"
}
"countNotify": {
"labels": {
"en": "Scan count > 100",
},
"code": "scans.forEach(scan => { setResult(scan._id, {result: scan.count > 100, value: scan.count, level: 'notify'}); });"
}
}

QM-Modul - Zonen-Konfiguration

Ähnlich wie die Scan-Konfiguration, wird jedoch als Nebeneffekt am Ende einer Zonenmanipulation ausgeführt.

Fähigkeiten

Ähnlich wie die Scan-Konfiguration, aber anstatt des scan-Dokuments wird das zone-Dokument bereitgestellt.

Konfigurationsbeispiel

{
"BusyZone": {
"labels": {
"en": "Zone is busy",
},
"code": "setResult(zone._id, {result: zone.status.includes('busy'), value: zone.status, level: 'warning'});"
}
}

Code zur Erstellung von Checklisten (PDF-Job)

Generiert PDF-Checklisten für Zonen mit benutzerdefiniertem Code. Kann pro Zone eine PDF-Datei oder für mehrere Zonen eine ZIP-Datei mit allen PDFs erstellen.

Fähigkeiten

  • writePdf(data, nameWithoutExtension) erstellt ein PDF-Dokument
  • zone aktuelles Zonen-Dokument
  • scanFlowConfig eine JSON-Konfiguration zum Scan-Ablauf
  • hasVerifyReasons Boolean, der angibt, ob Prüfungsgründe aktiviert sind
  • scanFlowConfig geparste Scan-Ablauf-Konfiguration
  • containsDifferentCount(data, activeSessions) gibt true zurück, wenn ein Scan oder eine Scan-Gruppe in aktiven Sitzungen unterschiedliche Zählungen über Revisionen hinweg hat
  • stocktraceScansFieldMapping Zuordnungsobjekt, das Scanner-Feldnamen in Stripes-Scan-Feldnamen übersetzt (z. B. 'Barcode' → 'matchCode', 'ScanID' → 'uuid', ...)
  • job Dokument mit Protokollierungs- und Fortschrittsfunktionen
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer
  • Erweiterte Sandbox-Helfer

Code-Beispiel

await job.log(`Generating checklist for zone ${zone.code}`);

// Build PDF document definition using pdfmake format
const docDefinition = {
content: [
{ text: `Checklist for Zone: ${zone.code}`, style: 'header' },
{ text: `Project: ${project.name}`, style: 'subheader' },
{ text: `Generated: ${moment().format('YYYY-MM-DD HH:mm')}`, margin: [0, 10, 0, 10] },
{
table: {
headerRows: 1,
widths: ['*', 'auto', 'auto'],
body: [
['Scan Code', 'Count', 'Status'],
...scans.map(scan => [
scan.code || scan.match?.productCode || 'N/A',
scan.count || 0,
scan.needsVerification ? 'Needs Review' : 'OK'
])
]
}
}
],
styles: {
header: { fontSize: 18, bold: true, margin: [0, 0, 0, 10] },
subheader: { fontSize: 14, bold: true, margin: [0, 0, 0, 5] }
},
defaultStyle: { font: 'Roboto' }
};

await writePdf(docDefinition, zone.code);

await job.log(`Checklist generated successfully for zone ${zone.code}`);

Export-Konfiguration

Definiert Export-Läufe, die Export-Jobs darstellen. Jeder Lauf enthält JavaScript-Code, der Dateien (CSV, XLSX, PDF, ZIP) generiert und in bestimmten Fällen Export-Sitzungen erstellt. Die Konfiguration unterstützt Vererbung über Einstellungsebenen, indem alle eindeutigen Namen der Export-Läufe kombiniert werden.

Export-Konfigurationen werden aus mehreren Einstellungsebenen in dieser Reihenfolge zusammengeführt: Global-Einstellungen < Client-Einstellungen < Branch-Einstellungen < Projekt-Einstellungen

Struktur des Export-Lauf-Objekts

Jeder Export-Lauf im exportRuns-Objekt enthält:

  • code (string, erforderlich) JavaScript-Code, der ausgeführt wird. Das Ergebnis wird in job.data gespeichert. Hinweis: Dies muss als String hinzugefügt werden, daher müssen sie ordnungsgemäß in einen String umgewandelt werden. In den nachfolgenden Beispielen wird der Code nicht als String dargestellt, um die Lesbarkeit zu erleichtern. Außerdem unterstützen wir yaml-Konfiguration, sodass der Code möglicherweise nicht in einen String umgewandelt werden muss, wenn die Konfiguration im YAML-Format geschrieben wird – dies wurde jedoch noch nicht getestet.
  • title (string, optional) Der Name des Exports
  • group (string, optional) Der Name der Export-Gruppe
  • allowWhenProjectNotClosed (boolean, optional) Legt fest, ob der Export gestartet werden kann, bevor das Projekt geschlossen wird
  • isHidden (boolean, optional) Blendet diesen Export für den Client aus
  • exportVariables (object, optional) Eine Liste von Variablen. Diese Variablen sind während des Exports im Objekt job.data.exportVariables als Schlüssel-Wert-Paare verfügbar (z. B. { key1: "Wert 1", key2: "Wert 2" })

Fähigkeiten

  • insertExportSessions(zoneIds) Erstellt Export-Sitzungen für Zonen und gibt Sitzungsdaten zurück
  • startExportSession(sessionId) Markiert eine Export-Sitzung als gestartet und setzt den Zonenstatus entsprechend
  • closeExportSession(sessionId) Markiert eine Export-Sitzung als abgeschlossen und setzt den Zonenstatus entsprechend
  • findZoneChangeRequests(selector) Findet Zonenänderungsanfragen für das Projekt
  • findCompletedExportJobs(selector) Findet abgeschlossene Export-Jobs für das Projekt
  • findOneZoneChangeRequest(selector) Findet eine einzelne Zonenänderungsanfrage
  • findOneCompletedExportJob(selector) Findet einen einzelnen abgeschlossenen Export-Job
  • writeFile({ name, data }) Erstellt eine Datei und lädt sie in den Cloud-Speicher hoch
  • generatePdfsForZones(zoneIds) Generiert PDFs für Zonen mit dem Checklisten-Code
  • successfulExportsCount Anzahl der erfolgreichen Export-Jobs für diesen Export-Typ
  • _ Veraltet. Die underscore.js-Bibliothek
  • JSZip ZIP-Dateierstellungsbibliothek
  • csvStringify CSV-Generierungsbibliothek
  • xlsx Excel-Dateierstellungsbibliothek
  • reportHelpers Hilfsfunktionen für die Berichtsgenerierung:
    • getZonenCount(projectId) Gibt ein Array von Zonenstatistiken zurück, einschließlich Gesamtscans, verifizierten Scans, bearbeiteten Scans, Produkten und Werten. Enthält eine Zusammenfassungszeile ("Gesamt") mit Summen. Zahlen werden mit deutschem Locale formatiert (Komma als Dezimaltrennzeichen)
    • getKorrekturen(projectId) Gibt ein Array von Scan-Korrekturen/-Änderungen zurück, die alte und neue Zählungen mit Zonen-, Match-Code-, Beschreibungs-, Preis-, Zähler- und Validierungsinformationen anzeigen
    • getZonenSummary(projectId) Gibt ein Zusammenfassungsobjekt mit der Gesamtzonenanzahl, der Anzahl der blockierten Zonen und der Anzahl der verifizierten Zonen zurück
    • getCounterValidator(projectId) Gibt ein Array von Zonen mit den registrierten Benutzern zurück, die die ursprüngliche Zählung (Zähler) und die anschließende Verifizierung (Prüfer) durchgeführt haben, sortiert nach Zonencode
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer
  • Erweiterte Sandbox-Helfer

Konfigurationsbeispiel

exportRuns: {
closeout: {
title: "Closeout Export"
allowWhenProjectNotClosed: false
code: {
await job.log('Starting closeout export');

// Get zones to export
const zones = await findZones({ projectId: project._id, deleted: false });
const zoneIds = zones.map(z => z._id);

// Create export sessions
const sessions = await insertExportSessions(zoneIds);
await job.log(`Created ${sessions.length} export sessions`);

// Generate CSV file
const csvData = [];
csvData.push(['Zone Code', 'Scan Code', 'Count', 'Price']);

for (const zone of zones) {
const scans = await findScans({ zoneId: zone._id, deleted: false });
for (const scan of scans) {
csvData.push([
zone.code,
scan.code || scan.match?.productCode || 'N/A',
scan.count || 0,
scan.price || scan.match?.price || 0
]);
}
}

const csvBuffer = await csvStringify(csvData);
await writeFile({ name: 'closeout-export.csv', data: csvBuffer });

// Close all sessions
for (const session of sessions) {
await closeExportSession(session.zoneSessionId);
}

await job.log('Closeout export completed');
return { filesCreated: 1, sessionsProcessed: sessions.length };
}
},
summary: {
title: "Summary Report"
allowWhenProjectNotClosed: true
code: {
await job.log('Generating summary report');

const zones = await findZones({ projectId: project._id });
const pdfs = await generatePdfsForZones(zones.map(z => z._id));

// Create ZIP with all PDFs
const zip = new JSZip();
pdfs.forEach((pdfBuffer, index) => {
zip.file(`zone-${zones[index].code}.pdf`, pdfBuffer);
});

const zipBuffer = await zip.generateAsync({ type: 'nodebuffer' });
await writeFile({ name: 'summary-report.zip', data: zipBuffer });

await job.log('Summary report generated');
return { filesCreated: 1 };
}
}
}

Import-Konfiguration

Das Import-System ermöglicht es Projekten, CSV-, Excel- oder XML-Dateien hochzuladen und deren Zeilen in strukturierte Daten in der Stripes-Datenbank umzuwandeln. Jede Import-Konfiguration definiert:

  • Wie eine Datei geparst werden soll
  • Welcher Entitätstyp erstellt oder aktualisiert werden soll (Match, Zone, Scan, Stock)
  • Wie jede Spalte interpretiert werden soll
  • Optionale Transformationslogik vor/nach dem Einfügen von Daten

Genau wie die Export-Konfiguration werden Import-Konfigurationen als Teil der Einstellungen definiert und können mehrere Dateien enthalten, von denen jede einen neuen Eintrag auf der Import-Seite erstellt. Beachten Sie, dass Dateien eine Anhäufung der Hierarchie sind und der Reihenfolge global < client < branch < project folgen. Wenn die ID einer Datei weiter unten in der Hierarchie gefunden wird, wird sie ersetzt.

Dateistruktur

Eine Import-Konfiguration enthält:

  • Files[] Jede beschreibt einen importierbaren Dateityp
  • Jede Datei hat einen oder mehrere Runs[], die Folgendes definieren:
    • Ziel-Entität (Match, Zone, Scan, Stock)
    • Feldzuordnung
    • Parser-Typ
    • Hooks (PreHook, PreInsertHook, PostHook)
    • Optionaler benutzerdefinierter Zeilen-Parser

Unterstützte Dateitypen

Der Importer erkennt automatisch, welchen Parser er basierend auf der FileConfig verwenden soll:

CSV

  • Unterstützt Kopfzeile oder manuelle Header-Definitionen
  • Steuerung über:
    • Delimiter
    • TextQualifier
    • Encoding (standardmäßig utf8)
    • SkipLines
    • Headers

Excel (.xlsx)

  • Verwendet SheetJS
  • Unterstützt:
    • SheetName (Name oder Index)
    • Headers
    • SkipLines

XML

  • Unterstützt einfache und komplexe XML-Strukturen
  • Steuerung über:
    • IsComplex (aktiviert erweitertes Abflachen)
    • RowSchema (JSON-Schema für komplexes XML)
    • ResourcePath (Standard: '/')
    • AttrsKey / TextKey

Import-Objektstruktur

Dateikonfiguration

Eine Datei-Import-Definition enthält:

  • ID (string, erforderlich): Eindeutiger Bezeichner der Import-Datei
  • GroupName (string, optional): Logische Gruppierung von Dateien
  • Headers optionale explizite Spaltennamen
  • FileDescription (string, optional): Lesbare Beschreibung
  • Remarks (string, optional): Hinweise zur Vorbereitung der Datei
  • SkipLines Anzahl der zu überspringenden oberen Zeilen
  • Encoding ((ascii|utf8|utf16le|ucs2|base64|latin1|binary|hex)) Nur CSV, der Zeichensatz der Datei
  • Delimiter (integer, optional): Zeichencode für das Feldtrennzeichen (z. B. 44 für Komma)
  • TextQualifier (integer, optional): Zeichencode für den Textqualifizierer (z. B. 34 für ")
  • FilenameRegex (string, optional): Regex zum Abgleichen von Dateinamen
  • ParserType ((CSV | Excel | XML), optional): Parser-Typ für die Datei (z. B. "Excel")
  • IsHidden (boolean, optional): Blendet die Datei aus der Benutzeroberfläche aus
  • AutoCreateJob (boolean, optional): Erstellt automatisch Import-Jobs, wenn eine Datei hochgeladen wird
  • Runs (array, erforderlich): Definiert mehrere Import-Läufe für diese Datei
  • ContinueWith Die ID des Jobs, mit dem nach Abschluss fortgefahren werden soll.

Beispiel:

Files: [
{
"ID": "zones-upload"
"ParserType": "CSV"
"SkipLines": 1
"Runs": [
{
"DestinationEntityName": "Zone"
"Fields": [
{
"FieldHeader": "Zone ID"
"DBFieldNames": "code"
"Operations": [
{
"Pad": [13, "0"]
}
]
}
]
}
]
}
]

Lauf-Konfiguration

Jeder Lauf in Runs[] unterstützt:

  • DestinationEntityName (erforderlich). Muss eines der folgenden sein:
    • Match
    • Zone
    • Scan
    • Stock
  • Fields[] - Eine Liste von Feldzuordnungen. Jedes Feld gibt an:
    • FieldHeader Name der Spalte in der Eingabedatei
    • DBFieldNames Ein oder mehrere interne Feldnamen (kommagetrennt)
    • StaticValue (optional) Verwendet einen festen Wert anstelle des Lesens aus einer Datei
    • Operations (optional) Grundlegende Transformationen (Großbuchstaben, Trimmen, Standardwerte usw.)
  • RowParser (optional) - Eine JavaScript-Funktion (in der Sandbox), die Folgendes kann:
    • Eine Zeile in viele Zeilen umwandeln
    • Feldformate normalisieren
    • Beliebige Geschäftslogik anwenden
  • PreHook (optional) Wird vor dem Lesen der Datei ausgeführt. (z. B. Tabellen leeren, Lookups cachen, temporäre Daten vorbereiten)
  • PreInsertHook (optional) Wird für jede transformierte Zeile vor der Validierung/Einfügung ausgeführt
  • PostHook (optional) Wird nach dem Importieren aller Zeilen ausgeführt

Wie die Datei-Analyse funktioniert

Alle Dateitypen werden in einen Stream von Zeilenobjekten umgewandelt, sodass auch sehr große Dateien sicher importiert werden können, ohne alles in den Speicher zu laden.

CSV

Jede Zeile wird zu einem JavaScript-Objekt aus { columnName: value }.

Excel

Konvertiert mit xlsx.utils.sheet_to_json unter Berücksichtigung von:

  • Headers
  • Übersprungene Zeilen
  • Ausgewähltes Tabellenblatt

XML

Abhängig von IsComplex:

  • Einfach → Abflachen mit Element-Text
  • Komplex → Tiefes Abflachen gemäß RowSchema

Automatische Header-Validierung

Vor dem Import stellt das System sicher:

  • Alle erforderlichen Spaltenheader sind vorhanden
  • Fehlende Header führen zu: missing-headers: Missing header(s) ...

Zeilen-Transformationsschicht

Bevor eine Zeile eingefügt werden kann, durchläuft sie mehrere Schritte:

  1. Feldzuordnung (Fields[]) Jede Feldkonfiguration wendet Folgendes an:
  • FieldHeader → aus Zeile lesen
  • Operations → grundlegende Transformationen
  • DBFieldNames → verschachtelte Felder mit Punktnotation
  • Entfernt nicht verwendete Felder automatisch

Beispiel:

"Fields": [
{
"FieldHeader": "z_EAN",
"DBFieldNames": "code",
"Operations": [
{
"Pad": [13, "0"]
}
]
},
{
"FieldHeader": "z_ArtNo",
"DBFieldNames": "productCode"
},
{
"FieldHeader": "d_SalesPrice",
"DBFieldNames": "price",
"Operations": [
{
"ToDecimal": [44]
},
{
"DivideBy": [100]
}
]
},
]
  1. Statische Werte Wenn StaticValue gesetzt ist, wird die Dateispalte ignoriert.

  2. Benutzerdefinierter RowParser (optional) Eine in der Sandbox ausgeführte JavaScript-Funktion, die Folgendes ermöglicht:

  • Benutzerdefinierte Transformationslogik
  • Rückgabe mehrerer Ausgabezeilen (z. B. Aufteilen einer Zeile in viele)
  • Lookups basierend auf DB oder Projekteinstellungen
  • Formatkonvertierungen

RowParser-Beispiel:

if (!this.Code) return [];
return [{ code: this.Code.trim() }];
  1. fixData (PreInsertHook) Eine weitere in der Sandbox ausgeführte Funktion, die für jede Zeile nach der Feldzuordnung und dem RowParser ausgeführt wird.

  2. Validierung Jeder Entitätstyp hat seine eigenen Validierungsregeln.

  3. Einfügen/Aktualisieren in der Datenbank Wird vom Ziel-Entitäts-Runner verarbeitet.

Import-Typen und ihre Fähigkeiten

Match-Import

Importiert Match-Codes, die von Scans verwendet werden.

Hauptverantwortlichkeiten
  • Match-Einträge erstellen oder aktualisieren
  • Eindeutigkeit sicherstellen
  • Gültige Preisformatierung sicherstellen
  • Indizes für schnelle Scan-Suchen erstellen
Validierungsregeln
  • code darf nicht leer sein
  • type darf nicht leer sein
  • price wird in eine Zahl konvertiert
  • Doppelte code-Einträge in derselben Datei werden abgelehnt
Massenverhalten

Daten werden in Batches von 10.000 Zeilen gepuffert Dann mit insertMany für optimale Leistung eingefügt

Fähigkeiten
  • collection - Zugriff auf die entsprechende Datenbanksammlung über den Mongo-Treiber
  • job - das Datenbankdokument, erweitert mit einer log-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführt
  • project, branch, client Dokumente
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer

Zonen-Import

Importiert zones mit ihren Codes, Bezeichnungen, Attributen usw.

Hauptverantwortlichkeiten
  • Neue Zonen einfügen
  • Vorhandene Zonen aktualisieren
  • Änderung interner Felder verhindern (Flags, Status, scanSessions)
  • Löschen blockieren, wenn die Zone Aktivität aufweist
Validierungsregeln
  • Doppelte Zonencodes in DERSELBEN Importdatei → Fehler
  • projectId muss übereinstimmen
  • Schema-Validierung trimmt Felder und setzt Standardwerte
  • Bei deleted: true → Ablehnen, wenn die Zone Sitzungsaktivität hat
Einfüge-/Aktualisierungslogik
  • Wenn Zone vorhanden → aktualisieren
  • Andernfalls → einfügen
  • Interne Eigenschaften werden beibehalten
Fähigkeiten
  • job - das Datenbankdokument, erweitert mit einer log-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführt
  • project, branch, client Dokumente
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer

Scan-Import

Erstellt validierte Scan-Einträge UND erstellt automatisch Scan-Sitzungen für jedes (Zone, Benutzer)-Paar.

Hauptverantwortlichkeiten
  • Hochgeladene Scans validieren
  • Sicherstellen, dass Benutzer und Zonen vorhanden sind
  • Sitzungen im laufenden Betrieb generieren
  • Jeden Scan einer Sitzung zuordnen
  • Schema und Preis validieren
  • Zonen-Metadaten und Prüfungs-Flags neu berechnen
Erforderliche Spalten
  • username
  • zoneCode
  • modifiedAt (optional, Standard ist Importzeit)
Sitzungserstellungslogik
  • Jedes eindeutige (zoneCode, username)-Paar → eine Sitzung
  • Client-Benutzer werden automatisch gekennzeichnet
Validierung
  • Schema stellt korrekte Felder sicher
  • match.price wird zur Zahl konvertiert
  • Fehlende Preise → 0
Nachverarbeitung

Führt die meisten Nebeneffekte aus, die eine normale Sitzung auslösen würde

  • Scans transformieren
  • Prüfungs-Flags
  • Zonen-Metadaten und -Status
  • Leere Zonen-Flag
  • Client-Sitzungs-Flag
Fähigkeiten
  • job - das Datenbankdokument, erweitert mit einer log-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführt
  • project, branch, client Dokumente
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer

Stock-Import

Importiert Lagerbestände, die mit Match-Codes verknüpft sind.

Hauptverantwortlichkeiten
  • Match-Referenzen validieren
  • Numerische Erwartungswerte validieren
  • Lagerartikel einfügen/aktualisieren
Validierungsregeln
  • match darf nicht leer sein
  • expected muss eine Zahl sein
  • match.price muss numerisch sein
Fähigkeiten
  • collection - Zugriff auf die entsprechende Datenbanksammlung über den Mongo-Treiber. Nur bestimmte Methoden sind erlaubt. Jede Methode auf der Sammlung ist auf dasselbe Projekt beschränkt
    • find
    • findOne
    • insertOne
    • insertMany
    • updateOne
    • updateMany
    • deleteOne
    • deleteMany
  • job - das Datenbankdokument, erweitert mit einer log-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführt
  • project, branch, client Dokumente
  • Sandbox-Variablen
  • Standard-Sandbox-Helfer

Hooks (Alle Import-Typen)

PreHook wird einmal vor dem Lauf ausgeführt PreInsertHook wird für jede Zeile nach der Zuordnung ausgeführt PostHook wird nach dem Einfügen aller Zeilen ausgeführt

Feldzuordnungs-Referenz

Jeder Eintrag in Fields[] unterstützt:

  • FieldHeader Dateispaltenname
  • DBFieldNames interne Stripes-Feldpfade
  • StaticValue überschreibt den Dateiwert
  • Operations Transformationen (trim, uppercase, toNumber, toBoolean)

Konfigurationsbeispiel

{
"Files": [
{
"ID": "fdd775a2-9b18-42a6-9053-2747fb12f5d2",
"GroupName": "group1",
"FileDescription": "Anmeldungen",
"Remarks": "csv layout: UserCode;FunctionFlag",
"Delimiter": 59,
"TextQualifier": 34,
"FilenameRegex": ".+[.]csv$|.+[.]CSV$",
"AutoCreateJob": true,
"Runs": [
{
"DestinationEntityName": "Match",
"PreInsertHook": "if (this.UserCode) { if (this.UserCode.length === 5) { this.UserCode = this.UserCode.padStart(6, '0'); } else if (this.UserCode.length !== 6) { delete this.UserCode; } }",
"Fields": [
{ "FieldHeader": "Scan-ID", "DBFieldNames": "code" },
{ "FieldHeader": "RoleCode", "DBFieldNames": "extra1", "StaticValue": "" },
{ "StaticValue": "P", "DBFieldNames": "type" }
]
}
]
},
{
"ID": "e75beecc-6a7b-48c1-bfae-296b548acc18",
"GroupName": "Zones",
"FileDescription": "Zone Import + Update",
"Remarks": "Zone Columns: from, to, Division, Extra1",
"ParserType": "Excel",
"IsHidden": true,
"AutoCreateJob": true,
"Runs": [
{
"DestinationEntityName": "Zone",
"RowParser": "const data = []; const requiredHeaders = ['from', 'to']; const currentHeaders = Object.keys(this); let invalidHeader = false; requiredHeaders.forEach(header => { if (!currentHeaders.includes(header)) { invalidHeader = true; job.log(`Required Column \"${header}\" is missing`); } }); if (!invalidHeader) { const from = parseInt(this.from.replace(/\\D/g, ''), 0); const to = parseInt(this.to.replace(/\\D/g, ''), 0); if ((to - from) > 1000) { throw new Error(`Range ${from} to ${to} contains more than 1000 zones.`); } for (let i = from; i <= to; i++) { const zone = { code: `A-${String(i).padStart(4, '0')}`, division: this.Division || '', extra1: this.Extra1 || '', warehouseCode: 'test' }; data.push(zone); } } return data;",
"Fields": []
}
]
},
{
"ID": "ea50258a-4c04-4108-a7a3-3384966600df",
"GroupName": "ArticleFiles",
"FileDescription": "Stammdaten",
"Delimiter": 9,
"TextQualifier": 25,
"AutoCreateJob": true,
"Runs": [
{
"DestinationEntityName": "Match",
"PreHook": "collection.drop()",
"Fields": [
{ "FieldHeader": "z_EAN", "DBFieldNames": "code", "Operations": [{"Pad": [13, "0"]}] },
{ "FieldHeader": "z_ArtNo", "DBFieldNames": "productCode" },
{ "FieldHeader": "DeptDescr", "DBFieldNames": "extra1" },
{ "FieldHeader": "d_ArtDescr", "DBFieldNames": "description" },
{ "FieldHeader": "d_SalesPrice", "DBFieldNames": "price", "Operations": [{"ToDecimal": [44]}, {"DivideBy": [100]}] },
{ "FieldHeader": "GGRNo", "DBFieldNames": "extra2" },
{ "FieldHeader": "DeptNo", "DBFieldNames": "extra3" },
{ "FieldHeader": "MFRName", "DBFieldNames": "extra5" },
{ "StaticValue": "P", "DBFieldNames": "type" }
]
}
]
}
]
}

Registrierungskonfiguration

Definiert benutzerdefinierte Hooks für den Import von Benutzerregistrierungen aus XLSX-Dateien. Unterstützt drei Hooks: PreHook (vor dem Parsen der Datei), RowParser (Transformation pro Zeile) und PostHook (nach Abschluss aller Registrierungen).

Struktur des Registrierungskonfigurations-Objekts

Das RegistrationConfig-Objekt enthält:

  • PreHook (string, optional) JavaScript-Code, der vor dem Parsen von Zeilen ausgeführt wird. Läuft einmal zu Beginn des Imports.
  • RowParser (string, optional) JavaScript-Code, der für jede Zeile/jedes Benutzerobjekt ausgeführt wird. Muss das transformierte Benutzerobjekt zurückgeben. Wird verwendet, um Zeilendaten vor der Verarbeitung zu normalisieren, zu validieren oder anzureichern.
  • PostHook (string, optional) JavaScript-Code, der nach dem Abschluss aller Registrierungen ausgeführt wird. Läuft einmal am Ende des Imports und wird auch über UI-erstellte Registrierungen ausgelöst.

Fähigkeiten

  • PreHook:
    • job Job-Objekt mit log()-Methode
    • project, branch, client Dokumente
  • RowParser:
    • job Job-Objekt mit log()-Methode
    • project, branch, client Dokumente
    • user rohes Benutzerobjekt aus der Excel-Zeile (kann geändert und zurückgegeben werden)
  • PostHook:
    • job Job-Objekt mit log()-Methode
    • userIds Array der Benutzer-IDs, die während des Imports erstellt oder aktualisiert wurden
    • project, branch, client Dokumente

Konfigurationsbeispiel

{
"PreHook": "await job.log(`Starting registration import for project ${project.code}`);",
"RowParser": "user.firstName = user.firstName?.trim(); user.lastName = user.lastName?.trim(); user.language = user.language || 'en'; user.role = user.role || 'employee'; return user;",
"PostHook": "await job.log(`Registration import completed. Created/updated ${userIds.length} users`); if (userIds.length > 0) { await log(`New users registered: ${userIds.join(', ')}`); }"
}

Sandbox-Fähigkeiten

Sandbox

Wird umfassend verwendet (Prüffunktion, Imports, Registrierungen, QM usw.) für benutzerdefinierten Code.

const flagged = await findScans({ needsVerification: true });
await log(`Flagged scans: ${flagged.length}`);
return flagged.map(scan => scan.code);

Erweiterte Sandbox

Wird hauptsächlich von Checklisten (PDFs), Export- und Import-Konfigurationen verwendet, mit Bibliotheken und einem umfangreicheren job, der die Kontrolle über Protokolle und Fortschritt des Jobs ermöglicht.

  await job.log('Export started');
await job.progress(50, 100);
return { ok: true };

Globale Sandbox-Fähigkeitsmatrix

Dies sind die integrierten Fähigkeiten jeder Sandbox-Variante (alles Flow/Job-Spezifische ist in den obigen Abschnitten beschrieben).

Fähigkeitsandboxerweiterte sandbox
log() zugänglich über das Systemmenü -> Debugging aktivieren
findMatches()
findScans()
findUsers()
findZones()
findZoneSessions()
findRegistrations()
findAssets()
updateRegistrations()
findOneMatch()
findOneScan()
findStock()
findOneStock()
findOneUser()
findOneZone()
findOneZoneSession()
SandboxVariables
job.log() (wenn ein job übergeben wird)
job.progress() (wenn ein job übergeben wird)
moment
PdfPrinter
path
Buffer
Assets, das absoluteFilePath(filePath) und getBinary(filePath) bereitstellt, um eine Datei aus dem System zu lesen
prettyNumber Eine Methode, die eine Darstellung mit einer Genauigkeit von bis zu vierzehn Stellen zurückgibt
project, branch, client Datenbankdokumente

Referenzen

Viele Informationen zu den verschiedenen Konfigurationen finden Sie hier.