/*
    **********************************************************************************
    *                                                                                *
    * @package URBEM CNM - Soluções em Gestão Pública                                *
    * @copyright (c) 2013 Confederação Nacional de Municípos                         *
    * @author Confederação Nacional de Municípios                                    *
    *                                                                                *
    * O URBEM CNM é um software livre; você pode redistribuí-lo e/ou modificá-lo sob *
    * os  termos  da Licença Pública Geral GNU conforme  publicada  pela Fundação do *
    * Software Livre (FSF - Free Software Foundation); na versão 2 da Licença.       *
    *                                                                                *
    * Este  programa  é  distribuído  na  expectativa  de  que  seja  útil,   porém, *
    * SEM NENHUMA GARANTIA; nem mesmo a garantia implícita  de  COMERCIABILIDADE  OU *
    * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral do GNU *
    * para mais detalhes.                                                            *
    *                                                                                *
    * Você deve ter recebido uma cópia da Licença Pública Geral do GNU "LICENCA.txt" *
    * com  este  programa; se não, escreva para  a  Free  Software Foundation  Inc., *
    * no endereço 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.       *
    *                                                                                *
    **********************************************************************************
*/
/*
* Script de DDL e DML
*
* URBEM Soluções de Gestão Pública Ltda
* www.urbem.cnm.org.br
*
* $Id: GRH_1972.sql 59612 2014-09-02 12:00:51Z gelson $
*
* Versão 1.97.2
*/

SELECT atualizarbanco('GRANT ALL ON pessoal.contrato_servidor_conta_salario_historico TO GROUP urbem;');

----------------
-- Ticket #14955
----------------
select atualizarBanco ('ALTER TABLE ima.configuracao_convenio_banrisul  DROP CONSTRAINT [REDACTED]');
select atualizarBanco ('ALTER TABLE ima.configuracao_convenio_banrisul  DROP CONSTRAINT fk_configuracao_convenio_banrisul_1;');
select atualizarBanco ('ALTER TABLE ima.configuracao_convenio_banrisul  RENAME TO configuracao_convenio_banrisul_bkp;');

SELECT atualizarbanco('
CREATE TABLE ima.configuracao_convenio_banrisul (
    cod_convenio            INTEGER                 NOT NULL,
    cod_convenio_banco      VARCHAR(20)             NOT NULL,
    cod_banco               INTEGER                 NOT NULL,
    CONSTRAINT [REDACTED]   PRIMARY KEY                (cod_convenio, cod_banco),
    CONSTRAINT fk_configuracao_convenio_banrisul_1  FOREIGN KEY                (cod_banco)
                                                    REFERENCES monetario.banco (cod_banco)
);
');

SELECT atualizarbanco('
GRANT ALL ON ima.configuracao_convenio_banrisul TO GROUP urbem;
');

SELECT atualizarbanco('
CREATE TABLE ima.configuracao_banrisul_conta (
    cod_convenio            INTEGER                 NOT NULL,
    cod_banco               INTEGER                 NOT NULL,
    cod_agencia             INTEGER                 NOT NULL,
    cod_conta_corrente      INTEGER                 NOT NULL,
    descricao               VARCHAR(60)             NOT NULL,
    CONSTRAINT [REDACTED]      PRIMARY KEY                               (cod_convenio, cod_banco, cod_agencia, cod_conta_corrente),
    CONSTRAINT fk_configuracao_banrisul_conta_1     FOREIGN KEY                               (cod_convenio, cod_banco)
                                                    REFERENCES ima.configuracao_convenio_banrisul (cod_convenio, cod_banco),
    CONSTRAINT fk_configuracao_banrisul_conta_2     FOREIGN KEY                               (cod_banco, cod_agencia, cod_conta_corrente)
                                                    REFERENCES monetario.conta_corrente       (cod_banco, cod_agencia, cod_conta_corrente)
);
');

SELECT atualizarbanco('
GRANT ALL ON ima.configuracao_banrisul_conta TO GROUP urbem;
');

SELECT atualizarbanco('
CREATE TABLE ima.configuracao_banrisul_orgao (
    cod_convenio            INTEGER                 NOT NULL,
    cod_banco               INTEGER                 NOT NULL,
    cod_agencia             INTEGER                 NOT NULL,
    cod_conta_corrente      INTEGER                 NOT NULL,
    cod_orgao               INTEGER                 NOT NULL,
    CONSTRAINT [REDACTED]      PRIMARY KEY                             (cod_convenio, cod_banco, cod_agencia, cod_conta_corrente, cod_orgao),
    CONSTRAINT fk_configuracao_banrisul_orgao_1     FOREIGN KEY                             (cod_convenio, cod_banco, cod_agencia, cod_conta_corrente)
                                                    REFERENCES  ima.configuracao_banrisul_conta (cod_convenio, cod_banco, cod_agencia, cod_conta_corrente),
    CONSTRAINT fk_configuracao_banrisul_orgao_2     FOREIGN KEY                             (cod_orgao)
                                                    REFERENCES organograma.orgao            (cod_orgao)
 );
');

SELECT atualizarbanco('
GRANT ALL ON ima.configuracao_banrisul_orgao TO GROUP urbem;
');

SELECT atualizarbanco('
CREATE TABLE ima.configuracao_banrisul_local (
    cod_convenio            INTEGER                 NOT NULL,
    cod_banco               INTEGER                 NOT NULL,
    cod_agencia             INTEGER                 NOT NULL,
    cod_conta_corrente      INTEGER                 NOT NULL,
    cod_local               INTEGER                 NOT NULL,
    CONSTRAINT [REDACTED]      PRIMARY KEY                             (cod_convenio, cod_banco, cod_agencia, cod_conta_corrente, cod_local),
    CONSTRAINT fk_configuracao_banrisul_local_1     FOREIGN KEY                             (cod_convenio, cod_banco, cod_agencia, cod_conta_corrente)
                                                    REFERENCES  ima.configuracao_banrisul_conta (cod_convenio, cod_banco, cod_agencia, cod_conta_corrente),
    CONSTRAINT fk_configuracao_banrisul_local_2     FOREIGN KEY                             (cod_local)
                                                    REFERENCES organograma.local            (cod_local)
 );
');

SELECT atualizarbanco('
GRANT ALL ON ima.configuracao_banrisul_local TO GROUP urbem;
');

SELECT atualizarbanco('
INSERT INTO ima.configuracao_convenio_banrisul
SELECT cod_convenio
     , cod_convenio_banco
     , cod_banco
  FROM ima.configuracao_convenio_banrisul_bkp;
');

SELECT atualizarbanco('
INSERT INTO ima.configuracao_banrisul_conta
SELECT cod_convenio
     , cod_banco
     , cod_agencia
     , cod_conta_corrente
     , cod_convenio_banco
  FROM ima.configuracao_convenio_banrisul_bkp;
');

SELECT atualizarbanco('
INSERT INTO ima.configuracao_banrisul_orgao
SELECT * 
FROM (
SELECT (SELECT cod_convenio FROM ima.configuracao_convenio_banrisul_bkp) as cod_convenio
     , (SELECT cod_banco FROM ima.configuracao_convenio_banrisul_bkp) as cod_banco
     , (SELECT cod_agencia FROM ima.configuracao_convenio_banrisul_bkp) as cod_agencia
     , (SELECT cod_conta_corrente FROM ima.configuracao_convenio_banrisul_bkp) as cod_conta_corrente
     , orgao.cod_orgao
  FROM organograma.orgao                                                                
     , organograma.organograma                                                          
     , organograma.orgao_nivel                                                          
     , organograma.nivel                                                                
     , organograma.vw_orgao_nivel as ovw                                                
     , (SELECT MAX(cod_organograma) as cod_organograma                                  
             , MAX(implantacao) AS data                                                 
          FROM organograma.organograma oo                                               
         WHERE implantacao <= to_char(now(), \'yyyy-mm-dd\')) as ultima_data       
WHERE organograma.cod_organograma = nivel.cod_organograma                               
  AND nivel.cod_organograma       = orgao_nivel.cod_organograma                         
  AND nivel.cod_nivel             = orgao_nivel.cod_nivel                               
  AND orgao_nivel.cod_orgao       = orgao.cod_orgao                                     
  AND orgao.cod_orgao             = ovw.cod_orgao                                       
  AND orgao_nivel.cod_organograma = ovw.cod_organograma                                 
  AND orgao_nivel.cod_organograma = ultima_data.cod_organograma                         
  AND nivel.cod_nivel             = ovw.nivel                                            
  AND organograma.ativo           = true
GROUP BY orgao.cod_orgao
) as tmp
WHERE cod_convenio is not null
');

SELECT atualizarbanco('DROP TABLE ima.configuracao_convenio_banrisul_bkp;');


CREATE TYPE colunasContratoServidor AS (
    cod_contrato                INTEGER,       
    cod_norma                   INTEGER,       
    cod_forma_pagamento         INTEGER,      
    cod_tipo_pagamento          INTEGER,       
    cod_tipo_salario            INTEGER,       
    cod_tipo_admissao           INTEGER,       
    cod_categoria               INTEGER,       
    cod_vinculo                 INTEGER,       
    cod_cargo                   INTEGER,       
    desc_cargo                  VARCHAR,
    cod_regime                  INTEGER,       
    desc_regime                 VARCHAR,       
    cod_sub_divisao             INTEGER,       
    desc_sub_divisao            VARCHAR,       
    nr_cartao_ponto             CHARACTER(10), 
    ativo                       BOOLEAN,       
    dt_opcao_fgts               DATE,          
    adiantamento                BOOLEAN,       
    cod_grade                   INTEGER,

    registro                    INTEGER,

    cod_servidor                INTEGER,               
    cod_uf                      INTEGER,               
    cod_municipio               INTEGER,               
    numcgm                      INTEGER,               
    nome_pai                    CHARACTER VARYING(80), 
    nome_mae                    CHARACTER VARYING(80), 
    zona_titulo                 CHARACTER(5),          
    secao_titulo                CHARACTER(5),          
    caminho_foto                CHARACTER VARYING(80), 
    nr_titulo_eleitor           CHARACTER VARYING(12), 
    cod_estado_civil            INTEGER,               
    cod_raca                    INTEGER,

    cod_orgao                   INTEGER,
    desc_orgao                  VARCHAR,
    orgao                       VARCHAR,
    cod_local                   INTEGER,
    desc_local                  VARCHAR,
    cod_regime_funcao           INTEGER,
    desc_regime_funcao          VARCHAR,
    cod_sub_divisao_funcao      INTEGER,
    desc_sub_divisao_funcao     VARCHAR,
    cod_funcao                  INTEGER,
    desc_funcao                 VARCHAR,
    cod_cbo_funcao              INTEGER,
    desc_cbo_funcao             VARCHAR,
    cod_especialidade_funcao    INTEGER,
    desc_especialidade_funcao   VARCHAR,
    cod_especialidade_cargo     INTEGER,
    desc_especialidade_cargo    VARCHAR,
    cod_tipo                    INTEGER,
    desc_tipo_cedencia          VARCHAR,
    cod_conselho                INTEGER,
    sigla_conselho              CHARACTER(10),
    desc_conselho               CHARACTER VARYING(80),
    cod_agencia_fgts            INTEGER,
    cod_banco_fgts              INTEGER,
    nr_conta_fgts               CHARACTER(15),
    cod_agencia_salario         INTEGER,
    cod_banco_salario           INTEGER,
    nr_conta_salario            CHARACTER(15),
    num_banco_salario           CHARACTER VARYING(10),
    nom_banco_salario           CHARACTER VARYING(80),
    num_agencia_salario         CHARACTER VARYING(10),
    nom_agencia_salario         CHARACTER VARYING(80),

    dt_validade_exame           DATE,
    dt_inicio_progressao        DATE,
    cod_nivel_padrao            INTEGER,
    dt_nomeacao                 DATE,
    dt_posse                    DATE,
    dt_admissao                 DATE,
    cod_ocorrencia              INTEGER,
    cod_padrao                  INTEGER,
    valor_padrao                NUMERIC(14,2),
    desc_padrao                 CHARACTER VARYING(80),
    cod_previdencia             INTEGER,
    salario                     NUMERIC(14,2),
    horas_mensais               NUMERIC(14,2),
    horas_semanais              NUMERIC(14,2),
    vigencia                    DATE,
    numcgm_sindicato            INTEGER,
    cod_cid                     INTEGER,
    numcgm_conjuge              INTEGER,
    nr_carteira_res             CHARACTER(15),
    cat_reservista              CHARACTER(1),
    origem_reservista           CHARACTER(1),

    nom_cgm                     CHARACTER VARYING(200),
    servidor_pis_pasep          CHARACTER(15),
    rg                          CHARACTER VARYING(15),
    cpf                         CHARACTER VARYING(20),
    dt_nascimento               DATE,

    valor_atributo              VARCHAR,

    data_laudo                  DATE
);      

CREATE TYPE colunasContratoPensionista AS (
    cod_contrato                INTEGER,                
    registro                    INTEGER,                
    cod_contrato_cedente        INTEGER,                
    cod_dependencia             INTEGER,                
    cod_pensionista             INTEGER,                
    num_beneficio               CHARACTER VARYING(15),  
    percentual_pagamento        NUMERIC(5,2),           
    dt_inicio_beneficio         DATE,                   
    dt_encerramento             DATE,                   
    motivo_encerramento         CHARACTER VARYING(200),
    cod_profissao               INTEGER,
    numcgm                      INTEGER,
    cod_grau                    INTEGER,

    cod_orgao                   INTEGER,
    desc_orgao                  VARCHAR,
    orgao                       VARCHAR,
    cod_local                   INTEGER,
    desc_local                  VARCHAR,

    cod_agencia_salario         INTEGER,
    cod_banco_salario           INTEGER,
    nr_conta_salario            CHARACTER(15),
    num_banco_salario           CHARACTER VARYING(10),
    nom_banco_salario           CHARACTER VARYING(80),
    num_agencia_salario         CHARACTER VARYING(10),
    nom_agencia_salario         CHARACTER VARYING(80),

    cod_previdencia             INTEGER,
    cod_processo                INTEGER,
    cod_cid                     INTEGER,

    cod_regime_funcao           INTEGER,
    desc_regime_funcao          VARCHAR,
    cod_sub_divisao_funcao      INTEGER,
    desc_sub_divisao_funcao     VARCHAR,
    cod_funcao                  INTEGER,
    desc_funcao                 VARCHAR,
    desc_cbo_funcao             VARCHAR,
    cod_especialidade_funcao    INTEGER,
    desc_especialidade_funcao   VARCHAR,

    nom_cgm                     CHARACTER VARYING(200),
    rg                          CHARACTER VARYING(15),
    cpf                         CHARACTER VARYING(20),
    dt_nascimento               DATE,
    
    valor_atributo              VARCHAR,

    data_laudo                  DATE
);

----------------
-- Ticket #15016
----------------
CREATE TYPE colunasConcederFerias   AS (
    cod_ferias              INTEGER,
    numcgm                  INTEGER,
    nom_cgm                 VARCHAR,
    registro                INTEGER,
    cod_contrato            INTEGER,
    desc_local              VARCHAR,
    desc_orgao              VARCHAR,
    orgao                   VARCHAR,
    dt_posse                DATE,
    dt_admissao             DATE,
    dt_nomeacao             DATE,
    desc_funcao             VARCHAR,
    desc_regime_funcao      VARCHAR,
    cod_regime_funcao       INTEGER,
    cod_funcao              INTEGER,
    cod_local               INTEGER,
    cod_orgao               INTEGER,
    bo_cadastradas          BOOLEAN,
    situacao                VARCHAR,
    dt_inicial_aquisitivo   DATE,
    dt_final_aquisitivo     DATE,
    dt_inicio               DATE,
    dt_fim                  DATE,
    mes_competencia         CHARACTER(2),
    ano_competencia         CHARACTER(4) 
);


----------------
-- Ticket #15042
----------------

SELECT atualizarbanco('
CREATE TABLE folhapagamento.reajuste_percentual(
    cod_reajuste    INTEGER             NOT NULL,
    valor           NUMERIC(14,4)       NOT NULL,
    CONSTRAINT [REDACTED]  PRIMARY KEY                         (cod_reajuste),
    CONSTRAINT fk_reajuste_percentual_1 FOREIGN KEY                         (cod_reajuste)
                                        REFERENCES folhapagamento.reajuste  (cod_reajuste)
 );
');

SELECT atualizarbanco('GRANT ALL ON folhapagamento.reajuste_percentual TO GROUP urbem;');

SELECT atualizarbanco('
CREATE TABLE folhapagamento.reajuste_absoluto(
    cod_reajuste    INTEGER             NOT NULL,
    valor           NUMERIC(14,2)       NOT NULL,
    CONSTRAINT [REDACTED]    PRIMARY KEY                         (cod_reajuste),
    CONSTRAINT fk_reajuste_absoluto_1   FOREIGN KEY                         (cod_reajuste)
                                        REFERENCES folhapagamento.reajuste  (cod_reajuste)
 );
');

SELECT atualizarbanco('GRANT ALL ON folhapagamento.reajuste_absoluto TO GROUP urbem;');

SELECT atualizarbanco('
INSERT
  INTO folhapagamento.reajuste_percentual
SELECT cod_reajuste
     , percentual
  FROM folhapagamento.reajuste;
');

SELECT atualizarbanco('ALTER TABLE folhapagamento.reajuste DROP COLUMN percentual;');


----------------
-- Ticket #15052
----------------

SELECT atualizarbanco('ALTER TABLE diarias.diaria ADD COLUMN hr_inicio  TIME;');
SELECT atualizarbanco('ALTER TABLE diarias.diaria ADD COLUMN hr_termino TIME;');

SELECT atualizarbanco('UPDATE diarias.diaria SET hr_inicio = \'00:00\', hr_termino = \'23:59\';');

SELECT atualizarbanco('ALTER TABLE diarias.diaria ALTER COLUMN hr_inicio  SET NOT NULL;');
SELECT atualizarbanco('ALTER TABLE diarias.diaria ALTER COLUMN hr_termino SET NOT NULL;');

----------------
-- Ticket #15096
----------------
DROP TYPE linhaComprovanteRendimentosIRRF CASCADE;
CREATE TYPE linhaComprovanteRendimentosIRRF AS (
    numcgm                                  INTEGER,
    nom_cgm                                 VARCHAR,
    cpf                                     VARCHAR,
    cod_cid                                 VARCHAR,
    total_rendimentos                       NUMERIC(8,2),
    contribuicao_previdenciaria_oficial     NUMERIC(8,2),
    contribuicao_previdenciaria_privada     NUMERIC(8,2),
    pensao_alimenticia                      NUMERIC(8,2),
    imposto_renda_retido                    NUMERIC(8,2),
    diarias_ajuda_custo                     NUMERIC(8,2),
    informativo_aposentadoria               NUMERIC(8,2),
    pensao_proventos_molestia_acidente      NUMERIC(8,2),
    decimo_terceiro                         NUMERIC(8,2),    
    agrupamento                             VARCHAR
);

----------------
-- Ticket #15097
----------------
CREATE TYPE colunasCustomizavelEventos AS (
cpf                         CHARACTER VARYING(20),
cod_contrato                INTEGER,
registro                    INTEGER,
nom_cgm                     VARCHAR,
desc_orgao                  VARCHAR,
desc_local                  VARCHAR,
desc_funcao                 VARCHAR,
desc_cargo                  VARCHAR,
desc_especialidade_cargo    VARCHAR,
desc_especialidade_funcao   VARCHAR,
desc_padrao                 VARCHAR,
valor1                      NUMERIC(14,2),
quantidade1                 NUMERIC(14,2),
valor2                      NUMERIC(14,2),
quantidade2                 NUMERIC(14,2),
valor3                      NUMERIC(14,2),
quantidade3                 NUMERIC(14,2),
valor4                      NUMERIC(14,2),
quantidade4                 NUMERIC(14,2),
valor5                      NUMERIC(14,2),
quantidade5                 NUMERIC(14,2),
valor6                      NUMERIC(14,2),
quantidade6                 NUMERIC(14,2),
quantidade1_parc            INTEGER,
quantidade2_parc            INTEGER,
quantidade3_parc            INTEGER,
quantidade4_parc            INTEGER,
quantidade5_parc            INTEGER,
quantidade6_parc            INTEGER
);


----------------
-- Ticket #15102
----------------

CREATE TYPE linhaRelatorioCargos AS (
    agrupamento         VARCHAR,
    count_servidores    INTEGER,
    cod_local           INTEGER,
    cod_orgao           INTEGER,
    cod_sub_divisao     INTEGER,
    cod_cargo           INTEGER,
    cod_especialidade   INTEGER,
    descricao_cargo     VARCHAR,
    codigo_cbo          VARCHAR,
    cargo_cc            VARCHAR,
    funcao_gratificada  VARCHAR,
    cod_padrao          INTEGER,
    descricao_padrao    VARCHAR,
    horas_mensais       NUMERIC(5,2),
    horas_semanais      NUMERIC(5,2),
    valor               VARCHAR,
    vigencia            VARCHAR
);

CREATE TYPE linhaRelatorioCargosServidores AS (
    matricula           VARCHAR,
    nome                VARCHAR,
    dt_admissao         VARCHAR,
    regime_sub_divisao  VARCHAR,
    horas_mensais       VARCHAR,
    horas_semanais      VARCHAR
);


----------------
-- Ticket #15003
----------------

UPDATE administracao.acao
   SET nom_acao = 'Incluir Configuração de Assentamento'
 WHERE cod_acao = 835;

UPDATE administracao.acao
   SET nom_acao = 'Alterar Configuração de Assentamento'
 WHERE cod_acao = 836;

UPDATE administracao.acao
   SET nom_acao = 'Excluir Configuração de Assentamento'
 WHERE cod_acao = 837;

----------------
-- Ticket #15192
----------------
CREATE TYPE colunasEventosCalculados AS (
    cod_contrato        INTEGER,  
    cod_evento          INTEGER,  
    codigo              CHARACTER(5) ,
    descricao           CHARACTER(80),
    natureza            CHARACTER(1) ,
    tipo                CHARACTER(1) ,
    fixado              CHARACTER(1) ,
    limite_calculo      BOOLEAN      ,
    apresenta_parcela   BOOLEAN      ,
    evento_sistema      BOOLEAN      ,
    sigla               CHARACTER VARYING(5),
    valor               NUMERIC(15,2),        
    quantidade          NUMERIC(15,2),
    desdobramento       CHARACTER(1),
    desdobramento_texto VARCHAR,
    sequencia           INTEGER,
    desc_sequencia      CHARACTER VARYING(80),
    quantidade_parc     INTEGER
);


-----------------------------------------------------------------
-- CORRIGINDO FK P/ TABELA organograma.orgao EM ima.banpara_orgao
-----------------------------------------------------------------

SELECT atualizarbanco('ALTER TABLE ima.banpara_orgao ADD CONSTRAINT fk_banpara_orgao_1 FOREIGN KEY (cod_orgao) REFERENCES organograma.orgao (cod_orgao);');

----------------
-- Ticket #15098
----------------

CREATE TYPE colunasTotaisFolha AS (
    codigo              VARCHAR,
    descricao           VARCHAR,
    provento            NUMERIC(14,2),
    desconto            NUMERIC(14,2),
    agrupamento_banco   VARCHAR,
    agrupamento         VARCHAR
);

----------------
-- Ticket #14950
----------------

SELECT atualizarbanco ('
CREATE TABLE pessoal.contrato_servidor_forma_pagamento (
    cod_contrato        INTEGER         NOT NULL,
    timestamp           TIMESTAMP       NOT NULL DEFAULT (\'now\'::text)::timestamp(3) with time zone,
    cod_forma_pagamento INTEGER         NOT NULL,
    CONSTRAINT [REDACTED]    PRIMARY KEY                             (cod_contrato, timestamp),
    CONSTRAINT fk_contrato_servidor_forma_pagamento_1   FOREIGN KEY                             (cod_contrato)
                                                        REFERENCES pessoal.contrato_servidor    (cod_contrato),
    CONSTRAINT fk_contrato_servidor_forma_pagamento_2   FOREIGN KEY                             (cod_forma_pagamento)
                                                        REFERENCES pessoal.forma_pagamento      (cod_forma_pagamento)
);
');

SELECT atualizarbanco ('GRANT ALL ON pessoal.contrato_servidor_forma_pagamento TO GROUP urbem;');

SELECT atualizarbanco ('
INSERT
  INTO pessoal.contrato_servidor_forma_pagamento
     ( cod_contrato
     , cod_forma_pagamento
     , timestamp
     )
SELECT cod_contrato
     , cod_forma_pagamento
     , \'1900-01-01 00:00:00.000\' as timestamp
  FROM pessoal.contrato_servidor
     ;
');

SELECT atualizarbanco ('ALTER TABLE pessoal.contrato_servidor DROP CONSTRAINT fk_contrato_servidor_8;');
SELECT atualizarbanco ('ALTER TABLE pessoal.contrato_servidor DROP COLUMN     cod_forma_pagamento;');


------------------------------------------------------------
-- EXCLUSAO DO RELATORIO customizavelEventosGrupos.rptdesign
------------------------------------------------------------

DELETE
  FROM administracao.relatorio
 WHERE cod_gestao = 4
   AND cod_modulo = 27
   AND cod_relatorio = 22;


----------------
-- Ticket #15018
----------------

SELECT atualizarbanco ('ALTER TABLE pessoal.lote_ferias ADD   COLUMN mes_competencia CHAR(2);');
SELECT atualizarbanco ('ALTER TABLE pessoal.lote_ferias ADD   COLUMN ano_competencia CHAR(4);');

CREATE OR REPLACE FUNCTION manutencao() RETURNS VOID AS $$
DECLARE

    stData          VARCHAR[];
    stNome          VARCHAR[];
    stMes           VARCHAR;
    stAno           VARCHAR;

    stSql           VARCHAR;
    reRecord        RECORD;
    crCursor        REFCURSOR;

    stSqlUpdate     VARCHAR;
    stSqlEnt        VARCHAR;
    reRecordEnt     RECORD;
    crCursorEnt     REFCURSOR;
    
    intCount        INTEGER;

BEGIN

    stSql := '  SELECT *
                  FROM pessoal.lote_ferias;
             ';
    OPEN crCursor FOR EXECUTE stSql;
    LOOP
        FETCH crCursor INTO reRecord;
        EXIT WHEN NOT FOUND;

            stNome := string_to_array(reRecord.nome,' ');
            
            intCount := 1;
            WHILE stNome[intCount] IS NOT NULL LOOP
                intCount := intCount+1;
            END LOOP;
            intCount := intCount-1;
            
            stData := string_to_array(stNome[intCount],'/');

            stMes  := stData[1];
            stAno  := stData[2];

            IF     stMes = 'Janeiro'     THEN stMes := '01'; 
            ELSEIF stMes = 'Fevereiro'   THEN stMes := '02';
            ELSEIF stMes = 'Março'       THEN stMes := '03';
            ELSEIF stMes = 'Abril'       THEN stMes := '04';
            ELSEIF stMes = 'Maio'        THEN stMes := '05';
            ELSEIF stMes = 'Junho'       THEN stMes := '06';
            ELSEIF stMes = 'Julho'       THEN stMes := '07';
            ELSEIF stMes = 'Agosto'      THEN stMes := '08';
            ELSEIF stMes = 'Setembro'    THEN stMes := '09';
            ELSEIF stMes = 'Outubro'     THEN stMes := '10';
            ELSEIF stMes = 'Novembro'    THEN stMes := '11';
            ELSEIF stMes = 'Dezembro'    THEN stMes := '12';
            END IF;

            UPDATE pessoal.lote_ferias
               SET mes_competencia = stMes
                 , ano_competencia = stAno
             WHERE cod_lote = reRecord.cod_lote;

    END LOOP;
    CLOSE crCursor;

    stSqlEnt := '  SELECT DISTINCT cod_entidade
                     FROM administracao.entidade_rh
                    WHERE cod_entidade <> ( SELECT CAST(valor as integer)
                                              FROM administracao.configuracao
                                             WHERE exercicio = \'2009\'
                                               AND parametro = \'cod_entidade_prefeitura\'
                                          );
                ';
    OPEN crCursorEnt FOR EXECUTE stSqlEnt;
    LOOP
        FETCH crCursorEnt INTO reRecordEnt;
        EXIT WHEN NOT FOUND;

            stSql := '  SELECT *
                          FROM pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias;
                     ';
            OPEN crCursor FOR EXECUTE stSql;
            LOOP
                FETCH crCursor INTO reRecord;
                EXIT WHEN NOT FOUND;
        
                    stNome := string_to_array(reRecord.nome,' ');
                    
                    intCount := 1;
                    WHILE stNome[intCount] IS NOT NULL LOOP
                        intCount := intCount+1;
                    END LOOP;
                    intCount := intCount-1;
                    
                    stData := string_to_array(stNome[intCount],'/');
        
                    stMes  := stData[1];
                    stAno  := stData[2];
        
                    IF     stMes = 'Janeiro'     THEN stMes := '01';
                    ELSEIF stMes = 'Fevereiro'   THEN stMes := '02';
                    ELSEIF stMes = 'Março'       THEN stMes := '03';
                    ELSEIF stMes = 'Abril'       THEN stMes := '04';
                    ELSEIF stMes = 'Maio'        THEN stMes := '05';
                    ELSEIF stMes = 'Junho'       THEN stMes := '06';
                    ELSEIF stMes = 'Julho'       THEN stMes := '07';
                    ELSEIF stMes = 'Agosto'      THEN stMes := '08';
                    ELSEIF stMes = 'Setembro'    THEN stMes := '09';
                    ELSEIF stMes = 'Outubro'     THEN stMes := '10';
                    ELSEIF stMes = 'Novembro'    THEN stMes := '11';
                    ELSEIF stMes = 'Dezembro'    THEN stMes := '12';
                    END IF;
        
                    stSqlUpdate := '    UPDATE pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias
                                           SET mes_competencia = \''|| stMes ||'\'
                                             , ano_competencia = \''|| stAno ||'\'
                                         WHERE cod_lote = reRecord.cod_lote;
                                   ';
                    EXECUTE stSqlUpdate;
            END LOOP;
            CLOSE crCursor;

    END LOOP;
    CLOSE crCursorEnt;

END;
$$ LANGUAGE 'plpgsql';

SELECT        manutencao();
DROP FUNCTION manutencao();

SELECT atualizarbanco ('ALTER TABLE pessoal.lote_ferias ALTER COLUMN mes_competencia SET NOT NULL;');
SELECT atualizarbanco ('ALTER TABLE pessoal.lote_ferias ALTER COLUMN ano_competencia SET NOT NULL;');



SELECT atualizarbanco ('
CREATE TABLE pessoal.lote_ferias_contrato (
    cod_lote            INTEGER             NOT NULL,
    cod_contrato        INTEGER             NOT NULL,
    CONSTRAINT [REDACTED]     PRIMARY KEY                     (cod_lote, cod_contrato),
    CONSTRAINT fk_lote_ferias_contrato_1    FOREIGN KEY                     (cod_lote)
                                            REFERENCES pessoal.lote_ferias  (cod_lote),
    CONSTRAINT fk_lote_ferias_contrato_2    FOREIGN KEY                     (cod_contrato)
                                            REFERENCES pessoal.contrato     (cod_contrato)
);
');

SELECT atualizarbanco ('GRANT ALL ON pessoal.lote_ferias_contrato TO GROUP urbem;');

SELECT atualizarbanco ('
    INSERT
      INTO pessoal.lote_ferias_contrato
    SELECT plf.cod_lote
         , pf.cod_contrato
      FROM pessoal.lote_ferias          AS plf
INNER JOIN pessoal.lote_ferias_lote     AS plfl
        ON plfl.cod_lote = plf.cod_lote
INNER JOIN pessoal.ferias               AS pf
        ON pf.cod_ferias = plfl.cod_ferias
     WHERE plf.nome ilike \'%lote geral%\'
        OR plf.nome ilike \'%lote para contratos%\';
');



SELECT atualizarbanco ('
CREATE TABLE pessoal.lote_ferias_orgao (
    cod_lote            INTEGER             NOT NULL,
    cod_orgao           INTEGER             NOT NULL,
    CONSTRAINT [REDACTED]        PRIMARY KEY                     (cod_lote, cod_orgao),
    CONSTRAINT fk_lote_ferias_orgao_1       FOREIGN KEY                     (cod_lote)
                                            REFERENCES pessoal.lote_ferias  (cod_lote),
    CONSTRAINT fk_lote_ferias_orgao_2       FOREIGN KEY                     (cod_orgao)
                                            REFERENCES organograma.orgao    (cod_orgao)
);
');

SELECT atualizarbanco ('GRANT ALL ON pessoal.lote_ferias_orgao TO GROUP urbem;');

CREATE OR REPLACE FUNCTION insere_lote_ferias_orgao () RETURNS VOID AS $$
DECLARE

    stNome          VARCHAR[];
    stRegistros     VARCHAR[];
    inCountReg      INTEGER := 0;
    inCount         INTEGER := 0;
    stTemp          VARCHAR;

    stSql           VARCHAR;
    reRecord        RECORD;
    crCursor        REFCURSOR;

    stSqlInsert     VARCHAR;
    stSqlEnt        VARCHAR;
    reRecordEnt     RECORD;
    crCursorEnt     REFCURSOR;

BEGIN

    stSql := '  SELECT *
                  FROM pessoal.lote_ferias
                 WHERE nome ilike \'%lote para lotação%\';
             ';
    OPEN crCursor FOR EXECUTE stSql;
    LOOP
        FETCH crCursor INTO reRecord;
        EXIT WHEN NOT FOUND;

            stNome := string_to_array(reRecord.nome,' ');
            stTemp := trim(both '()' from stNome[6]);

            stRegistros := string_to_array(stTemp, ',');
            inCountReg  := array_upper(stRegistros, 1);
            FOR inCount IN 1..inCountReg LOOP
                INSERT
                  INTO pessoal.lote_ferias_orgao
                     ( cod_lote
                     , cod_orgao
                     )
                VALUES
                     ( reRecord.cod_lote
                     , CAST (stRegistros[inCount] AS INTEGER)
                     );
            END LOOP;

    END LOOP;
    CLOSE crCursor;

    stSqlEnt := '  SELECT DISTINCT cod_entidade
                     FROM administracao.entidade_rh
                    WHERE cod_entidade <> ( SELECT CAST(valor as integer)
                                              FROM administracao.configuracao
                                             WHERE exercicio = \'2009\'
                                               AND parametro = \'cod_entidade_prefeitura\'
                                          );
                ';
    OPEN crCursorEnt FOR EXECUTE stSqlEnt;
    LOOP
        FETCH crCursorEnt INTO reRecordEnt;
        EXIT WHEN NOT FOUND;

            stSql := '  SELECT *
                          FROM pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias
                         WHERE nome ilike \'%lote para lotação%\';
                     ';
            OPEN crCursor FOR EXECUTE stSql;
            LOOP
                FETCH crCursor INTO reRecord;
                EXIT WHEN NOT FOUND;
        
                    stNome := string_to_array(reRecord.nome,' ');
                    stTemp := trim(both '()' from stNome[6]);
        
                    stRegistros := string_to_array(stTemp, ',');
                    inCountReg  := array_upper(stRegistros, 1);
                    FOR inCount IN 1..inCountReg LOOP
                        stSqlInsert := '    INSERT
                                              INTO pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias_orgao
                                                 ( cod_lote
                                                 , cod_orgao
                                                 )
                                            VALUES
                                                 ( reRecord.cod_lote
                                                 , CAST (stRegistros[inCount] AS INTEGER)
                                                 );
                                       ';
                        EXECUTE stSqlInsert;
                    END LOOP;
        
            END LOOP;
            CLOSE crCursor;

    END LOOP;
    CLOSE crCursorEnt;

END;
$$ LANGUAGE 'plpgsql';

SELECT        insere_lote_ferias_orgao();
DROP FUNCTION insere_lote_ferias_orgao();



SELECT atualizarbanco ('
CREATE TABLE pessoal.lote_ferias_local (
    cod_lote            INTEGER             NOT NULL,
    cod_local           INTEGER             NOT NULL,
    CONSTRAINT [REDACTED]        PRIMARY KEY                     (cod_lote, cod_local),
    CONSTRAINT fk_lote_ferias_local_1       FOREIGN KEY                     (cod_lote)
                                            REFERENCES pessoal.lote_ferias  (cod_lote),
    CONSTRAINT fk_lote_ferias_local_2       FOREIGN KEY                     (cod_local)
                                            REFERENCES organograma.local    (cod_local)
);
');

SELECT atualizarbanco ('GRANT ALL ON pessoal.lote_ferias_local TO GROUP urbem;');

CREATE OR REPLACE FUNCTION insere_lote_ferias_local () RETURNS VOID AS $$
DECLARE

    stNome          VARCHAR[];
    stRegistros     VARCHAR[];
    inCountReg      INTEGER := 0;
    inCount         INTEGER := 0;
    stTemp          VARCHAR;

    stSql           VARCHAR;
    reRecord        RECORD;
    crCursor        REFCURSOR;

    stSqlInsert     VARCHAR;
    stSqlEnt        VARCHAR;
    reRecordEnt     RECORD;
    crCursorEnt     REFCURSOR;

BEGIN

    stSql := '  SELECT *
                  FROM pessoal.lote_ferias
                 WHERE nome ilike \'%lote para local%\';
             ';
    OPEN crCursor FOR EXECUTE stSql;
    LOOP
        FETCH crCursor INTO reRecord;
        EXIT WHEN NOT FOUND;

            stNome := string_to_array(reRecord.nome,' ');
            stTemp := trim(both '()' from stNome[6]);

            stRegistros := string_to_array(stTemp, ',');
            inCountReg  := array_upper(stRegistros, 1);
            FOR inCount IN 1..inCountReg LOOP
                INSERT
                  INTO pessoal.lote_ferias_local
                     ( cod_lote
                     , cod_local
                     )
                VALUES
                     ( reRecord.cod_lote
                     , CAST (stRegistros[inCount] AS INTEGER)
                     );
            END LOOP;

    END LOOP;
    CLOSE crCursor;

    stSqlEnt := '  SELECT DISTINCT cod_entidade
                     FROM administracao.entidade_rh
                    WHERE cod_entidade <> ( SELECT CAST(valor as integer)
                                              FROM administracao.configuracao
                                             WHERE exercicio = \'2009\'
                                               AND parametro = \'cod_entidade_prefeitura\'
                                          );
                ';
    OPEN crCursorEnt FOR EXECUTE stSqlEnt;
    LOOP
        FETCH crCursorEnt INTO reRecordEnt;
        EXIT WHEN NOT FOUND;

            stSql := '  SELECT *
                          FROM pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias
                         WHERE nome ilike \'%lote para local%\';
                     ';
            OPEN crCursor FOR EXECUTE stSql;
            LOOP
                FETCH crCursor INTO reRecord;
                EXIT WHEN NOT FOUND;
        
                    stNome := string_to_array(reRecord.nome,' ');
                    stTemp := trim(both '()' from stNome[6]);
        
                    stRegistros := string_to_array(stTemp, ',');
                    inCountReg  := array_upper(stRegistros, 1);
                    FOR inCount IN 1..inCountReg LOOP
                        stSqlInsert := '    INSERT
                                              INTO pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias_local
                                                 ( cod_lote
                                                 , cod_local
                                                 )
                                            VALUES
                                                 ( reRecord.cod_lote
                                                 , CAST (stRegistros[inCount] AS INTEGER)
                                                 );
                                       ';
                        EXECUTE stSqlInsert;
                    END LOOP;
        
            END LOOP;
            CLOSE crCursor;

    END LOOP;
    CLOSE crCursorEnt;

END;
$$ LANGUAGE 'plpgsql';

SELECT        insere_lote_ferias_local();
DROP FUNCTION insere_lote_ferias_local();



SELECT atualizarbanco ('
CREATE TABLE pessoal.lote_ferias_funcao (
    cod_lote            INTEGER             NOT NULL,
    cod_cargo           INTEGER             NOT NULL,
    CONSTRAINT [REDACTED]       PRIMARY KEY                     (cod_lote, cod_cargo),
    CONSTRAINT fk_lote_ferias_funcao_1      FOREIGN KEY                     (cod_lote)
                                            REFERENCES pessoal.lote_ferias  (cod_lote),
    CONSTRAINT fk_lote_ferias_funcao_2      FOREIGN KEY                     (cod_cargo)
                                            REFERENCES pessoal.cargo        (cod_cargo)
);
');

SELECT atualizarbanco ('GRANT ALL ON pessoal.lote_ferias_funcao TO GROUP urbem;');

CREATE OR REPLACE FUNCTION insere_lote_ferias_funcao () RETURNS VOID AS $$
DECLARE

    stNome          VARCHAR[];
    stRegistros     VARCHAR[];
    inCountReg      INTEGER := 0;
    inCount         INTEGER := 0;
    stTemp          VARCHAR;

    stSql           VARCHAR;
    reRecord        RECORD;
    crCursor        REFCURSOR;

    stSqlInsert     VARCHAR;
    stSqlEnt        VARCHAR;
    reRecordEnt     RECORD;
    crCursorEnt     REFCURSOR;

BEGIN

    stSql := '  SELECT *
                  FROM pessoal.lote_ferias
                 WHERE nome ilike \'%lote para função%\';
             ';
    OPEN crCursor FOR EXECUTE stSql;
    LOOP
        FETCH crCursor INTO reRecord;
        EXIT WHEN NOT FOUND;

            stNome := string_to_array(reRecord.nome,' ');
            stTemp := trim(both '()' from stNome[6]);

            stRegistros := string_to_array(stTemp, ',');
            inCountReg  := array_upper(stRegistros, 1);
            FOR inCount IN 1..inCountReg LOOP
                INSERT
                  INTO pessoal.lote_ferias_funcao
                     ( cod_lote
                     , cod_cargo
                     )
                VALUES
                     ( reRecord.cod_lote
                     , CAST (stRegistros[inCount] AS INTEGER)
                     );
            END LOOP;

    END LOOP;
    CLOSE crCursor;

    stSqlEnt := '  SELECT DISTINCT cod_entidade
                     FROM administracao.entidade_rh
                    WHERE cod_entidade <> ( SELECT CAST(valor as integer)
                                              FROM administracao.configuracao
                                             WHERE exercicio = \'2009\'
                                               AND parametro = \'cod_entidade_prefeitura\'
                                          );
                ';
    OPEN crCursorEnt FOR EXECUTE stSqlEnt;
    LOOP
        FETCH crCursorEnt INTO reRecordEnt;
        EXIT WHEN NOT FOUND;

            stSql := '  SELECT *
                          FROM pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias
                         WHERE nome ilike \'%lote para função%\';
                     ';
            OPEN crCursor FOR EXECUTE stSql;
            LOOP
                FETCH crCursor INTO reRecord;
                EXIT WHEN NOT FOUND;
        
                    stNome := string_to_array(reRecord.nome,' ');
                    stTemp := trim(both '()' from stNome[6]);
        
                    stRegistros := string_to_array(stTemp, ',');
                    inCountReg  := array_upper(stRegistros, 1);
                    FOR inCount IN 1..inCountReg LOOP
                        stSqlInsert := '    INSERT
                                              INTO pessoal_'|| reRecordEnt.cod_entidade ||'.lote_ferias_funcao
                                                 ( cod_lote
                                                 , cod_cargo
                                                 )
                                            VALUES
                                                 ( reRecord.cod_lote
                                                 , CAST (stRegistros[inCount] AS INTEGER)
                                                 );
                                       ';
                        EXECUTE stSqlInsert;
                    END LOOP;
        
            END LOOP;
            CLOSE crCursor;

    END LOOP;
    CLOSE crCursorEnt;

END;
$$ LANGUAGE 'plpgsql';

SELECT        insere_lote_ferias_funcao();
DROP FUNCTION insere_lote_ferias_funcao();


----------------
-- Ticket #14950
----------------

select atualizarBanco('
CREATE OR REPLACE FUNCTION pessoal.fn_contrato_servidor_conta_salario_historico()  RETURNS TRIGGER AS $$
DECLARE
    reContaSalario      RECORD;
BEGIN
    If TG_OP=\'INSERT\' THEN
        INSERT INTO pessoal.contrato_servidor_conta_salario_historico
        (cod_contrato,cod_banco,cod_agencia,nr_conta) VALUES 
        (new.cod_contrato,new.cod_banco,new.cod_agencia,new.nr_conta);
    ELSE
         SELECT contrato_servidor_conta_salario.*
           INTO reContaSalario
           FROM pessoal.contrato_servidor_conta_salario
          WHERE contrato_servidor_conta_salario.cod_contrato = new.cod_contrato
            AND contrato_servidor_conta_salario.cod_banco = new.cod_banco
            AND contrato_servidor_conta_salario.cod_agencia = new.cod_agencia
            AND contrato_servidor_conta_salario.nr_conta = new.nr_conta;        

        IF reContaSalario.cod_contrato IS NULL THEN
            INSERT INTO pessoal.contrato_servidor_conta_salario_historico
            (cod_contrato,cod_banco,cod_agencia,nr_conta) VALUES 
            (new.cod_contrato,new.cod_banco,new.cod_agencia,new.nr_conta);
        END IF;
    END IF;
    Return new;
END;
$$ LANGUAGE plpgsql;
');

CREATE OR REPLACE FUNCTION manutencao() RETURNS VOID AS $$
DECLARE
    stSql           VARCHAR;
    stSqlEnt        VARCHAR;
    stSqlInsert     VARCHAR;
    inRetorno       INTEGER;
    reRecordEnt     RECORD;
BEGIN

    stSqlEnt := '  SELECT DISTINCT cod_entidade
                     FROM administracao.entidade_rh
                    WHERE cod_entidade <> ( SELECT CAST(valor as integer)
                                              FROM administracao.configuracao
                                             WHERE exercicio = \'2009\'
                                               AND parametro = \'cod_entidade_prefeitura\'
                                          );
                ';

    FOR reRecordEnt IN EXECUTE stSqlEnt LOOP
        stSql := '  SELECT 1
                      FROM information_schema.triggers 
                     WHERE trigger_schema = \'pessoal_'||reRecordEnt.cod_entidade||'\'
                       AND event_object_table = \'contrato_servidor_conta_salario\'
                     LIMIT 1;
                 ';
        inRetorno := selectIntoInteger(stSql);

        IF inRetorno IS NULL THEN
            stSqlInsert := 'CREATE TRIGGER tr_contrato_servidor_conta_salario_historico BEFORE INSERT OR UPDATE ON pessoal_'||reRecordEnt.cod_entidade||'.contrato_servidor_conta_salario FOR EACH ROW EXECUTE PROCEDURE pessoal_'||reRecordEnt.cod_entidade||'.fn_contrato_servidor_conta_salario_historico();';
            EXECUTE stSqlInsert;
            
            stSqlInsert := 'INSERT INTO pessoal_'||reRecordEnt.cod_entidade||'.contrato_servidor_conta_salario_historico SELECT cod_contrato, to_timestamp(\'1900-01-01\', \'yyyy-mm-dd\'), cod_agencia, cod_banco, nr_conta FROM pessoal_'||reRecordEnt.cod_entidade||'.contrato_servidor_conta_salario';
            EXECUTE stSqlInsert;
        END IF;
    END LOOP;
END;
$$ LANGUAGE 'plpgsql';

SELECT        manutencao();
DROP FUNCTION manutencao();
