ALTER TABLE TBCASO_PAINEL_CONF
    ADD MASCARA_CAMPO INTEGER DEFAULT 0;


UPDATE TBCASO_PAINEL_CONF
	SET MASCARA_CAMPO = 0
	WHERE MASCARA_CAMPO IS NULL;

/************************************************************************/
/************************************************************************/

SET TERM ^ ;

CREATE OR ALTER trigger ttbcaso_painel_conf_b01u for tbcaso_painel_conf
active after update position 0
AS
DECLARE VARIABLE HISTORICO VARCHAR(500);
BEGIN

HISTORICO = '';

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

IF(HISTORICO <> '') THEN
   BEGIN
     HISTORICO = 'PAINEL:'|| FN_LPAD(NEW.ID,4,0)||' - '||NEW.DESCRICAO ||' ALTERADO'||HISTORICO;
     EXECUTE PROCEDURE SPI_HISTORICO('TBCASO_PAINEL', NEW.PAINEL_ID,FN_ELIPSES(:HISTORICO,500));
   END
END
^

SET TERM ; ^

/********************************************************************************************************/
/********************************************************************************************************/

SET TERM ^ ;

CREATE OR ALTER function FN_DIA_ANT_UTIL (
    DATA date)
returns date
AS
declare variable dia_util date;
declare variable valido boolean;
begin

  DIA_UTIL = :DATA;
  VALIDO = true;

  if(extract( WEEKDAY from DIA_UTIL) = 6)then
  begin
     DIA_UTIL = dateadd(day,-1,:DIA_UTIL);
     VALIDO = false;
  end

  if(extract( WEEKDAY from DIA_UTIL) = 0)then
  begin
     DIA_UTIL = dateadd(day,-1,:DIA_UTIL);
     VALIDO = false;
  end

  for
      Select A.Data 
        from TBCAIXABANCO_FERIADO A
        Where A.Data = :DIA_UTIL

  into
    :DIA_UTIL
  do
  begin
     DIA_UTIL = dateadd(day,-1,:DIA_UTIL);
     VALIDO = false;
  end

  if(VALIDO = false)then
  begin
    DIA_UTIL = FN_DIA_ANT_UTIL(DIA_UTIL);
  end

  return DIA_UTIL;
end
^

SET TERM ; ^


SET TERM ^ ;

CREATE OR ALTER procedure SPU_REGUA_COBRANCA_CASO (
    IPAINEL_ID integer not null,
    IDIAS integer = 0)
as
declare variable VEMPRESA_ID integer;
declare variable VVINCULO_CASO_ID integer;
declare variable VPAGAMENTO_FORMA_ID integer;
declare variable VQTD_DOCUMENTOS integer;
declare variable VTOTAL_VALOR numeric(15,4);
declare variable VNFS_PARC_ID varchar(6000);
declare variable VDOCUMENTOS varchar(6000);
declare variable VVINCULO_CASO_SITUACAO integer;
declare variable VFEED_ID integer;
declare variable VCASO_ID integer;
declare variable VSPLIT varchar(6000);
declare variable VMENSAGEM varchar(6000);
declare variable VASSUNTO varchar(6000);
declare variable PAINEL_ID integer;
declare variable MOTIVO_ID integer;
declare variable TIPO_ID integer;
declare variable ORIGEM_ID integer;
declare variable CASO_ID integer;
declare variable CASO_ID2 integer;
BEGIN

    FOR
        SELECT /*FIRST 5*/ DISTINCT
            X.EMPRESA_CODIGO AS EMPRESA_ID,
            X.CASO_ID,
            COALESCE((SELECT FIRST 1 CAST(COALESCE(S.OSPLIT, '0') AS INTEGER) FROM SPLIT2(LIST(DISTINCT X.PAGAMENTO_FORMA), ',') S), 0) AS PAGAMENTO_FORMA_ID,
        
            COUNT(X.NUMERO_NOTAFISCAL) AS QTD_DOCUMENTOS,
            CAST(SUM(X.VALOR_SALDO) AS NUMERIC(15,4)) AS TOTAL_VALOR,
        
            LIST(X.CONTROLE, ',') AS NFS_PARC_ID,
            LIST('ESTAB.: '||FN_LPAD(X.ESTABELECIMENTO_ID, 4, '0')||' | DOC.: '||FN_LPAD(X.NUMERO_NOTAFISCAL, 8, '0')||'/'||FN_LPAD(X.SERIE, 3, '0')||'-'||FN_LPAD(X.PARCELA, 3, '0')||' | DT.VENC.: '||FORMATDATE(X.DATA_VENCIMENTO)||' | VALOR: R$ '||FN_LPAD(FN_FORMAT_NUMBER2(X.VALOR_SALDO, 2), 10, ''), ';') AS DOCUMENTOS
        
        FROM (
            SELECT
                A.EMPRESA_CODIGO,
            
                A.ESTABELECIMENTO_CODIGO AS ESTABELECIMENTO_ID,
                A.NUMERO_NOTAFISCAL,
                A.SERIE,
                A.PARCELA,
                A.DATA_EMISSAO,
                A.DATA_VENCIMENTO,
                A.VALOR_SALDO,
                A.PAGAMENTO_FORMA,

                A.CONTROLE,

                COALESCE(A.CASO_ID, 0) AS CASO_ID,

                B.DATA_TOLERANCIA
            
            FROM (
                SELECT
                    FN_DIA_ANT_UTIL(DATA_TOLERANCIA) AS DATA_TOLERANCIA
                
                FROM (
                    SELECT
                        CAST(DATEADD(DAY, -CAST(:IDIAS AS INTEGER), CURRENT_TIMESTAMP) AS DATE) AS DATA_TOLERANCIA
                
                    FROM RDB$DATABASE
                )
            ) B, TBNFS_PARCELAMENTO A
            WHERE A.SITUACAO = 1
            AND A.DATA_VENCIMENTO < B.DATA_TOLERANCIA
            AND A.VALOR_SALDO > 0
            
            ORDER BY
                A.DATA_VENCIMENTO,
                A.EMPRESA_CODIGO
        ) X
        
        GROUP BY
            X.EMPRESA_CODIGO,
            X.CASO_ID

    INTO
        :VEMPRESA_ID,
        :VVINCULO_CASO_ID,
        :VPAGAMENTO_FORMA_ID,
        :VQTD_DOCUMENTOS,
        :VTOTAL_VALOR,
        :VNFS_PARC_ID,
        :VDOCUMENTOS

    DO
    BEGIN
        
        FOR
            SELECT
                D.PAINEL_ID,
                D.MOTIVO_ID,
                D.TIPO_ID,
                D.ORIGEM_ID,
    
                COALESCE((SELECT FIRST 1
                            E.REGISTRO_ID
                        FROM TBCASO_REGISTRO_DETALHE E, TBCASO_PAINEL_CONF E2
                        WHERE E.CAMPO_ID = E2.ID
                        AND E.PAINEL_ID = E2.PAINEL_ID
                        AND E.PAINEL_ID = D.PAINEL_ID
                        AND E2.PARAM_EXEC = 1
                        AND TRIM(E.VALOR) = :VEMPRESA_ID), 0) AS CASO_ID,
    
                COALESCE((SELECT FIRST 1
                            C.ID
                        FROM TBCASO_REGISTRO C
                        WHERE C.PAINEL_ID = D.PAINEL_ID
                        AND C.CASO_ORIGEM_ID = :VEMPRESA_ID
                        AND C.CASO_ORIGEM_TABELA = 'TBCLIENTE'), 0) AS CASO_ID2
    
            FROM TBCASO_PAINEL_PROCEDIMENTO D
            WHERE D.PAINEL_ID = :IPAINEL_ID
            AND D.OPERACAO = 0

        INTO
           :PAINEL_ID,
           :MOTIVO_ID,
           :TIPO_ID,
           :ORIGEM_ID,
           :CASO_ID,
           :CASO_ID2

        DO
        BEGIN

            IF ((COALESCE(:CASO_ID, 0) > 0) OR (COALESCE(:CASO_ID2, 0) > 0)) THEN
            BEGIN

                :VVINCULO_CASO_SITUACAO = COALESCE((SELECT FIRST 1 S.TIPO FROM TBCASO_REGISTRO C, TBCASO_STATUS S WHERE C.STATUS_ID = S.ID AND C.PAINEL_ID = S.PAINEL_ID AND C.ID = :VVINCULO_CASO_ID), 0);

                IF (
                    (COALESCE(:VVINCULO_CASO_ID, 0) = 0) OR
                    (COALESCE(:VVINCULO_CASO_ID, 0) > 0 AND COALESCE(:VVINCULO_CASO_ID, 0) <> COALESCE(:CASO_ID2, 0) AND COALESCE(:VVINCULO_CASO_ID, 0) <> COALESCE(:CASO_ID, 0)) OR
                    (COALESCE(:VVINCULO_CASO_ID, 0) > 0 AND COALESCE(:VVINCULO_CASO_SITUACAO, 0) > 2)
                ) THEN
                BEGIN

                    /* verificando o ID do caso */
                    :VCASO_ID = 0;
                    IF (COALESCE(:CASO_ID, 0) > 0) THEN
                    BEGIN
                        :VCASO_ID = :CASO_ID;
                    END ELSE
                    BEGIN
                        :VCASO_ID = :CASO_ID2;
                    END
    
    
                    :VMENSAGEM = '<p><strong>Parcelas do Cliente fora do Periodo de Tolerancia ('||:IDIAS||' dias):</strong> '||:VQTD_DOCUMENTOS||' Parcelas Vinculadas </p>'|| ASCII_CHAR(13) || ASCII_CHAR(10) ||'';
                    :VASSUNTO  = 'AGENDAMENTO: [CASO: '||FN_LPAD(:VCASO_ID, 8, '0')||'] - INFORMACOES DE COBRANCA';
    
                    FOR
                        SELECT
                            SP.OSPLIT
                        FROM SPLIT_V2(:VDOCUMENTOS, ';') SP
    
                    INTO
                        :VSPLIT
    
                    DO
                    BEGIN
    
                        :VMENSAGEM = :VMENSAGEM ||'<p> '|| :VSPLIT ||' </p>'|| ASCII_CHAR(13) || ASCII_CHAR(10) ||'';
    
                    END
    
    
                    /* Inclusão do FEED no caso */
                    :VFEED_ID = GEN_ID(GTBCASO_FEED, 1);
    
                    INSERT INTO TBCASO_FEED (ID, DE, PARA, EM_COPIA, EM_COPIA_OCULTA, MENSAGEM, ASSUNTO, PAINEL_ID, CASO_ID, FILES, SUBFEED, TIPO, USUARIO_ID, COMENTARIO, LISTA_FILE, WORKFLOW_ITEM_ID)
                        VALUES (:VFEED_ID, '', '', '', '', :VMENSAGEM, FN_ELIPSE2(:VASSUNTO, 300), :PAINEL_ID, :VCASO_ID, 1, 0, 2, 99999, 0, '', 0);


                    /* Atualizando vinculo das parcelas */
                    FOR
                        SELECT
                            SP.OSPLIT
                        FROM SPLIT_V2(:VNFS_PARC_ID, ',') SP

                    INTO
                        :VSPLIT

                    DO
                    BEGIN

                        UPDATE TBNFS_PARCELAMENTO
                            SET CASO_ID = :VCASO_ID
                            WHERE CONTROLE = :VSPLIT;

                    END
                END

            END ELSE
            BEGIN

                :VCASO_ID = 0;

                :VMENSAGEM = '';

                FOR
                    SELECT
                        SP.OSPLIT
                    FROM SPLIT_V2(:VDOCUMENTOS, ';') SP

                INTO
                    :VSPLIT

                DO
                BEGIN

                    :VMENSAGEM = :VMENSAGEM ||''|| :VSPLIT ||' '|| ASCII_CHAR(13) || ASCII_CHAR(10) ||'';

                END


                FOR
                    SELECT
                        SPC.OCASO_ID
                    FROM SPI_CASO(:PAINEL_ID, :MOTIVO_ID, :TIPO_ID, :ORIGEM_ID, 'AGENDA_AUT', :VEMPRESA_ID, CAST(:VTOTAL_VALOR AS NUMERIC(15,2)), FN_ELIPSE2(:VMENSAGEM, 6000), :VPAGAMENTO_FORMA_ID, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 0, 'TBAGENDAMENTO') SPC
    
                INTO
                    :VCASO_ID
    
                DO
                BEGIN

                    /* Atualizando vinculo das parcelas */
                    FOR
                        SELECT
                            SP.OSPLIT
                        FROM SPLIT_V2(:VNFS_PARC_ID, ',') SP

                    INTO
                        :VSPLIT

                    DO
                    BEGIN

                        UPDATE TBNFS_PARCELAMENTO
                            SET CASO_ID = :VCASO_ID
                            WHERE CONTROLE = :VSPLIT;

                    END
    
                    /* Historico para geracao de novo caso */
                    EXECUTE PROCEDURE SPI_CASO_HISTORICO(:VCASO_ID, :PAINEL_ID, 'CASO REGISTRADO VIA AGENDAMENTO DE SISTEMA - '||:VQTD_DOCUMENTOS||' Parcelas Vinculadas');

                END
            END

        END
    END
END
^

SET TERM ; ^

COMMENT ON PARAMETER SPU_REGUA_COBRANCA_CASO.IDIAS IS
'Dias de tolerância';

