> For the complete documentation index, see [llms.txt](https://docs.eximee.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.eximee.com/budowanie-aplikacji/interfejs-uzytkownika/formularze/tworzenie-formularza/zapis-tymczasowy/parkowanie-i-odparkowanie-wnioskow.md).

# Parkowanie i odparkowanie wnioskow

## Wprowadzenie

Parkowanie wniosku polega na zapisaniu jego aktualnego stanu (wszystkich wypełnionych pól wniosku) z wyłączeniem dodanych załączników, w celu późniejszego powrotu do tego stanu podczas odparkowania wniosku.

{% hint style="warning" %}
**Uwaga!**\
Aby po odparkowaniu wniosek działał poprawnie należy uzupełnić listę pól, które nie mogą być odparkowywane.

W szczególności są to pola:

* związane z aktualną sesją użytkownika (np. zmienne sesyjne przechowujące **sessionKey** oraz wszystkie zmienne wynikające z mapowania parametrów wejściowych komponentów złożonych itp.),
* związane z danymi, których nie chcemy przechowywać do następnej sesji, np. dane tokenu sms, który zmieni się przy kolejnym uruchomieniu wniosku,
* związane z danymi aktywnymi czasowo, np. promocje,
* związane z powyższymi, ale wynikające z mapowania parametrów wejściowych komponentów złożonych itp.
  {% endhint %}

## Ustawienia

W tej sekcji możemy skonfigurować możliwość zapisu tymczasowego przez użytkownika.

<figure><img src="/files/F9jLZjVcx79AaKGXf7v0" alt=""><figcaption><p><em><strong>Ilustracja 1.</strong> Zapis tymczasowy w zakładce Właściwości w Eximee Designer</em></p></figcaption></figure>

<figure><img src="/files/aFQzV5wp0jEvqXtity6R" alt=""><figcaption><p><em><strong>Ilustracja 2.</strong> Włączenie opcji parkowania wniosku</em></p></figcaption></figure>

Dla tak skonfigurowanego, a następnie opublikowanego szablonu, podczas wypełniania bazującego na nim wniosku na ekranie pojawia sekcja odpowiedzialna za parkowanie z przyciskiem.

## Odtwarzanie wartości (biała/czarna lista pól)

W sekcji **Odtwarzanie wartości** możemy określić:

* które pola nie powinny zostać odparkowane przy odparkowywaniu wniosku przy użyciu **Blacklist**,
* które pola powinny zostać odparkowane przy odparkowywaniu wniosku przy użyciu **Whitelist** (pusta lista oznacza, że nic nie zostanie odparkowane).

Nie można jednocześnie używać białej listy jak i czarnej. W celu wybrania jednej listy (Whitelist lub Blacklist) używamy listy znajdującej się w zakładce **Właściwości** w sekcji **Zapis tymczasowy** i podsekcji **Odtwarzanie wartości**:

<figure><img src="/files/RXNfv4zpKBPqYz5Vwcuc" alt=""><figcaption><p><em><strong>Ilustracja 3.</strong> Przykład wybrania czarnej listy przy odparkowaniu</em></p></figcaption></figure>

W celu zdefiniowania pól należy je dodać do listy.

### Przykłady zastosowania

**Przykład 1** - promocja, która powinna wygasnąć po odparkowaniu:

* mamy promocję "xmas",
* dla wniosków uruchomionych z parametrem promotion=xmas mamy lepsze warunki,
* promocja kończy się w piątek,
* w piątek publikujemy szablon wniosku, który już nie obsługuje promocji "xmas",
* w szablonie wpisujemy "promotion" (i wszystkie zmienne do których przepisywana jest wartość zmiennej promotion np. poprzez Parametry wejściowe komponentów złożonych) na czarną listę,
* wniosek zaparkowany w czwartek i odparkowany w sobotę **nie będzie** zawierał pola promotion=xmas (chyba, że została ona ponownie przekazana jako parametr wejścia na wniosek).

**Przykład 2** - promocja, którą chcemy odparkowywać, ale z możliwością nadpisania odpowiednim parametrem:

* dla promocji "xmas" z powyższego przykładu chcemy zmienić typ promocji na promotion=xxx,
* w przypadku braku podania parametru chcemy użyć promocji z jaką klient wszedł na wniosek za pierwszym razem,
* w szablonie wpisujemy wszystkie zmienne do których przepisywana jest wartość zmiennej promotion np. poprzez Parametry wejściowe komponentów złożonych na czarną listę, jednak zmiennej promotion nie dodajemy do czarnej listy,
* klient po odparkowaniu z parametrem promotion=xxx **będzie** miał aktywną promocję xxx,
* klient po odparkowaniu bez parametru promotion, **będzie** miał aktywną tę samą promocję z jaką wniosek został zaparkowany.

## Parkowanie wniosku

Parkowanie wniosku polega na zapisaniu jego aktualnego stanu (wszystkich wypełnionych pól wniosku) z wyłączeniem dodanych załączników, w celu późniejszego powrotu do tego stanu.

### Klient niezalogowany

Proces parkowania rozpoczynamy przez naciśnięcie przycisku "**Zapisz**", w wyniku którego pojawia się okno dialogowe. W oknie tym **System** prosi nas o wprowadzenie danych autentykacyjnych, na podstawie których dokonana zostanie identyfikacja użytkownika w procesie odparkowywania danego wniosku.

<figure><img src="/files/nvAyJk0FRYviP1KqryxN" alt=""><figcaption><p><em><strong>Ilustracja 4.</strong> Okno wprowadzania danych autentykacyjnych</em></p></figcaption></figure>

Po zatwierdzeniu danych przyciskiem "**Zapisz**" wniosek zostanie zapisany wraz z wprowadzonymi danymi identyfikacyjnymi oraz unikalnym, nadanym mu numerem, w repozytorium. Potwierdza to wyświetlając następujące okno dialogowe:

<figure><img src="/files/CbIHNbSSpUQ66xDn3lSY" alt=""><figcaption><p><em><strong>Ilustracja 5.</strong> Okno potwierdzenia zaparkowania wniosku</em></p></figcaption></figure>

W ten sposób zaparkowany wniosek jest gotowy do odparkowania.

{% hint style="info" %}
**Uwaga!**\
Wpisywane hasła są sprawdzane pod kątem bezpieczeństwa według zaleceń agencji National Institute of Standards and Technology. Konfiguracja domyślna będzie zawierała taką politykę, aby hasło składało się z:

* jednej dużej litery,
* jednej małej,
* cyfry oraz znaku specjalnego,
* musi mieć co najmniej 8 znaków.

Konfiguracja jest niezależna dla każdego klienta i można ją zmienić w ***webforms.xml*** pod kluczem: **`<passwordPolicy>`** (jest to regex). Dodatkowo będzie możliwa modyfikacja komunikatu zwracanego w przypadku wpisania hasła niespełniającego wymogów bezpieczeństwa - tym razem w ***navigation.localization*** dla każdego klienta. Klucz ***iew\.form.password.policyInfo*** odpowiada komunikatowi, jakie wymogi powinno spełniać hasło, a ***iew\.form.password.policyViolation*** to klucz od komunikatu wyświetlanego w przypadku próby wpisania hasła niespełniającego wymogów bezpieczeństwa.
{% endhint %}

### Klient zalogowany

W przypadku klienta zalogowanego po naciśnięciu przycisku "**Zapisz**" wniosek zostanie zapisany w systemie bez konieczności podawania danych uwierzytelniających. Mechanizm wykorzystuje identyfikator klienta pobrany z sesji. Po pomyślnym zaparkowaniu zostanie wyświetlony komunikat potwierdzający zakończenie operacji.

Należy pamiętać, że użytkownik może mieć zaparkowaną tylko jedną instancję wniosku danego typu.

## Odparkowanie wniosku

Odparkowywanie wniosku to funkcjonalność umożliwiająca odczytanie wcześniej zaparkowanego wniosku (wraz ze wszystkimi polami wypełnionymi w momencie parkowania, ale z wyłączeniem załączników dodanych do parkowanego wniosku).

### Klient niezalogowany

Aby rozpocząć proces odparkowywania, należy przejść do strony, do której link otrzymujemy w oknie dialogowym potwierdzającym pomyślne zaparkowanie wniosku ***(Ilustracja 5)*** lub w mailu otrzymanym po zaparkowaniu (na adres wskazany podczas parkowania).

Po wyświetleniu w przeglądarce strony znajdującej się pod wskazanym linkiem, pokaże się okno dialogowe, w którym **System** zażąda potwierdzenia danych identyfikujących osobę, która dokonała parkowania wniosku:

<figure><img src="/files/9AEWXiTKgSrQ6qKeWzGI" alt=""><figcaption><p><em><strong>Ilustracja 6.</strong> Okno odparkowania wniosku</em></p></figcaption></figure>

Odparkowanie wniosku jest możliwe tylko po prawidłowym wprowadzeniu danych identyfikacyjnych (email oraz hasło) zapisanych w procesie parkowania. Po naciśnięciu przycisku "OK" zostaniemy przekierowani do strony wniosku ze stanem pól z momentu jego zaparkowania.

### Klient zalogowany

Odparkowywanie wcześniej zapisanego wniosku w przypadku klienta zalogowanego może się odbyć na dwa sposoby:

#### Sposób pierwszy

Wywołanie akcji ***load.html*** - żądanie **POST** na adres [*https://eximee-dmz:8080/webforms/wnioski/NAZWA\_WNIOSKU/load.html*](https://eximee-dmz:8080/webforms/wnioski/NAZWA_WNIOSKU/load.html)

gdzie: `NAZWA_WNIOSKU` - nazwa wniosku do odparkowania

Po wywołaniu akcji zostaniemy przekierowani do strony wniosku ze stanem pól z momentu jego zaparkowania.

#### Sposób drugi

{% hint style="info" %}
Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.
{% endhint %}

Wywołanie akcji ***getFormTemplate*** - żądanie **POST** na adres [*https://eximee-dmz:8080/webforms/api/formService/getFormTemplate*](https://eximee-dmz:8080/webforms/api/formService/getFormTemplate)

Jeśli wniosek został wcześniej zaparkowany, akcja zwróci wniosek ze stanem pól z momentu jego zaparkowania.

### Serwisy uruchamiane przy odparkowaniu

Dla wniosku można zdefiniować serwisy, które zostaną wywołane w momencie odparkowania wniosku. Sposób ich dodawania opisany został w [**Serwisy przy wznowieniu**](/budowanie-aplikacji/interfejs-uzytkownika/formularze/tworzenie-formularza/zapis-tymczasowy/serwisy-przy-wznowieniu.md).

Serwisy wywoływane są przed **entry service** i mogą nadpisywać wartości znajdujące się na wniosku.

{% hint style="warning" %}
Jeżeli na wartość komponentów lub zmiennych sesyjnych wpływają inne komponenty, lub zmienne sesyjne zasilane za pomocą **UnparkEntryService** to komponenty te zachowają się jak podczas standardowego wejścia na wniosek, na przykład:
{% endhint %}

<figure><img src="/files/xeAxl64KwfJ1AqS24yKM" alt=""><figcaption><p><em><strong>Ilustracja 7.</strong> Przepływ danych</em></p></figcaption></figure>

W tym przypadku `TextField1` jest zasilany za pomocą **UnparkEntryService**. Wpływa on na wartość pola `TextField2` (poprzez **PageService**, np. *EchoService).* Ponieważ usługi **UnparkEntryService** wykonywane są przed usługami **EntryService** oraz na pole `TextField2` wpływa pole zasilane przez **UnparkEntryService** to ostatecznie wartości pola `TextField2` będzie odpowiadała wartości zmiennej sesyjnej **SessionVariable** zasilonej za pomocą **EntryService**.

### Powiadomienia

Powiadomienia wysyłane po zaparkowaniu wniosku realizowane są za pomocą mechanizmu notyfikacji opisanego tutaj: [**Autozapis i Pola kontaktowe**](/budowanie-aplikacji/interfejs-uzytkownika/formularze/tworzenie-formularza/zapis-tymczasowy/autozapis-i-pola-kontaktowe.md).

### Odparkowanie wniosku przez wejście na link z powiadomienia

Do powiadomień może być dołączany link do odparkowania wniosku.

Wejście na link wysłany w powiadomieniu pozwala na odparkowanie wniosków zaparkowanych przez użytkownika zalogowanego oraz wniosków zaparkowanych przez użytkownika niezalogowanego.

Jeżeli wniosek był zaparkowany przez **użytkownika zalogowanego**, po wejściu na link zawarty w powiadomieniu następuje przekierowanie na stronę logowania. Jeżeli klient się uwierzytelni, zostanie dalej przekierowany na przygotowany do dalszej edycji, ostatni zaparkowany przez niego wniosek danego typu.

Jeżeli wniosek był zaparkowany przez **użytkownika niezalogowanego**, po wejściu na link zawarty w powiadomieniu następuje przekierowanie na stronę weryfikacji hasła jednorazowego dostępu. Podczas wejścia na tę stronę, na numer telefonu zapisany we wniosku zostaje wysłany SMSem jednorazowy kod dostępu do wniosku. Aby uruchomić zaparkowany wniosek, użytkownik musi potwierdzić swoją tożsamość przez wpisanie otrzymanego hasła. Treść wiadomości SMS z jednorazowym kodem dostępu pochodzi z szablonu wiadomości email, podanego w konfiguracji aplikacji webforms, w pliku */etc/eximee/webforms.xml* na serwerze dmz. Poniżej przykład konfiguracji (należy podać nazwę i wersję szablonu wiadomości email z repozytorium):

```xml
<webforms>
...
...
...
...
    <server>
    ...
    ...
    ...
        <unparkOtp>
            <smsContentArtifact>otpSmsContentDefaultTemplate-*</smsContentArtifact>
            ...
            ...
        </unparkOtp>
    ...
    ...
    </server>
</webforms>
```

{% hint style="warning" %}
W treści szablonu email (sic! tak się nazywa typ artefaktu w repozytorium - szablony te służą również do definicji treści wiadomości SMS) podanego w konfiguracji jako szablon z treścią wiadomości SMS z jednorazowym kodem dostępu do zaparkowanego wniosku **musi** zawierać znacznik: **${SMS\_CODE}** - zostanie on zastąpiony wygenerowanym kodem dostępu do zaparkowanego wniosku.
{% endhint %}

### Warunkowe odparkowanie wniosku

{% hint style="info" %}
Dostępność funkcjonalności zależy od licencji i może nie być dostępna we wszystkich wdrożeniach.
{% endhint %}

Dla wniosku można zdefiniować warunek, który zostanie sprawdzony w momencie odparkowania wniosku. Gdy warunek zostanie spełniony, wniosek zostanie odparkowany i pokazany użytkownikowi. W przeciwnym wypadku tworzony jest nowy formularz.

<figure><img src="/files/KVMpGZUOWAHBy1E1lYqW" alt=""><figcaption><p><em><strong>Ilustracja 8.</strong> Sekcja Odparkowanie wniosku z warunkiem do spełnienia</em></p></figcaption></figure>

Informacje o tym jak definiować warunki znajdują się na stronie: [**Język wyrażeń definiowania warunków (warunki z getValue)**](/budowanie-aplikacji/logika-biznesowa/jezyk-wyrazen-definiowania-warunkow-warunki-z-getvalue.md).

Funkcjonalność warunkowego odparkowania wniosku rozszerza metodę `_getValue('componentId')_` języka wyrażeń o dwie nowe funkcjonalności:

* możliwość uzyskania dostępu do wartości komponentu po jego MID,
* możliwość przyjęcia argumentu z prefixem ***parked***. Prefix ten umożliwia uzyskanie dostępu do zaparkowanych wartości wniosku.

**Przykładowy warunek odparkowania na podstawie MID**

```javascript
getValue('parked:usernameFieldMid') == 'parkedValue'
```

**Przykładowy warunek odparkowania na podstawie ID**

```javascript
getValue('parked:GesTextField1') == 'parkedValue'
```

**Przykładowy warunek odparkowania z wykorzystaniem injectableFields**

```javascript
getValue('parked:nazwazmiennej') == getValue('injected:nazwazmiennej')
```

{% hint style="info" %}
**Uwaga!**\
Może wystąpić sytuacja, że kiedy odparkowujemy wniosek mogą pojawić się inne strony, które wcześniej nie były widoczne.

Powinniśmy wtedy wejść na pierwszą stronę, która wcześniej nie została odwiedzona.
{% endhint %}

{% hint style="info" %}
**Uwaga!**\
Podczas odparkowania uaktywnia się *mechanizm blokowania statusu wniosku*. Oznacza on tyle, że dopóki wniosek jest odparkowany, nie może on zmienić swojego statusu (np. na wniosek porzucony). Wnioski takie są odblokowywane przy parkowaniu (również automatycznym parkowaniu), zapisywaniu lub po 1 dniu od ostatniej modyfikacji (ochrona przed zawieszaniem się wniosków przez system).

Więcej na temat tego mechanizmu znajdziesz tutaj: [**Mechanizm blokowania statusów**](/budowanie-aplikacji/interfejs-uzytkownika/formularze/tworzenie-formularza/zapis-tymczasowy/mechanizm-blokowania-statusow.md)
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.eximee.com/budowanie-aplikacji/interfejs-uzytkownika/formularze/tworzenie-formularza/zapis-tymczasowy/parkowanie-i-odparkowanie-wnioskow.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
