viernes, 31 de octubre de 2014

Balanza de Comprobación Optimizado al Máximo

Para poder correr dicho reporte, es necesario implementar primero el nuevo proceso "Obtener Movimientos Contables", la idea es realizar primero el cálculo, almacenar los resultados en una tabla y finalmente este resultado sirva para todos los reportes financieros.

Ver el nuevo proceso aqui.

-- Function: rep_balanza_comprobacion(numeric, date, date, character)

-- DROP FUNCTION rep_balanza_comprobacion(numeric, date, date, character);

CREATE OR REPLACE FUNCTION rep_balanza_comprobacion(IN id_compania numeric, IN finicial date, IN ffinal date, IN es_cierre_contable character)
  RETURNS TABLE(nombre_compania character varying, c_elementvalue_id numeric, codigocuenta character varying, nat character varying, tipo_cuenta character varying, nombrecuenta character varying, ctamayor_id numeric, ctmayor_value numeric, ctmayor_name character varying, parent_id numeric, parent_value numeric, parent_name character varying, inicialdr numeric, inicialcr numeric, debitos numeric, creditos numeric, finaldr numeric, finalcr numeric, fecha_ini date, fecha_fin date) AS
$BODY$
declare
    id_periodo numeric(10,0);
    num_periodo numeric(10,0);

    -- Fecha inicial del ultimo mes
    finicial_ultimo_mes date;
    p_nombre_compania varchar;
begin
    p_nombre_compania =
    (
        select
            c.name
        from ad_client c
        where c.ad_client_id = id_compania
    );

    id_periodo =
    (
        select p.c_period_id from c_period p
        where p.ad_client_id = id_compania
        and p.startdate = finicial
        and p.enddate = ffinal
        and p.periodtype = case when es_cierre_contable = 'Y' then 'A' else 'S' end
    );

    num_periodo =
    (
        select p.periodno from c_period p
        where p.c_period_id = id_periodo
    );

    -- Otener rangos de fechas para el ultimo mes contabilizado
    -- y rango de fechas para el cierre contable

    finicial_ultimo_mes =
    (
        select
            p.startdate
        from fact_acct f
            join c_period p
            on f.c_period_id = p.c_period_id
        where f.dateacct = ffinal
        limit 1
    );

    drop table if exists tmp_cuentas_contables;

    create temporary table tmp_cuentas_contables as
    select
        u.c_elementvalue_id as c_elementvalue_id_x,
        u.value as codigocuenta_x,
        cast(u.nat as varchar) as nat_x,
        u.accounttype::varchar as tipo_cuenta_x,
        cast(replace(u.name, ',', '') as varchar) as nombrecuenta_x,
        cast(u.ctamayor_id as numeric(10,0)) as ctamayor_id_x,
        cast(u.ctmayor_value as numeric(10,0)) as ctmayor_value_x,
        u.ctmayor_name as ctmayor_name_x,
        cast(u.parent_id as numeric(10,0)) as parent_id_x,
        cast(u.parent_value as numeric(10,0)) as parent_value_x,
        u.parent_name as parent_name_x
    from usr_v_vcc u
    where u.c_elementvalue_id in
    (
        select distinct sf.id_cuenta from nic_saldos_finales sf
    );

    drop table if exists tmp_movimientos_contables;

    create temporary table tmp_movimientos_contables as
    select
        sf.id_cuenta,
        sf.id_periodo,
        sf.tipo_periodo,
        sf.num_periodo,
        sf.es_cierre_contable,
        sum(coalesce(sf.debito_final, 0.00)) as debito_final,
        sum(coalesce(sf.credito_final, 0.00)) as credito_final,
        sum(coalesce(sf.debito_final, 0.00) - coalesce(sf.credito_final, 0.00)) as dc,
        sum(coalesce(sf.credito_final, 0.00) - coalesce(sf.debito_final, 0.00)) as cd
    from nic_saldos_finales sf
    group by
        sf.id_cuenta,
        sf.id_periodo,
        sf.tipo_periodo,
        sf.num_periodo,
        sf.es_cierre_contable;

    drop table if exists tmp_balanza_comprobacion;

    create temporary table tmp_balanza_comprobacion as
    select
        cc.c_elementvalue_id_x,
        cc.codigocuenta_x,
        cc.nat_x,
        cc.tipo_cuenta_x,
        cc.nombrecuenta_x,
        cc.ctamayor_id_x,
        cc.ctmayor_value_x,
        cc.ctmayor_name_x,
        cc.parent_id_x,
        cc.parent_value_x,
        cc.parent_name_x,

        case cc.nat_x
            when 'D' then
                coalesce((select sum(m.dc) from tmp_movimientos_contables m
                where m.id_cuenta = cc.c_elementvalue_id_x
                and m.num_periodo < num_periodo), 0.00)
            when 'C' then
                0.00
        end as inicialdr_x,

        case cc.nat_x
            when 'D' then
                0.00
            when 'C' then
                coalesce((select sum(m.cd) from tmp_movimientos_contables m
                where m.id_cuenta = cc.c_elementvalue_id_x
                and m.num_periodo < num_periodo), 0.00)
        end as inicialcr_x,

        coalesce((select sum(m.debito_final) from tmp_movimientos_contables m
        where m.id_cuenta = cc.c_elementvalue_id_x
        and m.num_periodo = num_periodo
        and m.es_cierre_contable = es_cierre_contable), 0.00) as debitos_x,

        coalesce((select sum(m.credito_final) from tmp_movimientos_contables m
        where m.id_cuenta = cc.c_elementvalue_id_x
        and m.num_periodo = num_periodo
        and m.es_cierre_contable = es_cierre_contable), 0.00) as creditos_x,

        case cc.nat_x
            when 'D' then
                coalesce((select sum(m.dc) from tmp_movimientos_contables m
                where m.id_cuenta = cc.c_elementvalue_id_x
                and m.num_periodo <= num_periodo), 0.00)
            when 'C' then
                0.00
        end as finaldr_x,

        case cc.nat_x
            when 'D' then
                0.00
            when 'C' then
                coalesce((select sum(m.cd) from tmp_movimientos_contables m
                where m.id_cuenta = cc.c_elementvalue_id_x
                and m.num_periodo <= num_periodo), 0.00)
        end as finalcr_x
       
    from tmp_cuentas_contables cc;
   
    return query
    (
        select
            p_nombre_compania as nombre_compania_x,
            bc.c_elementvalue_id_x,
            bc.codigocuenta_x,
            bc.nat_x,
            bc.tipo_cuenta_x,
            bc.nombrecuenta_x,
            bc.ctamayor_id_x,
            bc.ctmayor_value_x,
            bc.ctmayor_name_x,
            bc.parent_id_x,
            bc.parent_value_x,
            bc.parent_name_x,
            bc.inicialdr_x,
            bc.inicialcr_x,
            bc.debitos_x,
            bc.creditos_x,
            bc.finaldr_x,
            bc.finalcr_x,
            finicial as fecha_ini_x,
            case when es_cierre_contable = 'Y' then (extract(year from ffinal)::varchar || '1231')::date else ffinal end as fecha_fin_x
        from tmp_balanza_comprobacion bc
        where (bc.inicialdr_x <> 0.00
            or bc.inicialcr_x <> 0.00
            or bc.debitos_x <> 0.00
            or bc.creditos_x <> 0.00
            or bc.finaldr_x <> 0.00
            or bc.finalcr_x <> 0.00)
        order by
            case bc.tipo_cuenta_x
                when 'A' then -- Activo
                    1
                when 'L' then -- Pasivo
                    2
                when 'O' then -- Patrimonio
                    3
                when 'R' then -- Ingreso
                    4
                when 'E' then -- Gasto
                    5
                when 'M' then -- Memo
                    6
                else
                    7
            end,
            bc.ctmayor_value_x,
            bc.codigocuenta_x
    );

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;

No hay comentarios:

Publicar un comentario