Módulo:Temporada/Campanha: mudanças entre as edições

De Clube Atletico Mineiro - Enciclopedia Galo Digital
Ir para navegação Ir para pesquisar
Criou página com '-- Module:Temporada/Campanha -- Campanha por competição da temporada -- Projeto Wiki Galo Digital local Utils = require("Module:Temporada/Utils") local Partidas = require("Module:Temporada/Partidas") local Campanha = {} -------------------------------------------------- -- Estrutura base -------------------------------------------------- local function novaCampanha() return { jogos = 0, vitorias = 0, empates = 0, derrotas = 0, gols_pro = 0, gols_contra = 0, m...'
 
Sem resumo de edição
 
Linha 2: Linha 2:
-- Campanha por competição da temporada
-- Campanha por competição da temporada
-- Projeto Wiki Galo Digital
-- Projeto Wiki Galo Digital
--
-- Etapa 4.1 – Campanha por Competição
--
-- Dependências:
--  - Module:Temporada/Utils
--  - Module:Temporada/Partidas


local Utils = require("Module:Temporada/Utils")
local Utils = require("Module:Temporada/Utils")
Linha 9: Linha 15:


--------------------------------------------------
--------------------------------------------------
-- Estrutura base
-- Estrutura base de campanha
--------------------------------------------------
--------------------------------------------------
local function novaCampanha()
local function novaCampanha()
return {
return {
jogos = 0, vitorias = 0, empates = 0, derrotas = 0,
jogos = 0,
gols_pro = 0, gols_contra = 0,
vitorias = 0,
mandante = { jogos = 0, vitorias = 0, empates = 0, derrotas = 0, gols_pro = 0, gols_contra = 0 },
empates = 0,
visitante = { jogos = 0, vitorias = 0, empates = 0, derrotas = 0, gols_pro = 0, gols_contra = 0 }
derrotas = 0,
}
gols_pro = 0,
end
gols_contra = 0,


local function saldo(c)
mandante = {
return c.gols_pro - c.gols_contra
jogos = 0,
end
vitorias = 0,
empates = 0,
derrotas = 0,
gols_pro = 0,
gols_contra = 0
},


local function pontos(c)
visitante = {
return (c.vitorias * 3) + c.empates
jogos = 0,
end
vitorias = 0,
 
empates = 0,
local function aproveitamento(c)
derrotas = 0,
return Utils.aproveitamento(pontos(c), c.jogos * 3)
gols_pro = 0,
gols_contra = 0
}
}
end
end


--------------------------------------------------
--------------------------------------------------
-- Processa partida
-- Processa uma partida dentro da campanha
--------------------------------------------------
--------------------------------------------------
local function processar(c, p)
local function processarPartida(c, p)
if p.anulada or not p.conta then return end
if p.anulada or not p.conta then
return
end


local lado
local lado
if Utils.isAtletico(p.mandante) then lado = "mandante"
if Utils.isAtletico(p.mandante) then
elseif Utils.isAtletico(p.visitante) then lado = "visitante"
lado = "mandante"
else return end
elseif Utils.isAtletico(p.visitante) then
lado = "visitante"
else
return
end
 
c.jogos = c.jogos + 1
c[lado].jogos = c[lado].jogos + 1
 
local golsPro, golsContra, resultado


local gp, gc, res
if lado == "mandante" then
if lado == "mandante" then
gp, gc, res = p.gols_mandante, p.gols_visitante, p.resultado_mandante
golsPro = p.gols_mandante
golsContra = p.gols_visitante
resultado = p.resultado_mandante
else
else
gp, gc, res = p.gols_visitante, p.gols_mandante, p.resultado_visitante
golsPro = p.gols_visitante
golsContra = p.gols_mandante
resultado = p.resultado_visitante
end
end


if p.wo then res = "V" end
c.gols_pro = c.gols_pro + golsPro
c.gols_contra = c.gols_contra + golsContra
c[lado].gols_pro = c[lado].gols_pro + golsPro
c[lado].gols_contra = c[lado].gols_contra + golsContra


c.jogos = c.jogos + 1
if resultado == "V" then
c.gols_pro = c.gols_pro + gp
c.gols_contra = c.gols_contra + gc
 
c[lado].jogos = c[lado].jogos + 1
c[lado].gols_pro = c[lado].gols_pro + gp
c[lado].gols_contra = c[lado].gols_contra + gc
 
if res == "V" then
c.vitorias = c.vitorias + 1
c.vitorias = c.vitorias + 1
c[lado].vitorias = c[lado].vitorias + 1
c[lado].vitorias = c[lado].vitorias + 1
elseif res == "E" then
elseif resultado == "E" then
c.empates = c.empates + 1
c.empates = c.empates + 1
c[lado].empates = c[lado].empates + 1
c[lado].empates = c[lado].empates + 1
elseif res == "D" then
elseif resultado == "D" then
c.derrotas = c.derrotas + 1
c.derrotas = c.derrotas + 1
c[lado].derrotas = c[lado].derrotas + 1
c[lado].derrotas = c[lado].derrotas + 1
Linha 73: Linha 96:


--------------------------------------------------
--------------------------------------------------
-- Render
-- Funções auxiliares
--------------------------------------------------
local function saldo(c)
return c.gols_pro - c.gols_contra
end
 
local function aproveitamento(c)
local pontos = (c.vitorias * 3) + c.empates
local maximos = c.jogos * 3
if maximos == 0 then
return "–"
end
return string.format("%.1f%%", (pontos / maximos) * 100)
end
 
--------------------------------------------------
-- Renderização da Campanha por Competição
--------------------------------------------------
--------------------------------------------------
function Campanha.render(frame)
function Campanha.render(frame)
local ano = tonumber(frame.args.ano)
local ano = tonumber(frame.args.ano)
if not ano then
if not ano then
return "Erro: parâmetro <code>ano</code> inválido."
return "Erro: parâmetro <code>ano</code> não informado."
end
end


local Dados = require("Module:Temporada/Dados/" .. ano)
local partidas = Partidas.obterPorAno(ano)
local porComp = {}
local porComp = {}


for _, args in ipairs(Dados.partidas or {}) do
for _, args in ipairs(partidas) do
local p = Partidas.criar(args)
local p = Partidas.criar(args)
local comp = Utils.normalizeString(p.competicao)
if p.competicao and p.competicao ~= "" then
if comp == "" then comp = "Sem competição" end
porComp[p.competicao] = porComp[p.competicao] or novaCampanha()
porComp[comp] = porComp[comp] or novaCampanha()
processarPartida(porComp[p.competicao], p)
processar(porComp[comp], p)
end
end
end


Linha 98: Linha 137:


for nome, c in pairs(porComp) do
for nome, c in pairs(porComp) do
table.insert(out,
-- TOTAL
'|- \n| rowspan="3" | [[' .. nome .. ']]' ..
table.insert(out, "|-")
'\n| Total | ' .. c.jogos .. ' | ' .. c.vitorias .. ' | ' .. c.empates .. ' | ' .. c.derrotas ..
table.insert(out, '| rowspan="3" | [[' .. nome .. ']]')
' | ' .. c.gols_pro .. ' | ' .. c.gols_contra .. ' | ' .. saldo(c) .. ' | ' .. aproveitamento(c)
table.insert(out, "| Total")
)
table.insert(out, "| " .. c.jogos)
table.insert(out,
table.insert(out, "| " .. c.vitorias)
'|- \n| Mandante | ' .. c.mandante.jogos .. ' | ' .. c.mandante.vitorias .. ' | ' ..
table.insert(out, "| " .. c.empates)
c.mandante.empates .. ' | ' .. c.mandante.derrotas ..
table.insert(out, "| " .. c.derrotas)
' | ' .. c.mandante.gols_pro .. ' | ' .. c.mandante.gols_contra ..
table.insert(out, "| " .. c.gols_pro)
' | ' .. saldo(c.mandante) .. ' | ' .. aproveitamento(c.mandante)
table.insert(out, "| " .. c.gols_contra)
)
table.insert(out, "| " .. saldo(c))
table.insert(out,
table.insert(out, "| " .. aproveitamento(c))
'|- \n| Visitante | ' .. c.visitante.jogos .. ' | ' .. c.visitante.vitorias .. ' | ' ..
 
c.visitante.empates .. ' | ' .. c.visitante.derrotas ..
-- MANDANTE
' | ' .. c.visitante.gols_pro .. ' | ' .. c.visitante.gols_contra ..
table.insert(out, "|-")
' | ' .. saldo(c.visitante) .. ' | ' .. aproveitamento(c.visitante)
table.insert(out, "| Mandante")
)
table.insert(out, "| " .. c.mandante.jogos)
table.insert(out, "| " .. c.mandante.vitorias)
table.insert(out, "| " .. c.mandante.empates)
table.insert(out, "| " .. c.mandante.derrotas)
table.insert(out, "| " .. c.mandante.gols_pro)
table.insert(out, "| " .. c.mandante.gols_contra)
table.insert(out, "| " .. saldo(c.mandante))
table.insert(out, "| " .. aproveitamento(c.mandante))
 
-- VISITANTE
table.insert(out, "|-")
table.insert(out, "| Visitante")
table.insert(out, "| " .. c.visitante.jogos)
table.insert(out, "| " .. c.visitante.vitorias)
table.insert(out, "| " .. c.visitante.empates)
table.insert(out, "| " .. c.visitante.derrotas)
table.insert(out, "| " .. c.visitante.gols_pro)
table.insert(out, "| " .. c.visitante.gols_contra)
table.insert(out, "| " .. saldo(c.visitante))
table.insert(out, "| " .. aproveitamento(c.visitante))
end
end


table.insert(out, '|}')
table.insert(out, "|}")
return table.concat(out, '\n')
 
return table.concat(out, "\n")
end
end


return Campanha
return Campanha

Edição atual tal como às 21h15min de 24 de janeiro de 2026

Predefinição:Documentation

Módulo:Temporada/Campanha

O Módulo:Temporada/Campanha é responsável pela consolidação da campanha do Clube Atlético Mineiro por competição em uma determinada temporada, no projeto Wiki Galo Digital.

Ele processa as partidas registradas no módulo de dados da temporada e apresenta os resultados agregados por competição, com recortes de desempenho total, como mandante e como visitante.

---

Escopo e responsabilidades

Este módulo é responsável por:

  • Agrupar partidas por competição
  • Calcular campanha do Atlético em cada competição
  • Separar desempenho:
    • Total
    • Mandante
    • Visitante
  • Calcular:
    • Jogos
    • Vitórias, empates e derrotas
    • Gols pró e contra
    • Saldo de gols
    • Aproveitamento
  • Renderizar tabela consolidada por competição

Predefinição:Aviso

---

Dependências

Este módulo depende diretamente de:

  • Module:Temporada/Utils
  • Module:Temporada/Partidas

E consome dados exclusivamente de:

  • Module:Temporada/Dados/ANO

---

Estrutura de dados

Estrutura base de campanha

Cada campanha por competição utiliza a seguinte estrutura:

  • Estatísticas gerais
    • jogos
    • vitorias
    • empates
    • derrotas
    • gols_pro
    • gols_contra
  • Recorte como mandante
  • Recorte como visitante

Essa estrutura é inicializada por competição.

---

Funções internas

processarPartida(c, p)

Processa uma partida individual dentro da campanha da competição.

  • Ignora partidas:
    • Anuladas
    • Não contabilizáveis
  • Identifica se o Atlético atuou como:
    • Mandante
    • Visitante
  • Atualiza:
    • Jogos
    • Resultados
    • Gols pró e contra

---

saldo(c)

Calcula o saldo de gols da estrutura informada.

  • Retorno
    • gols_pro - gols_contra

---

aproveitamento(c)

Calcula o aproveitamento percentual da campanha.

  • Regra
    • Pontuação padrão 3-1-0
  • Retorno
    • Percentual formatado
    • Retorna “–” se não houver jogos

Predefinição:Nota

---

Função pública

render(frame)

Renderiza a tabela de campanha por competição da temporada.

  • Parâmetro
    • frame.args.ano
  • Fluxo de execução
  1. Obtém partidas do ano
  2. Agrupa por competição
  3. Consolida campanha
  4. Renderiza tabela com três linhas por competição:
    1. Total
    2. Mandante
    3. Visitante
  • Saída
    • Tabela wiki estruturada

Predefinição:Aviso

---

Regras de validação

  • Ano inválido gera erro controlado
  • Competições vazias são ignoradas
  • Partidas anuladas não entram no cálculo
  • Partidas não contabilizáveis são ignoradas

---

Boas práticas e manutenção

  • Não misturar lógica editorial com lógica de campanha
  • Alterações na estrutura exigem revisão da renderização
  • Novos recortes devem ser documentados
  • Dados históricos devem permanecer no módulo de dados do ano
  • Evitar duplicação de cálculos já existentes em outros módulos

---

Páginas relacionadas

---

Histórico

  • Módulo criado para consolidação da campanha por competição
  • Centraliza recortes total, mandante e visitante
  • Estruturado para facilitar expansão futura

-- Module:Temporada/Campanha
-- Campanha por competição da temporada
-- Projeto Wiki Galo Digital
--
-- Etapa 4.1 – Campanha por Competição
--
-- Dependências:
--  - Module:Temporada/Utils
--  - Module:Temporada/Partidas

local Utils = require("Module:Temporada/Utils")
local Partidas = require("Module:Temporada/Partidas")

local Campanha = {}

--------------------------------------------------
-- Estrutura base de campanha
--------------------------------------------------
local function novaCampanha()
	return {
		jogos = 0,
		vitorias = 0,
		empates = 0,
		derrotas = 0,
		gols_pro = 0,
		gols_contra = 0,

		mandante = {
			jogos = 0,
			vitorias = 0,
			empates = 0,
			derrotas = 0,
			gols_pro = 0,
			gols_contra = 0
		},

		visitante = {
			jogos = 0,
			vitorias = 0,
			empates = 0,
			derrotas = 0,
			gols_pro = 0,
			gols_contra = 0
		}
	}
end

--------------------------------------------------
-- Processa uma partida dentro da campanha
--------------------------------------------------
local function processarPartida(c, p)
	if p.anulada or not p.conta then
		return
	end

	local lado
	if Utils.isAtletico(p.mandante) then
		lado = "mandante"
	elseif Utils.isAtletico(p.visitante) then
		lado = "visitante"
	else
		return
	end

	c.jogos = c.jogos + 1
	c[lado].jogos = c[lado].jogos + 1

	local golsPro, golsContra, resultado

	if lado == "mandante" then
		golsPro = p.gols_mandante
		golsContra = p.gols_visitante
		resultado = p.resultado_mandante
	else
		golsPro = p.gols_visitante
		golsContra = p.gols_mandante
		resultado = p.resultado_visitante
	end

	c.gols_pro = c.gols_pro + golsPro
	c.gols_contra = c.gols_contra + golsContra
	c[lado].gols_pro = c[lado].gols_pro + golsPro
	c[lado].gols_contra = c[lado].gols_contra + golsContra

	if resultado == "V" then
		c.vitorias = c.vitorias + 1
		c[lado].vitorias = c[lado].vitorias + 1
	elseif resultado == "E" then
		c.empates = c.empates + 1
		c[lado].empates = c[lado].empates + 1
	elseif resultado == "D" then
		c.derrotas = c.derrotas + 1
		c[lado].derrotas = c[lado].derrotas + 1
	end
end

--------------------------------------------------
-- Funções auxiliares
--------------------------------------------------
local function saldo(c)
	return c.gols_pro - c.gols_contra
end

local function aproveitamento(c)
	local pontos = (c.vitorias * 3) + c.empates
	local maximos = c.jogos * 3
	if maximos == 0 then
		return "–"
	end
	return string.format("%.1f%%", (pontos / maximos) * 100)
end

--------------------------------------------------
-- Renderização da Campanha por Competição
--------------------------------------------------
function Campanha.render(frame)
	local ano = tonumber(frame.args.ano)
	if not ano then
		return "Erro: parâmetro <code>ano</code> não informado."
	end

	local partidas = Partidas.obterPorAno(ano)
	local porComp = {}

	for _, args in ipairs(partidas) do
		local p = Partidas.criar(args)
		if p.competicao and p.competicao ~= "" then
			porComp[p.competicao] = porComp[p.competicao] or novaCampanha()
			processarPartida(porComp[p.competicao], p)
		end
	end

	local out = {}
	table.insert(out, '{| class="wikitable gd-table gd-campanha"')
	table.insert(out, '|+ Campanha por Competição – Temporada ' .. ano)
	table.insert(out, '! Competição !! Recorte !! Jogos !! Vitórias !! Empates !! Derrotas !! Gols pró !! Gols contra !! Saldo !! Aproveitamento')

	for nome, c in pairs(porComp) do
		-- TOTAL
		table.insert(out, "|-")
		table.insert(out, '| rowspan="3" | [[' .. nome .. ']]')
		table.insert(out, "| Total")
		table.insert(out, "| " .. c.jogos)
		table.insert(out, "| " .. c.vitorias)
		table.insert(out, "| " .. c.empates)
		table.insert(out, "| " .. c.derrotas)
		table.insert(out, "| " .. c.gols_pro)
		table.insert(out, "| " .. c.gols_contra)
		table.insert(out, "| " .. saldo(c))
		table.insert(out, "| " .. aproveitamento(c))

		-- MANDANTE
		table.insert(out, "|-")
		table.insert(out, "| Mandante")
		table.insert(out, "| " .. c.mandante.jogos)
		table.insert(out, "| " .. c.mandante.vitorias)
		table.insert(out, "| " .. c.mandante.empates)
		table.insert(out, "| " .. c.mandante.derrotas)
		table.insert(out, "| " .. c.mandante.gols_pro)
		table.insert(out, "| " .. c.mandante.gols_contra)
		table.insert(out, "| " .. saldo(c.mandante))
		table.insert(out, "| " .. aproveitamento(c.mandante))

		-- VISITANTE
		table.insert(out, "|-")
		table.insert(out, "| Visitante")
		table.insert(out, "| " .. c.visitante.jogos)
		table.insert(out, "| " .. c.visitante.vitorias)
		table.insert(out, "| " .. c.visitante.empates)
		table.insert(out, "| " .. c.visitante.derrotas)
		table.insert(out, "| " .. c.visitante.gols_pro)
		table.insert(out, "| " .. c.visitante.gols_contra)
		table.insert(out, "| " .. saldo(c.visitante))
		table.insert(out, "| " .. aproveitamento(c.visitante))
	end

	table.insert(out, "|}")

	return table.concat(out, "\n")
end

return Campanha