CREATE TABLE TBNF_INUTILIZADOS (
    ID INTEGER NOT NULL,
    ESTABELECIMENTO_ID INTEGER NOT NULL,
    NUMERO_INICIAL INTEGER NOT NULL,
    NUMERO_FINAL INTEGER NOT NULL,
    SERIE INTEGER,
    TIPO INTEGER,
    JUSTIFICATIVA VARCHAR(50),
    DATA_EMISSAO DATE,
    PROTOCOLO_INUTILIZACAO VARCHAR(200),
    XML BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    USUARIO_ID INTEGER,
    DATAHORA TIMESTAMP DEFAULT 'NOW');

ALTER TABLE TBNF_INUTILIZADOS
ADD CONSTRAINT PK_TBNF_INUTILIZADOS
PRIMARY KEY (ID);

COMMENT ON COLUMN TBNF_INUTILIZADOS.TIPO IS
'0 - ENTRADA;
1 - SAIDA;';

CREATE SEQUENCE GTBNF_INUTILIZADOS;

SET TERM ^ ;

create trigger ttbnf_inutilizados_b01i for tbnf_inutilizados
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gtbnf_inutilizados,1);
end
^

SET TERM ; ^


CREATE INDEX ITBNF_INUTILIZADOS_01
ON TBNF_INUTILIZADOS (ESTABELECIMENTO_ID);

CREATE INDEX ITBNF_INUTILIZADOS_02
ON TBNF_INUTILIZADOS (NUMERO_INICIAL);

CREATE INDEX ITBNF_INUTILIZADOS_03
ON TBNF_INUTILIZADOS (NUMERO_FINAL);

CREATE INDEX ITBNF_INUTILIZADOS_04
ON TBNF_INUTILIZADOS (SERIE);

CREATE INDEX ITBNF_INUTILIZADOS_05
ON TBNF_INUTILIZADOS (TIPO);


ALTER TABLE TBNFS
    ADD NF_INUTILIZADOS_ID INTEGER DEFAULT 0 NOT NULL;
	

ALTER TABLE TBNFE
    ADD NF_INUTILIZADOS_ID INTEGER DEFAULT 0 NOT NULL;
	
SET TERM ^ ;

CREATE OR ALTER procedure SPUI_NFS_INUTILIZACAO (
    ESTABELECIMENTO_CODIGO integer,
    NUMERO_NOTAFISCAL integer,
    SERIE varchar(3),
    EMPRESA_CODIGO integer,
    NATUREZA integer,
    DATA_SAIDA date,
    DATA_EMISSAO date,
    HORA_EMISSAO varchar(5),
    HORA_SAIDA varchar(5),
    IND_FINAL char(1),
    IND_PRESENCA char(1),
    ID_ESTRANGEIRO varchar(20),
    CONTROLE integer,
    SITUACAO integer,
    CFOP_CODIGO varchar(5),
    CFOP_DESCRICAO varchar(60),
    USUARIO_CODIGO integer,
    USUARIO_DATA date,
    EMPRESA_RAZAOSOCIAL varchar(50),
    EMPRESA_CNPJ varchar(14),
    EMPRESA_IE varchar(20),
    EMPRESA_ENDERECO varchar(200),
    EMPRESA_NUMERO varchar(20),
    EMPRESA_BAIRRO varchar(20),
    EMPRESA_CIDADE varchar(40),
    EMPRESA_CEP varchar(8),
    EMPRESA_UF varchar(2),
    SUFRAMA varchar(9),
    CHAVE_ACESSO varchar(44),
    TIPO char(1),
    CLASSIFICACAO varchar(10),
    XML char(2),
    DANFE char(1),
    PAGAMENTO char(1),
    PROTOCOLO_CANCELAMENTO varchar(20),
    MOTIVO_CANCELAMENTO varchar(50),
    SPED char(1),
    MODELO char(2),
    ESPECIE varchar(5),
    FISCAL_CFOP_CODIGO varchar(5),
    ACUMULA_ITEM char(1),
    OCULTA_GRADE char(1),
    TIPO_DOC char(1),
    SPED_PISCOF char(1),
    GC_WEB integer,
    NF_INUTILIZADOS_ID integer = 0)
as
BEGIN
UPDATE OR INSERT INTO TBNFS (
ESTABELECIMENTO_CODIGO,NUMERO_NOTAFISCAL,SERIE,EMPRESA_CODIGO,NATUREZA,
DATA_SAIDA,DATA_EMISSAO,
HORA_EMISSAO,HORA_SAIDA,IND_FINAL,IND_PRESENCA,ID_ESTRANGEIRO,
CONTROLE,SITUACAO,CFOP_CODIGO,CFOP_DESCRICAO,
USUARIO_CODIGO,USUARIO_DATA,EMPRESA_RAZAOSOCIAL,EMPRESA_CNPJ,EMPRESA_IE,EMPRESA_ENDERECO,
EMPRESA_NUMERO,EMPRESA_BAIRRO,EMPRESA_CIDADE,EMPRESA_CEP,EMPRESA_UF,SUFRAMA,
CHAVE_ACESSO,TIPO,XML,DANFE,PAGAMENTO,PROTOCOLO_CANCELAMENTO,MOTIVO_CANCELAMENTO,
SPED,MODELO,ESPECIE,FISCAL_CFOP_CODIGO,ACUMULA_ITEM, OCULTA_GRADE, TIPO_DOC,
CLASSIFICACAO,SPED_PISCOF, GC_WEB, NF_INUTILIZADOS_ID) VALUES (

:ESTABELECIMENTO_CODIGO,:NUMERO_NOTAFISCAL,:SERIE,:EMPRESA_CODIGO,:NATUREZA,
:DATA_SAIDA,:DATA_EMISSAO,
:HORA_EMISSAO,:HORA_SAIDA,:IND_FINAL,:IND_PRESENCA,:ID_ESTRANGEIRO,
:CONTROLE,:SITUACAO,:CFOP_CODIGO,:CFOP_DESCRICAO,
:USUARIO_CODIGO,:USUARIO_DATA,:EMPRESA_RAZAOSOCIAL,:EMPRESA_CNPJ,:EMPRESA_IE,:EMPRESA_ENDERECO,
:EMPRESA_NUMERO,:EMPRESA_BAIRRO,:EMPRESA_CIDADE,:EMPRESA_CEP,:EMPRESA_UF,:SUFRAMA,
:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,:PROTOCOLO_CANCELAMENTO,:MOTIVO_CANCELAMENTO,
:SPED,:MODELO,:ESPECIE,:FISCAL_CFOP_CODIGO,
:ACUMULA_ITEM, :OCULTA_GRADE, :TIPO_DOC,:CLASSIFICACAO,:SPED_PISCOF, :GC_WEB, :NF_INUTILIZADOS_ID)
MATCHING(CONTROLE);

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER procedure SPUI_NFE_INUTILIZACAO (
    ESTABELECIMENTO_CODIGO integer,
    NUMERO_NOTAFISCAL integer,
    SERIE varchar(3),
    EMPRESA_CODIGO integer,
    NATUREZA integer,
    DATA_EMISSAO date,
    HORA_EMISSAO varchar(5),
    CONTROLE integer,
    SITUACAO integer,
    CFOP_CODIGO varchar(5),
    CFOP_DESCRICAO varchar(60),
    USUARIO_CODIGO integer,
    USUARIO_DATA date,
    EMPRESA_RAZAOSOCIAL varchar(50),
    EMPRESA_CNPJ varchar(14),
    EMPRESA_IE varchar(20),
    EMPRESA_ENDERECO varchar(200),
    EMPRESA_NUMERO varchar(20),
    EMPRESA_BAIRRO varchar(20),
    EMPRESA_CIDADE varchar(40),
    EMPRESA_CEP varchar(8),
    EMPRESA_UF varchar(2),
    SUFRAMA varchar(9),
    CHAVE_ACESSO varchar(44),
    TIPO char(1),
    CLASSIFICACAO varchar(10),
    XML char(2),
    DANFE char(1),
    PAGAMENTO char(1),
    PROTOCOLO_CANCELAMENTO varchar(20),
    MOTIVO_CANCELAMENTO varchar(50),
    SPED char(1),
    MODELO char(2),
    ESPECIE varchar(5),
    FISCAL_CFOP_CODIGO varchar(5),
    TIPO_DOC char(1),
    SPED_PISCOF char(1),
    GC_WEB integer,
    NF_INUTILIZADOS_ID integer = 0)
as
BEGIN
UPDATE OR INSERT INTO TBNFE (
ESTABELECIMENTO_CODIGO,NUMERO_NOTAFISCAL,SERIE,EMPRESA_CODIGO,NATUREZA, DATA_EMISSAO,
HORA_EMISSAO, CONTROLE,SITUACAO,CFOP_CODIGO,CFOP_DESCRICAO,
USUARIO_CODIGO,USUARIO_DATA,EMPRESA_RAZAOSOCIAL,EMPRESA_CNPJ,EMPRESA_IE,EMPRESA_ENDERECO,
EMPRESA_NUMERO,EMPRESA_BAIRRO,EMPRESA_CIDADE,EMPRESA_CEP,EMPRESA_UF,SUFRAMA,
CHAVE_ACESSO,TIPO,XML,DANFE,PAGAMENTO,PROTOCOLO_CANCELAMENTO,MOTIVO_CANCELAMENTO,
SPED,MODELO,ESPECIE,FISCAL_CFOP_CODIGO, TIPO_DOC,
CLASSIFICACAO,SPED_PISCOF, GC_WEB, NF_INUTILIZADOS_ID) VALUES (

:ESTABELECIMENTO_CODIGO,:NUMERO_NOTAFISCAL,:SERIE,:EMPRESA_CODIGO,:NATUREZA,
:DATA_EMISSAO,:HORA_EMISSAO,:CONTROLE,:SITUACAO,:CFOP_CODIGO,:CFOP_DESCRICAO,
:USUARIO_CODIGO,:USUARIO_DATA,:EMPRESA_RAZAOSOCIAL,:EMPRESA_CNPJ,:EMPRESA_IE,:EMPRESA_ENDERECO,
:EMPRESA_NUMERO,:EMPRESA_BAIRRO,:EMPRESA_CIDADE,:EMPRESA_CEP,:EMPRESA_UF,:SUFRAMA,
:CHAVE_ACESSO,:TIPO,:XML,:DANFE,:PAGAMENTO,:PROTOCOLO_CANCELAMENTO,:MOTIVO_CANCELAMENTO,
:SPED,:MODELO,:ESPECIE,:FISCAL_CFOP_CODIGO, :TIPO_DOC,:CLASSIFICACAO,:SPED_PISCOF, :GC_WEB, :NF_INUTILIZADOS_ID)
MATCHING(CONTROLE);

END
^

SET TERM ; ^

SET TERM ^ ;

CREATE trigger ttbnf_inutilizados_b01u for tbnf_inutilizados
active before update position 1
AS
BEGIN
    /* CASO ALTERACAO DE TIPO (ENTRADA/SAIDA) */
    IF(OLD.TIPO IS DISTINCT FROM NEW.TIPO) THEN
    BEGIN
        IF(COALESCE(OLD.TIPO, 0) = 0)THEN
        BEGIN
            DELETE FROM TBNFE T WHERE T.NF_INUTILIZADOS_ID = OLD.ID;
        END ELSE IF(COALESCE(OLD.TIPO, 0) = 1)THEN
        BEGIN
            DELETE FROM TBNFS T WHERE T.NF_INUTILIZADOS_ID = OLD.ID;
        END
    END
END
^

SET TERM ; ^


SET TERM ^ ;

CREATE trigger ttbnf_inutilizados_b01d for tbnf_inutilizados
active before delete position 1
AS
BEGIN
    IF(COALESCE(OLD.TIPO, 0) = 0)THEN
    BEGIN
        DELETE FROM TBNFE T WHERE T.NF_INUTILIZADOS_ID = OLD.ID;
    END ELSE IF(COALESCE(OLD.TIPO, 0) = 1)THEN
    BEGIN
        DELETE FROM TBNFS T WHERE T.NF_INUTILIZADOS_ID = OLD.ID;
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE trigger ttbnf_inutilizados_b09i for tbnf_inutilizados
active before insert position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF ( NEW.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO INCLUIDO.';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBNF_INUTILIZADOS', NEW.ID, HISTORICO);
    END
END
^

SET TERM ; ^

SET TERM ^ ;

CREATE trigger ttbnf_inutilizados_b09u for tbnf_inutilizados
active before update position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(8000);

BEGIN
    HISTORICO = '';

    IF(NEW.ESTABELECIMENTO_ID <> OLD.ESTABELECIMENTO_ID) THEN
    BEGIN                  
        HISTORICO = HISTORICO||' EST:'||OLD.ESTABELECIMENTO_ID||' -> '||NEW.ESTABELECIMENTO_ID;
    END

    IF(NEW.SERIE <> OLD.SERIE) THEN
    BEGIN                  
        HISTORICO = HISTORICO||' SERIE:'||OLD.SERIE||' -> '||NEW.SERIE;
    END

    IF(NEW.TIPO <> OLD.TIPO) THEN
    BEGIN                  
        HISTORICO = HISTORICO||' TIPO:'||OLD.TIPO||' -> '||NEW.TIPO;
    END

    IF(NEW.NUMERO_INICIAL <> OLD.NUMERO_INICIAL) THEN
    BEGIN                  
        HISTORICO = HISTORICO||' NR.INI:'||OLD.NUMERO_INICIAL||' -> '||NEW.NUMERO_INICIAL;
    END

    IF(NEW.NUMERO_FINAL <> OLD.NUMERO_FINAL) THEN
    BEGIN                  
        HISTORICO = HISTORICO||' NR.FIN:'||OLD.NUMERO_FINAL||' -> '||NEW.NUMERO_FINAL;
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        HISTORICO = FN_ELIPSES(HISTORICO, 500);
        EXECUTE PROCEDURE SPI_HISTORICO('TBNF_INUTILIZADOS', NEW.ID, HISTORICO);
    END

END
^

SET TERM ; ^


SET TERM ^ ;

CREATE trigger ttbnf_inutilizados_b09d for tbnf_inutilizados
active before delete position 9
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

    HISTORICO = '';

    IF (OLD.ID > 0) THEN
    BEGIN
        HISTORICO = HISTORICO||'REGISTRO EXCLUIDO.';
    END

    IF (HISTORICO <> '') THEN
    BEGIN
        EXECUTE PROCEDURE SPI_HISTORICO('TBNF_INUTILIZADOS', OLD.ID, HISTORICO);
    END
END
^

SET TERM ; ^


ALTER TABLE TBNF_INUTILIZADOS
    ADD IMPORTACAO INTEGER DEFAULT 0 NOT NULL;

