Einstellungen
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,clientDokumente
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,clientDokumente- 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 ScansetPieces(scanId, value)setzt die Stückzahl für einen Scanscans[]Array aller Scans in der Zoneproject,branch,clientDokumente- 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:
resultein Boolean, der angibt, ob eine Regel ausgelöst wurdevaluekann beliebig sein, kann aber verwendet werden, um den Wert aufzuzeichnen, der die Regel ausgelöst hatlevelder Schweregrad der Qualitätsbrücke. Kann eines der folgenden sein:- info
- warning
- notify
Fähigkeiten
scansaktuelle 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-Dokumentzoneaktuelles Zonen-DokumentscanFlowConfigeine JSON-Konfiguration zum Scan-AblaufhasVerifyReasonsBoolean, der angibt, ob Prüfungsgründe aktiviert sindscanFlowConfiggeparste Scan-Ablauf-KonfigurationcontainsDifferentCount(data, activeSessions)gibt true zurück, wenn ein Scan oder eine Scan-Gruppe in aktiven Sitzungen unterschiedliche Zählungen über Revisionen hinweg hatstocktraceScansFieldMappingZuordnungsobjekt, das Scanner-Feldnamen in Stripes-Scan-Feldnamen übersetzt (z. B. 'Barcode' → 'matchCode', 'ScanID' → 'uuid', ...)jobDokument 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 injob.datagespeichert. 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 wiryaml-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 Exportsgroup(string, optional) Der Name der Export-GruppeallowWhenProjectNotClosed(boolean, optional) Legt fest, ob der Export gestartet werden kann, bevor das Projekt geschlossen wirdisHidden(boolean, optional) Blendet diesen Export für den Client ausexportVariables(object, optional) Eine Liste von Variablen. Diese Variablen sind während des Exports im Objektjob.data.exportVariablesals 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ückstartExportSession(sessionId)Markiert eine Export-Sitzung als gestartet und setzt den Zonenstatus entsprechendcloseExportSession(sessionId)Markiert eine Export-Sitzung als abgeschlossen und setzt den Zonenstatus entsprechendfindZoneChangeRequests(selector)Findet Zonenänderungsanfragen für das ProjektfindCompletedExportJobs(selector)Findet abgeschlossene Export-Jobs für das ProjektfindOneZoneChangeRequest(selector)Findet eine einzelne ZonenänderungsanfragefindOneCompletedExportJob(selector)Findet einen einzelnen abgeschlossenen Export-JobwriteFile({ name, data })Erstellt eine Datei und lädt sie in den Cloud-Speicher hochgeneratePdfsForZones(zoneIds)Generiert PDFs für Zonen mit dem Checklisten-CodesuccessfulExportsCountAnzahl der erfolgreichen Export-Jobs für diesen Export-Typ- _ Veraltet. Die underscore.js-Bibliothek
- JSZip ZIP-Dateierstellungsbibliothek
- csvStringify CSV-Generierungsbibliothek
- xlsx Excel-Dateierstellungsbibliothek
reportHelpersHilfsfunktionen 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 anzeigengetZonenSummary(projectId) Gibt ein Zusammenfassungsobjekt mit der Gesamtzonenanzahl, der Anzahl der blockierten Zonen und der Anzahl der verifizierten Zonen zurückgetCounterValidator(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:
DelimiterTextQualifierEncoding(standardmäßig utf8)SkipLinesHeaders
Excel (.xlsx)
- Verwendet SheetJS
- Unterstützt:
SheetName(Name oder Index)HeadersSkipLines
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-DateiGroupName(string, optional): Logische Gruppierung von DateienHeadersoptionale explizite SpaltennamenFileDescription(string, optional): Lesbare BeschreibungRemarks(string, optional): Hinweise zur Vorbereitung der DateiSkipLinesAnzahl der zu überspringenden oberen ZeilenEncoding((ascii|utf8|utf16le|ucs2|base64|latin1|binary|hex)) Nur CSV, der Zeichensatz der DateiDelimiter(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 DateinamenParserType((CSV | Excel | XML), optional): Parser-Typ für die Datei (z. B. "Excel")IsHidden(boolean, optional): Blendet die Datei aus der Benutzeroberfläche ausAutoCreateJob(boolean, optional): Erstellt automatisch Import-Jobs, wenn eine Datei hochgeladen wirdRuns(array, erforderlich): Definiert mehrere Import-Läufe für diese DateiContinueWithDie 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:FieldHeaderName der Spalte in der EingabedateiDBFieldNamesEin oder mehrere interne Feldnamen (kommagetrennt)StaticValue(optional) Verwendet einen festen Wert anstelle des Lesens aus einer DateiOperations(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ührtPostHook(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:
- Feldzuordnung (Fields[]) Jede Feldkonfiguration wendet Folgendes an:
FieldHeader→ aus Zeile lesenOperations→ grundlegende TransformationenDBFieldNames→ 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]
}
]
},
]
-
Statische Werte Wenn
StaticValuegesetzt ist, wird die Dateispalte ignoriert. -
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() }];
-
fixData (PreInsertHook) Eine weitere in der Sandbox ausgeführte Funktion, die für jede Zeile nach der Feldzuordnung und dem RowParser ausgeführt wird.
-
Validierung Jeder Entitätstyp hat seine eigenen Validierungsregeln.
-
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
codedarf nicht leer seintypedarf nicht leer seinpricewird 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-Treiberjob- das Datenbankdokument, erweitert mit einerlog-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführtproject,branch,clientDokumente- 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
projectIdmuss ü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 einerlog-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführtproject,branch,clientDokumente- 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
usernamezoneCodemodifiedAt(optional, Standard ist Importzeit)
Sitzungserstellungslogik
- Jedes eindeutige (
zoneCode,username)-Paar → eine Sitzung - Client-Benutzer werden automatisch gekennzeichnet
Validierung
- Schema stellt korrekte Felder sicher
match.pricewird 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 einerlog-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführtproject,branch,clientDokumente- 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
matchdarf nicht leer seinexpectedmuss eine Zahl seinmatch.pricemuss 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änktfindfindOneinsertOneinsertManyupdateOneupdateManydeleteOnedeleteMany
job- das Datenbankdokument, erweitert mit einerlog-Funktion, die alle Protokolle in einer Datei sammelt und einige Kürzungen und Warnungsunterdrückungen für die Benutzeroberfläche durchführtproject,branch,clientDokumente- 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:
FieldHeaderDateispaltennameDBFieldNamesinterne Stripes-FeldpfadeStaticValueüberschreibt den DateiwertOperationsTransformationen (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:
jobJob-Objekt mitlog()-Methodeproject,branch,clientDokumente
- RowParser:
jobJob-Objekt mitlog()-Methodeproject,branch,clientDokumenteuserrohes Benutzerobjekt aus der Excel-Zeile (kann geändert und zurückgegeben werden)
- PostHook:
jobJob-Objekt mitlog()-MethodeuserIdsArray der Benutzer-IDs, die während des Imports erstellt oder aktualisiert wurdenproject,branch,clientDokumente
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ähigkeit | sandbox | erweiterte 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.