CREATE TABLE CONT_EJERCICIOS (
   ID            TIPO_ID NOT NULL,
   NOMBRE        VARCHAR(255),
   FECHA_INICIO   DATE,
   FECHA_FIN      DATE,
   ESTADO        VARCHAR(255),
   LONG_SUB_CUENTA SMALLINT,
   ID_ASIENTO_APERTURA TIPO_ID,
   ID_ASIENTO_PERYGAN TIPO_ID,
   ID_ASIENTO_CIERRE TIPO_ID);

ALTER TABLE CONT_EJERCICIOS ADD CONSTRAINT PK_CONT_EJERCICIOS PRIMARY KEY (ID);


CREATE TABLE CONT_CUENTAS_ESPECIALES (
  ID TIPO_ID NOT NULL,
  REFERENCIA varchar(6),
  descripcion varchar(255));

ALTER TABLE CONT_CUENTAS_ESPECIALES ADD CONSTRAINT PK_CONT_CUENTAS_ESPECIALES PRIMARY KEY (ID);


CREATE TABLE CONT_EPIGRAFES (
  ID TIPO_ID NOT NULL,
  REF_EPIGRAFE VARCHAR(6),
  ID_PADRE TIPO_ID,
  descripcion varchar(255),
  ID_EJERCICIO TIPO_ID);

ALTER TABLE CONT_EPIGRAFES ADD CONSTRAINT PK_CONT_EPIGRAFES PRIMARY KEY (ID);


CREATE TABLE CONT_BALANCES (
  ID          TIPO_ID NOT NULL /* TIPO_ID = INTEGER */,
  REF_BALANCE VARCHAR(255),
  NATURALEZA VARCHAR(255),
  NIVEL1 tipo_perfil, 
  DESCRIPCION1 varchar(255),
  NIVEL2 TIPO_PERFIL,
  DESCRIPCION2 varchar(255),
  NIVEL3 TIPO_PERFIL,
  DESCRIPCION3 varchar(255));

ALTER TABLE CONT_BALANCES ADD CONSTRAINT PK_CONT_BALANCES PRIMARY KEY (ID);


CREATE TABLE CONT_CUENTAS (
    ID                  TIPO_ID NOT NULL /* TIPO_ID = INTEGER */,
    REF_CUENTA          VARCHAR(10),
    ID_EJERCICIO        TIPO_ID /* TIPO_ID = INTEGER */,
    ID_EPIGRAFE         TIPO_ID /* TIPO_ID = INTEGER */,
    DESCRIPCION         VARCHAR(255),
    ID_BALANCE          TIPO_ID /* TIPO_ID = INTEGER */,
    ID_CUENTA_ESPECIAL  TIPO_ID /* TIPO_ID = INTEGER */
);

ALTER TABLE CONT_CUENTAS ADD CONSTRAINT PK_CONT_CUENTAS PRIMARY KEY (ID);


CREATE TABLE CONT_SUBCUENTAS (
    ID             TIPO_ID NOT NULL /* TIPO_ID = INTEGER */,
    REF_SUBCUENTA  VARCHAR(15),
    DESCRIPCION    VARCHAR(255),
    ID_CUENTA      TIPO_ID /* TIPO_ID = INTEGER */,
    ID_EJERCICIO   TIPO_ID /* TIPO_ID = INTEGER */
);

ALTER TABLE CONT_SUBCUENTAS ADD CONSTRAINT PK_CONT_SUBCUENTAS PRIMARY KEY (ID);

CREATE TABLE CONT_ASIENTOS (
    ID             TIPO_ID NOT NULL /* TIPO_ID = INTEGER */,
    FECHA_ASIENTO  DATE,
    ORDEN          INTEGER
);
ALTER TABLE CONT_ASIENTOS ADD CONSTRAINT PK_CONT_ASIENTOS PRIMARY KEY (ID);

CREATE TABLE CONT_APUNTES (
    ID                     TIPO_ID NOT NULL /* TIPO_ID = INTEGER */,
    ID_ASIENTO             TIPO_ID /* TIPO_ID = INTEGER */,
    ID_SUBCUENTA           TIPO_ID /* TIPO_ID = INTEGER */,
    CONCEPTO               VARCHAR(255),
    PUNTEADO               SMALLINT,
    DEBE                   TIPO_IMPORTE /* TIPO_IMPORTE = NUMERIC(11,2) */,
    HABER                  TIPO_IMPORTE /* TIPO_IMPORTE = NUMERIC(11,2) */,
    ID_FACTURA             TIPO_ID /* TIPO_ID = INTEGER */,
    ID_RECIBO              TIPO_ID /* TIPO_ID = INTEGER */
);

ALTER TABLE CONT_APUNTES ADD CONSTRAINT PK_CONT_APUNTES PRIMARY KEY (ID);

CREATE VIEW V_CONT_EPIGRAFES(
    ID,
    REF_EPIGRAFE,
    DESCRIPCION,
    ID_EJERCICIO,
    ID_PADRE,
    EPIGRAFE_PADRE)
AS
select CONT_EPI1.ID, CONT_EPI1.REF_EPIGRAFE, CONT_EPI1.DESCRIPCION, CONT_EPI1.ID_EJERCICIO,
CONT_EPI1.ID_PADRE, CONT_EPI2.DESCRIPCION as EPIGRAFE_PADRE
from CONT_EPIGRAFES CONT_EPI1
left join CONT_EPIGRAFES CONT_EPI2 on (CONT_EPI2.ID = CONT_EPI1.ID_PADRE)
;

CREATE VIEW V_CONT_CUENTAS(
    ID,
    REF_CUENTA,
    ID_EJERCICIO,
    DESCRIPCION,
    ID_EPIGRAFE,
    EPIGRAFE,
    ID_BALANCE,
    BALANCE,
    ID_CUENTA_ESPECIAL,
    CUENTA_ESPECIAL)
AS
select CONT_CUENTAS.ID, CONT_CUENTAS.REF_CUENTA, CONT_CUENTAS.ID_EJERCICIO, CONT_CUENTAS.DESCRIPCION,
CONT_CUENTAS.ID_EPIGRAFE, CONT_EPIGRAFES.DESCRIPCION as EPIGRAFE,
CONT_CUENTAS.ID_BALANCE, CONT_BALANCES.REF_BALANCE as BALANCE,
CONT_CUENTAS.ID_CUENTA_ESPECIAL, CONT_CUENTAS_ESPECIALES.DESCRIPCION as CUENTA_ESPECIAL
from CONT_CUENTAS
left join CONT_EPIGRAFES on (CONT_EPIGRAFES.ID = CONT_CUENTAS.ID_EPIGRAFE)
left join CONT_BALANCES on (CONT_BALANCES.ID = CONT_CUENTAS.ID_BALANCE)
left join CONT_CUENTAS_ESPECIALES on (CONT_CUENTAS_ESPECIALES.ID = CONT_CUENTAS.ID_CUENTA_ESPECIAL)
;



DROP VIEW V_CONT_SUBCUENTAS;
DROP VIEW V_CONT_SUBCUENTAS_SALDO;

CREATE VIEW V_CONT_SUBCUENTAS_SALDO(
    ID_SUBCUENTA,
    DEBE,
    HABER,
    SALDO)
AS
select cont_subcuentas.ID, COALESCE(SUM(cont_apuntes.DEBE), 0) as DEBE,
COALESCE(SUM(cont_apuntes.HABER), 0) as HABER,
COALESCE(SUM(cont_apuntes.DEBE), 0) - COALESCE(SUM(cont_apuntes.HABER), 0) as SALDO
from cont_subcuentas
left join cont_apuntes on (cont_apuntes.id_subcuenta = cont_subcuentas.ID)
group by cont_subcuentas.ID
;

CREATE VIEW V_CONT_SUBCUENTAS(
    ID,
    REF_SUBCUENTA,
    DESCRIPCION,
    ID_EJERCICIO,
    ID_CUENTA,
    CUENTA,
    DEBE,
    HABER,
    SALDO)
AS
select CONT_SUBCUENTAS.ID, CONT_SUBCUENTAS.REF_SUBCUENTA, CONT_SUBCUENTAS.DESCRIPCION, CONT_SUBCUENTAS.ID_EJERCICIO,
CONT_SUBCUENTAS.ID_CUENTA, CONT_CUENTAS.DESCRIPCION as CUENTA, V_CONT_SUBCUENTAS_SALDO.DEBE, V_CONT_SUBCUENTAS_SALDO.HABER, V_CONT_SUBCUENTAS_SALDO.SALDO
from V_CONT_SUBCUENTAS_SALDO
left join CONT_SUBCUENTAS on (CONT_SUBCUENTAS.ID = V_CONT_SUBCUENTAS_SALDO.ID_SUBCUENTA)
left join CONT_CUENTAS on (CONT_CUENTAS.ID = CONT_SUBCUENTAS.ID_CUENTA)
;