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