using System.Linq;
using Soneta.Business;
using Soneta.Kadry;
using Soneta.Kalend;
using Soneta.Place;
using Soneta.Test;
using Soneta.Types;
using Prac = Soneta.Kadry.Pracownik;
namespace Soneta.Skills.Test.KadryPlace.Pracownik;
///
/// Wspólna baza testów domeny Kadry/Płace (pracownik, etat, nieobecności, kalendarz, umowy, wypłaty).
/// Dziedziczy z , dzięki czemu:
///
/// - udostępnia gotową sesję operacyjną (Session) powiązaną z testową bazą Demo (GoldStandard),
/// - automatycznie wycofuje (rollback) wszystkie zmiany w bazie po zakończeniu testu,
/// - daje metody pomocnicze InTransaction/SaveDispose do pracy w transakcjach.
///
/// Baza dodaje skróty często powtarzane w testach kadrowo-płacowych: dostęp do modułów
/// (Kadry, Płace, Kalendarz) oraz pobieranie pracowników z bazy Demo po kodzie/nazwisku.
///
/// Cała baza operuje wyłącznie na publicznym kontrakcie platformy Soneta — tak jak dodatek
/// programisty zewnętrznego, który nie ma dostępu do kodu źródłowego aplikacji.
///
///
public abstract class PracownikTestBase : TestBase
{
// === Moduły bieżącej sesji operacyjnej ===
/// Moduł Kadry — kartoteka pracowników (Pracownicy), historia kadrowa, etaty, umowy.
protected KadryModule Kadry => Session.GetKadry();
/// Moduł Płace — wypłaty, listy płac, elementy wynagrodzenia, definicje elementów.
protected PlaceModule Place => Session.GetPlace();
/// Moduł Kalendarz — nieobecności, kalendarze, plan pracy, dni pracy, RCP, limity.
protected KalendModule Kalend => Session.GetKalend();
// === Kody pracowników dostępnych w bazie Demo (GoldStandard) ===
// Baza Demo zawiera ~80 zatrudnionych pracowników etatowych (po jednym zapisie historii każdy).
// Kody są stabilne między uruchomieniami — używamy ich jako punktów wejścia do scenariuszy odczytu.
/// Kody przykładowych pracowników etatowych z bazy Demo (pole Pracownik.Kod).
protected static class Pracownik_
{
public const string Andrzejewski = "006";
public const string Bednarek = "007";
public const string Bujak = "008";
public const string Strzelecki = "009";
}
// === Wyszukiwanie pracowników (publiczne API) ===
/// Pobiera pracownika po kodzie (klucz unikalny WgKodu, case-insensitive) albo null.
protected Prac Pracownik(string kod) => Kadry.Pracownicy.WgKodu[kod];
/// Pierwszy pracownik wg kodu — wygodny, deterministyczny punkt startu dla testów odczytu.
protected Prac PierwszyPracownik() => Kadry.Pracownicy.WgKodu.Cast().First();
}