martes, 23 de enero de 2018

Balance General en ADempiere

Descargar diseño aqui.

-- Function: adempiere.rep_balance_general(numeric, numeric, character, character)

-- DROP FUNCTION adempiere.rep_balance_general(numeric, numeric, character, character);

CREATE OR REPLACE FUNCTION adempiere.rep_balance_general(
    IN id_compania numeric,
    IN id_periodo numeric,
    IN es_cierre_contable character,
    IN es_periodo_ajuste character)
  RETURNS TABLE(nombre_compania character varying, id_tipo_cuenta character, tipo_cuenta character varying, id_naturaleza character, id_cuenta_mayor numeric, cod_cuenta_mayor numeric, cuenta_mayor character varying, id_cuenta_padre numeric, cod_cuenta_padre numeric, cuenta_padre character varying, id_cuenta_contable numeric, cod_cuenta_contable character varying, cuenta_contable character varying, id_etiqueta numeric, etiqueta character varying, orden integer, id_titulo numeric, titulo character varying, id_subtitulo numeric, subtitulo character varying, pre_titulo character varying, pre_subtitulo character varying, saldo numeric, total_balance numeric, fecha_ini date, fecha_fin date) AS
$BODY$
declare
    nombre_compania_x varchar(255);

    p_movimientos_totales boolean;
    p_tipo_periodo char;
    p_num_periodo numeric(10,0);
    finicial date;
    ffinal date;

    v_periodo numeric(10,0);
begin
    nombre_compania_x =
    (
        select c.name from ad_client c
        where c.ad_client_id = id_compania
    );

    -- Obtener el tipo de periodo (estandar o ajuste) y el consecutivo de periodo
    select
        p.periodtype,
        p.periodno,
        p.startdate,
        p.enddate
    into
        p_tipo_periodo,
        p_num_periodo,
        finicial,
        ffinal
    from c_period p
    where p.c_period_id = id_periodo;

    v_periodo =
    (
        select
            p.c_period_id
        from c_period p
        where p.periodno =
        case
            when es_cierre_contable = 'Y' then
                p_num_periodo - 1
            else
                p_num_periodo
        end
    );

    drop table if exists tmp_cuentas_balance;

    create temporary table tmp_cuentas_balance as
    select
        u.accounttype as id_tipo_cuenta_x,
        case u.accounttype
            when 'A' then 'ACTIVO'
            when 'L' then 'PASIVO Y PATRIMONIO'
            when 'O' then 'PASIVO Y PATRIMONIO'
            when 'E' then 'PASIVO Y PATRIMONIO'
        else ''
        end::varchar as tipo_cuenta_x,
        u.nat as id_naturaleza_x,
        u.ctamayor_id as id_cuenta_mayor_x,
        u.ctmayor_value as cod_cuenta_mayor_x,
        u.ctmayor_name as cuenta_mayor_x,
        u.parent_id as id_cuenta_padre_x,
        u.parent_value as cod_cuenta_padre_x,
        u.parent_name as cuenta_padre_x,
        u.c_elementvalue_id as id_cuenta_contable_x,
        u.value as cod_cuenta_contable_x,
        u.name as cuenta_contable_x,
        bg.nic_balance_grupo_id as id_etiqueta_x,
        bg.name as etiqueta_x,
        bc.orden as orden_x,
        bt.nic_balance_titulo_id as id_titulo_x,
        bt.name as titulo_x,
        bs.nic_balance_subtitulo_id as id_subtitulo_x,
        bs.name as subtitulo_x,
        bt.prefijo as pre_titulo_x,
        bs.prefijo as pre_subtitulo_x
    from usr_v_vcc u
        join nic_balance_cuentas bc
        on u.parent_id = bc.account_id
        join nic_balance_titulo bt
        on bc.nic_balance_titulo_id = bt.nic_balance_titulo_id
        join nic_balance_subtitulo bs
        on bc.nic_balance_subtitulo_id = bs.nic_balance_subtitulo_id
        join nic_balance_grupo bg
        on bc.nic_balance_grupo_id = bg.nic_balance_grupo_id
    where u.c_elementvalue_id in
    (
        -- select bc.account_id from nic_balance_cuentas bc
        select distinct sf.id_cuenta from nic_saldos_finales sf
    ) and u.accounttype in ('A', 'L', 'O', 'E')
    and u.nat in ('D', 'C');

    drop table if exists tmp_saldos_balance;

    create temporary table tmp_saldos_balance as
    select
        sf.tipo_cuenta as tipo_cuenta_x,
        sf.id_cuenta as id_cuenta_contable_x,
        sf.id_periodo as id_periodo_x,
        sf.tipo_periodo as tipo_periodo_x,
        sf.num_periodo as num_periodo_x,
        sf.es_cierre_contable as es_cierre_contable_x,
        sf.es_periodo_ajuste as es_periodo_ajuste_x,
        coalesce(sf.debito_final, 0.00) - coalesce(sf.credito_final, 0.00) as dc_x,
        coalesce(sf.credito_final, 0.00) - coalesce(sf.debito_final, 0.00) as cd_x
    from nic_saldos_finales sf
    where sf.ad_client_id = id_compania
        and sf.tipo_periodo in ('S', 'A')
        and sf.es_cierre_contable = 'N'
        and sf.id_cuenta in
        (
            select cc.id_cuenta_contable_x from tmp_cuentas_balance cc
        )
        and sf.num_periodo <= p_num_periodo
    union all
    select
        sf.tipo_cuenta as tipo_cuenta_x,
        sf.id_cuenta as id_cuenta_contable_x,
        sf.id_periodo as id_periodo_x,
        sf.tipo_periodo as tipo_periodo_x,
        sf.num_periodo as num_periodo_x,
        sf.es_cierre_contable as es_cierre_contable_x,
        sf.es_periodo_ajuste as es_periodo_ajuste_x,
        coalesce(sf.debito_final, 0.00) - coalesce(sf.credito_final, 0.00) as dc_x,
        coalesce(sf.credito_final, 0.00) - coalesce(sf.debito_final, 0.00) as cd_x
    from nic_saldos_finales sf
    where sf.ad_client_id = id_compania
        and sf.tipo_periodo in ('S', 'A')
            and sf.es_cierre_contable = 'Y'
            and sf.id_cuenta in
            (
                select cc.id_cuenta_contable_x from tmp_cuentas_balance cc
            )
            and sf.num_periodo <= p_num_periodo;

    drop table if exists tmp_balance_general;

    create temporary table tmp_balance_general as
    select
        cc.id_tipo_cuenta_x,
        cc.tipo_cuenta_x,
        cc.id_naturaleza_x,
        cc.id_cuenta_mayor_x,
        cc.cod_cuenta_mayor_x,
        cc.cuenta_mayor_x,
        cc.id_cuenta_padre_x,
        cc.cod_cuenta_padre_x,
        cc.cuenta_padre_x,
        cc.id_cuenta_contable_x,
        cc.cod_cuenta_contable_x,
        cc.cuenta_contable_x,
        cc.id_etiqueta_x,
        cc.etiqueta_x,
        cc.orden_x,
        cc.id_titulo_x,
        cc.titulo_x,
        cc.id_subtitulo_x,
        cc.subtitulo_x,
        cc.pre_titulo_x,
        cc.pre_subtitulo_x,
        coalesce(case cc.id_tipo_cuenta_x
            when 'A' then
                case cc.id_naturaleza_x
                    when 'D' then
                        (select sum(sb.dc_x) from tmp_saldos_balance sb
                        where sb.id_cuenta_contable_x = cc.id_cuenta_contable_x)
                    when 'C' then
                        (select sum(sb.dc_x) from tmp_saldos_balance sb
                        where sb.id_cuenta_contable_x = cc.id_cuenta_contable_x)
                    else
                        0.00
                end
            else
                case cc.id_naturaleza_x
                    when 'D' then
                        (select sum(sb.cd_x) from tmp_saldos_balance sb
                        where sb.id_cuenta_contable_x = cc.id_cuenta_contable_x)
                    when 'C' then
                        (select sum(sb.cd_x) from tmp_saldos_balance sb
                        where sb.id_cuenta_contable_x = cc.id_cuenta_contable_x)
                    else
                        0.00
                end
        end, 0.00) as saldo_x
    from tmp_cuentas_balance cc;

    drop table if exists tmp_balance_ultimate;

    create temporary table tmp_balance_ultimate as
    select
        t.id_tipo_cuenta_x,
        t.tipo_cuenta_x,
        t.id_naturaleza_x,
        t.id_cuenta_mayor_x,
        t.cod_cuenta_mayor_x,
        t.cuenta_mayor_x,
        t.id_cuenta_padre_x,
        t.cod_cuenta_padre_x,
        t.cuenta_padre_x,
        t.id_cuenta_contable_x,
        t.cod_cuenta_contable_x,
        t.cuenta_contable_x,
        t.id_etiqueta_x,
        t.etiqueta_x,
        t.orden_x,
        t.id_titulo_x,
        t.titulo_x,
        t.id_subtitulo_x,
        t.subtitulo_x,
        t.pre_titulo_x,
        t.pre_subtitulo_x,
        sum(t.saldo_x) as saldo_x,
        (select sum(t2.saldo_x) from tmp_balance_general t2) as total_balance_x
    from tmp_balance_general t
    group by
        t.id_tipo_cuenta_x,
        t.tipo_cuenta_x,
        t.id_naturaleza_x,
        t.id_cuenta_mayor_x,
        t.cod_cuenta_mayor_x,
        t.cuenta_mayor_x,
        t.id_cuenta_padre_x,
        t.cod_cuenta_padre_x,
        t.cuenta_padre_x,
        t.id_cuenta_contable_x,
        t.cod_cuenta_contable_x,
        t.cuenta_contable_x,
        t.id_etiqueta_x,
        t.etiqueta_x,
        t.orden_x,
        t.id_titulo_x,
        t.titulo_x,
        t.id_subtitulo_x,
        t.subtitulo_x,
        t.pre_titulo_x,
        t.pre_subtitulo_x
    union all
    select
        null as id_tipo_cuenta_x,
        'PASIVO Y PATRIMONIO' as tipo_cuenta_x,
        'C' as id_naturaleza_x,
        null as id_cuenta_mayor_x,
        '30100000' as cod_cuenta_mayor_x,
        'CAPITAL SOCIAL' as cuenta_mayor_x,
        null as id_cuenta_padre_x,
        null as cod_cuenta_padre_x,
        'Utilidad o Perdida Acumulada' as cuenta_padre_x,
        null as id_cuenta_contable_x,
        null as cod_cuenta_contable_x,
        null as cuenta_contable_x,
        null as id_etiqueta_x,
        'Súper Avit o Déficit del Período' as etiqueta_x,
        100 as orden_x,
        1000002 as id_titulo_x,
        'PATRIMONIO' as titulo_x,
        1000004 as id_subtitulo_x,
        'UTILIDAD O PERDIDA' as subtitulo_x,
        'TOTAL' as pre_titulo_x,
        'TOTAL' as pre_subtitulo_x,
        coalesce((select sum(er.saldo_acum) from rep_estado_resultado(id_compania, id_periodo, es_cierre_contable, es_periodo_ajuste) er), 0.00) as saldo_x,
        0.00 as total_balance_x;

    return query
    (
        select
            nombre_compania_x,
            t.id_tipo_cuenta_x,
            t.tipo_cuenta_x,
            t.id_naturaleza_x,
            t.id_cuenta_mayor_x,
            t.cod_cuenta_mayor_x,
            t.cuenta_mayor_x,
            t.id_cuenta_padre_x,
            t.cod_cuenta_padre_x,
            t.cuenta_padre_x,
            t.id_cuenta_contable_x,
            t.cod_cuenta_contable_x,
            t.cuenta_contable_x,
            t.id_etiqueta_x,
            t.etiqueta_x,
            t.orden_x,
            t.id_titulo_x,
            t.titulo_x,
            t.id_subtitulo_x,
            t.subtitulo_x,
            t.pre_titulo_x,
            t.pre_subtitulo_x,
            t.saldo_x,
            t.total_balance_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_balance_ultimate t
        where abs(t.saldo_x) > 0
        order by
            t.orden_x,
            t.cuenta_padre_x,
            t.cuenta_mayor_x,
            t.etiqueta_x,
            t.cod_cuenta_contable_x asc
    );
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;

No hay comentarios:

Publicar un comentario