Skip to main content

Refunds & Notifications · Article 6.1

Kiedy zdarzają się zwroty: gałęzie aneksu Δ_REFUND

Zwrot w Clozo jest zawsze powiązany z gałęzią aneksu Δ_REFUND — częściową (poprawiona suma mniejsza niż opłacona zaliczka) lub pełną (poprawiona suma wynosi zero). Aneks jest wyzwalaczem prawnym; zwrot jest konsekwencją gotówkową.

Clozo nie ma przycisku „oddaj klientowi trochę pieniędzy" oderwany od umowy. Każdy zwrot to noga gotówkowa podpisanego aneksu, który obniżył sumę poniżej tego, co klient już zapłacił jako zaliczkę. Ten projekt jest celowy — zwroty bez odpowiadającej zmiany umowy to koszmar audytu podatkowego; powiązanie każdego zwrotu z podpisanym aneksem zapewnia, że dokumenty prawne (Stornorechnung, Berichtigung, Gutschrift) i przepływ gotówki są zawsze zsynchronizowane.

Quick visual tour

  1. when-refunds-happen step 1: Prośba o zwrot nadchodzi. Nie panikuj — jest jasna ścieżka.

    Step 1: Prośba o zwrot nadchodzi. Nie panikuj — jest jasna ścieżka.

  2. when-refunds-happen step 2: Sprawdź kwalifikowalność na drzewie decyzji. Większość przypadków jest prawidłowa.

    Step 2: Sprawdź kwalifikowalność na drzewie decyzji. Większość przypadków jest prawidłowa.

  3. when-refunds-happen step 3: Naciśnij Zwróć. Stripe obsługuje faktyczny przepływ pieniędzy.

    Step 3: Naciśnij Zwróć. Stripe obsługuje faktyczny przepływ pieniędzy.

  4. when-refunds-happen step 4: Obserwuj jak monety wracają z Twojego skarbca do klienta.

    Step 4: Obserwuj jak monety wracają z Twojego skarbca do klienta.

  5. when-refunds-happen step 5: Wystaw notę kredytową. Księgowość zamyka się czysto.

    Step 5: Wystaw notę kredytową. Księgowość zamyka się czysto.

Step by step

  1. Zdecyduj kwotę zwrotu.

    To nie jest liczba, którą wpisujesz — to konsekwencja edytowania pozycji w aneksie. Nowa suma poniżej pobranej zaliczki → zwrot. Nowa suma wynosi zero → pełna zaliczka zwrócona.

  2. Otwórz kreator aneksu.

    /proposals/{id}/amend. Zmniejszaj pozycje w Kroku 1, dopóki baner kontekstu zaliczki kreatora nie pokaże „Zwrot: X EUR".

  3. Ustaw powód w Kroku 2.

    Minimum 30 znaków (dłuższe minimum odzwierciedla, że zmniejszasz — rób to jawnie). Powód pojawia się na aneksie, w narracji noty kredytowej i jest częścią ścieżki audytu.

  4. Wyślij i poczekaj na podpisanie przez klienta.

    Aneks przechodzi przez standardowy przepływ z bramą PIN (artykuł 7.4). Przy podpisaniu uruchamia się pipeline zwrotu.

  5. Obserwuj oś czasu zwrotu.

    Baner „Zwrot w toku" pojawia się na stronie oferty po podpisaniu. Etapy: wystawiony → zlecony (Stripe zaakceptował) → rozliczony (webhook Stripe potwierdzony) — patrz artykuł 8.4.

Po podpisaniu aneksu Δ_REFUND przez klienta, baner oferty przełącza się na „Zwrot w toku" z numerem noty kredytowej i oczekiwanym oknem. Lista Dokumenty dostaje nowe dokumenty (Storno, Berichtigung, Gutschrift). Pole refund_status noty kredytowej steruje UI: requested → „Zwrot w toku, spodziewany w ciągu 3–5 dni roboczych"; failed → „Zwrot nie powiódł się" z opcjami ponowienia / ręcznymi; succeeded / manual → „Zwrot zakończony dnia [data]".

Why this works this way

Przepływ zwrotu jest zakorzeniony w process_amendment_signed (backend/apps/proposals/amendment_postsign.py). W momencie podpisania funkcja sprawdza amendment.triggers_refund. Jeśli true, oblicza refund_gross = deposit_paid − revised_total (obcięte do zera) i:

1. Tworzy DepositInvoiceCorrection (Berichtigung der Anzahlungsrechnung) z correction_type=partial_refund lub full_cancellation. 2. Tworzy CreditNote (Gutschrift) z refund_status=pending, kwotami brutto/netto/VAT podzielonymi przez _split_refund_vat i odwołaniami do oryginalnej faktury zaliczkowej (numer + data) zgodnie z Art. 219 Dyrektywy VAT UE. 3. Wywołuje _trigger_stripe_refund, aby wykonać nogę gotówkową przez API Stripe na połączonym koncie freelancera.

Dwa różne „wyzwalaczy" produkują zwrot:

WyzwalaczGałąźTworzone dokumentyNoga gotówkowa
Aneks z revised_total < deposit_paid, oryginalna zaliczka opłacona przez StripeΔ_REFUND częściowy LUB pełnyStorno + Berichtigung + Gutschrift (+ anulowana FinalInvoice przy pełnym)Zwrot Stripe (artykuł 8.2)
Aneks z revised_total < deposit_paid, oryginalna zaliczka opłacona przez SEPA / poza systememΔ_REFUND częściowy LUB pełnyTe same dokumentyRęczny SEPA (artykuł 8.3 + 8.9)

Nie ma ścieżki „zwróć płatność końcową", ponieważ płatność końcowa nie jest zaliczką — po Opłacona, umowa jest rozliczona. Aby częściowo zwrócić opłaconą umowę, tworzysz aneks, który zmniejsza zakres (Δ−), podpisujesz go; oferta wraca do Oczekiwanie na płatność końcową z mniejszym saldem, a nadpobrana kwota jest obsługiwana przez pipeline po podpisaniu jako Δ_REFUND. Aneks jest zawsze główną bramą.

Uwaga: od 2026-05-07, bezpośrednie usunięcie oferty in_work jest również zabronione — backend odrzuca DELETE z HTTP 409 in_work_requires_amendment. Czerwony callout „Zwróć wszystko" kreatora aneksu (Krok 1) to jedyna ścieżka UI do zwrotu opłaconej zaliczki; kliknięcie go ustawia ilość każdej pozycji na 0, kreator wyświetla gałąź Δ_REFUND pełny, a przy podpisaniu przez klienta uruchamia się pipeline tego artykułu (zgodnie z [D-125]).

Troubleshooting

Keep reading