soneta-place-def-elementow

This commit is contained in:
Marcin Wojas
2026-03-26 23:19:11 +01:00
parent d4fd0b9398
commit 29f5aca0a2
9 changed files with 1680 additions and 1 deletions
@@ -0,0 +1,300 @@
# Algorytmy naliczania — kluczowa konfiguracja
## Typy algorytmów
| Typ | Opis |
|---|---|
| **Kreator algorytmu** | Konfigurator wizualny — definiujesz podstawę, mnożnik, korekty. System generuje kod C#. |
| **Edytor algorytmu** | Ręczny kod C# w edytorze. Pełna kontrola nad logiką. |
| **Klasa algorytmu** | Wskazanie klasy C# z zewnętrznego assembly. |
| **Za okres nieobecności** | Wbudowany algorytm dla nieobecności. |
| **Jak ekwiwalent za urlop** | Wbudowany algorytm ekwiwalentu. |
| **Jak urlop wypoczynkowy** | Wbudowany algorytm urlopu wypoczynkowego. |
| **Jak urlop okolicznościowy** | Wbudowany algorytm urlopu okolicznościowego. |
## Kreator algorytmu — parametry
### Podstawa
| Typ podstawy | Opis | Przykład użycia |
|---|---|---|
| `Kwota` | Stała kwota z parametru elementu | Premia kwotowa |
| `Wyrażenie` | Wyrażenie C# jako podstawa | Wynagrodzenie zasadnicze |
| `Kod metody` | Wywołanie metody C# | Zaawansowane obliczenia |
| `ZasadniczeNominalne` | Nominalne wynagrodzenie zasadnicze | Dodatek stażowy, premia procentowa |
| `ZasadniczeRzeczywiste` | Rzeczywiste wynagrodzenie zasadnicze | — |
| `Brutto` | Kwota brutto wypłaty | — |
| `BruttoBezZasiłków` | Brutto bez zasiłków | — |
| `StawkaZaszeregowania1h` | Stawka godzinowa | Nadgodziny |
| `PodstawaUrlopuWypoczynkowego1h` | Podstawa urlopu za 1h | — |
| `PodstawaEkwiwalentu1h` | Podstawa ekwiwalentu za 1h | — |
| `NajniższeWynagrodzenie1h` | Minimalna stawka za 1h | — |
### Pomniejszenie za okres niezatrudnienia
| Wartość | Opis |
|---|---|
| `NiePomniejszany` | Bez pomniejszenia |
| `Proporcjonalnie` | Proporcjonalnie do dni zatrudnienia |
| `JednaTrzydzista` | 1/30 za każdy dzień niezatrudnienia |
| `DniKalendarzowe` | Wg dni kalendarzowych |
### Mnożnik
| Typ | Opis |
|---|---|
| `BezWspółczynnika` | Bez mnożnika |
| `Procent` | Procent z parametru elementu |
| `Ułamek` | Ułamek (np. 1/3) |
| `Współczynnik` | Stały współczynnik |
| `ZależnyOdStażuPracy` | Tabela procentowa wg lat stażu |
### Korekta za nieobecności
Dla każdego typu nieobecności oddzielnie:
| Wartość | Opis |
|---|---|
| `NiePomniejsza` | Brak pomniejszenia |
| `Proporcjonalnie` | Proporcjonalnie do godzin nieobecności |
| `JednaTrzydziesta` | 1/30 za każdy dzień nieobecności |
| `JakZasadnicze` | Tak samo jak wynagrodzenie zasadnicze |
| `ZaKażdyDzień` | Za każdy dzień kalendarzowy |
| `Algorytm` | Własny algorytm pomniejszenia |
Typy nieobecności: nieusprawiedliwione, niepłatne, płatne (urlopy), wychowawcze, macierzyńskie, rehabilitacyjne, opiekuńcze, chorobowe.
### Zależność od czasu pracy
| Wartość | Opis |
|---|---|
| `NieZależyOdCzasu` | Bez zależności od czasu |
| `Godzinę` | Wartość za godzinę × czas pracy |
| `Miesięcznie` | Wartość miesięczna z korektami za nieobecności |
## Edytor algorytmu — struktura kodu C#
Algorytm edytora wymaga **dwóch metod publicznych**:
```csharp
// Metoda _Param — przygotowanie danych do obliczeń
public void {Identyfikator}_Param({KlasaElementu} Element, WypSkladnik Składnik)
{
// Ustaw podstawy, czas, dni, procent
}
// Metoda _Wylicz — obliczenie końcowej wartości
public Currency {Identyfikator}_Wylicz({KlasaElementu} Element, WypSkladnik Składnik)
{
// Zwróć obliczoną wartość elementu
return ...;
}
```
Opcjonalna trzecia metoda (dla elementów Etat):
```csharp
// Metoda _Wartość1h — wartość za 1 godzinę (używana przez inne elementy)
public double {Identyfikator}_Wartość1h({KlasaElementu} Element)
{
return ...;
}
```
### Klasy elementów wg rodzaju
| Rodzaj | Klasa w sygnaturze metody |
|---|---|
| Etat | `Soneta.Place.WypElementEtat` |
| Dodatek | `Soneta.Place.WypElementDodatek` |
| Dodatek automatyczny | `Soneta.Place.WypElementDodatekAutomatyczny` |
| Nieobecność | `Soneta.Place.WypElementNieobecnosc` |
| Nadgodziny I/II/św | `Soneta.Place.WypElementNadgodziny` |
| Nocne | `Soneta.Place.WypElementNocne` |
| Umowa | `Soneta.Place.WypElementUmowa` |
| Świadczenie | `Soneta.Place.WypElementSwiadczenie` |
**Uwaga:** Klasa `WypElementDodatekAutomatyczny` jest odrębna od `WypElementDodatek` — algorytmy dodatków automatycznych muszą używać tej klasy w sygnaturze.
## Przykłady kompletnych algorytmów C#
### Wynagrodzenie zasadnicze miesięczne (Etat)
Podstawa: wyrażenie `StawkaZaszeregowania1h * Norma.Czas`
```csharp
public void Wynagrodzenie_Zasadnicze_Mies__Param(
Soneta.Place.WypElementEtat Element, WypSkladnik Składnik)
{
DoubleCy podstawa1 = StawkaZaszeregowania1h(Element.Okres.To)
* Pracownik.Czasy.Norma(Składnik.Okres).Czas;
Składnik.Podstawa1 = podstawa1;
CzasDni cd = Element.Pracownik.Czasy.Norma(Składnik.Okres);
Składnik.Czas = cd.Czas;
Składnik.Dni = cd.Dni;
}
public Currency Wynagrodzenie_Zasadnicze_Mies__Wylicz(
Soneta.Place.WypElementEtat Element, WypSkladnik Składnik)
{
return Składnik.Podstawa1;
}
public double Wynagrodzenie_Zasadnicze_Mies__Wartość1h(
Soneta.Place.WypElementEtat Element)
{
return Element.PrzeliczNaPln(StawkaZaszeregowania1h(Element.Okres.To)).Value;
}
```
### Dodatek stażowy (Dodatek — zależny od stażu pracy)
Podstawa: ZasadniczeNominalne, Mnożnik: ZależnyOdStażuPracy
```csharp
public void Dodatek_Stażowy_Param(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
DoubleCy podstawa1 = ZasadniczeNominalne(Element.Okres.To);
Składnik.Podstawa1 = podstawa1;
WspolczynnikDefElementu współczynnik = Element.Definicja.Algorytm.KreatorAlgorytmu.Wspolczynnik;
Date dataStażu = współczynnik.PracaWFirmie ? Element.Okres.To : Date.Empty;
int lataStażu = Element.Pracownik.StażPracy(dataStażu, współczynnik.PodstawaStazu).Lata;
Składnik.Procent = współczynnik[lataStażu];
CzasDni cd = Element.Pracownik.Czasy.Norma(Składnik.Okres);
Składnik.Czas = cd.Czas;
Składnik.Dni = cd.Dni;
}
public Currency Dodatek_Stażowy_Wylicz(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
return (Składnik.Podstawa1 * Składnik.Procent);
}
```
### Premia procentowa (Dodatek — procent od zasadniczego)
Podstawa: ZasadniczeNominalne, Mnożnik: Procent (z parametru dodatku)
```csharp
public void Premia_Procentowa_Param(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
DoubleCy podstawa1 = ZasadniczeNominalne(Element.Okres.To);
FromTo okres = PełnyOkresNaliczania(Element, Składnik);
if (okres == Składnik.Okres)
Składnik.Podstawa1 = podstawa1;
else {
// Przeliczenie proporcjonalne gdy okres składnika != pełny okres
Time tokr = Czasy.KalkPlanu.NormaWym(Fraction.One, new Time(8,0), Składnik.Okres).Czas;
Time tpełny = Czasy.KalkPlanu.NormaKodeksowaWym(Fraction.One, new Time(8,0), okres).Czas;
if (tpełny == Time.Zero)
Składnik.Podstawa1 = DoubleCy.Zero;
else if (tokr > tpełny)
Składnik.Podstawa1 = podstawa1;
else
Składnik.Podstawa1 = podstawa1 * tokr / tpełny;
}
Składnik.Procent = Element.DodHistoria.Procent;
CzasDni cd = Element.Pracownik.Czasy.Norma(Składnik.Okres);
Składnik.Czas = cd.Czas;
Składnik.Dni = cd.Dni;
}
public Currency Premia_Procentowa_Wylicz(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
return (Składnik.Podstawa1 * Składnik.Procent);
}
```
### Premia kwotowa (Dodatek — prosta kwota)
Podstawa: Kwota
```csharp
public void Premia_Param(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
DoubleCy podstawa1 = Element.DodHistoria.Kwota;
Składnik.Podstawa1 = podstawa1;
CzasDni cd = Element.Pracownik.Czasy.Norma(Składnik.Okres);
Składnik.Czas = cd.Czas;
Składnik.Dni = cd.Dni;
}
public Currency Premia_Wylicz(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
return Składnik.Podstawa1;
}
```
### Dopłata do nadgodzin 50% (Nadgodziny I)
Podstawa: StawkaZaszeregowania1h + wynagrodzenie za nadgodziny, Mnożnik: 50%
```csharp
public void Dopłata_Do_N_Godz_50__Param(
Soneta.Place.WypElementNadgodziny Element, WypSkladnik Składnik)
{
DoubleCy podstawa1;
if (!Element.PracHistoria.Etat.WynagrodzenieAkordowe
|| !Płace.Config.Etat.NadgodzinyAkordowe60)
podstawa1 = Element.PracHistoria.Etat.Kalendarz.Nadgodziny.PodstawaWgNormyKP
? StawkaZaszeregowaniaNorm1h(Element.Okres.To) + WnagrodzenieZaNadgodziny(Element)
: StawkaZaszeregowania1h(Element.Okres.To) + WnagrodzenieZaNadgodziny(Element);
else
using (Soneta.Business.LogCatcher listener = new Soneta.Business.LogCatcher("Urlop")) {
using (Pracownik.Session.Logout(true)) {
var naliczanie = new NaliczanieWypoczynkowy(Element, Składnik);
naliczanie.NaliczPodstawy();
var procent = new Percent(0.6m);
podstawa1 = Składnik.Podstawa1 * procent;
Składnik.Podstawa1 = Składnik.Podstawa2 = DoubleCy.Zero;
}
}
Składnik.Podstawa1 = podstawa1;
Składnik.Procent = Element.Definicja.Algorytm.KreatorAlgorytmu.Wspolczynnik.Procent;
ZestawienieNadgodzin zestNad = NadgodzinyDobaOkres(Element, Składnik);
Składnik.Czas = zestNad.N50;
}
public Currency Dopłata_Do_N_Godz_50__Wylicz(
Soneta.Place.WypElementNadgodziny Element, WypSkladnik Składnik)
{
return ((Currency)(Składnik.Podstawa1 * Składnik.Procent) * Składnik.Czas);
}
```
### Potrącenie za nieobecność 1/28 (Dodatek — edytor algorytmu, niestandardowe)
Podstawa: ZasadniczeNominalne, pomniejszenie o 1/28 za każdy dzień nieobecności.
```csharp
public void Potrącenie_Za_Nieobecność_1_28_Param(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
DoubleCy podstawa = ZasadniczeNominalne(Element.Okres.To);
Składnik.Podstawa1 = podstawa;
int dniNieobecnosci = Element.Pracownik.Czasy.Nieobecnosci(Składnik.Okres).Dni;
Składnik.Dni = dniNieobecnosci;
CzasDni cd = Element.Pracownik.Czasy.Norma(Składnik.Okres);
Składnik.Czas = cd.Czas;
}
public Currency Potrącenie_Za_Nieobecność_1_28_Wylicz(
Soneta.Place.WypElementDodatek Element, WypSkladnik Składnik)
{
return Składnik.Podstawa1 - (Składnik.Podstawa1 * Składnik.Dni / 28);
}
```