martes, 23 de enero de 2018

Balanza de Comprobación en ADempiere

Descargar diseño aqui

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

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

CREATE OR REPLACE FUNCTION adempiere.rep_balanza_comprobacion(
    IN id_compania numeric,
    IN finicial date,
    IN ffinal date,
    IN es_cierre_contable character,
    IN es_periodo_ajuste 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' or es_periodo_ajuste = '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,
        sf.es_periodo_ajuste,
        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,
        sf.es_periodo_ajuste;

    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 <
                case
                    when es_periodo_ajuste = 'Y' then
                        num_periodo - 1
                    else
                        num_periodo
                end), 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 <
                case
                    when es_periodo_ajuste = 'Y' then
                        num_periodo - 1
                    else
                        num_periodo
                end), 0.00)
        end as inicialcr_x,

        case
            when es_periodo_ajuste = 'Y' then
                coalesce((select sum(m.debito_final) from tmp_movimientos_contables m
                where m.id_cuenta = cc.c_elementvalue_id_x
                and m.num_periodo =
                case
                    when es_periodo_ajuste = 'Y' then
                        num_periodo - 1
                    else
                        num_periodo
                end
                and m.es_cierre_contable = es_cierre_contable), 0.00) +
                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)

        else

            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)
        end as debitos_x,

        case
            when es_periodo_ajuste = 'Y' then
                coalesce((select sum(m.credito_final) from tmp_movimientos_contables m
                where m.id_cuenta = cc.c_elementvalue_id_x
                and m.num_periodo =
                case
                    when es_periodo_ajuste = 'Y' then
                        num_periodo - 1
                    else
                        num_periodo
                end
                and m.es_cierre_contable = es_cierre_contable), 0.00) +
                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)

        else

            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)
        end 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
                when es_periodo_ajuste = '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