viernes, 7 de junio de 2013
Balanza de Comprobacion en Adempiere
-- Descargar JRXML aqui
-- select * from rep_balanza_comprobacion(1000001, '131201', '131231', 'N');
-- 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, 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;
begin
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
);
return query
(
with cte_cuentas_contables as
(
select
u.accounttype as tipo_cuenta_x,
u.c_elementvalue_id as c_elementvalue_id_x,
u.value as codigocuenta_x,
cast(u.nat as varchar) as nat_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
),
cte_saldos_contables as
(
-- Movimientos ordinarios de la balanza de comprobacion
select
f.account_id as id_cuenta_x,
cast(f.dateacct as date) as fecha_contable_x,
coalesce(f.amtacctdr, 0.00) debito_x,
coalesce(f.amtacctcr, 0.00) credito_x,
(coalesce(f.amtacctdr, 0.00) - coalesce(f.amtacctcr, 0.00)) as dc,
(coalesce(f.amtacctcr, 0.00) - coalesce(f.amtacctdr, 0.00)) as cd,
p.es_cierre_contable as es_cierre_conta
from fact_acct f
join c_period p
on f.c_period_id = p.c_period_id
where f.ad_table_id = 224
and f.line_id > 0
and f.ad_client_id = id_compania
and p.periodtype IN ('S', 'A')
and p.es_cierre_contable = 'N'
union all
-- Movimientos de los cierres contables de la balanza de comprobacion
select
f.account_id as id_cuenta_x,
cast(f.dateacct as date) as fecha_contable_x,
coalesce(f.amtacctdr, 0.00) debito_x,
coalesce(f.amtacctcr, 0.00) credito_x,
(coalesce(f.amtacctdr, 0.00) - coalesce(f.amtacctcr, 0.00)) as dc,
(coalesce(f.amtacctcr, 0.00) - coalesce(f.amtacctdr, 0.00)) as cd,
p.es_cierre_contable as es_cierre_conta
from fact_acct f
join c_period p
on f.c_period_id = p.c_period_id
where f.ad_table_id = 224
and f.line_id > 0
and f.ad_client_id = id_compania
and p.periodtype IN ('S', 'A')
and p.es_cierre_contable = 'Y'
),
cte_balanza_comprobacion as
(
select
cc.tipo_cuenta_x,
cc.c_elementvalue_id_x,
cc.codigocuenta_x,
cc.nat_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
case
when es_cierre_contable = 'Y' then
-- Si el usuario selecciono cierre contable, significa que el saldo inicial
-- es el saldo final del ultimo periodo contable
coalesce((select
sum(sc.dc)
from cte_saldos_contables sc
where sc.fecha_contable_x <= ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'N'), 0.00)
else
-- Saldos iniciales del periodo contable
coalesce((select
sum(sc.dc)
from cte_saldos_contables sc
where sc.fecha_contable_x < finicial
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'N'), 0.00)
end +
-- Cierres contables de los periodos contables anteriores
coalesce((select
sum(sc.dc)
from cte_saldos_contables sc
where sc.fecha_contable_x < finicial_ultimo_mes
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'Y'), 0.00)
else
0.00
end as inicialdr_x,
case cc.nat_x
when 'C' then
case
-- Si el usuario selecciono cierre contable, significa que el saldo inicial
-- es el saldo final del ultimo period contable
when es_cierre_contable = 'Y' then
coalesce((select
sum(sc.cd)
from cte_saldos_contables sc
where sc.fecha_contable_x <= ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'N'), 0.00)
else
coalesce((select
sum(sc.cd)
from cte_saldos_contables sc
where sc.fecha_contable_x < finicial
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'N'), 0.00)
end +
-- Cierres contables de los periodos contables anteriores
coalesce((select
sum(sc.cd)
from cte_saldos_contables sc
where sc.fecha_contable_x < finicial_ultimo_mes
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'Y'), 0.00)
else
0.00
end as inicialcr_x,
coalesce((select
sum(sc.debito_x)
from cte_saldos_contables sc
where sc.fecha_contable_x between finicial_ultimo_mes and ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = es_cierre_contable), 0.00) as debitos_x,
coalesce((select
sum(sc.credito_x)
from cte_saldos_contables sc
where sc.fecha_contable_x between finicial_ultimo_mes and ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = es_cierre_contable), 0.00) as creditos_x,
case cc.nat_x
when 'D' then
case
when es_cierre_contable = 'Y' then
-- Si el usuario selecciono cierre contable, significa que el saldo final
-- es el saldo final del ultimo periodo contable
coalesce((select
sum(sc.dc)
from cte_saldos_contables sc
where sc.fecha_contable_x <= ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x), 0.00)
else
-- Saldos finales del periodo contable
coalesce((select
sum(sc.dc)
from cte_saldos_contables sc
where sc.fecha_contable_x <= ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'N'), 0.00) +
-- Cierres contables de los periodos contables anteriores
coalesce((select
sum(sc.dc)
from cte_saldos_contables sc
where sc.fecha_contable_x < finicial_ultimo_mes
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'Y'), 0.00)
end
else
0.00
end as finaldr_x,
case cc.nat_x
when 'C' then
case
when es_cierre_contable = 'Y' then
-- Si el usuario selecciono cierre contable, significa que el saldo inicial
-- es el saldo final del ultimo period contable
coalesce((select
sum(sc.cd)
from cte_saldos_contables sc
where sc.fecha_contable_x <= ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x), 0.00)
else
-- Saldos finales del periodo contable
coalesce((select
sum(sc.cd)
from cte_saldos_contables sc
where sc.fecha_contable_x <= ffinal
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'N'), 0.00) +
-- Cierres contables de los periodos contables anteriores
coalesce((select
sum(sc.cd)
from cte_saldos_contables sc
where sc.fecha_contable_x < finicial_ultimo_mes
and sc.id_cuenta_x = cc.c_elementvalue_id_x
and sc.es_cierre_conta = 'Y'), 0.00)
end
else
0.00
end as finalcr_x
from cte_cuentas_contables cc
),
cte_compania as
(
select
c.name as nombre_compania_x
from ad_client c
where c.ad_client_id = id_compania
)
select
(select c.nombre_compania_x from cte_compania c) as nombre_compania_x,
bc.c_elementvalue_id_x,
bc.codigocuenta_x,
bc.nat_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 cte_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;
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario