104 lines
3.2 KiB
PL/PgSQL
104 lines
3.2 KiB
PL/PgSQL
|
|
-- Criar função RPC para calcular o range dinâmico de datas do dashboard
|
|
CREATE OR REPLACE FUNCTION get_dashboard_date_range(of_number_param text)
|
|
RETURNS TABLE(
|
|
data_inicio_grafico date,
|
|
data_fim_grafico date
|
|
)
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
DECLARE
|
|
min_data_inicio date;
|
|
max_data_fim date;
|
|
max_apontamento date;
|
|
data_atual date := CURRENT_DATE;
|
|
BEGIN
|
|
-- Buscar data de início e fim da OF
|
|
SELECT
|
|
COALESCE(data_abertura, CURRENT_DATE),
|
|
COALESCE(data_prazo, CURRENT_DATE + INTERVAL '30 days')
|
|
INTO min_data_inicio, max_data_fim
|
|
FROM ordens_fabricacao
|
|
WHERE num_of = of_number_param;
|
|
|
|
-- Buscar data máxima de apontamento para esta OF
|
|
SELECT MAX(data_apontamento)
|
|
INTO max_apontamento
|
|
FROM apontamentos_producao
|
|
WHERE of_number = of_number_param;
|
|
|
|
-- Calcular data final do gráfico
|
|
data_fim_grafico := GREATEST(
|
|
COALESCE(max_data_fim, data_atual),
|
|
COALESCE(max_apontamento, data_atual),
|
|
data_atual
|
|
);
|
|
|
|
-- Retornar o range
|
|
data_inicio_grafico := min_data_inicio;
|
|
|
|
RETURN NEXT;
|
|
END;
|
|
$$;
|
|
|
|
-- Criar função para buscar dados consolidados de todos os processos
|
|
CREATE OR REPLACE FUNCTION get_dashboard_consolidated_data(of_number_param text)
|
|
RETURNS TABLE(
|
|
processo_id uuid,
|
|
processo_nome text,
|
|
processo_cor text,
|
|
data_apontamento date,
|
|
peso_acumulado numeric
|
|
)
|
|
LANGUAGE plpgsql
|
|
SECURITY DEFINER
|
|
AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
WITH apontamentos_ordenados AS (
|
|
SELECT
|
|
ap.processo_id,
|
|
pf.nome as processo_nome,
|
|
COALESCE(pf.cor, '#8884d8') as processo_cor,
|
|
ap.data_apontamento,
|
|
ap.quantidade_produzida * COALESCE(p.peso_unitario, 0) as peso_produzido,
|
|
ROW_NUMBER() OVER (PARTITION BY ap.processo_id ORDER BY ap.data_apontamento) as rn
|
|
FROM apontamentos_producao ap
|
|
JOIN processos_fabricacao pf ON ap.processo_id = pf.id
|
|
LEFT JOIN pecas p ON ap.peca_id = p.id
|
|
WHERE ap.of_number = of_number_param
|
|
ORDER BY ap.processo_id, ap.data_apontamento
|
|
),
|
|
peso_acumulado_por_processo AS (
|
|
SELECT
|
|
a1.processo_id,
|
|
a1.processo_nome,
|
|
a1.processo_cor,
|
|
a1.data_apontamento,
|
|
SUM(a2.peso_produzido) as peso_acumulado
|
|
FROM apontamentos_ordenados a1
|
|
JOIN apontamentos_ordenados a2 ON a1.processo_id = a2.processo_id AND a2.rn <= a1.rn
|
|
GROUP BY a1.processo_id, a1.processo_nome, a1.processo_cor, a1.data_apontamento, a1.rn
|
|
ORDER BY a1.processo_id, a1.data_apontamento
|
|
)
|
|
SELECT * FROM peso_acumulado_por_processo;
|
|
END;
|
|
$$;
|
|
|
|
-- Adicionar coluna de cor na tabela processos_fabricacao se não existir
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name = 'processos_fabricacao' AND column_name = 'cor') THEN
|
|
ALTER TABLE processos_fabricacao ADD COLUMN cor text DEFAULT '#8884d8';
|
|
END IF;
|
|
END $$;
|
|
|
|
-- Atualizar alguns processos com cores diferentes para melhor visualização
|
|
UPDATE processos_fabricacao SET cor = '#8884d8' WHERE nome ILIKE '%corte%';
|
|
UPDATE processos_fabricacao SET cor = '#82ca9d' WHERE nome ILIKE '%solda%';
|
|
UPDATE processos_fabricacao SET cor = '#ffc658' WHERE nome ILIKE '%pintura%';
|
|
UPDATE processos_fabricacao SET cor = '#ff7300' WHERE nome ILIKE '%montagem%';
|
|
UPDATE processos_fabricacao SET cor = '#00ff88' WHERE nome ILIKE '%expedi%';
|