diff --git a/Database/scripts/factuges.sql b/Database/scripts/factuges.sql index ee98caf0..2f59f05f 100644 --- a/Database/scripts/factuges.sql +++ b/Database/scripts/factuges.sql @@ -382,6 +382,91 @@ BEGIN END^ +CREATE PROCEDURE PROC_CIERRE_APERTURA ( + id_ejercicio_cierre integer, + id_ejercicio_apertura integer) +as +declare variable id_subcuenta_apertura integer; +declare variable id_subcuenta_cierre integer; +declare variable ref_subcuenta varchar(255); +declare variable subcuenta varchar(255); +declare variable num_orden integer; +declare variable diferencia numeric(11,2); +declare variable estado_ejercicio_cierre varchar(255); +declare variable estado_ejercicio_apertura varchar(255); +declare variable nombre_ejercicio_cierre varchar(255); +declare variable nombre_ejercicio_apertura varchar(255); +declare variable id_asiento_cierre integer; +declare variable id_asiento_apertura integer; +declare variable id_apunte_apertura integer; +declare variable id_apunte_cierre integer; +begin + /*Seleccionamos el ejercicio de cierre*/ + select ESTADO, NOMBRE, GEN_ID(gen_cont_asientos_id, 1) + from cont_ejercicios + where id = :id_ejercicio_cierre + into :estado_ejercicio_cierre, :nombre_ejercicio_cierre, :id_asiento_cierre; + + /*Seleccionamos el ejercicio de apertura*/ + select ESTADO, NOMBRE, GEN_ID(gen_cont_asientos_id, 1) + from cont_ejercicios + where id = :id_ejercicio_apertura + into :estado_ejercicio_apertura, :nombre_ejercicio_apertura, :id_asiento_apertura; + + /*Si los ejercicios no estan abiertos no hacemos nada*/ + if ((estado_ejercicio_cierre = 'ABIERTO') and (estado_ejercicio_apertura = 'ABIERTO')) then + begin + /* Aņadimos asiento de cierre*/ + insert into CONT_ASIENTOS (ID, FECHA_ASIENTO, TIPO) + values (:id_asiento_cierre, current_date, 'x'); + + /* Aņadimos asiento de apertura*/ + insert into CONT_ASIENTOS (ID, FECHA_ASIENTO, TIPO) + values (:id_asiento_apertura, current_date, 'a'); + + num_orden = 1; + + /* Para cada cuenta descuadrada se inserta un apunte de cierre asociado al asiento creado anteriormente*/ + for select ID_SUBCUENTA, REF_SUBCUENTA, SUBCUENTA, SUM(COALESCE(DEBE,0))-SUM(COALESCE(HABER,0)) as DIFERENCIA, + GEN_ID(gen_cont_apuntes_id, 1), GEN_ID(gen_cont_apuntes_id, 1) + from v_cont_diario where (ID_EJERCICIO = :ID_EJERCICIO_CIERRE) + group by 1, 2, 3 + having (SUM(COALESCE(DEBE,0))-SUM(COALESCE(HABER,0))) <> 0 + into :id_subcuenta_cierre, :ref_subcuenta, :subcuenta, :diferencia, :id_apunte_cierre, :id_apunte_apertura do + begin + /*Buscamos la subcuenta equibalente en el ejericio de apertura*/ + select ID from cont_subcuentas + where REF_SUBCUENTA = :ref_subcuenta + and DESCRIPCION = :subcuenta + and ID_EJERCICIO = :id_ejercicio_apertura + into :id_subcuenta_apertura; + + if (diferencia > 0) then + begin + /*APUNTE DE CIERRE*/ + insert into CONT_APUNTES (ID, ID_ASIENTO, ID_SUBCUENTA, NUM_ORDEN, CONCEPTO, HABER) + values (:id_apunte_cierre, :id_asiento_cierre, :id_subcuenta_cierre, :num_orden, 'Asiento de cierre ' || :nombre_ejercicio_cierre, :diferencia); + + /*APUNTE DE APERTURA*/ + insert into CONT_APUNTES (ID, ID_ASIENTO, ID_SUBCUENTA, NUM_ORDEN, CONCEPTO, DEBE) + values (:id_apunte_apertura, :id_asiento_apertura, :id_subcuenta_apertura, :num_orden, 'Asiento de apertura ' || :nombre_ejercicio_apertura, :diferencia); + end + else + begin + /*APUNTE DE CIERRE*/ + insert into CONT_APUNTES (ID, ID_ASIENTO, ID_SUBCUENTA, NUM_ORDEN, CONCEPTO, DEBE) + values (:id_apunte_cierre, :id_asiento_cierre, :id_subcuenta_cierre, :num_orden, 'Asiento de cierre ' || :nombre_ejercicio_cierre, (:diferencia)*-1); + + /*APUNTE DE APERTURA*/ + insert into CONT_APUNTES (ID, ID_ASIENTO, ID_SUBCUENTA, NUM_ORDEN, CONCEPTO, HABER) + values (:id_apunte_apertura, :id_asiento_apertura, :id_subcuenta_apertura, :num_orden, 'Asiento de apertura ' || :nombre_ejercicio_apertura, (:diferencia)*-1); + end + num_orden = num_orden + 1; + end + end + + suspend; +end^ SET TERM ; ^