Przejdź do zawartości

Moduł:Trenerzy sezon

Z Encyklopedia Poznanskiego Sportu
Wersja z dnia 10:45, 17 sie 2026 autorstwa Admin karol bury (dyskusja | edycje) (Utworzono nową stronę "local p = {} function p.main(frame) -- ===================================================== -- PARAMETRY -- ===================================================== local sezon = frame.args.sezon or "" local druzyna = frame.args.druzyna or "" if sezon == "" then return "'''Błąd:''' nie podano sezonu." end if druzyna == "" then return "'''Błąd:''' nie podano drużyny." end -- Bezpieczne przygotowanie wa…")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Trenerzy sezon/opis

local p = {}

function p.main(frame)

    -- =====================================================
    -- PARAMETRY
    -- =====================================================

    local sezon = frame.args.sezon or ""
    local druzyna = frame.args.druzyna or ""

    if sezon == "" then
        return "'''Błąd:''' nie podano sezonu."
    end

    if druzyna == "" then
        return "'''Błąd:''' nie podano drużyny."
    end

    -- Bezpieczne przygotowanie wartości do SQL
    local sezonSQL = mw.ustring.gsub(sezon, "'", "''")
    local druzynaSQL = mw.ustring.gsub(druzyna, "'", "''")

    -- =====================================================
    -- POBRANIE TRENERÓW I MECZÓW
    -- =====================================================

    local fields = table.concat({
        "SztabMeczu.osoba=trener",
        "SztabMeczu.druzyna=druzyna",

        "Mecze.id=mecz",
        "Mecze.data=data",
        "Mecze.sezon=sezon",
        "Mecze.druzyna1=druzyna1",
        "Mecze.druzyna2=druzyna2",
        "Mecze.gole1=gole1",
        "Mecze.gole2=gole2",
        "Mecze.wynik=wynik"
    }, ",")

    local args = {
        join = "SztabMeczu.mecz=Mecze.id",
        where =
            "SztabMeczu.rola='Trener'" ..
            " AND SztabMeczu.druzyna='" .. druzynaSQL .. "'" ..
            " AND Mecze.sezon='" .. sezonSQL .. "'",
        orderBy = "Mecze.data ASC",
        limit = 5000
    }

    local rows = mw.ext.cargo.query(
        "SztabMeczu,Mecze",
        fields,
        args
    )

    if not rows or #rows == 0 then
        return "''Brak danych o trenerach dla tej drużyny w podanym sezonie.''"
    end

    -- =====================================================
    -- PODSUMOWANIA TRENERÓW
    -- =====================================================

    local trenerzy = {}

    local function nowePodsumowanie()

        return {
            mecze = 0,
            zwyciestwa = 0,
            porazki = 0,
            remisy = 0,
            rzucone = 0,
            stracone = 0
        }

    end

    -- =====================================================
    -- PRZETWARZANIE MECZÓW
    -- =====================================================

    for _, row in ipairs(rows) do

        local trener = row.trener or ""

        if trener ~= "" then

            if not trenerzy[trener] then
                trenerzy[trener] = nowePodsumowanie()
            end

            local stat = trenerzy[trener]

            local d1 = row.druzyna1 or ""
            local d2 = row.druzyna2 or ""

            local g1 = tonumber(row.gole1 or "")
            local g2 = tonumber(row.gole2 or "")

            -- Jeżeli pola gole1/gole2 nie są dostępne,
            -- próbujemy odczytać wynik z pola wynik.

            if not g1 or not g2 then

                local wynik = row.wynik or ""

                local a, b =
                    wynik:match("(%d+)%s*:%s*(%d+)")

                if a and b then
                    g1 = tonumber(a)
                    g2 = tonumber(b)
                end

            end

            -- Bez poprawnego wyniku nie liczymy meczu
            -- do klasyfikacji.

            if g1 and g2 then

                stat.mecze =
                    stat.mecze + 1

                -- -----------------------------------------
                -- DRUŻYNA TRENERA JAKO GOSPODARZ
                -- -----------------------------------------

                if druzyna == d1 then

                    stat.rzucone =
                        stat.rzucone + g1

                    stat.stracone =
                        stat.stracone + g2

                    if g1 > g2 then

                        stat.zwyciestwa =
                            stat.zwyciestwa + 1

                    elseif g1 < g2 then

                        stat.porazki =
                            stat.porazki + 1

                    else

                        stat.remisy =
                            stat.remisy + 1

                    end

                -- -----------------------------------------
                -- DRUŻYNA TRENERA JAKO GOŚĆ
                -- -----------------------------------------

                elseif druzyna == d2 then

                    stat.rzucone =
                        stat.rzucone + g2

                    stat.stracone =
                        stat.stracone + g1

                    if g2 > g1 then

                        stat.zwyciestwa =
                            stat.zwyciestwa + 1

                    elseif g2 < g1 then

                        stat.porazki =
                            stat.porazki + 1

                    else

                        stat.remisy =
                            stat.remisy + 1

                    end

                end

            end

        end

    end

    -- =====================================================
    -- USUNIĘCIE TRENERÓW BEZ POLICZONYCH MECZÓW
    -- =====================================================

    for trener, stat in pairs(trenerzy) do

        if stat.mecze == 0 then
            trenerzy[trener] = nil
        end

    end

    -- =====================================================
    -- SPRAWDZENIE DANYCH
    -- =====================================================

    local lista = {}

    for trener, stat in pairs(trenerzy) do

        table.insert(
            lista,
            {
                trener = trener,
                stat = stat
            }
        )

    end

    if #lista == 0 then
        return "''Brak kompletnych danych o meczach trenerów w tym sezonie.''"
    end

    -- =====================================================
    -- SORTOWANIE
    -- =====================================================

    table.sort(
        lista,
        function(a, b)

            -- najpierw liczba zwycięstw
            if a.stat.zwyciestwa ~= b.stat.zwyciestwa then
                return a.stat.zwyciestwa > b.stat.zwyciestwa
            end

            -- następnie liczba meczów
            if a.stat.mecze ~= b.stat.mecze then
                return a.stat.mecze > b.stat.mecze
            end

            -- następnie bilans
            local bilansA =
                a.stat.rzucone - a.stat.stracone

            local bilansB =
                b.stat.rzucone - b.stat.stracone

            if bilansA ~= bilansB then
                return bilansA > bilansB
            end

            return a.trener < b.trener

        end
    )

    -- =====================================================
    -- WYNIK
    -- =====================================================

    local wynik = {}

    table.insert(
        wynik,
        '{| class="wikitable sortable" style="width:100%; text-align:center;"'
    )

    -- Nagłówki

    table.insert(
        wynik,
        "! Trener"
    )

    table.insert(
        wynik,
        "! Mecze"
    )

    table.insert(
        wynik,
        "! W"
    )

    table.insert(
        wynik,
        "! P"
    )

    table.insert(
        wynik,
        "! R"
    )

    table.insert(
        wynik,
        "! % zwycięstw"
    )

    table.insert(
        wynik,
        "! Kosze rzucone"
    )

    table.insert(
        wynik,
        "! Kosze stracone"
    )

    table.insert(
        wynik,
        "! Bilans"
    )

    -- =====================================================
    -- WIERSZE
    -- =====================================================

    for _, item in ipairs(lista) do

        local trener = item.trener
        local stat = item.stat

        local bilans =
            stat.rzucone - stat.stracone

        local procent = 0

        if stat.mecze > 0 then

            procent =
                (stat.zwyciestwa / stat.mecze) * 100

        end

        -- Zaokrąglenie do jednego miejsca

        procent =
            string.format(
                "%.1f",
                procent
            )

        -- Link do strony trenera

        local trenerLink =
            "[[" .. trener .. "]]"

        table.insert(
            wynik,
            "|-"
        )

        table.insert(
            wynik,
            "| " .. trenerLink
        )

        table.insert(
            wynik,
            "| " .. stat.mecze
        )

        table.insert(
            wynik,
            "| " .. stat.zwyciestwa
        )

        table.insert(
            wynik,
            "| " .. stat.porazki
        )

        table.insert(
            wynik,
            "| " .. stat.remisy
        )

        table.insert(
            wynik,
            "| " .. procent .. "%"
        )

        table.insert(
            wynik,
            "| " .. stat.rzucone
        )

        table.insert(
            wynik,
            "| " .. stat.stracone
        )

        local bilansTekst

        if bilans > 0 then

            bilansTekst =
                "+" .. bilans

        else

            bilansTekst =
                tostring(bilans)

        end

        table.insert(
            wynik,
            "| " .. bilansTekst
        )

    end

    table.insert(
        wynik,
        "|}"
    )

    return table.concat(
        wynik,
        "\n"
    )

end

return p