-- TBNFS_ITEM

-- PARAMETROS GC_WEB

ALTER TABLE TBNFS_PARCELAMENTO
ADD GC_WEB INTEGER
DEFAULT 0;

-- NOVO CAMPO DE SITUAÇÃO
ALTER TABLE TBNFS_PARCELAMENTO
ADD NF_SITUACAO INTEGER;

-- NOVO CAMPO DE NATUREZA
ALTER TABLE TBNFS_PARCELAMENTO
ADD NF_NATUREZA INTEGER;


-- ALTERANDO TABELA DE PARCELAMENTO PARA ACEITAR O PARÂMETRO DE CÓDIGO DE AUTORIZAÇÃO
ALTER TABLE TBNFS_PARCELAMENTO
ADD CODIGO_AUTORIZACAO VARCHAR(50);


-- TRIGGERS

-- ########### INSERT ###########

-- TTBNFS_PARCELAMENTO_B05I
CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_B05I FOR TBNFS_PARCELAMENTO
ACTIVE BEFORE INSERT POSITION 4
AS
BEGIN

   IF (NEW.GC_WEB = 1) THEN
       BEGIN
            IF(NEW.NF_NATUREZA = 2) THEN
            BEGIN
               EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE,
                 NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                 NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);
            END

       END

END;

COMMENT ON TRIGGER TTBNFS_PARCELAMENTO_B05I IS 'GERAÇÃO DO LANÇAMENTO NO FINANCEIRO (TBCAIXABANCO_LANCAMENTO_REG)';

-- ########### UPDATE ###########
-- TTBNFS_PARCELAMENTO_B08U
CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_B08U FOR TBNFS_PARCELAMENTO
ACTIVE BEFORE UPDATE POSITION 4
AS
DECLARE VARIABLE VREGISTROS INTEGER;
BEGIN

   IF (NEW.GC_WEB = '1') THEN
       BEGIN

            IF((OLD.NF_NATUREZA = 1 AND NEW.NF_NATUREZA = 2) OR (OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 1) ) THEN
            BEGIN
                -- DELETAR LANÇAMENTO DE PARCELA
                EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 2);
    
    
                IF(NEW.NF_NATUREZA = 2) THEN
                BEGIN
                    -- INCLUIR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);
                END
    
           END ELSE
           IF(OLD.NF_NATUREZA = 2 AND NEW.NF_NATUREZA = 2) THEN
           BEGIN
              VREGISTROS = (SELECT COUNT(CONTROLE) FROM TBCAIXABANCO_LANCAMENTO_REG WHERE NFS_CONTROLE = OLD.NFS_CONTROLE AND NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE);
                IF(NEW.ESTABELECIMENTO_CODIGO   <> OLD.ESTABELECIMENTO_CODIGO OR
                   NEW.EMPRESA_CODIGO           <> OLD.EMPRESA_CODIGO OR
                   NEW.VALOR                    <> OLD.VALOR) THEN
               BEGIN
    
                    IF (OLD.VALOR_SALDO <> OLD.VALOR) THEN
                        EXCEPTION "..." 'PARCELAMENTO COM LANCAMENTOS VINCULADOS, ALTERACAO CANCELADA!';
    
                        VREGISTROS = (SELECT COUNT(CONTROLE) FROM TBCAIXABANCO_LANCAMENTO_REG WHERE NFS_CONTROLE = OLD.NFS_CONTROLE AND NFS_PARCELAMENTO_CONTROLE = OLD.CONTROLE);
    
                        IF (VREGISTROS > 1) THEN
                            EXCEPTION "..." 'PARCELAMENTO COM LANCAMENTOS VINCULADOS, ALTERACAO CANCELADA!';
    
    
               END
    
                -- ATUALIZAR LANÇAMENTO DE PARCELA

                IF(OLD.ESTABELECIMENTO_CODIGO  <> NEW.ESTABELECIMENTO_CODIGO
                OR OLD.EMPRESA_CODIGO          <> NEW.EMPRESA_CODIGO
                OR OLD.NUMERO_NOTAFISCAL       <> NEW.NUMERO_NOTAFISCAL
                OR OLD.PARCELA                 <> NEW.PARCELA
                OR OLD.DATA_EMISSAO            <> NEW.DATA_EMISSAO
                OR OLD.SERIE                   <> NEW.SERIE
                OR OLD.REPRESENTANTE_ID        <> NEW.REPRESENTANTE_ID
                OR OLD.VENDEDOR_ID             <> NEW.VENDEDOR_ID
                OR OLD.REPRESENTANTE_COMISSAO  <> NEW.REPRESENTANTE_COMISSAO
                OR OLD.VENDEDOR_COMISSAO       <> NEW.VENDEDOR_COMISSAO )THEN
                BEGIN
                 EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                 NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 3);
                END

    
           END ELSE
           IF(OLD.NF_NATUREZA = 1 AND NEW.NF_NATUREZA = 1) THEN
           BEGIN
                IF(OLD.NF_SITUACAO = 1 AND NEW.NF_SITUACAO = 2) THEN
                BEGIN
                    -- INCLUIR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 1);
    
                END ELSE
                IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 1) THEN
                BEGIN
                    -- DELETAR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 2);
    
                END ELSE
                IF(OLD.NF_SITUACAO = 2 AND NEW.NF_SITUACAO = 3) THEN
                BEGIN
                    UPDATE TBNFS_PARCELAMENTO T SET T.SITUACAO = 3 WHERE T.CONTROLE = NEW.CONTROLE;

                    -- DELETAR LANÇAMENTO DE PARCELA
                    EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', NEW.CONTROLE, NEW.NFS_CONTROLE, NEW.ESTABELECIMENTO_CODIGO, NEW.EMPRESA_CODIGO, NEW.CONTA_RECEBER_OPERACAO,
                    NEW.NUMERO_NOTAFISCAL, NEW.PARCELA, NEW.DATA_EMISSAO, NEW.VALOR_SALDO, NEW.VALOR, 'D', NEW.SERIE, NEW.AVULSO, 2);
    
                END
           END

       END

END;

COMMENT ON TRIGGER TTBNFS_PARCELAMENTO_B08U IS 'GERAÇÃO DO LANÇAMENTO NO FINANCEIRO (TBCAIXABANCO_LANCAMENTO_REG)';

-- ########### DELETE ###########

-- TTBNFS_PARCELAMENTO_B04D
CREATE OR ALTER TRIGGER TTBNFS_PARCELAMENTO_B04D FOR TBNFS_PARCELAMENTO
ACTIVE BEFORE DELETE POSITION 1
AS
DECLARE VARIABLE VREGISTROS INTEGER;
BEGIN
    
        EXECUTE PROCEDURE SP_NF_LANCAMENTO_PARCELA('NFS', OLD.CONTROLE, OLD.NFS_CONTROLE,
         OLD.ESTABELECIMENTO_CODIGO, OLD.EMPRESA_CODIGO, OLD.CONTA_RECEBER_OPERACAO,
         OLD.NUMERO_NOTAFISCAL, OLD.PARCELA, OLD.DATA_EMISSAO, OLD.VALOR_SALDO, OLD.VALOR, 'D', OLD.SERIE, OLD.AVULSO, 2);

END;

COMMENT ON TRIGGER TTBNFS_PARCELAMENTO_B04D IS 'EXCLUSÃO DO LANÇAMENTO NO FINANCEIRO (TBCAIXABANCO_LANCAMENTO_REG)';

-- PROCEDURE DE INSERÇÃO

CREATE OR ALTER PROCEDURE SPI_NFS_PARCELAMENTO (
    NFS_CONTROLE INTEGER,
    ESTABELECIMENTO_CODIGO INTEGER,
    EMPRESA_CODIGO INTEGER,
    NUMERO_NOTAFISCAL INTEGER,
    DATA_EMISSAO DATE,
    DATA_VENCIMENTO DATE,
    PARCELA INTEGER,
    VALOR NUMERIC(10,5),
    VALOR_SALDO NUMERIC(10,5),
    CONTA_RECEBER_OPERACAO INTEGER,
    CONTROLE INTEGER,
    ACEITE VARCHAR(1),
    VALOR_DESCONTO NUMERIC(10,5),
    CONTA_RECEBER_BANCO INTEGER,
    CONTA_RECEBER_MODALIDADE INTEGER,
    CONTA_RECEBER_POSICAO INTEGER,
    CONTA_RECEBER_COBRANCA INTEGER,
    SERIE VARCHAR(3),
    PAGAMENTO_FORMA INTEGER,
    CLASSIFICACAO_CONTABIL VARCHAR(6),
    CCUSTO VARCHAR(8),
    OBSERVACAO VARCHAR(100),
    CODIGO_AUTORIZACAO VARCHAR(50),
    GC_WEB INTEGER,
    NF_SITUACAO INTEGER,
    NF_NATUREZA INTEGER,
    REPRESENTANTE_ID INTEGER,
    REPRESENTANTE_COMISSAO NUMERIC(10,5),
    VENDEDOR_ID INTEGER,
    VENDEDOR_COMISSAO NUMERIC(10,5))
AS
BEGIN
INSERT INTO TBNFS_PARCELAMENTO(
NFS_CONTROLE,ESTABELECIMENTO_CODIGO,EMPRESA_CODIGO,NUMERO_NOTAFISCAL,
DATA_EMISSAO,DATA_VENCIMENTO,PARCELA,VALOR,VALOR_SALDO,CONTA_RECEBER_OPERACAO,
CONTROLE,ACEITE,VALOR_DESCONTO,CONTA_RECEBER_BANCO,CONTA_RECEBER_MODALIDADE,
CONTA_RECEBER_POSICAO ,CONTA_RECEBER_COBRANCA,SERIE,PAGAMENTO_FORMA, CLASSIFICACAO_CONTABIL,
CCUSTO, OBSERVACAO, CODIGO_AUTORIZACAO, GC_WEB, NF_SITUACAO, NF_NATUREZA, REPRESENTANTE_ID,
REPRESENTANTE_COMISSAO, VENDEDOR_ID, VENDEDOR_COMISSAO) VALUES (
:NFS_CONTROLE,:ESTABELECIMENTO_CODIGO,:EMPRESA_CODIGO,:NUMERO_NOTAFISCAL,
:DATA_EMISSAO,:DATA_VENCIMENTO,:PARCELA,:VALOR,:VALOR_SALDO,
:CONTA_RECEBER_OPERACAO,:CONTROLE,:ACEITE,:VALOR_DESCONTO,:CONTA_RECEBER_BANCO,
:CONTA_RECEBER_MODALIDADE,:CONTA_RECEBER_POSICAO,:CONTA_RECEBER_COBRANCA,:SERIE,:PAGAMENTO_FORMA,
:CLASSIFICACAO_CONTABIL, :CCUSTO, :OBSERVACAO, :CODIGO_AUTORIZACAO, :GC_WEB, :NF_SITUACAO, :NF_NATUREZA,
:REPRESENTANTE_ID, :REPRESENTANTE_COMISSAO, :VENDEDOR_ID, :VENDEDOR_COMISSAO);
END;


-- PROCEDURE DE ATUALIZAÇÃO

CREATE OR ALTER PROCEDURE SPU_NFS_PARCELAMENTO (
    NFS_CONTROLE INTEGER,
    ESTABELECIMENTO_CODIGO INTEGER,
    EMPRESA_CODIGO INTEGER,
    NUMERO_NOTAFISCAL INTEGER,
    DATA_EMISSAO DATE,
    DATA_VENCIMENTO DATE,
    PARCELA INTEGER,
    VALOR NUMERIC(10,5),
    VALOR_SALDO NUMERIC(10,5),
    CONTA_RECEBER_OPERACAO INTEGER,
    CONTROLE INTEGER,
    ACEITE VARCHAR(1),
    VALOR_DESCONTO NUMERIC(10,5),
    CONTA_RECEBER_BANCO INTEGER,
    CONTA_RECEBER_MODALIDADE INTEGER,
    CONTA_RECEBER_POSICAO INTEGER,
    CONTA_RECEBER_COBRANCA INTEGER,
    SERIE VARCHAR(3),
    PAGAMENTO_FORMA INTEGER,
    CLASSIFICACAO_CONTABIL VARCHAR(6),
    CCUSTO VARCHAR(8),
    OBSERVACAO VARCHAR(100),
    CODIGO_AUTORIZACAO VARCHAR(50),
    GC_WEB INTEGER,
    NF_SITUACAO INTEGER,
    NF_NATUREZA INTEGER,
    REPRESENTANTE_ID INTEGER,
    REPRESENTANTE_COMISSAO NUMERIC(10,5),
    VENDEDOR_ID INTEGER,
    VENDEDOR_COMISSAO NUMERIC(10,5))
AS
BEGIN

UPDATE TBNFS_PARCELAMENTO SET
ESTABELECIMENTO_CODIGO = :ESTABELECIMENTO_CODIGO,
EMPRESA_CODIGO = :EMPRESA_CODIGO,
NUMERO_NOTAFISCAL = :NUMERO_NOTAFISCAL,
DATA_EMISSAO = :DATA_EMISSAO,
SERIE = :SERIE,
NF_SITUACAO = :NF_SITUACAO,
NF_NATUREZA = :NF_NATUREZA,
REPRESENTANTE_ID = :REPRESENTANTE_ID,
REPRESENTANTE_COMISSAO = :REPRESENTANTE_COMISSAO,
VENDEDOR_ID = :VENDEDOR_ID,
VENDEDOR_COMISSAO = :VENDEDOR_COMISSAO

WHERE CONTROLE = :CONTROLE;

END;