# 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); } ```