46 lines
1.8 KiB
PL/PgSQL
46 lines
1.8 KiB
PL/PgSQL
|
|
-- Atualizar a função que calcula dados consolidados para usar pesos corretamente
|
|
CREATE OR REPLACE FUNCTION public.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 $function$
|
|
BEGIN
|
|
RETURN QUERY
|
|
WITH apontamentos_com_peso AS (
|
|
SELECT
|
|
ap.processo_id,
|
|
pf.nome as processo_nome,
|
|
COALESCE(pf.cor, '#8884d8') as processo_cor,
|
|
ap.data_apontamento,
|
|
-- Calcular peso corretamente baseado no tipo de apontamento
|
|
CASE
|
|
WHEN ap.tipo_apontamento = 'componente' THEN
|
|
ap.quantidade_produzida * COALESCE(cp.peso_unitario, 0)
|
|
ELSE
|
|
ap.quantidade_produzida * COALESCE(p.peso_unitario, 0)
|
|
END 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 AND ap.tipo_apontamento = 'peca'
|
|
LEFT JOIN componentes_peca cp ON ap.componente_id = cp.id AND ap.tipo_apontamento = 'componente'
|
|
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_com_peso a1
|
|
JOIN apontamentos_com_peso 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;
|
|
$function$
|