Está en la página 1de 11

CREATE OR REPLACE FUNCTION public.

core_aprobar_credito_creditos(p_id_creditos
bigint, p_id_usuarios integer, OUT pout_resultado integer, OUT pout_mensaje text,
OUT pout_linea text, OUT pout_funcion text)
RETURNS record
LANGUAGE plpgsql
AS $function$

DECLARE

/** ALMACENAR PROVEEDOR **/


in_id_proveedor int4;

/** INGRESAR LOTE **/


in_id_lote int4;

/** DATOS DOCUMENTOS **/


rdocumento record;

/** DATOS OTORGACION CREDITO**/


rgeneracredito record;

/** DATOS CREDITO **/


rcredito record;

/** VARIABLES DE FUNCION **/


in_renovacion bit;
in_usuario_usuarios varchar(50);
in_retencion_primera_cuota numeric;
in_valor_renovacion numeric;
in_descripcion_distribucion varchar(200);
in_orden_distribucion int4;
rdebecredito record;
rcuentas record;
rrenovacion record;
in_id_plan_cuentas_interes int4;
in_id_plan_cuentas_haber int4;
in_id_consecutivo_cxp int4;
in_id_tipo_documento int4;
in_id_moneda int4;
in_compra_cuentas_pagar numeric;
in_total_cuentas_pagar numeric;
in_saldo_cuentas_pagar numeric;
in_descripcion_cuentas_pagar text;
in_origen_cuentas_pagar varchar(50);
in_id_bancos int4;
in_tipo_comprobante_contable int4;
in_concepto_comprobante_contable text;
in_valor_letras_comprobante_contable text;
in_id_plan_cuentas_liquidacion_renovacion int4;
in_impuesto_cuentas_pagar numeric;
in_valor_suma_renovacion numeric;

/** Respuesta Funciones **/


in_resultado_cuentas_pagar int4;
in_resultado_comprobante_contable int4;
in_respuesta_renovacion int4;

in_valor_retencion_aporte numeric; --NOTICE POR CONFIRMAR


in_retencion_aportes int4; --NOTICE POR CONFIRMAR
BEGIN

begin

/** PROVEEDOR **/


in_id_proveedor :=
public.ins_proveedores_participes( p_id_creditos::int4 );

in_usuario_usuarios := ( select usuario_usuarios from usuarios


where id_usuarios = p_id_usuarios );

/** LOTE **/


in_id_lote := public.tes_genera_lote(
_nombre_lote => 'CxP-Creditos',
_descripcion_lote => 'GENERACION CREDITO',
_id_frecuencia => 1,
_id_usuarios => p_id_usuarios
);

select aa.monto_otorgado_creditos, aa.monto_neto_entregado_creditos,


aa.fecha_concesion_creditos, bb.nombre_creditos_productos, aa.id_forma_pago,
bb.descripcion_creditos_productos, cc.codigo_tipo_creditos,
cc.nombre_tipo_creditos, cc.tipo_operacion, aa.numero_creditos,
bb.id_creditos_productos,
cc.id_tipo_creditos
into rcredito
from core_creditos aa
inner join core_creditos_productos bb on bb.id_creditos_productos =
aa.id_creditos_productos
inner join core_tipo_creditos cc on cc.id_tipo_creditos =
bb.id_tipo_creditos
where 1 = 1
and aa.id_creditos = p_id_creditos ;

--ver si exite renovacion por parte del credito


in_renovacion := case when exists(select 1 from
core_creditos_a_pagar_renovaciones where id_creditos = p_id_creditos limit 1) then
'1'::bit else '0'::bit end;

in_retencion_primera_cuota := coalesce( (select


valor_creditos_retencion_primera_cuota from core_creditos_retencion_primera_cuota
where id_creditos = p_id_creditos),0);

--NOTICE entender que aqui se debe buscar el dia que se aprueba el


credito
--utilizar la funcion para devolver el saldo de creditos a la fecha
in_valor_renovacion := coalesce( ( select
sum(saldo_a_la_fecha_creditos_a_pagar_renovaciones) from
core_creditos_a_pagar_renovaciones where id_creditos = p_id_creditos) ,0);

/**COMIENZA INS cuentas por pagar | inicia con la distribucion**/

in_descripcion_distribucion := 'Concesion Credito Num ['||


rcredito.numero_creditos ||']'; --tener en cuenta que el numero de credito es
diferente al id_creditos

/**Insercion en la tabla distribucion**/


in_orden_distribucion := 0;

/**PARA ENCABEZADO DE PAGARE**/


select id_plan_cuentas_debe, id_plan_cuentas_haber
into rdocumento
from core_parametrizacion_cuentas
where nombre_parametrizacion_cuentas = 'DOCPAGARE'
and modulo_parametrizacion_cuentas = 'DOCUMENTOS'
and operacion_parametrizacion_cuentas = 'PAGARE'
limit 1;

in_orden_distribucion := in_orden_distribucion + 1;

--
============================================================================
-- BEGIN_SALIDA DE DOCUMENNTOS PAGARE
---
--
============================================================================
INSERT INTO tes_distribucion_cuentas_pagar(
id_lote,
id_plan_cuentas,
tipo_distribucion_cuentas_pagar,
debito_distribucion_cuentas_pagar,
credito_distribucion_cuentas_pagar,
ord_distribucion_cuentas_pagar,
referencia_distribucion_cuentas_pagar )
VALUES (
in_id_lote,
rdocumento.id_plan_cuentas_debe,
'COMPRA',
rcredito.monto_otorgado_creditos,
0.00,
in_orden_distribucion,
in_descripcion_distribucion
);

--
============================================================================
-- END_SALIDA DE DOCUMENNTOS PAGARE
---
--
============================================================================

/*for rdebecredito in
select did_plan_cuentas, dvalor, dnaturaleza
from
public.core_distribucion_credito_contable( p_id_creditos,'1')
order by dvalor desc
loop

in_orden_distribucion := in_orden_distribucion + 1;

INSERT INTO tes_distribucion_cuentas_pagar(


id_lote,
id_plan_cuentas,
tipo_distribucion_cuentas_pagar,
debito_distribucion_cuentas_pagar,
credito_distribucion_cuentas_pagar,
ord_distribucion_cuentas_pagar,
referencia_distribucion_cuentas_pagar )
VALUES (
in_id_lote,
rdebecredito.did_plan_cuentas,
'COMPRA',
rdebecredito.dvalor,
0.00,
in_orden_distribucion,
in_descripcion_distribucion);

end loop;*/

/**PARA INGRESAR EL INGRESO DE CREDITO **/


select id_plan_cuentas_debe, id_plan_cuentas_haber
into rgeneracredito
from core_parametrizacion_cuentas
where nombre_parametrizacion_cuentas = 'DEVCREDITO'
and modulo_parametrizacion_cuentas = 'CREDITO'
and operacion_parametrizacion_cuentas = 'NUEVO'
and tabla_parametrizacion_cuentas = 'core_creditos_productos'
and id_principal_parametrizacion_cuentas = rcredito.id_tipo_creditos;

in_orden_distribucion := in_orden_distribucion + 1;

INSERT INTO tes_distribucion_cuentas_pagar(


id_lote,
id_plan_cuentas,
tipo_distribucion_cuentas_pagar,
debito_distribucion_cuentas_pagar,
credito_distribucion_cuentas_pagar,
ord_distribucion_cuentas_pagar,
referencia_distribucion_cuentas_pagar )
VALUES (
in_id_lote,
rgeneracredito.id_plan_cuentas_debe,
'COMPRA',
rcredito.monto_otorgado_creditos,
0.00,
in_orden_distribucion,
in_descripcion_distribucion);

/** para insertado de interes **/


--if in_renovacion = '0' and in_retencion_primera_cuota > 0 then
if in_retencion_primera_cuota > 0 then

in_id_plan_cuentas_interes := coalesce( ( select


id_plan_cuentas_haber
from core_parametrizacion_cuentas
where 1 = 1
and nombre_parametrizacion_cuentas = 'INTERESCREDITO'
and modulo_parametrizacion_cuentas = 'CREDITO'
and operacion_parametrizacion_cuentas = 'NUEVO'
and tabla_parametrizacion_cuentas =
'core_creditos_productos'
and id_principal_parametrizacion_cuentas =
rcredito.id_tipo_creditos
), 0 );

if in_id_plan_cuentas_interes = 0 then
raise exception ' Variable in_id_plan_cuentas_interes -- no
esta parametrizado en parametrizacion-cuentas ';
end if;

in_orden_distribucion := in_orden_distribucion + 1;

INSERT INTO tes_distribucion_cuentas_pagar(


id_lote,
id_plan_cuentas,
tipo_distribucion_cuentas_pagar,
debito_distribucion_cuentas_pagar,
credito_distribucion_cuentas_pagar,
ord_distribucion_cuentas_pagar,
referencia_distribucion_cuentas_pagar )
VALUES (
in_id_lote,
in_id_plan_cuentas_interes,
'IMPTOS',
0.00,
in_retencion_primera_cuota,
in_orden_distribucion,
in_descripcion_distribucion);

end if;

/** PARA INGRESAR RENOVACION **/


if in_renovacion = '1' then

/** para todos los creditos a renovar **/


for rrenovacion in
select id_creditos_renovaciones
from core_creditos_a_pagar_renovaciones
where id_creditos = p_id_creditos
loop

update core_creditos set id_estado_creditos = 8 where


id_creditos = rrenovacion.id_creditos_renovaciones;

--raise exception '<<ERROR>>


rrenovacion.id_creditos_renovaciones --> % ',
rrenovacion.id_creditos_renovaciones;

in_respuesta_renovacion :=
public.core_aprobar_credito_renovacion(
p_id_creditos =>
rrenovacion.id_creditos_renovaciones,
p_fecha => now()::date,
p_id_usuarios => p_id_usuarios,
p_id_proveedores => in_id_proveedor
);

in_valor_suma_renovacion := (
select saldo_a_la_fecha_creditos_a_pagar_renovaciones

from core_creditos_a_pagar_renovaciones
where id_creditos_renovaciones =
rrenovacion.id_creditos_renovaciones
);

in_valor_suma_renovacion :=
coalesce(in_valor_suma_renovacion,0);

/**PARA INGRESO DE FILA RENOVACION POR CREDITO **/


in_id_plan_cuentas_liquidacion_renovacion := (
select id_plan_cuentas_haber
from core_parametrizacion_cuentas
where 1 = 1
and nombre_parametrizacion_cuentas = 'LIQRENOVACION'
and modulo_parametrizacion_cuentas = 'CREDITO'
and operacion_parametrizacion_cuentas = 'NUEVO'
and tabla_parametrizacion_cuentas =
'core_creditos_productos'
and id_principal_parametrizacion_cuentas = (
select aa.id_tipo_creditos
from core_creditos aa
where 1 = 1
and aa.id_creditos =
rrenovacion.id_creditos_renovaciones
limit 1
)
);

in_id_plan_cuentas_liquidacion_renovacion :=
coalesce(in_id_plan_cuentas_liquidacion_renovacion,0);

if in_id_plan_cuentas_liquidacion_renovacion = 0 then raise


exception '##### Cuenta para liquidacion Renovacion No parametrizada'; end if;

in_orden_distribucion := in_orden_distribucion + 1;

INSERT INTO tes_distribucion_cuentas_pagar(


id_lote,
id_plan_cuentas,
tipo_distribucion_cuentas_pagar,
debito_distribucion_cuentas_pagar,
credito_distribucion_cuentas_pagar,
ord_distribucion_cuentas_pagar,
referencia_distribucion_cuentas_pagar
)VALUES (
in_id_lote,
in_id_plan_cuentas_liquidacion_renovacion,
'IMPTOS',
0.00,
in_valor_suma_renovacion,
in_orden_distribucion,
in_descripcion_distribucion
);

end loop;

/** ------ **/

end if;
--
============================================================================
-- BEGIN_RETENCION APORTES ---
--
============================================================================

in_valor_retencion_aporte := 0;

if( exists( select 1 from core_creditos_retencion_aportes where


id_creditos = p_id_creditos and id_estatus = 1 and id_estado = 1 ) ) then

in_valor_retencion_aporte := (
select (numero_aportaciones_creditos_retencion_aportes *
valor_contribucion_creditos_retencion_aportes)
from core_creditos_retencion_aportes
where id_creditos = p_id_creditos and id_estado = 1 and
id_estatus = 1 );

in_valor_retencion_aporte :=
coalesce( in_valor_retencion_aporte, 0);

end if;
--
============================================================================
-- BEGIN_RETENCION APORTES ---
--
============================================================================

/**PARA INSETTAR DEVENGO MONTO TOTAL A RECIBIR DE DOCUMENTOS


CREDITOS***/
in_id_plan_cuentas_haber := coalesce( ( select
id_plan_cuentas_haber
from core_parametrizacion_cuentas
where 1 = 1
and nombre_parametrizacion_cuentas = 'GENERACREDITO'
and modulo_parametrizacion_cuentas = 'CREDITO'
and operacion_parametrizacion_cuentas = 'NUEVO'
and tabla_parametrizacion_cuentas = 'core_creditos_productos'
and id_principal_parametrizacion_cuentas =
rcredito.id_tipo_creditos
), 0 );

if in_id_plan_cuentas_haber = 0 then
raise exception ' Variable in_id_plan_cuentas_haber -- no
esta parametrizado en parametrizacion-cuentas ';
end if;

in_orden_distribucion := in_orden_distribucion + 1;

INSERT INTO tes_distribucion_cuentas_pagar(


id_lote,
id_plan_cuentas,
tipo_distribucion_cuentas_pagar,
debito_distribucion_cuentas_pagar,
credito_distribucion_cuentas_pagar,
ord_distribucion_cuentas_pagar,
referencia_distribucion_cuentas_pagar
) VALUES (
in_id_lote,
in_id_plan_cuentas_haber,
'PAGO',
0.00,
rcredito.monto_neto_entregado_creditos,
in_orden_distribucion,
in_descripcion_distribucion
);

--
============================================================================
-- BEGIN_INGRESO DE DOCUMENNTOS PAGARE
---
--
============================================================================
INSERT INTO tes_distribucion_cuentas_pagar(
id_lote,
id_plan_cuentas,
tipo_distribucion_cuentas_pagar,
debito_distribucion_cuentas_pagar,
credito_distribucion_cuentas_pagar,
ord_distribucion_cuentas_pagar,
referencia_distribucion_cuentas_pagar )
VALUES (
in_id_lote,
rdocumento.id_plan_cuentas_haber,
'COMPRA',
0.00,
rcredito.monto_otorgado_creditos,
in_orden_distribucion,
in_descripcion_distribucion
);

--
============================================================================
-- END_INGRESO DE DOCUMENNTOS PAGARE
---
--
============================================================================

/*** Para Ingreso de la cuenta Pagar **/


in_id_consecutivo_cxp = coalesce( ( SELECT id_consecutivos
FROM consecutivos
WHERE id_entidades = 1 AND nombre_consecutivos='CxP' ), 0 );

in_id_tipo_documento := coalesce(( SELECT id_tipo_documento


FROM tes_tipo_documento
WHERE abreviacion_tipo_documento = 'MIS' LIMIT 1 ), 0 );

in_id_moneda := coalesce( ( SELECT id_moneda


FROM tes_moneda
WHERE nombre_moneda = 'DOLAR' LIMIT 1), 0);

in_descripcion_cuentas_pagar := 'Cuenta x Pagar Credito Num '||


rcredito.numero_creditos || ' ' || rcredito.codigo_tipo_creditos;
in_origen_cuentas_pagar := 'CREDITOS';

/** PARA VALORES DE CUENTAS POR PAGAR **/


in_compra_cuentas_pagar := rcredito.monto_otorgado_creditos;
in_total_cuentas_pagar := in_compra_cuentas_pagar;
in_saldo_cuentas_pagar := in_total_cuentas_pagar -
in_retencion_primera_cuota - in_valor_renovacion -
rcredito.monto_neto_entregado_creditos - in_valor_retencion_aporte;
in_impuesto_cuentas_pagar := -( in_retencion_primera_cuota +
in_valor_renovacion + in_valor_retencion_aporte ); --se coloca en negativo por el
motivo de de valores que restan en la cxp
in_total_cuentas_pagar := in_compra_cuentas_pagar +
in_impuesto_cuentas_pagar; -- se aplica el valor de interes y retencion a la cuenta
por pagar

if in_saldo_cuentas_pagar <> 0 then raise exception '##### Cuenta x


Pagar Con Saldo CREDITO --> % | MONTO --> % | RETENCION --> % | RENOVACION --> % |
RET APORTES --> % | NETO --> % | SALDO --> % | ',
p_id_creditos, in_compra_cuentas_pagar,
in_retencion_primera_cuota, in_valor_renovacion, in_valor_retencion_aporte,
rcredito.monto_neto_entregado_creditos, in_saldo_cuentas_pagar; end if;

in_id_bancos := null;

in_resultado_cuentas_pagar := public.tes_ins_cuentas_pagar(
_id_lote => in_id_lote,
_id_consecutivo => in_id_consecutivo_cxp,
_id_tipo_documento => in_id_tipo_documento,
_id_proveedor => in_id_proveedor,
_id_bancos => in_id_bancos,
_id_moneda => in_id_moneda,
_descripcion_cuentas_pagar => in_descripcion_cuentas_pagar,
_fecha_cuentas_pagar => now()::date,
_condiciones_pago_cuentas_pagar => '',
_num_documento_cuentas_pagar => '',
_num_ord_compra => '',
_metodo_envio_cuentas_pagar => '',
_compra_cuentas_pagar => in_compra_cuentas_pagar,
_desc_comercial => 0.00,
_flete_cuentas_pagar => 0.00,
_miscelaneos_cuentas_pagar => 0.00,
_impuesto_cuentas_pagar => in_impuesto_cuentas_pagar,
_total_cuentas_pagar => in_total_cuentas_pagar,
_monto1099_cuentas_pagar=> 0.00,
_efectivo_cuentas_pagar => 0.00,
_cheque_cuentas_pagar => 0.00,
_tarjeta_credito_cuentas_pagar => 0.00,
_condonaciones_cuentas_pagar => 0.00,
_saldo_cuentas_pagar => in_total_cuentas_pagar,
_origen_cuentas_pagar => in_origen_cuentas_pagar,
_compra_cero_cuentas_pagar => 0.00,
_compra_iva_cuentas_pagar => in_compra_cuentas_pagar
);

/** PARA INSERCION DE COMPROBANTE **/


in_tipo_comprobante_contable := coalesce(( SELECT id_tipo_comprobantes
FROM tipo_comprobantes
WHERE nombre_tipo_comprobantes = 'CONTABLE' ),0);

in_concepto_comprobante_contable := 'Consecion Creditos Sol: '||


rcredito.numero_creditos ;
in_valor_letras_comprobante_contable:=
public.numero_a_letras( rcredito.monto_otorgado_creditos::numeric );

in_resultado_comprobante_contable :=
public.core_ins_ccomprobantes_activacion_credito(
_id_entidades => 1,
_id_tipo_comprobantes => in_tipo_comprobante_contable,
_ruc_ccomprobantes => '',
_nombres_ccomprobantes => '',
_retencion_ccomprobantes => '',
_valor_ccomprobantes => rcredito.monto_otorgado_creditos,
_concepto_ccomprobantes => in_concepto_comprobante_contable,
_id_usuarios => p_id_usuarios,
_valor_letras => in_valor_letras_comprobante_contable,
_fecha_ccomprobantes => now()::date,
_id_forma_pago => rcredito.id_forma_pago,
_referencia_doc_ccomprobantes => 'N. Credito: '||
rcredito.numero_creditos,
_numero_cuenta_banco_ccomprobantes => null,
_numero_cheque_ccomprobantes => null,
_observaciones_ccomprobantes =>
in_concepto_comprobante_contable,
_id_proveedores => in_id_proveedor,
_tipo_cuenta_ccomprobantes => 'cxp',
_usuario_usuarios => in_usuario_usuarios,
_transaccion_ccomprobantes => 'credito',
_id_lote => in_id_lote
);

/** PARA ACTUALIZACION TABLAS **/

SELECT aa.id_creditos, cc.id_bancos, 1 existe


INTO rcuentas
FROM core_creditos aa
iNNER JOIN core_participes_cuentas cc
ON cc.id_participes = aa.id_participes AND cc.cuenta_principal = true
WHERE aa.id_estatus = 1 AND aa.id_creditos = p_id_creditos;

update tes_cuentas_pagar
set id_ccomprobantes = in_resultado_comprobante_contable,
id_forma_pago = rcredito.id_forma_pago,
id_banco = case when rcuentas.existe = 1 then
rcuentas.id_bancos else null end
where id_cuentas_pagar = in_resultado_cuentas_pagar;

update core_creditos set id_ccomprobantes =


in_resultado_comprobante_contable where id_creditos = p_id_creditos;

pout_resultado = 1;

exception when others then


pout_resultado = 0;

raise notice 'ERROR ENCONTRADO <<core_aprobar_credito_creditos>> %:


%;',sqlstate,sqlerrm;
pout_mensaje := 'ERROR ENCONTRADO
<<core_aprobar_credito_creditos>> '|| sqlstate || ' : ' || sqlerrm;

<<enderror>>
declare
p_outerror_procedimiento text;
p_outerror_linea int4;
begin

GET STACKED DIAGNOSTICS p_outerror_procedimiento =


PG_EXCEPTION_CONTEXT;
p_outerror_linea := substring( p_outerror_procedimiento FROM '[0-
9]+');

raise notice 'ERROR CONTEXTO %:',p_outerror_procedimiento;


raise notice 'ERROR CONTEXTO %:',p_outerror_linea;
pout_linea := p_outerror_linea;
pout_funcion := p_outerror_procedimiento;

end enderror;

end;

END;
$function$
;

También podría gustarte