# 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`.