CREATE TABLE TBMANIFESTO_NF (
    ID INTEGER NOT NULL,
    NSU VARCHAR(15),
    TIPO_DOCUMENTO VARCHAR(100),
    DATAHORA TIMESTAMP DEFAULT 'NOW',
    ESTABELECIMENTO_ID INTEGER,
    EMPRESA_CODIGO INTEGER,
    EMPRESA_RAZAOSOCIAL VARCHAR(100),
    EMPRESA_CNPJ VARCHAR(14),
    EMPRESA_IE VARCHAR(20),
    EMPRESA_UF VARCHAR(2),
    CHAVE_ACESSO VARCHAR(44),
    DATA_EMISSAO DATE,
    TIPO_NF INTEGER,
    FIN_NFE INTEGER,
    DIGEST_VALUE VARCHAR(100),
    SITUACAO INTEGER,
    CONFIRMACAO_EMPRESA INTEGER,
    DATAHORA_RCBTO TIMESTAMP,
    VALOR_TOTAL_NF NUMERIC(15,2),
    DATA_EMISSAO_EVENTO TIMESTAMP,
    TIPO_EVENTO INTEGER,
    SEQUENCIA_EVENTO INTEGER,
    DESC_EVENTO VARCHAR(200),
    X_EVENTO VARCHAR(100),
    DATAHORA_RCBTO_EVENTO TIMESTAMP);

ALTER TABLE TBMANIFESTO_NF
ADD CONSTRAINT PK_TBMANIFESTO_NF
PRIMARY KEY (ID);

COMMENT ON COLUMN TBMANIFESTO_NF.TIPO_DOCUMENTO IS
'NF-E, EVENTO';

COMMENT ON COLUMN TBMANIFESTO_NF.TIPO_NF IS
'TIPO DA NOTA FISCAL ELETRÔNICA:
0 - ENTRADA;
1 - SAÍDA;';

COMMENT ON COLUMN TBMANIFESTO_NF.FIN_NFE IS
'FINALIDADE DA NF-E:
1 - NF-E NORMAL;
2 - NF-E COMPLEMENTAR;
3 - NF-E AJUSTE;
4 - DEVOLUÇÃO DE MERCADORIA;';

COMMENT ON COLUMN TBMANIFESTO_NF.DIGEST_VALUE IS
'DIGEST VALUE DA NF-E AUTORIZADA';

COMMENT ON COLUMN TBMANIFESTO_NF.SITUACAO IS
'1 - AUTORIZADA;
2 - DENEGADA;
3 - CANCELADA;';

COMMENT ON COLUMN TBMANIFESTO_NF.CONFIRMACAO_EMPRESA IS
'0 - NÃO CONFIRMADA;
1 - CONFIRMADA;
2 - DESCONHECIDA;
3 - OPERAÇÃO NÃO REALIZADA;';

COMMENT ON COLUMN TBMANIFESTO_NF.DATAHORA_RCBTO IS
'DATA E HORA DE AUTORIZAÇÃO DE USO DA NF-E PELA SEFAZ ORIGEM';

COMMENT ON COLUMN TBMANIFESTO_NF.DATA_EMISSAO_EVENTO IS
'DATA DE EMISSÃO DO EVENTO';

COMMENT ON COLUMN TBMANIFESTO_NF.TIPO_EVENTO IS
'CÓDIGO DO EVENTO';

COMMENT ON COLUMN TBMANIFESTO_NF.SEQUENCIA_EVENTO IS
'SEQUENCIAL DO EVENTO';

COMMENT ON COLUMN TBMANIFESTO_NF.DESC_EVENTO IS
'DESCRIÇÃO DO EVENTO';

COMMENT ON COLUMN TBMANIFESTO_NF.X_EVENTO IS
'EVENTO A SER CONSIDERADO';

COMMENT ON COLUMN TBMANIFESTO_NF.DATAHORA_RCBTO_EVENTO IS
'DATA E HORA DE AUTORIZAÇÃO DE USO DO EVENTO';

CREATE SEQUENCE GTBMANIFESTO_NF;

CREATE TRIGGER TBMANIFESTO_NF_BI FOR TBMANIFESTO_NF
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTBMANIFESTO_NF,1);
END;

CREATE OR ALTER TRIGGER TBMANIFESTO_NF_B02I FOR TBMANIFESTO_NF
ACTIVE BEFORE INSERT OR UPDATE POSITION 2
AS
DECLARE VARIABLE EMPRESA_CODIGO INTEGER;
DECLARE VARIABLE EMPRESA_RAZAOSOCIAL VARCHAR(50);
DECLARE VARIABLE EMPRESA_IE VARCHAR(20);
DECLARE VARIABLE EMPRESA_UF VARCHAR(2);

BEGIN

    IF(CHAR_LENGTH(NEW.EMPRESA_RAZAOSOCIAL) = 0) THEN
    BEGIN
        SELECT FIRST 1
            T.CODIGO, T.RAZAOSOCIAL, T.IE, T.UF
        FROM TBEMPRESA T
        WHERE T.CNPJ LIKE NEW.EMPRESA_CNPJ
        INTO :EMPRESA_CODIGO, :EMPRESA_RAZAOSOCIAL, :EMPRESA_IE, :EMPRESA_UF;

        --NEW.EMPRESA_CODIGO      = :EMPRESA_CODIGO;
        NEW.EMPRESA_RAZAOSOCIAL = :EMPRESA_RAZAOSOCIAL;
        NEW.EMPRESA_IE          = :EMPRESA_IE;
        NEW.EMPRESA_UF          = :EMPRESA_UF;
    END

END;


CREATE OR ALTER TRIGGER TBMANIFESTO_NF_B03I FOR TBMANIFESTO_NF
ACTIVE BEFORE INSERT OR UPDATE POSITION 3
AS
DECLARE VARIABLE EMPRESA_UF VARCHAR(2);

BEGIN
    IF(CHAR_LENGTH(NEW.CHAVE_ACESSO) >= 2) THEN
    BEGIN

        SELECT FIRST 1 U.UF FROM TBUF U WHERE U.CODIGO_IBGE = SUBSTRING(NEW.CHAVE_ACESSO FROM 1 FOR 2) INTO :EMPRESA_UF;

        NEW.EMPRESA_UF = :EMPRESA_UF;

        NEW.NUMERO_NOTAFISCAL = CAST(SUBSTRING(NEW.CHAVE_ACESSO FROM 26 FOR 9) AS INTEGER);

        NEW.SERIE = SUBSTRING(NEW.CHAVE_ACESSO FROM 23 FOR 3);

    END
END;

CREATE OR ALTER TRIGGER TBMANIFESTO_NF_B04I FOR TBMANIFESTO_NF
ACTIVE BEFORE INSERT POSITION 4
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('TBMANIFESTO_NF', NEW.ID, HISTORICO);
    END
END;

CREATE OR ALTER TRIGGER TBMANIFESTO_NF_B04U FOR TBMANIFESTO_NF
ACTIVE BEFORE UPDATE POSITION 4
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
DECLARE VARIABLE DESC_OLD_STTS VARCHAR(500);
DECLARE VARIABLE DESC_NEW_STTS VARCHAR(500);

BEGIN
    HISTORICO = '';

    IF(NEW.CONFIRMACAO_EMPRESA <> OLD.CONFIRMACAO_EMPRESA) THEN
    BEGIN
        IF(OLD.CONFIRMACAO_EMPRESA = 9) THEN :DESC_OLD_STTS = 'SEM MANIFESTACAO';
        IF(OLD.CONFIRMACAO_EMPRESA = 0) THEN :DESC_OLD_STTS = 'CIENCIA DA OPERACAO';
        IF(OLD.CONFIRMACAO_EMPRESA = 1) THEN :DESC_OLD_STTS = 'CONFIRMACAO DA OPERACAO';
        IF(OLD.CONFIRMACAO_EMPRESA = 2) THEN :DESC_OLD_STTS = 'DESCONHECIMENTO DA OPERACAO';
        IF(OLD.CONFIRMACAO_EMPRESA = 3) THEN :DESC_OLD_STTS = 'OPERACAO NAO REALIZADA';

        IF(NEW.CONFIRMACAO_EMPRESA = 9) THEN :DESC_NEW_STTS = 'SEM MANIFESTACAO';
        IF(NEW.CONFIRMACAO_EMPRESA = 0) THEN :DESC_OLD_STTS = 'CIENCIA DA OPERACAO';
        IF(NEW.CONFIRMACAO_EMPRESA = 1) THEN :DESC_NEW_STTS = 'CONFIRMACAO DA OPERACAO';
        IF(NEW.CONFIRMACAO_EMPRESA = 2) THEN :DESC_NEW_STTS = 'DESCONHECIMENTO DA OPERACAO';
        IF(NEW.CONFIRMACAO_EMPRESA = 3) THEN :DESC_NEW_STTS = 'OPERACAO NAO REALIZADA';

        HISTORICO = HISTORICO||' STTS MANIF.'||:DESC_OLD_STTS||' -> '||:DESC_NEW_STTS;
    END

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

END;

CREATE INDEX TBMANIFESTO_NF_01
ON TBMANIFESTO_NF (NSU);

CREATE INDEX TBMANIFESTO_NF_02
ON TBMANIFESTO_NF (TIPO_DOCUMENTO);

CREATE INDEX TBMANIFESTO_NF_03
ON TBMANIFESTO_NF (ESTABELECIMENTO_ID);

CREATE INDEX TBMANIFESTO_NF_04
ON TBMANIFESTO_NF (DATA_EMISSAO);

CREATE INDEX TBMANIFESTO_NF_05
ON TBMANIFESTO_NF (TIPO_EVENTO);

CREATE INDEX TBMANIFESTO_NF_06
ON TBMANIFESTO_NF (EMPRESA_RAZAOSOCIAL);

CREATE INDEX TBMANIFESTO_NF_07
ON TBMANIFESTO_NF (EMPRESA_CNPJ);


CREATE INDEX TBMANIFESTO_NF_08
ON TBMANIFESTO_NF (DATAHORA);

CREATE INDEX TBMANIFESTO_NF_09
ON TBMANIFESTO_NF (CHAVE_ACESSO);

CREATE INDEX TBMANIFESTO_NF_10
ON TBMANIFESTO_NF (SITUACAO);


CREATE INDEX TBMANIFESTO_NF_11
ON TBMANIFESTO_NF (CONFIRMACAO_EMPRESA);

CREATE INDEX TBMANIFESTO_NF_12
ON TBMANIFESTO_NF (DATA_EMISSAO_EVENTO);

CREATE INDEX TBMANIFESTO_NF_13
ON TBMANIFESTO_NF (TIPO_NF);

ALTER TABLE TBMANIFESTO_NF
ADD SERIE VARCHAR(3);