1. Opis ogólny
2. Zadania automatu, który oblicza rabat
3. Wykorzystanie obliczeń w fakturze [FKZ]
4. Uwagi, warunki i zastrzeżenia
5. Model danych
6. Rekomendacja wdrożeniowa
7. Tematy powiązane
1. Opis ogólny
Jak połączyć (jeśli można, to zautomatyzować) metody obliczania rabatu
z mechanizmem wystawiania faktur korygujących zbiorczych.
Można to połączyć, ale najlepiej rozdzielić proces na dwa poziomy:
1. mechanizm naliczenia rabatu okresowego, czyli 'ile rabatu należy się kontrahentowi za półrocze';
2. mechanizm wystawienia faktury korygującej zbiorczej FKZ, czyli
'jak tę kwotę poprawnie przenieść na dokument korekty'.
Z opisu wynika, że w Trawersie faktura korygująca zbiorcza służy właśnie do ujęcia opustu,
obniżki lub rabatu za wskazany okres, zawiera okres korekty, listę faktur korygowanych
oraz pozycję `[U] Rabat od całej faktury`.
Proponowany model automatyzacji
Najbezpieczniejszy schemat wygląda tak:
```
Sprzedaż z okresu
|
v
Raport / naliczenie rabatu okresowego
|
v
Propozycja korekty zbiorczej
|
v
Weryfikacja użytkownika
|
v
FKZ w NA > Faktury korygujące
|
v
Pozycja [U] Rabat od całej faktury
|
v
Dekretacja + KSeF
```
Czyli nie zaczynałbym od samego wystawiania faktury korygującej.
Najpierw trzeba zbudować 'warstwę naliczeniową', która policzy rabat,
a dopiero potem poda wynik do mechanizmu FKZ.
2. Zadania automatu, który oblicza rabat
Dla każdego kontrahenta i okresu, np. półrocza, automat powinien:
1. Wybrać faktury kwalifikowane
Na wejściu:
* odbiorca,
* okres od-do,
* waluta,
* typy dokumentów,
* faktury zatwierdzone,
* faktury nieanulowane,
* ewentualnie tylko wybrane grupy towarów.
W opisie Trawersa jest warunek, że do wystawienia FKZ wszystkie faktury
kontrahenta z danego okresu muszą być zatwierdzone [v], a faktury są w PLN .
Czyli automat powinien najpierw zrobić kontrolę:
```
Czy wszystkie faktury z okresu są zatwierdzone?
Czy są w PLN?
Czy dotyczą jednego kontrahenta?
Czy nie były już objęte wcześniejszą korektą rabatową?
```
2. Ustalić podstawę rabatu
W zależności od wybranej metody:
```
Podstawa = suma sprzedaży netto/brutto z faktur kwalifikowanych
```
albo:
```
Podstawa = suma sprzedaży tylko z wybranych grup asortymentowych
```
albo:
```
Podstawa = ilość sprzedana wybranych indeksów
```
Tutaj ważna uwaga: w opisie [FKZ] jest zapis, że kwota rabatu w pozycji `[U]`
liczona jest od wartości brutto sprzedaży, a program rozbija ją na netto i PTU/VAT .
Dlatego automat powinien jasno wiedzieć, czy rabat handlowy jest zdefiniowany od:
* netto,
* brutto,
* ilości,
* marży,
* wzrostu obrotu,
* wybranej grupy towarowej.
Potem wynik trzeba przeliczyć do formatu akceptowanego przez FKZ.
3. Obliczyć rabat według tabeli
Przykład tabeli:
| Kontrahent / grupa | Okres | Od obrotu | Do obrotu | Rabat |
| ------------------ | -------- | --------: | --------: | ----: |
| HURT | półrocze | 100 000 | 250 000 | 2% |
| HURT | półrocze | 250 000 | 500 000 | 4% |
| HURT | półrocze | 500 000 | > | 6% |
Dla prostego rabatu:
```
Kwota rabatu = obrót kwalifikowany × procent rabatu
```
Dla rabatu marginalnego (schodkowego):
```
Kwota rabatu =
część obrotu w progu 1 × %
+ część obrotu w progu 2 × %
+ część obrotu w progu 3 × %
```
Dla rabatu od wzrostu:
```
Kwota rabatu = max(sprzedaż bieżąca - sprzedaż bazowa, 0) × %
```
4. Rozbić rabat według stawek VAT
To jest kluczowe dla FKZ.
Trawers przy FKZ pokazuje wartości oznaczonych faktur w poszczególnych stawkach PTU/VAT,
a przy rejestracji pozycji `[U] Rabat` po wybraniu stawki PTU - podpowiada sumy sprzedaży i podatku .
Dlatego automat powinien policzyć rabat osobno dla każdej stawki VAT.
Przykład:
| Stawka VAT | Sprzedaż netto | VAT | Brutto | Udział brutto |
| ---------: | -------------: | -----: | ------: | ------------: |
| 23% | 100 000 | 23 000 | 123 000 | 96,85% |
| 8% | 3 000 | 240 | 3 240 | 2,55% |
| 0% | 750 | 0 | 750 | 0,60% |
Jeżeli rabat brutto wynosi 10 000, automat rozdziela:
```
23%: 10 000 × 96,85% = 9 685
8%: 10 000 × 2,55% = 255
0%: 10 000 × 0,60% = 60
```
Potem dla każdej stawki wylicza:
```
Netto rabatu = Brutto rabatu / (1 + stawka VAT)
VAT rabatu = Brutto rabatu - Netto rabatu
```
Dla 23%:
```
Netto = 9 685 / 1,23 = 7 873,98
VAT = 1 811,02
```
To pozwala przygotować dane dokładnie pod pozycję `[U]`.
3. Wykorzystanie obliczeń w fakturze korygującej zbiorczej [FKZ]
Wariant 1 - półautomatyczny, najłatwiejszy do wdrożenia
Automat robi tylko naliczenie i drukuje/eksportuje 'propozycję FKZ'.
Raport zawiera:
| Pole | Wartość |
| ---------------------- | -------------------- |
| Odbiorca | 000001 |
| Okres | 2026/01-2026/06 |
| Obrót kwalifikowany | 350 000 |
| Metoda rabatu | schodkowy all-units |
| Rabat | 5% |
| Kwota rabatu brutto | 21 525 |
| Kwota netto | 17 500 |
| VAT | 4 025 |
| Faktury do zaznaczenia | lista faktur |
| Stawki VAT | rozbicie 23%, 8%, 0% |
Operator następnie wchodzi:
```
NA > Sprzedaż > Faktury korygujące
```
wybiera korektę zbiorczą [FKZ], wskazuje okres, oznacza faktury F10,
a następnie wpisuje pozycję:
```
[U] Rabat od całej faktury
```
Ten wariant jest bezpieczny, bo nie ingeruje w mechanizm wystawiania FKZ.
Automatyzuje obliczenia, ale sam dokument nadal wystawia użytkownik.
To jest wariant, który rekomendowałbym jako pierwszy etap.
Wariant 2 - automatyczne przygotowanie 'paczek korekt'
Tu automat tworzy listę korekt do wystawienia:
```
Kontrahent | Okres | Faktury | Stawki VAT | Kwota rabatu | Metoda
```
Na przykład:
| Odbiorca | Okres | Rabat | 23% brutto | 8% brutto | Status |
| -------- | --------------- | ----: | ---------: | --------: | ---------- |
| 000001 | 2026/01-2026/06 | 5% | 9 685 | 255 | gotowe |
| 000018 | 2026/01-2026/06 | 3% | 4 920 | 0 | gotowe |
| 000025 | 2026/01-2026/06 | 0% | 0 | 0 | brak progu |
Użytkownik wybiera pozycję z listy, a program prowadzi go przez FKZ z gotowymi wartościami.
To nadal może wymagać potwierdzenia przez operatora, ale ogranicza ręczne liczenie.
Wariant 3 - pełna automatyzacja FKZ
Pełna automatyzacja oznaczałaby, że program sam:
1. wybiera kontrahentów,
2. liczy podstawę,
3. wyznacza rabat,
4. znajduje faktury,
5. tworzy FKZ,
6. dodaje pozycję `[U]`,
7. zapisuje dokument,
8. przygotowuje dekretację,
9. przekazuje do KSeF.
To jest możliwe koncepcyjnie, ale wymagałoby funkcji programowej/generatora po stronie Trawersa.
Z samego opisu wynika, że standardowy proces jest interaktywny:
operator wybiera korektę zbiorczą, wskazuje okres, oznacza faktury F10
i po Esc rejestruje pozycję `[U] Rabat`.
Czyli pełny automat powinien być traktowany jako rozszerzenie projektowo-programowe,
a nie tylko konfiguracja tabeli rabatowej.
4. Uwagi, warunki i zastrzeżenia
Bardzo ważne rozróżnienie:
Rabat od całości czy od części asortymentu
To decyduje, czy mechanizm FKZ `[U]` wystarczy.
Przypadek A - rabat od całej sprzedaży kontrahenta
Przykład:
> Klient dostaje 5% rabatu od całego obrotu półrocznego.
To pasuje idealnie do `[U] Rabat od całej faktury`.
Wtedy wystarczy:
```
okres + lista faktur + procent/kwota rabatu
```
Przypadek B - rabat tylko od wybranych grup lub indeksów
Przykład:
> Klient dostaje 4% rabatu, ale tylko od grupy 'AGD Premium'.
Tu trzeba uważać.
Jeżeli faktury zawierają jednocześnie towary objęte i nieobjęte rabatem,
to pozycja `[U] Rabat od całej faktury` może być zbyt szeroka,
bo logicznie dotyczy całej faktury.
W opisie jest też zastrzeżenie KSeF: jeżeli zbiorcza faktura korygująca dotyczy tylko
części dostaw towarów lub usług dla jednego odbiorcy w okresie, powinna dodatkowo
zawierać nazwę/rodzaj towaru lub usługi w polu P_7, a przy korekcie części faktury
sekcja <FaWiersz> powinna zawierać nazwę towarów/usług i ilość sprzedaną w P_8B .
Dlatego przy rabatach asortymentowych są trzy bezpieczne rozwiązania:
1. ograniczyć FKZ tylko do faktur, które w całości dotyczą rabatowanego asortymentu,
2. wystawiać osobne korekty dla grup asortymentowych, jeżeli program obsługuje
wymagane dane w KSeF,
3. pozostać przy rabacie od całej sprzedaży, a warunki asortymentowe traktować
tylko jako warunek uzyskania rabatu, nie jako podstawę korekty pozycyjnej.
Najprostszy wariant biznesowo:
```
Jeżeli klient kupił minimum 50 000 PLN grupy X,
to dostaje 2% rabatu od całego obrotu.
```
Wtedy warunek jest asortymentowy, ale korekta nadal dotyczy całej sprzedaży.
5. Model danych i przykład przebiegu obliczeń
Model danych
W praktyce potrzebne byłyby 4 tabele/obszary.
1. Definicja programu rabatowego
```
Program: RABAT_POLROCZE_HURT
Okres: półrocze
Typ: rabat od obrotu
Podstawa: sprzedaż brutto / netto
Waluta: PLN
Zakres: wszyscy odbiorcy z grupy HURT
Sposób liczenia: all-units / marginalny / kwotowy
Czy tworzyć FKZ: Tak
```
2. Progi rabatowe
```
Od obrotu Do obrotu Rabat
100 000 249 999,99 2%
250 000 499 999,99 4%
500 000 bez limitu 6%
```
NOTE: Patrz Obliczenia upustów natychmiastowych - w chwili wystawiania
faktur sprzedaży. Tam także tabele upustów + progi rabatowe (upustowe).
Obroty podawać dla okresu rabatowego, np. kwartału lub roku.
3. Wyłączenia
```
Nie uwzględniać:
- faktur anulowanych,
- korekt,
- usług transportowych,
- indeksów promocyjnych,
- sprzedaży z marżą poniżej X,
- wybranych grup towarowych.
```
4. Wyniki naliczenia
```
Odbiorca
Okres
Lista faktur
Obrót netto
Obrót brutto
Stawki VAT
Metoda
Procent rabatu
Kwota rabatu netto
Kwota rabatu VAT
Kwota rabatu brutto
Status: naliczone / zatwierdzone / FKZ wystawiona
Numer FKZ
```
Przykład przebiegu obliczeń
Załóżmy:
```
Odbiorca: 000001
Okres: 2026/01-2026/06
Sprzedaż brutto: 430 500
Sprzedaż netto: 350 000
VAT: 80 500
Metoda: rabat od obrotu półrocznego
Próg: powyżej 300 000 netto = 5%
```
Jeżeli umowa mówi, że rabat jest liczony od netto:
```
Rabat netto = 350 000 × 5% = 17 500
VAT 23% = 4 025
Rabat brutto = 21 525
```
Do FKZ trzeba przygotować:
```
Okres: 2026/01 do 2026/06
Faktury: wszystkie zakwalifikowane faktury odbiorcy
Pozycja: [U] Rabat od całej faktury
Stawka PTU: 23%
Rabat: 5%
Kwota brutto rabatu: -21 525
Netto-rabat: -17 500
PTU-rabat: -4 025
```
Dekretacja powinna pójść zgodnie z mechanizmem opisanym w FKZ:
```
Netto-rabat -> Korekta sprzedaży
PTU-rabat -> Korekta PTU/VAT
```
6. Rekomendacja wdrożeniowa
Najrozsądniej zrobić to etapami.
Etap 1 - raport naliczenia rabatów
Na początek automat nie wystawia FKZ. Tylko liczy:
```
kontrahent -> okres -> faktury -> podstawa -> procent -> kwota -> rozbicie VAT
```
Na końcu daje operatorowi gotowe dane do wpisania w FKZ.
To zmniejsza ryzyko błędów i pozwala sprawdzić zgodność z księgowością.
Etap 2 - propozycje FKZ
Program tworzy 'propozycje korekt zbiorczych' z listą faktur i kwotami.
Operator tylko zatwierdza.
Etap 3 - generator FKZ
Dopiero po sprawdzeniu procesu warto automatycznie tworzyć dokument FKZ.
Najważniejsza zasada projektowa
Mechanizm rabatowy powinien kończyć się wynikiem w takim formacie:
```
Kontrahent
Okres od-do
Lista faktur korygowanych
Stawka VAT
Podstawa brutto/netto
Procent rabatu albo kwota rabatu
Kwota netto rabatu
Kwota VAT rabatu
Kwota brutto rabatu
Opis przyczyny korekty
```
A mechanizm FKZ powinien tylko ten wynik zastosować.
Czyli:
```
Tabela rabatowa nie powinna bezpośrednio wystawiać faktury.
Tabela rabatowa powinna wygenerować propozycję korekty.
Dopiero zatwierdzona propozycja powinna tworzyć FKZ.
```
To daje kontrolę, audytowalność i możliwość wyjaśnienia każdej
korekty klientowi oraz księgowości.
NOTE: Obliczenia w Trawersie do ew. wykorzystania
* Obliczenia upustu bieżącego - przy wystawianiu faktur sprzedaży
* Dane roczne. Sumy transakcji
* Obliczanie prowizji handlowcom
* UStalanie % upustu odbiorcom (wg obrotów)
* raporty i analizy sprzedaży
...
NOTE: Patrz Obliczenia upustów natychmiastowych - w chwili wystawiania
faktur sprzedaży. Tam także tabele upustów + progi rabatowe (upustowe).
Tu: Obroty podawać dla okresu rabatowego, np. kwartału lub roku.