
# Izvoz in ponovno predvajanje poteka dela

Queuety lahko izvozi celotno zgodovino izvajanja poteka dela v prenosljivo obliko JSON in jo ponovno predvaja v drugem okolju. To je uporabno za lokalno ponovitev napak iz produkcije, selitev potekov dela med okolji in revizijo.

## Izvoz poteka dela

### PHP API

Pokličite `Queuety::export_workflow()` z ID-jem poteka dela. Vrne polje, ki ga je mogoče serializirati v JSON:

```php
use Queuety\Queuety;

$data = Queuety::export_workflow( $workflow_id );
```

Če želite neposredno pridobiti niz JSON:

```php
$json = json_encode( $data, JSON_PRETTY_PRINT );
file_put_contents( '/tmp/workflow-42.json', $json );
```

### CLI

```bash
wp queuety workflow export <id> [--output=<file>]
```

| Možnost | Opis |
|---|---|
| `<id>` | ID poteka dela (obvezno) |
| `--output=<file>` | Pot datoteke, v katero se zapiše JSON. Privzeto je stdout. |

```bash
# Print to stdout
wp queuety workflow export 42

# Write to a file
wp queuety workflow export 42 --output=/tmp/workflow-42.json
```

## Ponovno predvajanje poteka dela

### PHP API

Pokličite `Queuety::replay_workflow()` s podatki izvoza. Vrne ID novega poteka dela:

```php
use Queuety\Queuety;

$json = file_get_contents( '/tmp/workflow-42.json' );
$data = json_decode( $json, true );

$new_id = Queuety::replay_workflow( $data );
```

### CLI

```bash
wp queuety workflow replay <file>
```

| Možnost | Opis |
|---|---|
| `<file>` | Pot do izvožene datoteke JSON (obvezno) |

```bash
wp queuety workflow replay /tmp/workflow-42.json
# Success: Workflow replayed. New workflow ID: 85.
```

## Struktura JSON

Izvoz vsebuje celotno stanje poteka dela, povezana opravila, dogodke sledi, vnose dnevnika, shranjene signale, artefakte, kose in vse vrstice čakanja na odvisnosti potekov dela:

```json
{
    "workflow": {
        "id": 42,
        "name": "generate_report",
        "status": "failed",
        "state": { "user_id": 1, "_steps": [...], "_queue": "default" },
        "current_step": 2,
        "total_steps": 4,
        "parent_workflow_id": null,
        "parent_step_index": null,
        "started_at": "2026-03-28 10:00:00",
        "completed_at": null,
        "failed_at": "2026-03-28 10:05:00",
        "error_message": "API timeout",
        "deadline_at": null
    },
    "jobs": [
        {
            "id": 100,
            "queue": "default",
            "handler": "App\\Handlers\\FetchDataHandler",
            "payload": {},
            "status": "completed",
            "attempts": 1,
            "max_attempts": 3,
            "step_index": 0
        }
    ],
    "events": [
        {
            "id": 1,
            "job_id": 100,
            "step_index": 0,
            "step_name": "fetchData",
            "step_type": "single",
            "handler": "App\\Handlers\\FetchDataHandler",
            "event": "step_completed",
            "input": { "user_id": 1 },
            "output": { "records": 150 },
            "state_before": { "user_id": 1 },
            "state_after": { "user_id": 1, "records": 150 },
            "context": { "source": "api" },
            "error": null,
            "duration_ms": 230,
            "created_at": "2026-03-28 10:00:01"
        }
    ],
    "logs": [
        {
            "id": 1,
            "event": "workflow_started",
            "handler": "generate_report",
            "created_at": "2026-03-28 10:00:00"
        }
    ],
    "signals": [],
    "artifacts": [],
    "chunks": [],
    "wait_dependencies": [],
    "exported_at": "2026-03-28T12:00:00+00:00",
    "queuety_version": "0.22.0"
}
```

Nekatera polja so v zgornjem primeru skrajšana. Dejanski izvoz vključuje vse stolpce sledi iz vsake vrstice dogodka.

Izvozi potekov dela ohranijo tudi metapodatke poteka dela, kot so `definition_version`, `definition_hash` in `idempotency_key`, če so bili nastavljeni pri izvirnem izvajanju.

## Kako deluje ponovno predvajanje

Ko ponovno predvajate izvožen potek dela:

1. Ustvari se nova vrstica poteka dela z izvoženim stanjem in definicijami korakov
2. Ime novega poteka dela je `{original_name}_replay_{timestamp}`
3. Zgodovinski dogodki in dnevniki poteka dela se znova vstavijo v novo okolje
4. Shranjeni signali in vrstice odvisnosti čakanja na potek dela se ponovno predvajajo kot zgodovinsko stanje
5. Če je bil izvirni potek dela še vedno `running`, se trenutni korak postavi v čakalno vrsto za obdelavo. Koraki Repeat in `start_workflows()` se ne postavijo znova v čakalno vrsto, zato ponovno predvajanje, ki se ustavi pri enem od njih, ostane `running` brez opravila ([#17](https://github.com/inline0/queuety/issues/17))
6. Če je bil izvirni potek dela v stanju `waiting_for_signal`, `waiting_for_workflows`, `paused`, `failed`, `cancelled` ali `completed`, se to stanje ohrani tudi pri ponovno predvajanem poteku dela

Ponovno predvajani potek dela dobi nov ID in deluje neodvisno. Na izvirnika ne vpliva.

Pri ponovnih predvajanjih `waiting_for_workflows` se izvožene vrstice odvisnosti ponovno ustvarijo z istimi ID-ji potekov dela. To je uporabno za revizijo in v okoljih, kjer ti odvisni poteki dela prav tako obstajajo, vendar ID-jev odvisnosti med okolji ne preslika samodejno.

## Primeri uporabe

### Ponovitev napak iz produkcije

Izvozite neuspešni potek dela iz produkcije in ga ponovno predvajajte lokalno:

```bash
# On production
wp queuety workflow export 42 --output=/tmp/workflow-42.json

# Copy the file to your local environment

# On local
wp queuety workflow replay /tmp/workflow-42.json
```

Ponovno predvajani potek dela ima povsem enako stanje in definicije korakov. Pri izvajajočih se potekih dela se trenutni korak znova postavi v čakalno vrsto, zato lahko izvajanje nadaljujete tam, kjer se je končalo. Začasno ustavljeni ali čakajoči poteki dela pa se ponovno ustvarijo v tem blokiranem stanju za pregled.

### Selitev potekov dela med okolji

Potek dela premaknite iz pripravljalnega okolja v produkcijo (ali obratno) tako, da ga izvozite in ponovno predvajate:

```bash
# On staging
wp queuety workflow export 15 --output=workflow.json

# On production
wp queuety workflow replay workflow.json
```

### Revizija in arhiviranje

Izvozite zaključene poteke dela za dolgoročno shranjevanje ali skladnost. Datoteka JSON vsebuje celotno zgodovino izvajanja, vključno z vhodi, izhodi, stanjem pred in po korakih, časovnimi podatki in podrobnostmi o napakah.

```php
$data = Queuety::export_workflow( $workflow_id );
// Store $data in your archive system, S3, etc.
```
