# Squeeze Pull

# 01 – Übersicht

Der Squeeze Pull-Job holt fertig gelesene Belege per Squeeze REST-API v2 nach DOCUMENTS ab und ersetzt den SOAP-Export. Diese Seite beschreibt Funktionsweise und Statuswerte für den Mappentyp Invoice. Stand 09.11.2026.

## Was ist der Pull-Job

Bisher hat Squeeze fertig gelesene Belege per SOAP nach DOCUMENTS geschoben. Beim Pull holt DOCUMENTS die Belege selbst über die REST-API v2 von Squeeze ab. Je Mappentyp gibt es ein eigenes Job-Skript, das im Scheduler viertelstündlich läuft und die generische Bibliothek `Squeeze_Pull_Lib` aufruft.

Der Job fragt im Queue-Step „Export“ nur die Belege der konfigurierten Squeeze-Klasse ab. Je Beleg legt er einen Vorgang an oder aktualisiert einen vorhandenen. Er schreibt Kopffelder, Positionen (Gentable) und Anhänge und meldet den Beleg danach über das Export-Interface „Pull“ als FINISHED an Squeeze. Erst dann gilt der Vorgang als fertig und darf in den Workflow.

Die Zuordnung Beleg → Vorgang läuft über das Feld `SqueezeID`. Findet der Job darüber keinen Vorgang, sucht er zusätzlich über die externalId des Belegs (Belege aus der SOAP-Zeit).

<p class="callout info">Die Zuordnung Beleg → Vorgang läuft ausschließlich über das Feld `SqueezeID`.</p>

## Ablauf je Beleg

1. **Vorgang suchen:** zuerst über `SqueezeID`, sonst über die externalId des Belegs. Dabei zählt nur ein aktiver Vorgang desselben Mappentyps ohne fremde `SqueezeID`.
2. **Vorgang anlegen:** Gibt es keinen Vorgang, wird er neu angelegt und **sofort** mit `SqueezeID` und `SqueezeStatus = Unfinished` gespeichert. Einen Vorgang auf `Processed` überschreibt der Job nie.
3. **Daten schreiben:** Kopffelder, Positionen und Anhänge, danach speichern. Felder, die es am Mappentyp nicht gibt, werden übersprungen (Hinweis im Log). Der Beleg wird trotzdem übernommen.
4. **Abschließen:** Bei Erfolg geht FINISHED an Squeeze, dann wird `SqueezeStatus = Processed` gesetzt, optional mit direktem Workflow-Start. Bei einem Fehler wird `SqueezeStatus = ERROR` gesetzt und kein FINISHED gemeldet. Der Beleg bleibt im Export und der nächste Lauf versucht es erneut.

## Häufigkeit und Menge je Lauf

Beides ist einstellbar:

- **Ausführungshäufigkeit:** über die Einplanung des Jobs `Invoice_JOB_SqueezePull` im Scheduler.
- **Belege je Lauf:** über den Schalter `MAX_DOCS_PER_RUN` in `Squeeze_Pull_Lib`, im Paket `100`. Was ein Lauf nicht schafft, übernimmt der nächste.

Empfehlung: viertelstündlich mit 100 Belegen starten. Staut sich der Export, zuerst das Intervall verkürzen (z.B. auf 5 Minuten), statt `MAX_DOCS_PER_RUN` stark zu erhöhen. Kurze Läufe machen Fehler schneller sichtbar, und bis DOCUMENTS 6.1 gibt es keinen HTTP-Timeout für die Squeeze-Aufrufe.

<p class="callout info">`MAX_DOCS_PER_RUN` ist kein Parameter, sondern eine Konstante in `Squeeze_Pull_Lib` und gilt damit für alle Mappentypen. Es läuft immer nur ein Lauf gleichzeitig. Ist ein Lauf beim Start der nächsten Ausführung noch nicht fertig, fällt diese Ausführung aus. Die restlichen Belege holt der nächste Lauf ab (Parallel-Sperre, siehe *Betrieb und Fehlersuche*). </p>

## SqueezeStatus am Vorgang

<table id="bkmrk-wert-bedeutung-workf"><thead><tr class="header"><th>Wert</th><th>Bedeutung</th><th>Workflow</th><th>Nächster Lauf</th></tr></thead><tbody><tr class="odd"><td>`Unfinished`</td><td>wird übernommen oder Lauf abgebrochen</td><td>nein</td><td>macht mit demselben Vorgang weiter</td></tr><tr class="even"><td>`ERROR`</td><td>Fehler erkannt, Grund im Log</td><td>nein</td><td>versucht es erneut</td></tr><tr class="odd"><td>`Processed`</td><td>fertig, FINISHED von Squeeze bestätigt</td><td>ja</td><td>überspringt, überschreibt nie</td></tr></tbody></table>

Die Werte `New`, `Analyze`, `Split` usw. stammen aus SOAP bzw. der Analyse. Der Pull-Job setzt sie nicht.

<p class="callout info">**Wichtig:** Den Workflow-Start für `Unfinished` und `ERROR` sperrt der Userexit `ue_beforeStartWorkflow` in `Invoice__UserExit_CustomLib`. Fehlt er, startet `Invoice_JOB_StartWorkflow` auch unfertige Vorgänge.</p>

# 02 – Installation

Diese Seite beschreibt Voraussetzungen, Einbau und Einbautest des Squeeze Pull-Jobs für den Mappentyp Invoice. Die Parameter und Schalter sind auf der Seite *Konfiguration* beschrieben.

## Voraussetzungen

- DOCUMENTS 5/6 mit DEXPRO-Standard (Import-, Parameter- und Logging-Bibliothek sowie `Squeeze_FunctionLib` mit v2-Unterstützung)
- Squeeze mit REST-API v2, Zugang in der Squeeze-Konfiguration von DOCUMENTS hinterlegt
- Mappentyp mit `SqueezeID` (Text, durchsuchbar, indiziert), `SqueezeStatus` (durchsuchbar), Register für Anhänge und Gentable

<p class="callout danger">Feste Regeln: nur **ein** DOCUMENTS-System je Squeeze-Instanz, nur **ein** Job je Mappentyp und nur auf **einem** Server. SOAP und Pull nie gleichzeitig an derselben Klasse, sonst entstehen Dubletten.</p>

## Bestandteile

Kategorien: die `Squeeze_*`-Skripte in **SqueezePull**, der Job in **Invoice**, der Userexit in **Invoice\_UserExit**.

<table id="bkmrk-skript-aufgabe-anpas"><thead><tr class="header"><th>Skript</th><th>Aufgabe</th><th>Anpassen?</th></tr></thead><tbody><tr class="odd"><td>`Invoice_JOB_SqueezePull`</td><td>Job: Job-User, SuperMode, Log, liest Parameter, ruft `runSqueezePull()`</td><td>je Mappentyp ein eigenes Job-Skript</td></tr><tr class="even"><td>`Squeeze_Pull_Lib`</td><td>Ablauf, gleich für alle Mappentypen</td><td>nein, nur die Schalter am Dateianfang (siehe *Konfiguration*)</td></tr><tr class="odd"><td>`Squeeze_FunctionApiLib`</td><td>REST-Aufrufe, `SqueezeAPI` erbt von `Squeeze`</td><td>nein, aber abgleichen</td></tr><tr class="even"><td>`Squeeze_CustomLib`</td><td>Userexit `ue_Squeeze_ParseFieldValue`</td><td>**ja, je Kunde**</td></tr><tr class="odd"><td>`Squeeze_ENUM_DocFile_SqueezeStatus`</td><td>Standard-Enum plus Unfinished, ERROR, Processed</td><td>nein</td></tr><tr class="even"><td>`Invoice__UserExit_CustomLib`</td><td>`ue_beforeStartWorkflow`: sperrt den Workflow-Start bei `Unfinished` und `ERROR`</td><td>ja, Userexit an die Kundenfassung anfügen</td></tr></tbody></table>

Unverändert bleiben die Standardskripte `Squeeze_FunctionLib`, `DEXPRO__ImportLib`, `Invoice__ImportLib`, `Invoice_JOB_StartWorkflow` und `DEXPRO_ENUM_DocFile_SqueezeStatus` (bei Kunden oft verschlüsselt).

## Einbau

### Sicherung

Vor dem Einspielen exportieren:

- `Invoice__UserExit_CustomLib` des Kunden
- `Squeeze_FunctionApiLib`, falls schon vorhanden

### Skripte

- `Squeeze_Pull_Lib`, `Squeeze_CustomLib` und `Squeeze_ENUM_DocFile_SqueezeStatus` in die Kategorie **SqueezePull** importieren.
- `Squeeze_FunctionApiLib` in die Kategorie **SqueezePull** importieren. Gibt es schon eine Fassung, abgleichen statt überschreiben: Nur `getQueueStepEntries`, `getExportInterfaceIdByName`, `postRequest2xx` und `setExportInterfaceStatus` sind für den Pull neu bzw. erweitert.
- `Invoice_JOB_SqueezePull` in die Kategorie **Invoice** importieren.

Den Userexit `ue_beforeStartWorkflow` an die Kundenfassung von `Invoice__UserExit_CustomLib` **anfügen**, den Rest nicht ändern.

<p class="callout warning">Enthält das Skript schon ein `ue_beforeStartWorkflow`, dann muss die Prüfung in die vorhandene Funktion eingebaut werden.</p>

### Parameter

`Squeeze_DocumentClassName` und bei Bedarf `Squeeze_StartWorkflow` anlegen, wie auf der Seite *Konfiguration* beschrieben. Angelegt werden die Parameter über die Weboberfläche.

### Übersetzungen

In der Weboberfläche unter **Übersetzungen** drei Einträge anlegen.

<table id="bkmrk-feld-eintrag-1-eintr" style="width:94.1667%;height:289.391px;"><thead><tr style="height:29.7969px;"><th style="width:25.1679%;height:29.7969px;">Feld</th><th style="width:27.4415%;height:29.7969px;">Eintrag 1</th><th style="width:23.5324%;height:29.7969px;">Eintrag 2</th><th style="width:23.7654%;height:29.7969px;">Eintrag 3</th></tr></thead><tbody><tr style="height:29.7969px;"><td style="width:25.1679%;height:29.7969px;">Applikation</td><td style="width:27.4415%;height:29.7969px;">Documents</td><td style="width:23.5324%;height:29.7969px;">Documents</td><td style="width:23.7654%;height:29.7969px;">Documents</td></tr><tr style="height:29.7969px;"><td style="width:25.1679%;height:29.7969px;">Typ</td><td style="width:27.4415%;height:29.7969px;">Properties</td><td style="width:23.5324%;height:29.7969px;">Properties</td><td style="width:23.7654%;height:29.7969px;">Properties</td></tr><tr style="height:29.7969px;"><td style="width:25.1679%;height:29.7969px;">Unterkategorie</td><td style="width:27.4415%;height:29.7969px;">Squeeze</td><td style="width:23.5324%;height:29.7969px;">Squeeze</td><td style="width:23.7654%;height:29.7969px;">Squeeze</td></tr><tr style="height:47.2188px;"><td style="width:25.1679%;height:47.2188px;">Name</td><td style="width:27.4415%;height:47.2188px;">`SqueezeStatus_Unfinished`</td><td style="width:23.5324%;height:47.2188px;">`SqueezeStatus_Error`</td><td style="width:23.7654%;height:47.2188px;">`SqueezeStatus_Processed`</td></tr><tr style="height:46.5938px;"><td style="width:25.1679%;height:46.5938px;">Projektspezifische Anpassung</td><td style="width:27.4415%;height:46.5938px;">nein</td><td style="width:23.5324%;height:46.5938px;">nein</td><td style="width:23.7654%;height:46.5938px;">nein</td></tr><tr style="height:46.5938px;"><td style="width:25.1679%;height:46.5938px;">Deutsch</td><td style="width:27.4415%;height:46.5938px;">Übernahme läuft / unvollständig</td><td style="width:23.5324%;height:46.5938px;">Übernahme fehlgeschlagen</td><td style="width:23.7654%;height:46.5938px;">Übernommen</td></tr><tr style="height:29.7969px;"><td style="width:25.1679%;height:29.7969px;">Englisch</td><td style="width:27.4415%;height:29.7969px;">Transfer incomplete</td><td style="width:23.5324%;height:29.7969px;">Transfer failed</td><td style="width:23.7654%;height:29.7969px;">Transferred</td></tr></tbody></table>

Danach die Properties erzeugen, sonst zeigt das Feld die neuen Werte nicht übersetzt an.

### Mappentyp Invoice

- Feld `SqueezeStatus` auf `runscript:Squeeze_ENUM_DocFile_SqueezeStatus` umstellen
- Register aus Wert 2 (und ggf. Wert 3) des Parameters und Gentable vorhanden
- Öffentlichen Filterordner für Invoice mit `SqueezeStatus = Unfinished` ODER `ERROR` anlegen

Das Feld `SqueezeStatus` im Manager bzw. im Webclient nach der Umstellung:

[![04_mappentyp_squeezestatus.png](https://docs.squeeze.one/uploads/images/gallery/2026-11/scaled-1680-/SsY04-mappentyp-squeezestatus.png)](https://docs.squeeze.one/uploads/images/gallery/2026-11/SsY04-mappentyp-squeezestatus.png)

### Squeeze

1. SOAP-Export der Klasse ausschalten.
2. Export-Interface „Pull“ an der Klasse anlegen und aktivieren.
3. Prüfen, dass der Queue-Step „Export“ heißt.
4. Mapping in der Spalte **Name (Zielsystem)** prüfen: jedes DOCUMENTS-Feld nur einmal zugeordnet (Details auf der Seite *Konfiguration*).

Das Export-Interface „Pull“ an der Klasse:

[![05_squeeze_exportinterface_pull.png](https://docs.squeeze.one/uploads/images/gallery/2026-11/scaled-1680-/nQr05-squeeze-exportinterface-pull.png)](https://docs.squeeze.one/uploads/images/gallery/2026-11/nQr05-squeeze-exportinterface-pull.png)

### Jobs

`Invoice_JOB_SqueezePull` mit der Eigenschaft `thread=1` anlegen und erst nach dem Test viertelstündlich einplanen.

[![07_job_squeezepull.png](https://docs.squeeze.one/uploads/images/gallery/2026-11/scaled-1680-/NT907-job-squeezepull.png)](https://docs.squeeze.one/uploads/images/gallery/2026-11/NT907-job-squeezepull.png)

`Invoice_JOB_StartWorkflow` nicht ändern. Er wird nur gebraucht, wenn der Parameter `Squeeze_StartWorkflow` nicht auf `true` steht.

<p class="callout warning">Vor dem ersten Start von `Invoice_JOB_StartWorkflow`, auch im Einbautest Schritt 2, prüfen, ob es alte Vorgänge mit leerer WorkflowID gibt. Sie würden ebenfalls gestartet werden.</p>

## Einbautest

Der Test läuft mit einem einzelnen Beleg in zwei Durchgängen: zuerst ohne Rückmeldung an Squeeze, dann mit. Vorher in `Squeeze_Pull_Lib` `TEST_KEEP_IN_EXPORT = true` und `MAX_DOCS_PER_RUN = 1` setzen.

<table id="bkmrk-%23-aktion-erwartung-0" style="width:100%;height:298.234px;"><thead><tr style="height:29.7969px;"><th style="width:3.00967%;height:29.7969px;">\#</th><th style="width:38.4431%;height:29.7969px;">Aktion</th><th style="width:58.4282%;height:29.7969px;">Erwartung</th></tr></thead><tbody><tr style="height:30.1094px;"><td style="width:3.00967%;height:30.1094px;">0</td><td style="width:38.4431%;height:30.1094px;">Invoice-Vorgang öffnen</td><td style="width:58.4282%;height:30.1094px;">`SqueezeStatus` bietet zusätzlich „Übernahme läuft / unvollständig“, „Übernahme fehlgeschlagen“ und „Übernommen“ an.</td></tr><tr style="height:63.3906px;"><td style="width:3.00967%;height:63.3906px;">1</td><td style="width:38.4431%;height:63.3906px;">`Invoice_JOB_SqueezePull` von Hand starten</td><td style="width:58.4282%;height:63.3906px;">Der Vorgang wird angelegt und steht auf „Unfinished“, keine FEHLT-Zeile im Log. Der Beleg bleibt in Squeeze im Export, weil der Testmodus kein FINISHED meldet.</td></tr><tr style="height:46.9062px;"><td style="width:3.00967%;height:46.9062px;">2</td><td style="width:38.4431%;height:46.9062px;">`Invoice_JOB_StartWorkflow` von Hand starten</td><td style="width:58.4282%;height:46.9062px;">Prüft die Workflow-Sperre: Der Vorgang aus Schritt 1 bekommt keinen Workflow, im Log steht `ue_beforeStartWorkflow() -> false`.</td></tr><tr style="height:64.0156px;"><td style="width:3.00967%;height:64.0156px;">3</td><td style="width:38.4431%;height:64.0156px;">In `Squeeze_Pull_Lib` `TEST_KEEP_IN_EXPORT = false` setzen, `Invoice_JOB_SqueezePull` erneut starten</td><td style="width:58.4282%;height:64.0156px;">Jetzt die echte Übernahme: FINISHED im Log, Vorgang auf „Processed“, Beleg in Squeeze aus dem Export verschwunden.</td></tr><tr style="height:64.0156px;"><td style="width:3.00967%;height:64.0156px;">4</td><td style="width:38.4431%;height:64.0156px;">Workflow prüfen</td><td style="width:58.4282%;height:64.0156px;">Mit `Squeeze_StartWorkflow = true`: im Pull-Log „Workflow … gestartet“. Sonst `Invoice_JOB_StartWorkflow` starten, der Vorgang bekommt jetzt seinen Workflow.</td></tr></tbody></table>

Nach dem Test in `Squeeze_Pull_Lib` `MAX_DOCS_PER_RUN` wieder auf `100` setzen (`TEST_KEEP_IN_EXPORT` steht seit Schritt 3 auf `false`). Dann `Invoice_JOB_SqueezePull` viertelstündlich einplanen und, falls der Workflow nicht direkt im Pull-Lauf startet, auch `Invoice_JOB_StartWorkflow`.

# 03 – Konfiguration

Diese Seite beschreibt die Parameter, das Mapping in Squeeze und die Schalter in `Squeeze_Pull_Lib`.

## Parameter

Parameter werden in der Weboberfläche auf der Outbar **Administration Invoice** im Ordner **Parameter** angelegt und gepflegt, nicht per SQL. Beide Parameter haben die Vorlage **Invoice** und gelten global. Als Job-User nutzt der Job den vorhandenen Parameter `JobScriptUser`, sonst `cJobUser`.

### Squeeze\_DocumentClassName (Pflicht)

Bezeichnung: *Squeeze: Dokumentklasse und Register*

<table id="bkmrk-feld-wert-1-wert-2-w"><thead><tr class="header"><th>Feld</th><th>Wert 1</th><th>Wert 2</th><th>Wert 3</th></tr></thead><tbody><tr class="odd"><td>Beschreibung</td><td>Squeeze-Dokumentklasse</td><td>Register fuer Anhaenge</td><td>Register je Dateiendung (optional)</td></tr><tr class="even"><td>Typ</td><td>String</td><td>String</td><td>String</td></tr><tr class="odd"><td>Standardwert</td><td>leer</td><td>leer</td><td>leer</td></tr><tr class="even"><td>Eintrag (Beispiel)</td><td>`Invoices`</td><td>`Documents`</td><td>leer oder `Documents2:eml,msg`</td></tr></tbody></table>

Wert 3 hat das Format `Register:Endung,Endung`. Mehrere Regeln werden mit `;` getrennt, zum Beispiel `Documents2:eml,msg;Documents3:xml`. Endungen ohne Punkt angeben, Groß- und Kleinschreibung spielt keine Rolle. Ist Wert 3 leer, landen alle Anhänge im Register aus Wert 2.

<p class="callout warning">Ist Wert 3 ungültig, holt der Job nichts ab. Fehlt ein Register aus Wert 2 oder 3 am Mappentyp, verarbeitet der Job die Klasse nicht oder bricht beim ersten Beleg ab; dieser Vorgang steht dann auf `ERROR`. Die Belege bleiben im Export-Step, der Grund steht im Log.</p>

### Squeeze\_StartWorkflow (optional)

Bezeichnung: *Squeeze: Workflow direkt nach Übernahme starten*

<table id="bkmrk-feld-wert-1-wert-2-b"><thead><tr class="header"><th>Feld</th><th>Wert 1</th><th>Wert 2</th></tr></thead><tbody><tr class="odd"><td>Beschreibung</td><td>Workflow direkt starten</td><td>Workflow-Name (leer = WorkflowRules)</td></tr><tr class="even"><td>Typ</td><td>Boolean</td><td>String</td></tr><tr class="odd"><td>Standardwert</td><td>`false`</td><td>leer</td></tr><tr class="even"><td>Eintrag (Beispiel)</td><td>`true`</td><td>leer</td></tr></tbody></table>

Einen Eintrag nur anlegen, wenn der Workflow direkt im Pull-Lauf starten soll. Ohne Eintrag startet `Invoice_JOB_StartWorkflow` den Workflow.

<p class="callout warning">Standardwert von Wert 1 auf `false` setzen. Bei `true` kann der Workflow direkt starten, obwohl kein Eintrag angelegt ist.</p>

## Mapping in Squeeze

Das Mapping steht in Squeeze an der Dokumentklasse unter **Felder** bzw. **Tabellen** in der Spalte **Name (Zielsystem)**. In der REST-API heißt sie `externalName`. Spalten ohne Eintrag werden nicht übernommen. Jedes DOCUMENTS-Feld darf nur einmal zugeordnet sein; der Job meldet doppelt zugeordnete Kopffelder beim Start.

[![06a_squeeze_kopffelder.png](https://docs.squeeze.one/uploads/images/gallery/2026-11/scaled-1680-/l5j06a-squeeze-kopffelder.png)](https://docs.squeeze.one/uploads/images/gallery/2026-11/l5j06a-squeeze-kopffelder.png)

### Positionen nicht übernehmen

Dafür gibt es keinen Schalter. In Squeeze unter Dokumentklasse → **Tabellen** die Spalte **Name (Zielsystem)** für alle Spalten leeren. Ohne Zeilen wird die Gentable nicht geschrieben. Das Mapping wird bei jedem Lauf neu gelesen.

<p class="callout info">Eine bereits befüllte Gentable eines vorhandenen Vorgangs wird dabei nicht geleert.</p>

## Schalter in Squeeze\_Pull\_Lib

Am Dateianfang von `Squeeze_Pull_Lib` stehen die Schalter. Im Paket sind die Betriebswerte gesetzt.

<table id="bkmrk-variable-test-betrie"><thead><tr class="header"><th>Variable</th><th>Test</th><th>Betrieb</th><th>Bedeutung</th></tr></thead><tbody><tr class="odd"><td>`TEST_KEEP_IN_EXPORT`</td><td>`true`</td><td>**`false`**</td><td>kein FINISHED, Beleg bleibt im Export, Vorgang bleibt Unfinished</td></tr><tr class="even"><td>`MAX_DOCS_PER_RUN`</td><td>`1`</td><td>`100`</td><td>höchstens so viele Belege je Lauf</td></tr><tr class="odd"><td>`LOCK_TIMEOUT_MIN`</td><td>`10`</td><td>`10`</td><td>Laufkennzeichen gilt danach als veraltet</td></tr><tr class="even"><td>`USE_ACTIVITY_LIST`</td><td>`false`</td><td>`false`</td><td>erst ab DOCUMENTS 6.3</td></tr><tr class="odd"><td>`TEMP_PATH`, `PAGE_SIZE`, `MAX_PAGES`</td><td>–</td><td>`<DEXPRO>\SqueezeDocs`, 35, 200</td><td>normalerweise nicht abzuändern</td></tr></tbody></table>

<p class="callout danger">`TEST_KEEP_IN_EXPORT` muss im Betrieb auf `false` stehen. Im Testmodus schreibt der Job einen deutlichen Hinweisblock ins Log.</p>

# 04 – Betrieb und Fehlersuche

Diese Seite beschreibt Log, typische Fehlerbilder und die Parallel-Sperre des Squeeze Pull-Jobs.

## Log

Das Log liegt monatlich unter:

```
<DEXPRO>\Logs\Invoice\JOBS\Invoice_JOB_SqueezePull_JJJJMM.log
```

## Typische Fälle

<table id="bkmrk-thema-vorgehen-fehle"><thead><tr class="header"><th>Thema</th><th>Vorgehen</th></tr></thead><tbody><tr class="odd"><td>Fehler finden</td><td>Filterordner Unfinished/ERROR öffnen. Diese Vorgänge bekommen keinen Workflow, bis der Pull für sie klappt.</td></tr><tr class="even"><td>Feld fehlt</td><td>Log: „Hinweis: Feld 'X' gibt es am Mappentyp … nicht“ → Name (Zielsystem) in Squeeze korrigieren oder entfernen.</td></tr><tr class="odd"><td>Register fehlt</td><td>Konfigurationsfehler: Der Lauf für die Klasse bricht ab, die restlichen Belege bleiben im Export. Parameter prüfen.</td></tr><tr class="even"><td>Processed nicht speicherbar</td><td>Log: „… bitte SqueezeStatus von Hand auf 'Processed' setzen“ → von Hand setzen, der Beleg ist in Squeeze schon abgeschlossen.</td></tr><tr class="odd"><td>Processed, aber noch im Export</td><td>Meist eine Verzögerung in Squeeze, das erledigt sich von selbst. Bleibt der Beleg liegen, überspringt der Job ihn bei jedem Lauf ohne FINISHED (Log: `uebersprungen (SqueezeStatus ist Processed)`). Dann den Beleg über „Erneut übergeben“ neu holen oder in Squeeze von Hand abschließen.</td></tr><tr class="even"><td>Erneut übergeben</td><td>Vorgang in DOCUMENTS löschen, in Squeeze den Export-Status „Pull“ zurücksetzen. Der nächste Lauf legt einen neuen Vorgang an.</td></tr><tr class="odd"><td>Zahlen und Datum</td><td>Zahlen: letztes Trennzeichen = Dezimaltrenner (wie Squeeze `/formatValueAs`). Datum nur `dd.mm.yyyy`; ungültige Werte bleiben leer, der Beleg wird nicht angehalten. Achtung: `1.000` in einem Squeeze-Textfeld wird als 1 gelesen, im Log steht dazu ein Hinweis.</td></tr></tbody></table>

## Parallel-Sperre

Damit nie zwei Läufe denselben Mappentyp bearbeiten, setzt der Job ein Laufkennzeichen im `propCache` (Arbeitsspeicher, nach einem Neustart leer):

```
SqueezePullLock_Invoice = <Lauf-ID>|<Zeitstempel>
```

Der Lauf erneuert den Zeitstempel vor jedem Beleg. Findet ein Lauf ein gültiges Kennzeichen, endet er sofort ohne Abholung. Wird der Zeitstempel 10 Minuten nicht erneuert, übernimmt der nächste Lauf.

<p class="callout warning">Nur im Notfall von Hand entfernen: `propCache.removeProperty("SqueezePullLock_Invoice")`. Vorher sicherstellen, dass kein Lauf aktiv ist.</p>

## Bekannte Einschränkungen

<table id="bkmrk-punkt-stand-http-tim"><thead><tr class="header"><th>Punkt</th><th>Stand</th></tr></thead><tbody><tr class="odd"><td>HTTP-Timeout für Squeeze-Aufrufe</td><td>erst ab DOCUMENTS 6.1 möglich. Bis dahin schützt `thread=1` die übrigen Jobs.</td></tr><tr class="even"><td>`getActivityList()`</td><td>ab DOCUMENTS 6.3, eingebaut, schreibt bisher nur ins Log</td></tr><tr class="odd"><td>Standard-Bug `Invoice_Action_StartWorkflow`</td><td>`cnt` undefiniert, wenn der Userexit `false` liefert → Skriptfehler statt Meldung; der Workflow startet trotzdem nicht</td></tr><tr class="even"><td>`PosQuantity` in Squeeze als Text angelegt</td><td>Der Wert wird als Zahl übernommen. Eine Menge `1.000` wird dabei als 1 gelesen (letztes Trennzeichen = Dezimaltrenner).</td></tr><tr class="odd"><td>`Invoice_Posting_Head` wird bei Updates nicht nachgeführt</td><td>Für die Dublettenprüfung unkritisch, Gadgets und Reports zeigen ggf. einen veralteten Status.</td></tr></tbody></table>