/**
 * FUNCTION: back.atualizar_totais_orcamentodet
 * 
 * Recalcula os totais mensais (jan a dez) da tabela orcamentodet
 * somando todos os valores de suas linhas filhas em orcamentodetfilho.
 * 
 * Parâmetro:
 *   - p_cdorcamentodet: ID da linha de detalhe (orcamentodet)
 * 
 * Retorno:
 *   - TRUE se sucesso, FALSE caso contrário
 * 
 * Uso:
 *   SELECT back.atualizar_totais_orcamentodet(123);
 * 
 * Esta função é chamada automaticamente pelo PHP em:
 *   - orcamentodetfilho_actions.php > recalcularTotaisPai()
 *   - Quando atualiza um mês em orcamentodetfilho
 *   - Quando volta/salva do módulo orcamentodetfilho
 */

CREATE OR REPLACE FUNCTION back.atualizar_totais_orcamentodet(p_cdorcamentodet INTEGER)
RETURNS BOOLEAN AS $$
BEGIN
    UPDATE back.orcamentodet od
    SET 
        jan = (SELECT COALESCE(SUM(jan), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        fev = (SELECT COALESCE(SUM(fev), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        mar = (SELECT COALESCE(SUM(mar), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        abr = (SELECT COALESCE(SUM(abr), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        mai = (SELECT COALESCE(SUM(mai), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        jun = (SELECT COALESCE(SUM(jun), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        jul = (SELECT COALESCE(SUM(jul), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        ago = (SELECT COALESCE(SUM(ago), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        "set" = (SELECT COALESCE(SUM("set"), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        "out" = (SELECT COALESCE(SUM("out"), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        nov = (SELECT COALESCE(SUM(nov), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        dez = (SELECT COALESCE(SUM(dez), 0) FROM back.orcamentodetfilho WHERE cdorcamentodet = od.cdorcamentodet),
        dtalteracao = NOW()
    WHERE cdorcamentodet = p_cdorcamentodet;
    
    RETURN TRUE;
EXCEPTION WHEN OTHERS THEN
    RAISE WARNING 'Erro em atualizar_totais_orcamentodet: %', SQLERRM;
    RETURN FALSE;
END;
$$ LANGUAGE plpgsql;
