--===========================================================================--
-- ##INI :: IMPORTACAO TABELAS DE MOVIMENTO DE MATERIAS PERMANENTES          --
--===========================================================================--


BEGIN;  -- #INI :: MOVIMENTACAO DE DAS ENTRADAS >> ENTRADA
    /*
      OBSERVAÇÕES:

      1. O código da entrada foi formado por CD_ENTRADA||CD_UG para garantir unicidade,
         pois no ASI a chave é CD_ORGAO + CD_UG + CD_ENTRADA;
      2. Tempo estimado de execução de ~12 minutos;
      3. Foi necessário filtrar somente registros com DT_CONTABIL, porque o ASI considera
         os registros sem conteúdo neste campo como "apagados". Já no GRP a data contábil
         é obrigatória.
    */

    --> REGISTROS DE ENTRADA
    DO $$ 
    DECLARE
      r        RECORD;     
      v_entId  BIGINT;
    BEGIN

      RAISE NOTICE 'Importando os registros consolidados de entrada (header)...';
      FOR r IN 
        SELECT DISTINCT  E1.DT_INCLUSAO  AS datacriacao
         , E1.DT_INCLUSAO                AS dataedicao
         , 0                             AS "version"
         , E1.CD_ENTRADA                 AS codigo
         , E1.CD_ENTRADA||E1.CD_UG       AS codigoasi
         , E1.DT_CONTABIL                AS datacontabil
         , E1.DT_AQUISICAO               AS datarecebimento
         , E1.DT_INCLUSAO                AS datareferencia
         , VT.VL_ENTRADA/100             AS valortotalnota
         , (SELECT ID FROM PUBLIC.ORGANIZACAO LIMIT 1) AS organizacao_id
         , CASE 
             WHEN TP.IN_ORCAMENTARIO='S' THEN 
               (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEntrada' AND CODIGO=1)
             ELSE 
               (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEntrada' AND CODIGO=2)
           END                           AS dominiotipoentrada_id
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoRecebimento' AND CD_ASI=E1.CD_TP_FORMA_OP) AS dominiotiporecebimento_id -- "asiweb.bp_tp_forma_op"
         , P.ID fornecedor_id
        FROM ASIWEB.BP_ENTRADA E1
        JOIN ASIWEB.BP_TP_FORMA_OP_POSSIVEL TP ON TP.CD_TP_OPERACAO=E1.CD_TP_OPERACAO AND TP.CD_TP_FORMA_OP=E1.CD_TP_FORMA_OP AND TP.CD_TP_BEM=E1.CD_TP_BEM
        JOIN ASIWEB.BP_ENT_ITEM E2 ON E1.CD_ORGAO=E2.CD_ORGAO AND E1.CD_UG=E2.CD_UG AND E1.CD_ENTRADA=E2.CD_ENTRADA
        JOIN ASIWEB.BP_BEM E3 ON E2.CD_ORGAO=E3.CD_ORGAO AND E2.CD_UG=E3.CD_UG AND E2.CD_ENTRADA=E3.CD_ENTRADA AND E2.SQ_ITEM=E3.SQ_ITEM
        JOIN ASIWEB.CR_BEM_SERVICO BS ON BS.CD_BEM_SERVICO=E3.CD_BEM_SERVICO     
        JOIN ( SELECT BP_BEM.CD_ORGAO, BP_BEM.CD_UG, BP_BEM.CD_ENTRADA, SUM(BP_BEM.VL_UNITARIO) AS VL_ENTRADA 
               FROM ASIWEB.BP_BEM 
               GROUP BY BP_BEM.CD_ORGAO, BP_BEM.CD_UG, BP_BEM.CD_ENTRADA
              ) AS VT ON VT.CD_ORGAO=E1.CD_ORGAO AND VT.CD_UG=E1.CD_UG AND VT.CD_ENTRADA=E1.CD_ENTRADA
         LEFT JOIN PUBLIC.PARCEIRO P ON P.CODIGO=E1.CD_AGENTE
      LOOP
        INSERT INTO public.entrada
             ( id, datacriacao, dataedicao, version, codigo, codigoasi
             , datacontabil, datarecebimento, datareferencia, valortotalnota
             , organizacao_id, dominiotipoentrada_id, dominiotiporecebimento_id, fornecedor_id
             )
        VALUES
             ( NEXTVAL('hibernate_sequence'), r.datacriacao, r.dataedicao, r.version, r.codigo, r.codigoasi
             , r.datacontabil, r.datarecebimento, r.datareferencia, r.valortotalnota
             , r.organizacao_id, r.dominiotipoentrada_id, r.dominiotiporecebimento_id, r.fornecedor_id );
      END LOOP;
    END$$;    

    DO $$ BEGIN RAISE NOTICE 'Criando os registros de referencia em entradapatrimonio...'; END;$$;
    INSERT INTO public.entradapatrimonio
         ( id
         , dominiotipobem_id
         , estruturaorganizacional_id
         )
    SELECT DISTINCT E.ID AS id
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoBem' AND CD_ASI=E1.CD_TP_BEM) AS dominiotipobem_id -- "asiweb.bp_tp_bem"
         , (SELECT ID FROM PUBLIC.ESTRUTURAORGANIZACIONAL E WHERE E.CODIGO=B.CD_UL_ENTRADA AND E.TIPOESTRUTURAORGANIZACIONAL_ID = (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEstruturaOrganizacional' AND CODIGO=3)) AS estruturaorganizacional_id 
    FROM ASIWEB.BP_ENTRADA E1
    INNER JOIN PUBLIC.ENTRADA E ON (E.CODIGOASI=E1.CD_ENTRADA||E1.CD_UG)
    LEFT JOIN ASIWEB.BP_BEM B ON (E.CODIGOASI=B.CD_ENTRADA||B.CD_UG);

    /*
     A estratégia usada para incluir os itens, foi agrupá-los por valor unitário para
     bater com o total, pois um dos itens do mesmo material pode ter valor unitario
     diferente por causa do resto de uma dízima periódica.
    */
    DO $$ BEGIN RAISE NOTICE 'Criando os registros de itens da referencia em entradapatrimonio...'; END;$$;
    INSERT INTO public.entradapatrimonioitem
         ( id
         ,  datacriacao
         , dataedicao
         , version
         , emplaquetado
         , quantidade
         , sequencia
         , valor
         , valorunitario
         , entrada_id
         , material_id
         )
    SELECT DISTINCT NEXTVAL('hibernate_sequence')   AS id
         , E.DATACRIACAO                            AS datacriacao
         , E.DATAEDICAO                             AS dataedicao
         , 0                                        AS "version"
         , TRUE                                     AS emplaquetado
         , COUNT(*)                                 AS quantidade
         , B.SQ_ITEM                                AS sequencia
         , ((B.VL_UNITARIO/100)*COUNT(*))           AS valor
         , (B.VL_UNITARIO/100)                      AS valorunitario
         , E.ID                                     AS entrada_id
         , M.ID                                     AS material_id
    FROM PUBLIC.ENTRADA E
    JOIN ASIWEB.BP_ENT_ITEM I ON E.CODIGOASI::TEXT=I.CD_ENTRADA::TEXT||I.CD_UG::TEXT
    JOIN ASIWEB.BP_BEM B ON I.CD_ORGAO::TEXT=B.CD_ORGAO::TEXT AND I.CD_UG::TEXT=B.CD_UG::TEXT AND I.CD_ENTRADA::TEXT=B.CD_ENTRADA::TEXT AND I.SQ_ITEM=B.SQ_ITEM
    JOIN PUBLIC.MATERIAL M ON (M.CODIGO=B.CD_BEM_SERVICO)
    GROUP BY B.CD_BEM_SERVICO, B.VL_UNITARIO, E.DATACRIACAO, E.DATAEDICAO, B.SQ_ITEM, E.ID, M.ID;

    DO $$ BEGIN RAISE NOTICE 'Importando os documentos de entrada...'; END;$$;
    INSERT INTO public.documento
         ( id
         , databloqueio
         , datainativo
         , datacriacao
         , dataedicao
         , version
         , dataemissao
         , numero
         , inativador_id
         , autor_id
         , editor_id
         , organizacao_id
         , dominiotipodocumento_id
         , emitente_id
         )
    SELECT (ROW_NUMBER() OVER (ORDER BY D.CD_ENTRADA)) + M.MAX AS id
         , NULL                      AS databloqueio
         , NULL                      AS datainativo
         , LOCALTIMESTAMP            AS datacriacao
         , LOCALTIMESTAMP            AS dataedicao
         , 0                         AS "version"
         , D.DT_EMISSAO              AS dataemissao
         , D.NR_DOCUMENTO            AS numero
         , NULL                      AS inativador_id
         , NULL                      AS autor_id
         , NULL                      AS editor_id
         , 1                         AS organizacao_id
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoDocumento' AND CD_ASI=D.CD_TP_DOCUMENTO) AS dominiotipodocumento_id -- "asiweb.cr_tp_documento"
         , P.ID                      AS emitente_id
    FROM ASIWEB.BP_ENT_DOC D
    JOIN (SELECT COALESCE(MAX(ID),0) AS MAX FROM public.documento) M ON 1=1
    LEFT JOIN PARCEIRO P ON P.CODIGO = D.CD_AGENTE;

    DO $$ BEGIN RAISE NOTICE 'Criando a referencia dos documentos das entradas...'; END;$$;
    INSERT INTO public.entradadocumento
         ( id
         , entrada_id
         , entradainativo_id
         )
    SELECT (row_number() OVER (ORDER BY DOC.CD_ENTRADA)) + M.MAX AS id
         , E.ID AS entrada_id
         , NULL AS entradainativo_id
    FROM ASIWEB.BP_ENT_DOC DOC
    JOIN (SELECT COALESCE(MAX(ID),0) AS MAX FROM public.entradadocumento) M ON 1=1
    LEFT JOIN PUBLIC.ENTRADA E ON E.CODIGOASI=DOC.CD_ENTRADA||DOC.CD_UG
    ORDER BY DOC.CD_ENTRADA;
    
    /*
     CONSIDERAÇÕES:
     1. Como o banco do ASI mantém apenas MES/ANO da data de início da depreciacao, foram 
        acrescentados a todos os meses o dia 01;
     2. Para buscar o VALOR_LIQUIDO do bem, buscamos o último registro da tabela de depreciações,
        e calculamos a diferença entre o valor unitário do bem e VL_ACUMULADO da depreciação;
     3. A vida útil restante também foi obtida da tabela de depreciações;
     4. O conteúdo do campo SQ_BEM_PERM do ASI foi migrado para atributo CODIGO, para fazer o
        relacionamento do bem com algumas tabelas do ASI.
    */
    DO $$ BEGIN RAISE NOTICE 'Desabilitando as constraints de bempatrimonial...'; END;$$;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_2lyppwdaqeghbrhvpqd0xfsfg;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_5wpgein2ksk4x95rwoxybd1xb;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_6axsw7vlnwfmk3kul1i5snbw9;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_7ln6wvjsslq6pde27mpskfkk4;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_84t3s4qhvk3hux9nja6yvuskw;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_b0qq4c20jxhk0ld9fd6o81cxo;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_bms01vleymwfnpe82lu6ucw4q;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_cgrev0ob4hgxw11tutjjlecr9;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_ecwjmdimmqyl14q2vq4w7b1l2;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_8usk4bex1tcn1424glpmt3nsy;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_ggja01bbgksq3nhioymv7yoxd;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_hb7coo6b3g6vrqcxtbnvvxfy3;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_lo2mirunnjfe1jsrfhmvtx2b6;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_luhl9nankja63w09rxdaey0bu;
    ALTER TABLE bempatrimonial DROP CONSTRAINT fk_qjtg4otjjxqsa7fkjp8or00e7;
    
    DO $$ BEGIN RAISE NOTICE 'Importando os registros de bempatrimonial...'; END;$$;
    INSERT INTO public.bempatrimonial
         ( id
    --   , databloqueio
    --   , datainativo
         , datacriacao
         , dataedicao
         , version
         , bemprincipal
         , codigo         
         , datafinalgarantia
         , datainicialgarantia
         , datainiciodepreciacao
         , numeropatrimonial
         , numeropatrimonialnumerico
         , valoraquisicao
         , valorliquido
         , vidautiloriginal
         , vidautilatual
    --   , inativador_id
    --   , autor_id
    --   , editor_id
         , organizacao_id
    --   , bempatrimonialprincipal_id
    --   , bempatrimonialvaloranterior_id
    --   , detentor_id
         , dominiosituacaofisica_id
         , dominiostatus_id
    --   , dominiostatusdepreciacao_id
    --   , dominiotipooperacao_id
         , entradaitem_id
         , unidadeatual_id
         , unidadecompra_id
         , fornecedor_id
         , material_id
         , depreciacaoacumulada
         , naodepreciar
    --   , responsavel_id
         , percentualnaodepreciavel
         , reavaliacaoacumulada
         , reavaliacaoperiodo
         , reducaoacumulada
         , reducaoperiodo
         , valorbrutoatual
         , valorbrutocalculo
         , datacontabil
         )
    SELECT DISTINCT 
           NEXTVAL('hibernate_sequence')       AS id
    --   , NULL                                AS databloqueio
    --   , NULL                                AS datainativo
         , I.DATACRIACAO                       AS datacriacao
         , I.DATAEDICAO                        AS dataedicao
         , 0                                   AS "version"
         , FALSE                               AS bemprincipal
         , B.SQ_BEM_PERM                       AS codigo         
         , B.DT_GARANTIA_FIM                   AS datafinalgarantia
         , B.DT_GARANTIA_INI                   AS datainicialgarantia
         , TO_DATE(B.DT_ANOMES_INICIO_DEP,'YYYYMM') AS datainiciodepreciacao
         , B.CD_BEM_PERM                       AS numeropatrimonial
         , HASHCODE(B.CD_BEM_PERM)             AS numeropatrimonialnumerico
         , (V.VL_UNITARIO/100)                 AS valoraquisicao
         , 0.0                                 AS valorliquido       -- ATUALIZADO EM SEGUIDA
         , B.NR_VIDA_UTIL                      AS vidautiloriginal
         , B.NR_VIDA_UTIL                      AS vidautilatual      -- ATUALIZADO EM SEGUIDA
    --   , NULL                                AS inativador_id
    --   , NULL                                AS autor_id
    --   , NULL                                AS editor_id
         , 1                                   AS organizacao_id
    --   , NULL                                AS bempatrimonialprincipal_id
    --   , NULL                                AS bempatrimonialvaloranterior_id
    --   , NULL                                AS detentor_id
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoSituacaoFisica' AND CD_ASI=B.CD_TP_SIT_FISICA) AS dominiosituacaofisica_id  -- "asiweb.bp_tp_sit_fisica"
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoStatusBem' AND CD_ASI=B.CD_TP_STATUS) AS dominiostatus_id  -- "asiweb.bp_tp_status"
    --   , NULL                                AS dominiostatusdepreciacao_id
    --   , NULL                                AS dominiotipooperacao_id  -- VERIFICAR UTILIZACAO
         , I.ID                                AS entradaitem_id
         , UND_ATUAL.ID                        AS unidadeatual_id
         , UND_ENTRADA.ID                      AS unidadecompra_id
         , E.FORNECEDOR_ID                     AS fornecedor_id
         , I.MATERIAL_ID                       AS material_id
    --   , NULL                                AS responsavel_id   -- VERIFICAR UPDATE USANDO REGISTRO DE DETENTOR
         , 0
         , FALSE
         , B.VL_PERCENT_NAO_DEPRECIAVEL/100    AS PERCENTUALNAODEPRECIAVEL
         , 0
         , 0
         , 0
         , 0
         , (V.VL_UNITARIO/100)
         , (V.VL_UNITARIO/100)
         , E.DATACONTABIL
    FROM ASIWEB.BP_BEM B
    LEFT JOIN PUBLIC.ENTRADA E ON (E.CODIGOASI=B.CD_ENTRADA||B.CD_UG)
    LEFT JOIN PUBLIC.MATERIAL M ON (M.CODIGO=B.CD_BEM_SERVICO)
    LEFT JOIN PUBLIC.ENTRADAPATRIMONIOITEM I ON (I.ENTRADA_ID= E.ID AND I.SEQUENCIA=B.SQ_ITEM AND I.VALORUNITARIO = (B.VL_UNITARIO/100) AND I.MATERIAL_ID=M.ID)
    LEFT JOIN PUBLIC.ESTRUTURAORGANIZACIONAL UND_ATUAL ON (UND_ATUAL.CODIGO=B.CD_UL_ATUAL AND UND_ATUAL.TIPOESTRUTURAORGANIZACIONAL_ID = (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEstruturaOrganizacional' AND CODIGO=3))
    LEFT JOIN PUBLIC.ESTRUTURAORGANIZACIONAL UND_ENTRADA ON (UND_ENTRADA.CODIGO=B.CD_UL_ENTRADA AND UND_ENTRADA.TIPOESTRUTURAORGANIZACIONAL_ID = (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEstruturaOrganizacional' AND CODIGO=3))
    LEFT JOIN ASIWEB.BP_BEM V ON V.SQ_BEM_PERM=B.SQ_BEM_PERM;
    --WHERE B.CD_ENTRADA NOT IN (SELECT ENT.CD_ENTRADA FROM ASIWEB.BP_ENTRADA ENT WHERE ENT.DT_CONTABIL IS NULL);
COMMIT; -- #INI :: MOVIMENTACAO DE DAS ENTRADAS >> ENTRADA


-- #INI :: AJUSTES TABELA BEMPATRIMONIAL >> COLUNA CODIGO
    DO $$
    BEGIN 
        RAISE NOTICE 'Criando coluna temporária [codigo_tmp] bempatrimonial...';
        ALTER TABLE public.bempatrimonial ADD COLUMN codigo_tmp character varying(30);

        RAISE NOTICE 'Salvando o contéudo de [codigo] em [codigo_tmp]...';
        UPDATE public.bempatrimonial SET codigo_tmp = codigo;
        
        RAISE NOTICE 'Convertendo coluna [codigo] em número...';
        ALTER TABLE public.bempatrimonial DROP COLUMN codigo;
        ALTER TABLE public.bempatrimonial ADD COLUMN codigo NUMERIC;
        UPDATE public.bempatrimonial SET codigo = codigo_tmp::NUMERIC;
        
        RAISE NOTICE 'Criando índice para coluna [codigo] em bempatrimonial...';
        CREATE UNIQUE INDEX ix01_bempat_cd ON public.bempatrimonial (codigo);
    EXCEPTION
        WHEN OTHERS THEN
            RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END;$$;
-- #FIM :: AJUSTES TABELA BEMPATRIMONIAL >> COLUNA CODIGO


-- #INI :: AJUSTES DADOS TABELA DEPRECIACAO >> BEMPATRIMONIAL
    --> UPDAATE BEMPATRIMONIAL >> DADOS QUE PRECISO PEGAR DA TABELA DE DEPRECIACAO
    DO $$
    DECLARE
      rBEM     RECORD;
      rDEPR    RECORD;
    BEGIN
      RAISE NOTICE 'Atualizando os dados de depreciação de bempatrimonial...';
      -- RECUPERA OS BENS PATRIMONIAIS QUE ESTAO NA TABELA DE DEPRECIACAO
      FOR rBEM IN 
        SELECT B.CODIGO, B.ID
        FROM BEMPATRIMONIAL B 
        WHERE EXISTS (SELECT 'X' FROM ASIWEB.BP_DEPRECIACAO DP WHERE DP.SQ_BEM_PERM = B.CODIGO) 
      LOOP
        SELECT ((DEPR.VL_UNITARIO)-(DEPR.VL_DEPR_ACUM)) AS VALOR_LIQUIDO
             , DEPR.NR_MESES_DEPRECIADOS AS NR_MESES_DEPRECIADOS
             , DEPR.VL_DEPR_ACUM AS DEPR_ACUM
             , DEPR.VL_UNITARIO  AS VL_UNITARIO  
			 , DEPR.NR_VIDA_UTIL AS NR_VIDA_UTIL  			 
          FROM ASIWEB.BP_DEPRECIACAO DEPR              
         WHERE DEPR.SQ_BEM_PERM = rBEM.CODIGO 
           AND DEPR.DT_ANOMES_FECHAMENTO = (SELECT MAX(DT_ANOMES_FECHAMENTO) 
                                              FROM ASIWEB.BP_DEPRECIACAO 
                                             WHERE SQ_BEM_PERM = DEPR.SQ_BEM_PERM)
          INTO rDEPR;

        UPDATE PUBLIC.BEMPATRIMONIAL
           SET valorliquido         = rDEPR.VALOR_LIQUIDO
             , vidautilacumulada    = rDEPR.NR_MESES_DEPRECIADOS
             , depreciacaoacumulada = rDEPR.DEPR_ACUM
			 , vidautilatual 		= rDEPR.NR_VIDA_UTIL
             , valorbrutocalculo    = rDEPR.VL_UNITARIO
             , valorbrutoatual      = rDEPR.VL_UNITARIO
         WHERE ID = rBEM.id;
      END LOOP;
    END$$;    
-- #FIM :: AJUSTES DADOS TABELA DEPRECIACAO >> BEMPATRIMONIAL


BEGIN;  -- #INI :: AJUSTES VIDA UTIL DO BEM >> BEMPATRIMONIAL
    DO $$
    DECLARE
      rBEM     RECORD;      
    BEGIN
      RAISE NOTICE 'Atualizando os dados de vida útil em bempatrimonial...';
      FOR rBEM IN 
        SELECT B.ID, B.VIDAUTILATUAL
        FROM BEMPATRIMONIAL B 
        WHERE VIDAUTILACUMULADA > VIDAUTILATUAL
      LOOP
         UPDATE PUBLIC.BEMPATRIMONIAL
            SET vidautilacumulada = RBEM.VIDAUTILATUAL
         WHERE ID = rBEM.id;
      END LOOP;      
    END$$;             
COMMIT; -- #FIM :: AJUSTES VIDA UTIL DO BEM >> BEMPATRIMONIAL


BEGIN;  -- #INI :: ATRIBUINDO DETENTOR AOS BENS QUE POSSUEM DETENTOR ATRIBUIDO
    DO $$ BEGIN RAISE NOTICE 'Atualizando dados de detentor em entradapatrimonio...'; END;$$;
    UPDATE PUBLIC.bempatrimonial
       SET detentor_id = P.COLABORADOR_ID
      FROM
         (
           SELECT C.id AS COLABORADOR_ID, B.SQ_BEM_PERM
           FROM ASIWEB.BP_BEM B
           INNER JOIN PESSOA P ON (P.CODIGO = B.CD_DETENTOR)    
           INNER JOIN PARCEIRO C ON (C.PESSOA_ID = P.ID)       
           WHERE B.CD_DETENTOR IS NOT NULL           
         ) AS P
    WHERE CODIGO=P.SQ_BEM_PERM;    
COMMIT; -- #FIM :: ATRIBUINDO DETENTOR AOS BENS QUE POSSUEM DETENTOR ATRIBUIDO


-- #INI :: RETORNANDO AS CONSTRAINTS DE BEMPATRIMONIAL
  DO $$ BEGIN RAISE NOTICE 'Retornando as constraints de bempatrimonial...'; END;$$;
  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_2lyppwdaqeghbrhvpqd0xfsfg FOREIGN KEY (dominiosituacaofisica_id)
        REFERENCES dominio (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_5wpgein2ksk4x95rwoxybd1xb FOREIGN KEY (autor_id)
        REFERENCES seguranca_usuario (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
     ADD CONSTRAINT fk_6axsw7vlnwfmk3kul1i5snbw9 FOREIGN KEY (entradaitem_id)
        REFERENCES entradapatrimonioitem (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_7ln6wvjsslq6pde27mpskfkk4 FOREIGN KEY (responsavel_id)
        REFERENCES parceiro_colaborador (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_84t3s4qhvk3hux9nja6yvuskw FOREIGN KEY (organizacao_id)
        REFERENCES organizacao (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_b0qq4c20jxhk0ld9fd6o81cxo FOREIGN KEY (bempatrimonialprincipal_id)
        REFERENCES bempatrimonial (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_bms01vleymwfnpe82lu6ucw4q FOREIGN KEY (detentor_id)
        REFERENCES parceiro_colaborador (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_cgrev0ob4hgxw11tutjjlecr9 FOREIGN KEY (inativador_id)
        REFERENCES seguranca_usuario (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_ecwjmdimmqyl14q2vq4w7b1l2 FOREIGN KEY (dominiostatus_id)
        REFERENCES dominio (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_8usk4bex1tcn1424glpmt3nsy FOREIGN KEY (unidadeatual_id)
        REFERENCES estruturaorganizacional (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_ggja01bbgksq3nhioymv7yoxd FOREIGN KEY (dominiostatusdepreciacao_id)
        REFERENCES dominio (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_hb7coo6b3g6vrqcxtbnvvxfy3 FOREIGN KEY (editor_id)
        REFERENCES seguranca_usuario (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_lo2mirunnjfe1jsrfhmvtx2b6 FOREIGN KEY (material_id)
       REFERENCES materialpermanente (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_luhl9nankja63w09rxdaey0bu FOREIGN KEY (unidadecompra_id)
        REFERENCES estruturaorganizacional (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;

  ALTER TABLE bempatrimonial
    ADD CONSTRAINT fk_qjtg4otjjxqsa7fkjp8or00e7 FOREIGN KEY (fornecedor_id)
        REFERENCES parceiro (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;
-- #FIM :: RETORNANDO AS CONSTRAINTS DE BEMPATRIMONIAL


-- #INI :: MIGRACAO DOS VALORES DAS CARACTERISTICAS GENERICAS DOS BENS
    DO $$
    DECLARE
      r            RECORD;
      v_dominio_id BIGINT;
      v_conteudo   CHARACTER VARYING(4000);
    BEGIN 
      RAISE NOTICE 'Importando os valores de caracteristica genericas de bempatrimonial...';
      -- RECUPERA AS CARACTERISTICAS DOS BENS
      FOR r IN 
        -- Na tabela de caracteristica existem mais campos que guardam valor, mas fiz uma busca e 
		-- nenhum no sistema e diferente de null: cg.ds_car_date as valorData, cg.ds_car_blob as arquivo
        SELECT CARASI.TP_DADO   AS tipodado
             , CG.DS_CAR_CHAR   AS valorText
             , CG.DS_CAR_NUMBER AS valornumero
		     , BEM.ID           AS bem_id
             , MC.ID            AS materialcaracteristica_id
             , CAR.CHAVEDOMINIO AS chavedominio
        FROM ASIWEB.BP_ENT_CAR_GEN CG
        INNER JOIN ASIWEB.CR_CARACTERISTICA CARASI ON (CARASI.CD_CARACTERISTICA = CG.CD_CARACTERISTICA)        
        INNER JOIN ASIWEB.BP_BEM B ON (B.CD_ORGAO = CG.CD_ORGAO AND B.CD_UG = CG.CD_UG AND B.CD_ENTRADA = CG.CD_ENTRADA AND B.SQ_ITEM = CG.SQ_ITEM)
        INNER JOIN PUBLIC.BEMPATRIMONIAL BEM ON (BEM.CODIGO = B.SQ_BEM_PERM)
        INNER JOIN PUBLIC.MATERIAL M ON (M.CODIGO = B.CD_BEM_SERVICO) 
        INNER JOIN PUBLIC.MATERIALCARACTERISTICA MC ON (MC.MATERIAL_ID = M.ID AND MC.CODIGO = CG.CD_CARACTERISTICA)
        INNER JOIN PUBLIC.CARACTERISTICA CAR ON (CAR.ID = MC.CARACTERISTICA_ID)
      LOOP
        IF (r.chavedominio IS NOT NULL) THEN
          SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE=r.chavedominio AND CODIGO=r.valortext::bigint INTO v_dominio_id;
          v_conteudo = v_dominio_id;    
        ELSE 
          v_dominio_id = NULL;
          IF (r.tipodado = 'NM') THEN
            IF (r.valornumero-FLOOR(r.valornumero)) > 0 THEN
              v_conteudo = CAST(r.valornumero AS CHARACTER VARYING(4000));
            ELSE
              v_conteudo = CAST(FLOOR(r.valornumero) AS CHARACTER VARYING(4000));
            END IF;
          ELSE 
            v_conteudo = r.valortext;
          END IF;            
       END IF;      
       INSERT INTO public.bempatrimonialcaracteristica
            ( id
        --  , databloqueio
        --  , datainativo
            , datacriacao
            , dataedicao
            , version
        --  , arquivo
            , valormaterialcaracteristica
        --  , inativador_id
        --  , autor_id
        --  , editor_id
            , bempatrimonial_id
            , materialcaracteristica_id
            )
       VALUES
            ( NEXTVAL('hibernate_sequence')
            , LOCALTIMESTAMP
            , LOCALTIMESTAMP
            , 0
            , v_conteudo
            , r.bem_id
            , r.materialcaracteristica_id
            );
      END LOOP;
    END$$;
-- #FIM :: MIGRACAO DOS VALORES DAS CARACTERISTICAS GENERICAS DOS BENS    


-- #INI :: MIGRACAO DOS VALORES DAS CARACTERISTICAS ESPECIFICAS DOS BENS
    DO $$
    DECLARE
      r    RECORD;
    BEGIN 
      RAISE NOTICE 'Importando os valores de caracteristica especificas de bempatrimonial...';
      -- RECUPERA AS CARACTERISTICAS ESPECIFICAS DOS BENS
      FOR r IN                 
        -- Na tabela de caracteristicas especificas so existe valor no campo ce.ds_car_char, todas as caracteristicas desse tipo sao do tipo character
        SELECT CARASI.TP_DADO AS TIPODADO, CE.DS_CAR_CHAR AS VALORTEXT, BEM.ID AS BEMID, MC.ID AS MATERIALCARACTERISTICAID
        FROM ASIWEB.BP_ENT_CAR_BEM CE
        INNER JOIN ASIWEB.CR_CARACTERISTICA CARASI ON (CARASI.CD_CARACTERISTICA = CE.CD_CARACTERISTICA)                
        INNER JOIN PUBLIC.BEMPATRIMONIAL BEM ON (BEM.CODIGO::BIGINT = CE.SQ_BEM_PERM)
        INNER JOIN PUBLIC.MATERIAL M ON (M.ID = BEM.MATERIAL_ID) 
        INNER JOIN PUBLIC.MATERIALCARACTERISTICA MC ON (MC.MATERIAL_ID = M.ID AND MC.CODIGO = CE.CD_CARACTERISTICA)        
      LOOP
        INSERT INTO public.bempatrimonialcaracteristica
             ( id
        --   , databloqueio
        --   , datainativo
             , datacriacao
             , dataedicao
             , version
        --   , arquivo
             , valormaterialcaracteristica                           
        --   , inativador_id
        --   , autor_id
        --   , editor_id
             , bempatrimonial_id
             , materialcaracteristica_id
             )
        VALUES
             ( NEXTVAL('hibernate_sequence')
             , LOCALTIMESTAMP
             , LOCALTIMESTAMP
             , 0
             , R.VALORTEXT
             , R.BEMID
             , R.MATERIALCARACTERISTICAID
             );
      END LOOP;
    END$$;
-- #FIM :: MIGRACAO DOS VALORES DAS CARACTERISTICAS ESPECIFICAS DOS BENS


BEGIN;  -- #INI :: AJUSTA ATRIBUTOS 'ISLOCALIZADORADEBENS'/'ISALMOXARIFADO'/'ISUNDCONSUMIDORAREQUISITANTE'
    DO $$ BEGIN RAISE NOTICE 'Marca as unidades como LOCALIZADORAS se existir bens...'; END;$$;
    UPDATE ESTRUTURAORGANIZACIONALPATRIM
       SET ISLOCALIZADORADEBEM=TRUE
      FROM  
         ( SELECT BP.UNIDADEATUAL_ID, COUNT(*) AS QTD
           FROM   BEMPATRIMONIAL BP   -- VERIFICA SE A ESTRUTURA POSSUI BENS NÃO BAIXADOS
           WHERE  BP.DOMINIOSTATUS_ID <> (SELECT ID FROM DOMINIO WHERE CHAVE='tipoStatusBem' AND CODIGO=2) -- BAIXADO
           GROUP  BY BP.UNIDADEATUAL_ID
         ) AS B
     WHERE B.UNIDADEATUAL_ID=ESTRUTURAORGANIZACIONAL_ID
       AND B.QTD > 0;
     
    DO $$ BEGIN RAISE NOTICE 'Marca as unidades como ALMOXARIFADO (ALM) se foi informada na entrada de bens...'; END;$$;
    UPDATE PUBLIC.ESTRUTURAORGANIZACIONALALMOX
       SET ISALMOXARIFADO = TRUE
      FROM
         ( SELECT EO.ID AS ALM_ID
           FROM PUBLIC.ESTRUTURAORGANIZACIONAL EO
           WHERE EO.DATAFIM IS NULL
           AND EO.ID IN (SELECT DISTINCT(UNIDADECOMPRA_ID) FROM PUBLIC.BEMPATRIMONIAL)
         ) AS B
    WHERE ESTRUTURAORGANIZACIONAL_ID=B.ALM_ID;
    
    DO $$ BEGIN RAISE NOTICE 'Marca as unidades como ALMOXARIFADO (ALM) se foi informada na entrada de bens...'; END;$$;
    UPDATE PUBLIC.ESTRUTURAORGANIZACIONALPATRIM
       SET ISALMOXARIFADO = TRUE
      FROM
         ( SELECT EO.ID AS ALM_ID
           FROM PUBLIC.ESTRUTURAORGANIZACIONAL EO
           WHERE EO.DATAFIM IS NULL
           AND EO.ID IN (SELECT DISTINCT(UNIDADECOMPRA_ID) FROM PUBLIC.BEMPATRIMONIAL)
         ) AS B
    WHERE ESTRUTURAORGANIZACIONAL_ID=B.ALM_ID;    

    DO $$ BEGIN RAISE NOTICE 'Marca as unidades requisitantes (sem ul correspondente) como requisitantes...'; END;$$;
    UPDATE ESTRUTURAORGANIZACIONALALMOX
       SET ISUNDCONSUMIDORAREQUISITANTE=TRUE
      FROM  
         ( SELECT UR.ID FROM PUBLIC.ESTRUTURAORGANIZACIONAL UR 
           INNER JOIN PUBLIC.DOMINIO D ON UR.TIPOESTRUTURAORGANIZACIONAL_ID = D.ID AND D.CHAVE = 'tipoEstruturaOrganizacional' AND D.CODIGO=4
         ) AS U
     WHERE U.ID = ESTRUTURAORGANIZACIONAL_ID;
     
     --> ATUALIZANDO AS UNIDADES ALMOXARIFADO E ALMOXARIFADO PADRÃO
    DO $$ BEGIN RAISE NOTICE 'Marca as unidades requisitantes (sem ul correspondente) como requisitantes...'; END;$$;
    UPDATE PUBLIC.ESTRUTURAORGANIZACIONALPATRIM 
       SET ISALMOXARIFADOPADRAO = ISALMOXARIFADO
     WHERE ISALMOXARIFADOPADRAO IS NULL;
COMMIT; -- #FIM :: AJUSTA ATRIBUTOS 'ISLOCALIZADORADEBENS'/'ISALMOXARIFADO'/'ISUNDCONSUMIDORAREQUISITANTE


BEGIN;  -- #INI :: AJUSTES PARA SETAR OS BENS PRINCIPAIS COMO PRINCIPAIS
    DO $$ BEGIN RAISE NOTICE 'Atualizando o atributo indicador de bemprincipal...'; END;$$;
    UPDATE PUBLIC.BEMPATRIMONIAL
       SET BEMPRINCIPAL = TRUE 
     WHERE CODIGO IN (SELECT SQ_BEM_PERM_SUP 
                        FROM ASIWEB.BP_BEM BEM 
                       WHERE BEM.SQ_BEM_PERM_SUP IS NOT NULL);
COMMIT; -- #FIM :: AJUSTES PARA SETAR OS BENS PRINCIPAIS COMO PRINCIPAIS 


BEGIN;  -- #INI :: AJUSTES PARA SETAR OS BENS PRINCIPAIS NOS SEUS FILHOS
    DO $$ BEGIN RAISE NOTICE 'Atualizando a referencia ao bemprincipal...'; END;$$;
    UPDATE PUBLIC.BEMPATRIMONIAL
       SET BEMPATRIMONIALPRINCIPAL_ID = D.PAI
      FROM
         ( SELECT BEM.SQ_BEM_PERM                           AS FILHO
                , (SELECT ID FROM BEMPATRIMONIAL BSUP 
                   WHERE BSUP.CODIGO = BEM.SQ_BEM_PERM_SUP) AS PAI
             FROM BEMPATRIMONIAL B INNER JOIN ASIWEB.BP_BEM BEM ON (BEM.SQ_BEM_PERM = B.CODIGO)
            WHERE SQ_BEM_PERM_SUP IS NOT NULL             
         ) AS D
       WHERE D.FILHO=CODIGO;
COMMIT; -- #FIM :: AJUSTES PARA SETAR OS BENS PRINCIPAIS NOS SEUS FILHOS


BEGIN;  -- #INI :: AJUSTES PARA CRIAR O CODIGO UNICO DA TRANSFERENCIA
    DO $$
    BEGIN
        ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM ADD COLUMN codigomigracao VARCHAR(30);
    EXCEPTION
        WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    DO $$
    BEGIN
        ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM DROP CONSTRAINT fk_tibp_bem;
    EXCEPTION
        WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    DO $$
    BEGIN
        ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM DROP CONSTRAINT fk_tibp_cont_d;
    EXCEPTION
        WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    DO $$
    BEGIN
        ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM DROP CONSTRAINT fk_tibp_cont_o;
    EXCEPTION
        WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    DO $$
    BEGIN
        ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM DROP CONSTRAINT fk_tibp_fun;
    EXCEPTION
        WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    DO $$
    BEGIN
        ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM DROP CONSTRAINT fk_tibp_prqi;
    EXCEPTION
        WHEN OTHERS THEN NULL;
    END$$;

    DO $$
    BEGIN
        ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM DROP CONSTRAINT fk_tibp_tpst_o;
    EXCEPTION
        WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    DO $$
    BEGIN
      ALTER TABLE ASIWEB.BP_TRANSF_INT_BEM DROP CONSTRAINT fk_tibp_trin;
    EXCEPTION
        WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    DO $$ BEGIN RAISE NOTICE 'Criando a tabela temporária [TMP_BP_TRANS_INT_BEM]...'; END$$;
    CREATE TABLE PUBLIC.TMP_BP_TRANS_INT_BEM
    AS
    SELECT T.CD_TRANSFERENCIA||T.CD_UG||TO_CHAR(COALESCE(I.DT_CONTABIL, T.DT_AUTORIZACAO), 'YYYYMM') AS CODIGOMIGRACAO
         , I.CD_ORGAO, I.CD_UG, I.CD_TRANSFERENCIA, I.SQ_BEM_PERM,I.DT_CONTABIL, T.DT_AUTORIZACAO, T.CD_UL_D, T.CD_UL_O
         , T.DT_INCLUSAO, T.DT_TRANSFERENCIA, I.VL_UNITARIO, I.CD_CONTA_O,I.CD_CONTA_D
    FROM   ASIWEB.BP_TRANSF_INT_BEM I
    INNER JOIN ASIWEB.BP_TRANSF_INTERNA T ON (T.CD_TRANSFERENCIA = I.CD_TRANSFERENCIA AND T.CD_UG = I.CD_UG);  

    DO $$ BEGIN RAISE NOTICE 'Criando os índices na tabela temporária [TMP_BP_TRANS_INT_BEM]...'; END$$;
    CREATE INDEX IX_TMP_BP_TRANS_INT_BEM_CODIGOMIGRACAO ON PUBLIC.TMP_BP_TRANS_INT_BEM USING BTREE (CODIGOMIGRACAO);
    CREATE INDEX IX_TMP_BP_TRANS_INT_BEM_SQ_BEM_PERM ON PUBLIC.TMP_BP_TRANS_INT_BEM USING BTREE (SQ_BEM_PERM);
    CREATE INDEX IX_TMP_BP_TRANS_INT_BEM_CD_UL_O ON PUBLIC.TMP_BP_TRANS_INT_BEM USING BTREE (CD_UL_O);
COMMIT; -- #FIM :: AJUSTES PARA CRIAR O CODIGO UNICO DA TRANSFERENCIA


BEGIN;  -- #INI :: MOVIMENTACAO DE TRANSFERENCIA INTERNA >> TRANSFERENCIA

    --> REGISTROS DE TRANSFERENCIAS
    DO $$ 
    DECLARE
      r          RECORD;     
      v_transfId BIGINT;
    BEGIN

      RAISE NOTICE 'Importando as movimentações de transferência interna...';
      
      -- RECUPERA AS TRANSFERENCIAS
      FOR r IN 
        SELECT DISTINCT            
               COALESCE(I.DT_INCLUSAO,I.DT_TRANSFERENCIA) AS datacriacao
             , LOCALTIMESTAMP     AS dataedicao
             , 0                  AS "version"
             , I.CD_TRANSFERENCIA AS codigo
             , I.CODIGOMIGRACAO   AS codigoasi
             , CAST(CASE WHEN I.DT_CONTABIL IS NULL THEN I.DT_AUTORIZACAO ELSE I.DT_CONTABIL END AS DATE) AS datatransferencia    
             , CAST(CASE WHEN I.DT_CONTABIL IS NULL THEN I.DT_AUTORIZACAO ELSE I.DT_CONTABIL END AS DATE) AS referenciavigente    
             , E.ID               AS unidadedestino_id
             , 1                  AS organizacao_id
        FROM   PUBLIC.TMP_BP_TRANS_INT_BEM I        
        INNER JOIN PUBLIC.ESTRUTURAORGANIZACIONAL E ON (E.CODIGO = I.CD_UL_D AND E.TIPOESTRUTURAORGANIZACIONAL_ID = (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEstruturaOrganizacional' AND CODIGO=3))
        WHERE I.DT_AUTORIZACAO IS NOT NULL
      LOOP
        -- RECUPERA A PROXIMA SEQUENCE
        SELECT NEXTVAL('hibernate_sequence') into v_transfId;
        
        INSERT INTO public.transferencia
             ( id      
             , datacriacao
             , dataedicao
             , version
             , codigo
             , codigoasi
             , datatransferencia
             , referenciavigente
             , unidadedestino_id
             , organizacao_id 
             )
        VALUES
             ( v_transfId
             , r.datacriacao
             , r.dataedicao
             , r.version
             , r.codigo
             , r.codigoasi
             , r.datatransferencia
             , r.referenciavigente
             , r.unidadedestino_id
             , r.organizacao_id 
             );
        END LOOP;
    END$$;           

    -- Preciso adicionar o campo com a conta contabil destino porque o material pode sofrer alteracao de conta contabil
    -- com o tempo, e se for a conta errada para o movimentos o rmb fica errado
    DO $$
    BEGIN
        RAISE NOTICE 'Importando os itens das transferências interna...';
        ALTER TABLE PUBLIC.TRANSFERENCIAITEM ADD COLUMN cd_conta_d VARCHAR(30);
    EXCEPTION
        WHEN OTHERS THEN WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    INSERT INTO public.transferenciaitem
         ( id
         , datacriacao
         , dataedicao
         , version
         , transferencia_id
         , bempatrimonial_id
         , unidadeorigem_id
         , vl_unitario
         , cd_conta
         , cd_conta_d
         )
    SELECT NEXTVAL('hibernate_sequence')
         , T.DATACRIACAO
         , T.DATAEDICAO
         , 0
         , T.ID
         , B.ID
         , E.ID
         , I.VL_UNITARIO/100
         , I.CD_CONTA_O
         , I.CD_CONTA_D
    FROM PUBLIC.TMP_BP_TRANS_INT_BEM I 
    INNER JOIN PUBLIC.TRANSFERENCIA T ON (T.CODIGOASI = I.CODIGOMIGRACAO)
    INNER JOIN PUBLIC.BEMPATRIMONIAL B ON (B.CODIGO = I.SQ_BEM_PERM)
    INNER JOIN PUBLIC.ESTRUTURAORGANIZACIONAL E ON (E.CODIGO = I.CD_UL_O AND E.TIPOESTRUTURAORGANIZACIONAL_ID = (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEstruturaOrganizacional' AND CODIGO=3));
    
    DO $$ BEGIN RAISE NOTICE 'Importando os registros de transferências entre contas...'; END$$;
    INSERT INTO public.transferenciacontacontabil
         ( id
         , datacriacao 
         , dataedicao 
         , version 
         , datatransferencia 
         , organizacao_id
         , contadestino_id
         , contaorigem_id            
         , material_id
         , codigo
         , valortransferencia
         , valordepreciacaoacumulada
         , quantidadematerial
         )
    SELECT DISTINCT
           NEXTVAL('hibernate_sequence')
         , TC.DT_TRANSFERENCIA
         , LOCALTIMESTAMP
         , 0
         , TC.DT_TRANSFERENCIA
         , 1
         , CD.ID
         , CO.ID
         , M.ID
         , T.CD_TRANSFERENCIA
         , SUM(T.VL_UNITARIO/100)
         , 0.0
         , 0.0
    FROM ASIWEB.BP_TRANSF_CONTA_BEM T
    INNER JOIN ASIWEB.BP_TRANSF_CONTA TC ON (TC.CD_TRANSFERENCIA = T.CD_TRANSFERENCIA)
    INNER JOIN PUBLIC.MATERIAL M ON (M.CODIGO = TC.CD_BEM_SERVICO)
    INNER JOIN PUBLIC.CONTACONTABIL CO ON (CO.CODIGO = T.CD_CONTA_O)
    INNER JOIN PUBLIC.CONTACONTABIL CD ON (CD.CODIGO = TC.CD_CONTA_D)
    GROUP BY TC.DT_TRANSFERENCIA, CD.ID, CO.ID, M.ID, T.CD_TRANSFERENCIA;
COMMIT; -- #FIM :: MOVIMENTACAO DE TRANSFERENCIA INTERNA >> TRANSFERENCIA


BEGIN;  -- #INI :: MOVIMENTACAO DE TRANSFERENCIA EXTERNA >> SAIDATEMPORARIA
    DO $$ BEGIN RAISE NOTICE 'Importando os registros de saidatemporaria...'; END$$;
    INSERT INTO public.saidatemporaria
         ( id
         , datacriacao
         , dataedicao
         , version
         , codigo
         , datasaida
         , previsaoretorno
         , organizacao_id
         , destino_id
         , dominiotipoobjetivo_id
         , dominiotipoprojeto_id
         , estruturaorganizacional_id
         , portador_id
         , responsavel_id
         )
    SELECT NEXTVAL('hibernate_sequence')
         , COALESCE(TRANSF.DT_INCLUSAO,LOCALTIMESTAMP) AS datacriacao
         , LOCALTIMESTAMP
         , 0
         , CAST(TRANSF.CD_TRANSFERENCIA AS TEXT)
         , TRANSF.DT_TRANSFERENCIA
         , TRANSF.DT_PREV_RETORNO
         , 1
         , PDESTINO.ID
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoObjetivoSaidaTemporaria' AND CD_ASI=TRANSF.CD_MOTIVO_SAIDA_TEMP) AS dominiotipoobjetivo_id -- "asiweb.bp_motivo_saida_temp"
         , NULL
         , (SELECT ID FROM PUBLIC.ESTRUTURAORGANIZACIONAL EO WHERE EO.CODIGO = TRANSF.CD_UG)
         , PPORTADOR.ID
         , PRESPONSAVEL.ID
    FROM ASIWEB.BP_TRANSF_EXTERNA TRANSF
    LEFT JOIN PARCEIRO PDESTINO ON (PDESTINO.CODIGO = TRANSF.CD_FORNEC_ORGEXT)
    LEFT JOIN PARCEIRO PPORTADOR ON (PPORTADOR.CODIGO = TRANSF.CD_PORTADOR)
    LEFT JOIN PARCEIRO PRESPONSAVEL ON (PRESPONSAVEL.CODIGO = TRANSF.CD_FUN_AUTORIZ_SAIDA)
    ORDER BY TRANSF.CD_TRANSFERENCIA;

    DO $$ BEGIN RAISE NOTICE 'Importando os registros de saidatemporariaitem...'; END$$;
    INSERT INTO public.saidatemporariaitem
         ( id
         , datacriacao
         , dataedicao
         , version
         , dataretorno
         , garantiafinal
         , garantiainicial
         , sequencia
         , solucaoconserto
         , valorconserto 
         , bempatrimonial_id
         , dominiostatusanterior_id
         , dominiostatusretorno_id
         , recebedor_id
         , saidatemporaria_id
         , saidatemporariainativo_id
         )
    SELECT NEXTVAL('hibernate_sequence')
         , S.DATACRIACAO
         , S.DATAEDICAO
         , 0
         , TRANSFBEM.dt_recebimento
         , TRANSFBEM.dt_garantia_fim
         , TRANSFBEM.dt_garantia_ini
         , NULL
         , NULL
         , TRANSFBEM.vl_conserto
         , B.ID
         , NULL
         , NULL
         , PRECEBEDOR.ID
         , S.ID
         , NULL
    FROM ASIWEB.BP_TRANSF_EXT_BEM TRANSFBEM
    INNER JOIN PUBLIC.SAIDATEMPORARIA S ON (S.CODIGO = TRANSFBEM.CD_TRANSFERENCIA)
    LEFT JOIN PUBLIC.BEMPATRIMONIAL B ON (B.CODIGO = TRANSFBEM.SQ_BEM_PERM)
    LEFT JOIN PARCEIRO PRECEBEDOR ON (PRECEBEDOR.CODIGO = transfbem.CD_recebedor)
    ORDER BY TRANSFBEM.CD_TRANSFERENCIA;
COMMIT; -- #FIM :: MOVIMENTACAO DE TRANSFERENCIA EXTERNA >> SAIDATEMPORARIA


BEGIN;  -- #INI :: DEFINICAO DE DENTENTOR DE BEM >> DEFINICAODETENTOR
    DO $$ BEGIN RAISE NOTICE 'Importando os registros de definicaodetentor...'; END$$;
    INSERT INTO public.definicaodetentor
         ( id
         , databloqueio
         , datainativo
         , datacriacao
         , dataedicao
         , version
         , dataatribuicao
         , datafimatribuicao
         , detentorresponsavel
         , numerotermo
         , referenciavigente
         , inativador_id
         , autor_id
         , editor_id
         , organizacao_id
         , colaborador_id
		 , codigo
         )
    SELECT NEXTVAL('hibernate_sequence')     AS id
         , NULL                              AS databloqueio
         , NULL                              AS datainativo
         , COALESCE(TD.DT_INCLUSAO,LOCALTIMESTAMP) AS datacriacao
         , LOCALTIMESTAMP                    AS dataedicao
         , 0                                 AS "version"
         , TD.DT_TRANSFERENCIA               AS dataatribuicao
         , NULL                              AS datafimatribuicao
         , CASE WHEN TD.IN_RESPONSAVEL='S' 
             THEN TRUE
             ELSE FALSE                      
           END                               AS detentorresponsavel
         , TD.CD_TRANSFERENCIA::BIGINT       AS numerotermo
         , TD.DT_TRANSFERENCIA               AS referenciavigente
         , NULL                              AS inativador_id
         , NULL                              AS autor_id
         , NULL                              AS editor_id
         , (SELECT ID FROM PUBLIC.organizacao LIMIT 1) AS organizacao_id
         , PAR.ID                            AS colaborador_id
		 , TD.CD_TRANSFERENCIA
    FROM ASIWEB.BP_TRANSF_DETENTOR TD
    INNER JOIN ASIWEB.CR_FUNCIONARIO FC ON TD.CD_DETENTOR_D=FC.CD_FUNCIONARIO
    INNER JOIN PUBLIC.PESSOA P ON P.CODIGO=FC.CD_FUNCIONARIO
    INNER JOIN PUBLIC.PARCEIRO PAR ON PAR.PESSOA_ID=P.ID
    WHERE TD.CD_DETENTOR_D IS NOT NULL;

    DO $$ BEGIN RAISE NOTICE 'Importando os registros de definicaodetentoritem...'; END$$;
    INSERT INTO public.definicaodetentoritem
         ( id
         , databloqueio
         , datainativo
         , datacriacao
         , dataedicao
         , version
         , dataatribuicao
         , datafimatribuicao
         , sequencia
         , inativador_id
         , autor_id
         , editor_id
         , bempatrimonial_id
         , definicaodetentor_id
         )
    SELECT NEXTVAL('hibernate_sequence')     AS id
         , NULL                              AS databloqueio
         , NULL                              AS datainativo
         , COALESCE(TD.DT_INCLUSAO,LOCALTIMESTAMP) AS datacriacao
         , LOCALTIMESTAMP                    AS dataedicao
         , NULL                              AS "version"
         , TD.DT_TRANSFERENCIA               AS dataatribuicao
         , NULL                              AS datafimatribuicao
         , TI.SQ_BEM_PERM                    AS sequencia
         , NULL                              AS inativador_id
         , NULL                              AS autor_id
         , NULL                              AS editor_id
         , BP.ID                             AS bempatrimonial_id
         , DD.ID                             AS definicaodetentor_id
    FROM ASIWEB.BP_TRANSF_DETENTOR TD
    INNER JOIN ASIWEB.BP_TRANSF_BEM_DET TI ON TD.CD_ORGAO::TEXT=TI.CD_ORGAO::TEXT AND TD.CD_TRANSFERENCIA::TEXT=TI.CD_TRANSFERENCIA::TEXT AND TD.CD_UG::TEXT=TI.CD_UG::TEXT
    INNER JOIN PUBLIC.DEFINICAODETENTOR DD ON DD.NUMEROTERMO=TD.CD_TRANSFERENCIA
    INNER JOIN PUBLIC.BEMPATRIMONIAL BP ON BP.CODIGO=TI.SQ_BEM_PERM
    WHERE TD.CD_DETENTOR_D IS NOT NULL
    ORDER BY TD.CD_TRANSFERENCIA;
COMMIT; -- #FIM :: DEFINICAO DE DENTENTOR DE BEM >> DEFINICAODETENTOR


BEGIN;  -- #INI :: ADICAO A BEM PRINCIPAL >> ADICAOBEMPRINCIPAL
    DO $$ BEGIN RAISE NOTICE 'Importando os registros de adicaobemprincipal...'; END$$;
    INSERT INTO public.adicaobemprincipal
         ( id
         , databloqueio
         , datainativo
         , datacriacao
         , dataedicao
         , version
         , inativador_id
         , autor_id
         , editor_id
         , organizacao_id
         , bempatrimonial_id
         )
    SELECT NEXTVAL('hibernate_sequence')     AS id
         , NULL                              AS databloqueio
         , NULL                              AS datainativo
         , COALESCE(BH.DT_HISTORICO,LOCALTIMESTAMP) AS datacriacao
         , LOCALTIMESTAMP                    AS dataedicao
         , 0                                 AS "version"
         , NULL                              AS inativador_id
         , NULL                              AS autor_id
         , NULL                              AS editor_id
         , (SELECT ID FROM PUBLIC.ORGANIZACAO LIMIT 1) AS organizacao_id
         , PRI.ID                            AS bempatrimonial_id
    FROM ASIWEB.BP_BEM BP 
    INNER JOIN ASIWEB.BP_HISTORICO BH ON BP.SQ_BEM_PERM=BH.SQ_BEM_PERM AND BP.CD_ORGAO=BH.CD_ORGAO
    INNER JOIN PUBLIC.BEMPATRIMONIAL PRI ON PRI.CODIGO=BP.SQ_BEM_PERM_SUP
    WHERE BH.CD_TP_HISTORICO = '01'
    ORDER BY BH.DT_HISTORICO;

    DO $$ BEGIN RAISE NOTICE 'Importando os registros de adicaobemprincipalitem...'; END$$;
    INSERT INTO public.adicaobemprincipalitem
         ( id
         , databloqueio
         , datainativo
         , datacriacao
         , dataedicao
         , version
         , datareferencia
         , inativador_id
         , autor_id
         , editor_id
         , adicaobemprincipal_id
         , adicaobemprincipalinativado_id
         , bempatrimonial_id
         )
    SELECT NEXTVAL('hibernate_sequence')     AS id
         , NULL                              AS databloqueio
         , NULL                              AS datainativo
         , COALESCE(BH.DT_HISTORICO,LOCALTIMESTAMP) AS datacriacao
         , LOCALTIMESTAMP                    AS dataedicao
         , 0                                 AS "version"
         , BH.DT_HISTORICO                   AS datareferencia
         , NULL                              AS inativador_id
         , NULL                              AS autor_id
         , NULL                              AS editor_id
         , ADC.ID                            AS adicaobemprincipal_id
         , NULL                              AS adicaobemprincipalinativado_id
         , ADI.ID                            AS bempatrimonial_id
    FROM ASIWEB.BP_BEM BP 
    INNER JOIN ASIWEB.BP_HISTORICO BH ON BP.SQ_BEM_PERM=BH.SQ_BEM_PERM AND BP.CD_ORGAO=BH.CD_ORGAO
    INNER JOIN PUBLIC.BEMPATRIMONIAL ADI ON ADI.CODIGO=BP.SQ_BEM_PERM
    INNER JOIN PUBLIC.BEMPATRIMONIAL PRI ON PRI.CODIGO=BP.SQ_BEM_PERM_SUP
    INNER JOIN PUBLIC.ADICAOBEMPRINCIPAL ADC ON ADC.BEMPATRIMONIAL_ID=PRI.ID
    WHERE BH.CD_TP_HISTORICO = '01'
    ORDER BY BH.DT_HISTORICO;
COMMIT; -- #FIM :: ADICAO A BEM PRINCIPAL >> ADICAOBEMPRINCIPAL


BEGIN;  -- #INI :: MOVIMENTACAO DE BAIXAS >> BAIXA
    DO $$ BEGIN RAISE NOTICE 'Importando os registros de baixa...'; END$$;
    INSERT INTO public.baixa
         ( id
         , datacriacao 
         , dataedicao
         , version
         , organizacao_id
         , codigo  
         )
    SELECT NEXTVAL('hibernate_sequence')
         , LOCALTIMESTAMP
         , LOCALTIMESTAMP
         , 0
         , 1
         , BAIXA.SQ_BAIXA
      FROM ASIWEB.BP_BAIXA BAIXA
    ORDER BY BAIXA.NR_BAIXA;

    DO $$ BEGIN RAISE NOTICE 'Importando os registros de baixapatrimonio...'; END$$;
    INSERT INTO public.baixapatrimonio
         ( id
         , codigo
         , datacontabilizacao
         , dataconclusao      
         , datainicio
         , destino_id
         , portador_id
         , dominiosituacaobaixa_id
         , dominiotipobaixa_id
         , dominiotipobem_id
         )
    SELECT B.ID
         , BAIXA.NR_BAIXA
         , BAIXA.DT_CONTABIL
         , BAIXA.DT_CONTABIL
         , BAIXA.DT_INICIO_BAIXA
         , PDESTINO.ID
         , PPORTADOR.ID
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoSituacaoBaixa' AND CD_ASI=BAIXA.CD_TP_SIT_BAIXA) AS dominiosituacaobaixa_id  -- "asiweb.bp_tp_sit_baixa"
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoBaixa' AND CD_ASI=BAIXA.CD_TP_FORMA_OP) AS dominiotipobaixa_id -- "asiweb.bp_tp_forma_op"
         , (SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoBem' AND CODIGO=1) -- 1;"Próprio contabilizado"
    FROM PUBLIC.BAIXA B
    INNER JOIN ASIWEB.BP_BAIXA BAIXA ON (B.CODIGO = BAIXA.SQ_BAIXA) 
    LEFT JOIN PUBLIC.PARCEIRO PDESTINO ON (PDESTINO.CODIGO = BAIXA.CD_DESTINO)
    LEFT JOIN PUBLIC.PARCEIRO PPORTADOR ON (PPORTADOR.CODIGO = BAIXA.CD_PORTADOR)
    ORDER BY B.CODIGO;  

    -- PRECISEI CRIAR ESSE CAMPO PARA A MIGRACAO POIS A CONTA DO MATERIAL NA EPOCA DA BAIXA
    -- PODE SER DIFERENTE DA QUE ESTA NO BEM NO MOMENTO
    DO $$
    BEGIN
      RAISE NOTICE 'Importando os registros de baixapatrimonioitem...';
      ALTER TABLE BAIXAPATRIMONIOITEM ADD COLUMN CONTA_CONTABIL_O VARCHAR(10);
    EXCEPTION
      WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    INSERT INTO public.baixapatrimonioitem
         ( id
         , datacriacao 
         , dataedicao
         , version
         , baixa_id   
         , bempatrimonial_id
         , dataestorno
         , vl_unitario
         , conta_contabil_o 
         )
    SELECT NEXTVAL('hibernate_sequence')
         , B.DATACRIACAO
         , B.DATAEDICAO
         , 0
         , B.id
         , BEM.ID 
         , BAIXA_ITEM.DT_ESTORNO
         , BAIXA_ITEM.VL_UNITARIO/100
         , BAIXA_ITEM.CD_CONTA  
    FROM ASIWEB.BP_BAIXA_ITEM BAIXA_ITEM 
    INNER JOIN PUBLIC.BAIXA B ON (B.CODIGO = BAIXA_ITEM.SQ_BAIXA)
    INNER JOIN PUBLIC.BEMPATRIMONIAL BEM ON (BEM.CODIGO = BAIXA_ITEM.SQ_BEM_PERM);

    DO $$ BEGIN RAISE NOTICE 'Importando os registros de observacao em baixas de patrimonio...'; END$$;
    INSERT INTO public.observacao
         ( id
         , datacriacao
         , dataedicao
         , version
         , descricao
         , codigo
         )
    SELECT NEXTVAL('hibernate_sequence')
         , OBS.DT_OBSERVACAO
         , LOCALTIMESTAMP
         , 0
         , OBS.DS_OBSERVACAO
         , OBS.SQ_BAIXA
    FROM ASIWEB.BP_BAIXA_OBS OBS;

    DO $$ BEGIN RAISE NOTICE 'Criando a referencia observacao/baixas de patrimonio...'; END$$;
    INSERT INTO public.baixaobservacao
         ( id
         , baixa_id
         )
    SELECT OBS.ID
         , B.ID
    FROM PUBLIC.OBSERVACAO OBS
    INNER JOIN PUBLIC.BAIXA B ON (B.CODIGO = OBS.CODIGO);

    -- DOCUMENTOS DAS BAIXAS
    DO $$
    BEGIN
      RAISE NOTICE 'Importando documento de baixas de patrimonio...';
      ALTER TABLE DOCUMENTO ADD COLUMN CODIGO VARCHAR(30);
    EXCEPTION
      WHEN OTHERS THEN RAISE NOTICE '% %', SQLERRM, SQLSTATE;
    END$$;

    --FAVOR VERIFICAR REGRA DE NEGOCIO DA QUERY ABAIXO
    INSERT INTO public.documento
         ( id
         , datacriacao 
         , dataedicao
         , version
         , dataemissao
         , numero
         , dominiotipodocumento_id
         , emitente_id
         , codigo
         )
    SELECT NEXTVAL('hibernate_sequence')
         , COALESCE(DOC.DT_EMISSAO,LOCALTIMESTAMP)
         , LOCALTIMESTAMP
         , 0
         , DOC.DT_EMISSAO
         , DOC.NR_DOCUMENTO
         , (SELECT ID_GRP FROM PUBLIC.DOMINIO_ASI_GRP WHERE TP_GRP='tipoDocumento' AND CD_ASI=DOC.CD_TP_DOCUMENTO)  AS dominiotipodocumento_id  -- "asiweb.cr_tp_documento"
         , PAR.ID
         , DOC.SQ_BAIXA::TEXT
    FROM ASIWEB.BP_BAIXA_DOC DOC
    LEFT JOIN PARCEIRO PAR ON PAR.CODIGO = DOC.CD_AGENTE
    ORDER BY DOC.SQ_BAIXA;

    DO $$ BEGIN RAISE NOTICE 'Criando a referencia documento/baixas de patrimonio...'; END$$;
    INSERT INTO public.baixadocumento
         ( id
         , baixa_id
         )
    SELECT DOC.ID
         , B.ID
    FROM PUBLIC.DOCUMENTO DOC 
    INNER JOIN PUBLIC.BAIXA B ON (B.CODIGO = DOC.CODIGO::NUMERIC)
    WHERE DOC.CODIGO IS NOT NULL
    ORDER BY DOC.CODIGO;

    -- DOCUMENTOS DAS BAIXAS
    DO $$
    BEGIN
      UPDATE DOCUMENTO SET CODIGO = NULL;
    EXCEPTION
      WHEN OTHERS THEN 
        NULL;
    END$$;
COMMIT; -- #FIM :: MOVIMENTACAO DE BAIXAS >> BAIXA


BEGIN;  -- #INI :: MIGRACAO DAS DEPRECIACOES >> DEPRECIACAO / DEPRECIACAOITEM

    DO $$ BEGIN RAISE NOTICE 'Desabilitando as constraints de depreciacao...'; END$$;
    ALTER TABLE depreciacao DROP CONSTRAINT fk_7ir0d4f00iv0d5k2tqnado80t;
    ALTER TABLE depreciacao DROP CONSTRAINT fk_7qj52csr4ussngholioxwf8ny;
    ALTER TABLE depreciacao DROP CONSTRAINT fk_ax8wlx3nuo622jni9tlkf05t4;
    ALTER TABLE depreciacao DROP CONSTRAINT fk_hxiqvyjv7su2fsn0b3hcmuirx;
    ALTER TABLE depreciacaoitem DROP CONSTRAINT fk_1fssswosq1k83ghlnq8efennr;
    ALTER TABLE depreciacaoitem DROP CONSTRAINT fk_2lv1atngy0npqsjbxvg2j0nd8;
    ALTER TABLE depreciacaoitem DROP CONSTRAINT fk_5dd5ba2uf8vd5im0j6wy73xue;
    ALTER TABLE depreciacaoitem DROP CONSTRAINT fk_6dt6ljs2kog9j0hrugj4jp1cq;
    ALTER TABLE depreciacaoitem DROP CONSTRAINT fk_e1qmf052vbg4kbym0c2rl0t9;
    ALTER TABLE depreciacaoitem DROP CONSTRAINT fk_flvqkobbb468h7m7twqpg27wm;

    DO $$ BEGIN RAISE NOTICE 'Adiconando a coluna [anomes] em depreciacaoitem...'; END$$;
    ALTER TABLE depreciacaoitem ADD COLUMN anomes char(6);
    
    DO $$ BEGIN RAISE NOTICE 'Criando os índices em depreciacaoitem...'; END$$;
    CREATE INDEX IX_DEPRECIACAO_ITEM  ON PUBLIC.DEPRECIACAOITEM USING BTREE (ANOMES, BEMPATRIMONIAL_ID);
    CREATE INDEX IX_DEPRECIACAO_CONTA ON PUBLIC.DEPRECIACAOITEM USING BTREE (ANOMES, CONTACONTABIL_ID);
    
    -- CRIAR INDICE EM CIMA DO MES E ID NO DEPRECIACAO ITEM
    -- CRIAR COMPO MESNAO NO DEPRECIACAO ITEM AO INSERIR
    
    DO $$ BEGIN RAISE NOTICE 'Importando os registros de depreciacao...'; END$$;
    INSERT INTO public.depreciacao
         ( id
         , datacriacao 
         , dataedicao
         , version
         , datadepreciacao
         , mesreferencia
    --   , qtitensnaodepreciadovlrresidual -- FAZER UPDATE DEPOIS PARA ISSO
         , organizacao_id           
         )
    SELECT NEXTVAL('hibernate_sequence')
         , LOCALTIMESTAMP
         , LOCALTIMESTAMP
         , 0
         , TO_DATE(D.DT_ANOMES_FECHAMENTO, 'YYYYMM') AS DATADEPRECIACAO
         , TO_DATE(D.DT_ANOMES_FECHAMENTO, 'YYYYMM') AS MESREFERENCIA
         , 1
    FROM ASIWEB.BP_DEPRECIACAO D 
    GROUP BY D.DT_ANOMES_FECHAMENTO
    ORDER BY D.DT_ANOMES_FECHAMENTO;

    DO $$ BEGIN RAISE NOTICE 'Importando os registros de depreciacaoitem...'; END$$;
    INSERT INTO public.depreciacaoitem
         ( id
         , datacriacao 
         , dataedicao
         , version
         , percentualnaodepreciavel
         , taxadepreciacao
         , valorbrutoatual
         , valorbrutocalculo
         , vldepreciacaoacumuladaanterior           
         , valordepreciacaoacumuladaatual
         , valordepreciacaoatual
         , valordepreciavel
         , valorliquidoanterior
         , valorliquidoatual
         , valorresidual
         , vidautilatual
         , vidautilrestanteanterior
         , vidautilrestanteatual
         , bempatrimonial_id    
         , contacontabil_id
         , depreciacao_id
         , anomes
         )
    SELECT NEXTVAL('hibernate_sequence')   AS id
         , DN.DATACRIACAO                  AS datacriacao 
         , DN.DATAEDICAO                   AS dataedicao
         , 0                               AS "version"
         , D.VL_PERCENT_NAO_DEPRECIAVEL    AS percentualnaodepreciavel
         , CASE WHEN D.VL_UNITARIO > 0 
             THEN (D.VL_DEPR_MENSAL/(D.VL_UNITARIO-D.VL_RESIDUAL))
             ELSE 0 
           END              AS taxa
         , ((D.VL_UNITARIO-D.VL_DEPR_ACUM)+D.VL_DEPR_MENSAL) AS valorbrutoatual
         , ((D.VL_UNITARIO-D.VL_DEPR_ACUM)+D.VL_DEPR_MENSAL) AS valorbrutocalculo
         , CASE WHEN D.VL_DEPR_MENSAL > 0 
             THEN (D.VL_DEPR_ACUM - D.VL_DEPR_MENSAL)
             ELSE D.VL_DEPR_ACUM 
           END              AS vldepreciacaoacumuladaanterior
         , D.VL_DEPR_ACUM   AS valordepreciacaoacumuladaatual
         , D.VL_DEPR_MENSAL AS valordepreciacaoatual
         , (D.VL_UNITARIO - D.VL_RESIDUAL) AS valordepreciavel
         , (D.VL_UNITARIO - D.VL_DEPR_ACUM + D.VL_DEPR_MENSAL) as valorliquidoanterior
         , (D.VL_UNITARIO-D.VL_DEPR_ACUM) AS valorliquidoatual
         , D.VL_RESIDUAL    AS valorresidual
         , D.NR_VIDA_UTIL   AS vidautilatual
         , CASE WHEN D.NR_MESES_DEPRECIADOS > 0
             THEN (D.NR_VIDA_UTIL - D.NR_MESES_DEPRECIADOS)+1 
             ELSE D.NR_VIDA_UTIL
           END              AS vidautilrestanteanterior
         , CASE WHEN D.NR_MESES_DEPRECIADOS > 0 
             THEN (D.NR_VIDA_UTIL - D.NR_MESES_DEPRECIADOS)
             ELSE D.NR_VIDA_UTIL 
           END              AS vidautilrestanteatual
         , B.ID             AS bempatrimonial_id
         , C.ID             AS contacontabil_id
         , DN.ID            AS depreciacao_id
         , D.DT_ANOMES_FECHAMENTO AS anomes
      FROM ASIWEB.BP_DEPRECIACAO D
      INNER JOIN PUBLIC.DEPRECIACAO DN ON (DN.MESREFERENCIA = TO_DATE(D.DT_ANOMES_FECHAMENTO, 'YYYYMM'))
      INNER JOIN PUBLIC.CONTACONTABIL C ON (C.CODIGO = D.CD_CONTA)
      INNER JOIN PUBLIC.BEMPATRIMONIAL B ON (B.CODIGO = D.SQ_BEM_PERM);
COMMIT; -- #FIM :: MIGRACAO DAS DEPRECIACOES >> DEPRECIACAO / DEPRECIACAOITEM

  
BEGIN;  -- #INI :: MIGRACAO REAVALIACAO\REDUCAO >> BEMPATRIMONIALALTERACAO E BEMPATRIMONIALALTERACAOITEM
    DO $$ 
    DECLARE      
      r RECORD;
      v_ccmId BIGINT;
      v_bemAlteracaoId BIGINT;
      v_motivoAltId BIGINT;
      v_campoVlrBrutoId BIGINT;
      v_campoVlrLiquidoId BIGINT;
      v_vidaUtilId BIGINT;
    BEGIN
            
      ALTER TABLE BEMPATRIMONIALALTERACAOITEM ADD COLUMN cd_conta_d VARCHAR(30);        

      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=3 INTO v_motivoAltId;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='campoReferencia' AND CODIGO= 2 INTO v_campoVlrBrutoId;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='campoReferencia' AND CODIGO=11 INTO v_campoVlrLiquidoId;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='campoReferencia' AND CODIGO= 1 INTO v_vidaUtilId;
    
      FOR r IN 
        SELECT 
          RE.DT_INCLUSAO    AS datainclusao,
          RE.DT_REAVALIACAO AS dataalteracao,
          BEM.ID            AS bempatrimonial_id,
          RE.ID_REAVALIACAO,
          RI.VL_BRUTO_O,
          RI.VL_BRUTO_D,
          RI.CD_CONTA,
          RI.VL_LIQUIDO,
          RI.VL_DEPR_ACUM,
          RI.NR_VIDA_UTIL_D,
          RI.NR_VIDA_UTIL_O
        FROM ASIWEB.BP_NOVA_REAVALIACAO RE
        INNER JOIN ASIWEB.BP_NOVA_REAVALIACAO_ITEM RI ON (RI.ID_REAVALIACAO = RE.ID_REAVALIACAO)
        INNER JOIN BEMPATRIMONIAL BEM ON (BEM.CODIGO = RI.SQ_BEM_PERM)
      LOOP

        -- RECUPERA A PROXIMA SEQUENCE
        SELECT NEXTVAL('hibernate_sequence') into v_ccmId;
        v_bemAlteracaoId = v_ccmId;
    
        INSERT INTO bempatrimonialalteracao
             ( id, 
               databloqueio, 
               datainativo, 
               datacriacao, 
               dataedicao, 
               version, 
               dataalteracao, 
               inativador_id, 
               autor_id, 
               editor_id, 
               organizacao_id, 
               bempatrimonial_id, 
               motivoalteracao_id            
             )
        VALUES
             ( v_ccmId,
               NULL,
               NULL,
               R.DATAINCLUSAO, 
               LOCALTIMESTAMP, 
               0, 
               r.DATAALTERACAO, 
               NULL,
               NULL,
               NULL,
               1, --ORGANIZACAO 
               r.BEMPATRIMONIAL_ID,             
               v_motivoAltId            
              );

        -- RECUPERA A PROXIMA SEQUENCE
        SELECT NEXTVAL('hibernate_sequence') INTO v_ccmId;

        INSERT INTO bempatrimonialalteracaoitem(
            id, 
            databloqueio, 
            datainativo, 
            datacriacao, 
            dataedicao, 
            version, 
            descricaocampo, 
            valoranterior, 
            valorarquivoanterior, 
            valorarquivoatualizado,
            valoratualizado, 
            inativador_id, 
            autor_id, 
            editor_id, 
            bempatrimonial_id, 
            bempatrimonialalteracao_id, 
            bempatrimalteracaoinativo_id, 
            campoalterado_id,
            cd_conta_d
        )VALUES(
            v_ccmId,
            NULL,
            NULL,
            R.DATAINCLUSAO,
            LOCALTIMESTAMP,
            0,
            NULL,
            TO_CHAR(R.VL_BRUTO_O, '9999999990D9999'),
            NULL,
            NULL,
            TO_CHAR(R.VL_BRUTO_D, '9999999990D9999'),
            NULL,
            NULL,
            NULL,
            R.BEMPATRIMONIAL_ID,
            v_bemAlteracaoId,
            null,
            v_campoVlrBrutoId,
            R.CD_CONTA
        );
        
        -- RECUPERA A PROXIMA SEQUENCE
        SELECT NEXTVAL('hibernate_sequence') INTO v_ccmId;

        INSERT INTO bempatrimonialalteracaoitem(
            id, 
            databloqueio, 
            datainativo, 
            datacriacao, 
            dataedicao, 
            version, 
            descricaocampo, 
            valoranterior, 
            valorarquivoanterior, 
            valorarquivoatualizado,
            valoratualizado, 
            inativador_id, 
            autor_id, 
            editor_id, 
            bempatrimonial_id, 
            bempatrimonialalteracao_id, 
            bempatrimalteracaoinativo_id, 
            campoalterado_id,
            cd_conta_d
        )VALUES(
            v_ccmId,
            NULL,
            NULL,
            R.DATAINCLUSAO,
            LOCALTIMESTAMP,
            0,
            NULL,
            TO_CHAR(R.VL_LIQUIDO, '9999999990D9999'),
            NULL,
            NULL,
            TO_CHAR((R.VL_BRUTO_D-R.VL_DEPR_ACUM), '9999999990D9999'),
            NULL,
            NULL,
            NULL,
            R.BEMPATRIMONIAL_ID,
            v_bemAlteracaoId,
            null,
            v_campoVlrLiquidoId,
            R.CD_CONTA
        );    

        -- RECUPERA A PROXIMA SEQUENCE
        SELECT NEXTVAL('hibernate_sequence') INTO v_ccmId;        

        INSERT INTO bempatrimonialalteracaoitem(
            id, 
            databloqueio, 
            datainativo, 
            datacriacao, 
            dataedicao, 
            version, 
            descricaocampo, 
            valoranterior, 
            valorarquivoanterior, 
            valorarquivoatualizado,
            valoratualizado, 
            inativador_id, 
            autor_id, 
            editor_id, 
            bempatrimonial_id, 
            bempatrimonialalteracao_id, 
            bempatrimalteracaoinativo_id, 
            campoalterado_id,
            cd_conta_d
        )VALUES(
            v_ccmId,
            NULL,
            NULL,
            R.DATAINCLUSAO,
            LOCALTIMESTAMP,
            0,
            NULL,
            TO_CHAR(R.NR_VIDA_UTIL_O, '9999999990D9999'),
            NULL,
            NULL,
            TO_CHAR(R.NR_VIDA_UTIL_D, '9999999990D9999'),
            NULL,
            NULL,
            NULL,
            R.BEMPATRIMONIAL_ID,
            v_bemAlteracaoId,
            null,
            v_vidaUtilId,
            R.CD_CONTA
        );
    END LOOP;
    END$$;  
COMMIT; -- #FIM :: MIGRACAO REAVALIACAO\REDUCAO >> BEMPATRIMONIALALTERACAO E BEMPATRIMONIALALTERACAOITEM 


BEGIN;  -- DELETO AS CONSTRAINTS DAS TABELAS DE MOVIMENTO PARA FICAR MAIS RAPIDO (AO FINAL DOS INSERTS ELAS SAO CRIADAS NOVAMENTE)
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_114dqtx1g4ja80nkdqrw0ej0t;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_2yfuukmqt1uyv7r0c9dc20xiw;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_72shgmt8caaldg2m0kw2cvbhj;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_8q85bxfuhk0f536ndy3y876xl;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_blt6cqdh6lonms89du3m5wug8;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_c2crmvotnfof8iv19h96qdn1h;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_dpuxwhj1qoinbsbdem8hvey5l;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_ixxyf53r9ft0t2tjgttwhq12r;
    ALTER TABLE contacontabilmovimento DROP CONSTRAINT fk_tltd08eva1hdwc3h7jlwjws4j;
    ALTER TABLE contacontabilmovpatrimonio DROP CONSTRAINT fk_1rrslp97ar7119a4fjw9h8xq7;
    ALTER TABLE contacontabilmovpatrimonio DROP CONSTRAINT fk_1uaukjmyd9srei1s6l3sueu9r;
    ALTER TABLE contacontabilmovpatrimonio DROP CONSTRAINT fk_qu9isdu7h3l1dabu9n9l2klab;    
COMMIT; -- DELETO AS CONSTRAINTS DAS TABELAS DE MOVIMENTO PARA FICAR MAIS RAPIDO (AO FINAL DOS INSERTS ELAS SAO CRIADAS NOVAMENTE)


-- #INI :: MIGRACAO DE MOVIMENTOS DE ENTRADA >> CONTACONTABILMOVIMENTO E CONTACONTABILMOVPATRIMONIO
    DO $$ 
    DECLARE      
      r RECORD;
      v_ccmId BIGINT;
      v_tipoEntradaOrcamentaria BIGINT;
      v_tipoMovimentoEntradaOrcamentaria BIGINT;
      v_tipoMovimentoEntradaExtraOrcamentaria BIGINT;
    BEGIN

      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoEntrada' AND CODIGO = 1 INTO v_tipoEntradaOrcamentaria; 
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMovimentoContaContabil' AND CODIGO = 1 INTO v_tipoMovimentoEntradaOrcamentaria;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMovimentoContaContabil' AND CODIGO = 3 INTO v_tipoMovimentoEntradaExtraOrcamentaria;

      FOR r IN 
        SELECT E.DATACONTABIL AS datareferencia
             , I.VALORUNITARIO
             , (SELECT ID FROM CONTACONTABIL WHERE DESCRICAO = 'BENS MÓVEIS EM ESTOQUE' LIMIT 1) AS CONTACONTABIL_ID
             , CASE 
                 WHEN E.DOMINIOTIPOENTRADA_ID = v_tipoEntradaOrcamentaria THEN v_tipoMovimentoEntradaOrcamentaria
                 ELSE v_tipoMovimentoEntradaExtraOrcamentaria
               END    AS tipomovimentocontacontabil_id
             , E.ID   AS ENTRADA_ID
             , BEM.ID AS BEMPATRIMONIAL_ID
          FROM PUBLIC.BEMPATRIMONIAL BEM
         INNER JOIN PUBLIC.ENTRADAPATRIMONIOITEM I ON (BEM.ENTRADAITEM_ID = I.ID)
         INNER JOIN PUBLIC.ENTRADA E ON (E.ID = I.ENTRADA_ID)
         WHERE E.DATACONTABIL IS NOT NULL
        ORDER BY E.ID
      LOOP

        -- RECUPERA A PROXIMA SEQUENCE
        SELECT NEXTVAL('hibernate_sequence') INTO v_ccmId;

        INSERT INTO public.contacontabilmovimento
             (
               id
             , datacriacao
             , dataedicao
             , version
             , datareferencia
             , valor
             , contacontabil_id
             , tipomovimentocontacontabil_id
             , entrada_id
             )
        VALUES
             (
                v_ccmId
              , LOCALTIMESTAMP
              , LOCALTIMESTAMP
              , 0
              , r.datareferencia
              , r.valorunitario
              , r.contacontabil_id
              , r.tipomovimentocontacontabil_id
              , r.entrada_id
             );
        
        INSERT INTO public.contacontabilmovpatrimonio
             (
               id
             , reavaliacao
             , valordepreciacao
             , valorreavaliacao
             , valorreducao
             , bempatrimonial_id
             , transferencia_id
             )
        VALUES
             (
               v_ccmId
             , FALSE
             , 0
             , 0
             , 0
             , r.BEMPATRIMONIAL_ID
             , NULL
             );
      END LOOP;
    END$$;
-- #FIM :: MIGRACAO DE MOVIMENTOS DE ENTRADA >> CONTACONTABILMOVIMENTO E CONTACONTABILMOVPATRIMONIO


-- #INI :: MIGRACAO DAS TRANSFERENCIAS INTERNAS >> CONTACONTABILMOVIMENTO E CONTACONTABILMOVPATRIMONIO
    DO $$
    DECLARE
      r        RECORD;
      v_moventoorcamentaria BIGINT;
      v_moventextraorcamentaria    BIGINT;
      v_tipoEntradaOrcamentaria BIGINT;
      v_tipoEntradaExtraOrcamentaria BIGINT;
      v_movsai BIGINT;
      v_movsaiOrc BIGINT;
      v_movsaiExtraOrc BIGINT;
      v_movent BIGINT;
      v_contad BIGINT;
      v_contae BIGINT;
      v_ccm_id BIGINT;
      v_cdconta CHARACTER VARYING(10);
    BEGIN
      -- RECUPERA O ID DO DOMINIO ENTRADA EXTRA-ORCAMENTARIA
      SELECT ID INTO v_moventoorcamentaria
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 1;
         
      -- RECUPERA O ID DO DOMINIO ENTRADA EXTRA-ORCAMENTARIA
      SELECT ID INTO v_moventextraorcamentaria
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 3;         
         
      SELECT ID INTO v_tipoEntradaOrcamentaria
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoEntrada' 
         AND CODIGO = 1;                       
 
      -- RECUPERA O ID DO DOMINIO BAIXA EXTRA-ORCAMENTARIA
      SELECT ID INTO v_movsaiOrc
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 2;

      -- RECUPERA O ID DO DOMINIO BAIXA ORCAMENTARIA
      SELECT ID INTO v_movsaiExtraOrc
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 4;                 

      -- RECUPERA O ID DO DOMINIO BAIXA EXTRA-ORCAMENTARIA
      SELECT ID INTO v_movsai
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 2;         

      -- RECUPERA O ID DA CONTA CONTACONTABIL ESTOQUE
      SELECT ID, CODIGO INTO v_contae, v_cdconta
        FROM PUBLIC.CONTACONTABIL 
       WHERE DESCRICAO = 'BENS MÓVEIS EM ESTOQUE' LIMIT 1;
 
      -- RECUPERA AS TRANSFERENCIAS DO ALMOXARIFADO
      FOR r IN 
        SELECT T.REFERENCIAVIGENTE, TI.VL_UNITARIO, TI.CD_CONTA_D, B.ID AS ID_BEM, T.ID AS ID_TRANSF, TI.ID, E.DOMINIOTIPOENTRADA_ID
        FROM TRANSFERENCIA T 
        INNER JOIN TRANSFERENCIAITEM TI ON (TI.TRANSFERENCIA_ID = T.ID) 
        INNER JOIN BEMPATRIMONIAL B ON (B.ID = TI.BEMPATRIMONIAL_ID)   
        INNER JOIN ENTRADAPATRIMONIOITEM EI ON (EI.ID = B.ENTRADAITEM_ID)
        INNER JOIN ENTRADA E ON (E.ID = EI.ENTRADA_ID)  
        INNER JOIN ESTRUTURAORGANIZACIONAL EO ON (EO.ID = TI.UNIDADEORIGEM_ID)
        WHERE TI.CD_CONTA = v_cdconta
      LOOP

        -- RECUPERA O ID DA CONTA CONTACONTABIL DESTINO
        SELECT ID INTO v_contad
          FROM PUBLIC.CONTACONTABIL 
         WHERE CODIGO = r.CD_CONTA_D;

        IF (v_contad IS NOT NULL) THEN
          -- RECUPERA O ID DO MOVIMENTO
          SELECT NEXTVAL('hibernate_sequence') INTO v_ccm_id;
 
          IF (r.DOMINIOTIPOENTRADA_ID = v_tipoEntradaOrcamentaria) THEN
            v_movent = v_moventoorcamentaria;            
          ELSE
            v_movent = v_moventextraorcamentaria;            
          END IF;          

          --SAIDA E SEMPRE EXTRAORCAMENTARIA
          v_movsai = v_movsaiExtraOrc;

          -- INSERE MOVIMENTO DE ENTRADA NA CONTA DESTINO
          INSERT INTO public.contacontabilmovimento
               ( id, datacriacao, dataedicao, version, datareferencia,
                 valor, contacontabil_id, tipomovimentocontacontabil_id,
                 entrada_id, transferenciaconta_id, bempatrimonial_id, transferencia_id )
          VALUES 
               ( v_ccm_id, LOCALTIMESTAMP, LOCALTIMESTAMP, 0, r.REFERENCIAVIGENTE,
                 r.VL_UNITARIO, v_contad, v_movent,
                 NULL, NULL, r.ID_BEM, r.ID_TRANSF );

          -- INSERE AS REFERENCIAS DA TRANSFERENCIA DE PATRIMONIO
          INSERT INTO public.contacontabilmovpatrimonio
               ( id, bempatrimonial_id, transferencia_id )               
          VALUES 
               ( v_ccm_id, r.ID_BEM, r.ID_TRANSF );
        ELSE
          RAISE NOTICE 'Transferência sem conta destino (%)', r.ID;
        END IF;

        IF (v_contae IS NOT NULL) THEN
          -- RECUPERA O ID DO MOVIMENTO
          SELECT NEXTVAL('hibernate_sequence') INTO v_ccm_id;

          -- INSERE MOVIMENTO DE SAIDA DA CONTA ESTOQUE
          INSERT INTO public.contacontabilmovimento
               ( id, datacriacao, dataedicao, version, datareferencia,
                 valor, contacontabil_id, tipomovimentocontacontabil_id,
                 entrada_id, transferenciaconta_id, bempatrimonial_id, transferencia_id )
          VALUES 
               ( v_ccm_id, LOCALTIMESTAMP, LOCALTIMESTAMP, 0, r.REFERENCIAVIGENTE,
                 -r.VL_UNITARIO, v_contae, v_movsai,
                 NULL, NULL, r.ID_BEM, r.ID_TRANSF );

          -- INSERE AS REFERENCIAS DA TRANSFERENCIA DE PATRIMONIO
          INSERT INTO public.contacontabilmovpatrimonio
               ( id, bempatrimonial_id, transferencia_id )               
          VALUES 
               ( v_ccm_id, r.ID_BEM, r.ID_TRANSF );
        ELSE
          RAISE NOTICE 'Transferência sem conta origem (%)', r.ID;
        END IF;
         
        v_contad := NULL;

      END LOOP;
    END$$;
    --Maquina Ju 1,711
-- #FIM :: MIGRACAO DAS TRANSFERENCIAS INTERNAS >> CONTACONTABILMOVIMENTO E CONTACONTABILMOVPATRIMONIO


-- #INI :: MIGRACAO DAS BAIXAS >> CONTACONTABILMOVIMENTO E CONTACONTABILMOVPATRIMONIO
    DO $$
    DECLARE
      r        RECORD;
      v_movent BIGINT;
      v_movsai BIGINT;
      v_ccm_id BIGINT;            
    BEGIN
      -- RECUPERA O ID DO DOMINIO ENTRADA ORCAMENTARIA
      SELECT ID INTO v_movent
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 1;
 
       -- RECUPERA O ID DO DOMINIO BAIXA ORCAMENTARIA
      SELECT ID INTO v_movsai
        FROM PUBLIC.DOMINIO 
       WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 2;
 
      -- RECUPERA AS BAIXAS DE PATRIMONIO
      FOR r IN 
        SELECT B.DATACONTABILIZACAO, BI.DATAESTORNO, BI.VL_UNITARIO, CC.ID AS ID_CTA, B.ID, BEM.ID AS BEMPATRIMONIAL_ID, COALESCE(DI.VALORDEPRECIACAOACUMULADAATUAL, 0) AS DEPRECIACAOACUMULADA
        FROM BAIXAPATRIMONIO B 
        INNER JOIN BAIXAPATRIMONIOITEM BI ON (BI.BAIXA_ID = B.ID) 
        INNER JOIN BEMPATRIMONIAL BEM ON (BEM.ID = BI.BEMPATRIMONIAL_ID)
        LEFT JOIN DEPRECIACAOITEM DI ON (DI.BEMPATRIMONIAL_ID = BEM.ID AND ANOMES = TO_CHAR(B.DATACONTABILIZACAO, 'YYYYMM'))
        INNER JOIN CONTACONTABIL CC ON (CC.CODIGO = BI.CONTA_CONTABIL_O)
      LOOP

    
        --> SAIDAS DA CONTA CONTABIL ORIGEM
        IF (v_movent IS NOT NULL) AND (v_movsai IS NOT NULL) THEN                  

          SELECT NEXTVAL('hibernate_sequence') INTO v_ccm_id;      
      
          INSERT INTO public.contacontabilmovimento
               ( id, datacriacao, dataedicao, version, datareferencia, 
             valor, contacontabil_id, tipomovimentocontacontabil_id, 
             baixa_id )
          VALUES
               ( v_ccm_id, LOCALTIMESTAMP, LOCALTIMESTAMP, 0, r.DATACONTABILIZACAO,
             -r.VL_UNITARIO, r.ID_CTA, v_movsai, r.ID );

          INSERT INTO public.contacontabilmovpatrimonio
               ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id)
          VALUES
               ( v_ccm_id, -R.DEPRECIACAOACUMULADA, 0, 0, R.BEMPATRIMONIAL_ID );                           

          -- O ASI CONSIDERA UMA BAIXA ESTORNADA COMO UMA ENTRADA
          -- REGISTRAMOS SAIDA DE TODAS AS BAIXA E ENTRADA SOMENTE
          -- DAS BAIXAS ESTORNADAS
          IF (r.DATAESTORNO IS NOT NULL) THEN
                SELECT NEXTVAL('hibernate_sequence') INTO v_ccm_id;                    
        
            INSERT INTO public.contacontabilmovimento
             ( id, datacriacao, dataedicao, version, datareferencia, 
               valor, contacontabil_id, tipomovimentocontacontabil_id, 
               baixa_id )
            VALUES
             ( v_ccm_id, LOCALTIMESTAMP, LOCALTIMESTAMP, 0, r.DATAESTORNO,
               r.VL_UNITARIO, r.ID_CTA, v_movent, r.ID );

          INSERT INTO public.contacontabilmovpatrimonio
               ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id)
          VALUES
               ( v_ccm_id, R.DEPRECIACAOACUMULADA, 0, 0, R.BEMPATRIMONIAL_ID );                       
          END IF;
        END IF;
      END LOOP;
    END$$;    
-- #FIM :: MIGRACAO DAS BAIXAS >> CONTACONTABILMOVIMENTO E CONTACONTABILMOVPATRIMONIO


-- #INI :: MIGRACAO DAS TRANSFERENCIAS ENTRE CONTAS >> CONTACONTABILMOVIMENTO
    DO $$
    DECLARE
      r     RECORD;
      v_valDepreciacaoAcumulada NUMERIC(10,4);
      v_movsai BIGINT;
      v_movent BIGINT;
      v_ccmId  BIGINT;
    BEGIN

      -- RECUPERA O ID DO DOMINIO ENTRADA EXTRA-ORCAMENTARIA
    SELECT ID INTO v_movent
        FROM PUBLIC.DOMINIO 
    WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 3;    

      -- RECUPERA O ID DO DOMINIO ENTRADA EXTRA-ORCAMENTARIA
    SELECT ID INTO v_movsai
        FROM PUBLIC.DOMINIO 
    WHERE CHAVE  = 'tipoMovimentoContaContabil' 
         AND CODIGO = 4;             

    FOR r in
        SELECT        
            TN.DATACRIACAO,        
            TN.DATATRANSFERENCIA,
            TN.VALORTRANSFERENCIA,
            TN.CONTAORIGEM_ID,    
            TN.CONTADESTINO_ID,
            CO.CODIGO AS CODIGOCONTAORIGEM,
            CD.CODIGO AS CODIGOCONTADESTINO,    
            TN.ID AS TRANSFERENCIACONTA_ID
        FROM PUBLIC.TRANSFERENCIACONTACONTABIL TN
        INNER JOIN CONTACONTABIL CO ON (CO.ID = TN.CONTAORIGEM_ID)
        INNER JOIN CONTACONTABIL CD ON (CD.ID = TN.CONTADESTINO_ID)
    LOOP

    
        SELECT NEXTVAL('hibernate_sequence') INTO v_ccmId;

        --> SAIDAS DA CONTA CONTABIL
        INSERT INTO public.contacontabilmovimento
        (     id,
            datacriacao, 
            dataedicao, 
            version, 
            datareferencia, 
            valor,             
            contacontabil_id, 
            tipomovimentocontacontabil_id, 
            entrada_id,
            baixa_id,
            transferenciaconta_id
        )
        VALUES
        (
            v_ccmId,
            R.datacriacao, 
            LOCALTIMESTAMP,
            0,
            R.DATATRANSFERENCIA,
            -R.VALORTRANSFERENCIA,
            R.CONTAORIGEM_ID,
            v_movsai,
            NULL,
            NULL,
            R.TRANSFERENCIACONTA_ID
        );

        SELECT SUM(VL_DEPR_ACUM) FROM ASIWEB.BP_DEPRECIACAO WHERE DT_ANOMES_FECHAMENTO = TO_CHAR(R.DATATRANSFERENCIA, 'YYYYMM') AND CD_CONTA = R.CODIGOCONTAORIGEM INTO v_valDepreciacaoAcumulada;

        IF (v_valDepreciacaoAcumulada IS NULL) THEN
            v_valDepreciacaoAcumulada = 0;
        END IF;
        
        INSERT INTO public.contacontabilmovpatrimonio
        ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id)
        VALUES
        ( v_ccmId, -v_valDepreciacaoAcumulada, 0, 0, NULL );     

        SELECT NEXTVAL('hibernate_sequence') INTO v_ccmId;

        --> ENTRADAS DA CONTA CONTABIL
        INSERT INTO public.contacontabilmovimento
        (   id,
            datacriacao, 
            dataedicao, 
            version, 
            datareferencia, 
            valor,             
            contacontabil_id, 
            tipomovimentocontacontabil_id, 
            entrada_id,
            baixa_id,
            transferenciaconta_id
        )
        VALUES
        (
            v_ccmId,
            R.datacriacao, 
            LOCALTIMESTAMP,
            0,
            R.DATATRANSFERENCIA,
            R.VALORTRANSFERENCIA,
            R.CONTADESTINO_ID,
            v_movent,
            NULL,
            NULL,
            R.TRANSFERENCIACONTA_ID
        );

        INSERT INTO public.contacontabilmovpatrimonio
        ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id)
        VALUES
        ( v_ccmId, v_valDepreciacaoAcumulada, 0, 0, NULL );         
        
    END LOOP;
   END$$;   
-- #FIM :: MIGRACAO DAS TRANSFERENCIAS ENTRE CONTAS >> CONTACONTABILMOVIMENTO


-- #INI :: MIGRACAO DAS REAVALIACOES\REDUCOES >> CONTACONTABILMOVIMENTO e CONTACONTABILMOVPATRIMONIO
    DO $$ 
    DECLARE
        r        RECORD;
        v_movent BIGINT;
        v_movsai BIGINT;
        v_ccm_id BIGINT;
        v_classeRefAlteracao BIGINT;
        v_valAnterior numeric;
        v_valAtual numeric;
        v_valReducao numeric;
        v_valReavaliacao numeric;
        v_campoVlrBrutoId BIGINT;
    BEGIN
        -- RECUPERA O ID DO DOMINIO ENTRADA EXTRA-ORCAMENTARIA
        SELECT ID INTO v_movent
          FROM PUBLIC.DOMINIO 
         WHERE CHAVE  = 'tipoMovimentoContaContabil' 
           AND CODIGO = 3;
        
         -- RECUPERA O ID DO DOMINIO BAIXA EXTRA ORCAMENTARIA
        SELECT ID INTO v_movsai
          FROM PUBLIC.DOMINIO 
         WHERE CHAVE  = 'tipoMovimentoContaContabil' 
           AND CODIGO = 4;
        
        SELECT ID INTO v_classeRefAlteracao
          FROM PUBLIC.DOMINIO 
         WHERE CHAVE  = 'classeReferencia' 
           AND CODIGO = 8;         
        
        SELECT ID INTO v_campoVlrBrutoId
          FROM PUBLIC.DOMINIO 
         WHERE CHAVE  = 'campoReferencia' 
           AND CODIGO = 2;         
        
        -- RECUPERA AS REAVALICOES\REDUCOES
        FOR r IN 
            SELECT AI.ID AS ID, AI.BEMPATRIMONIAL_ID, A.DATAALTERACAO, AI.VALORANTERIOR, AI.VALORATUALIZADO, CC.ID AS CONTACONTABIL_ID, DI.VALORDEPRECIACAOACUMULADAATUAL AS DEPRECIACAOACUMULADA
             FROM BEMPATRIMONIALALTERACAOITEM AI       
             INNER JOIN BEMPATRIMONIALALTERACAO A ON (A.ID = AI.BEMPATRIMONIALALTERACAO_ID)          
             INNER JOIN BEMPATRIMONIAL BEM ON (BEM.ID = AI.BEMPATRIMONIAL_ID)
             INNER JOIN DEPRECIACAOITEM DI ON (DI.BEMPATRIMONIAL_ID = BEM.ID AND DI.ANOMES = TO_CHAR(A.DATAALTERACAO, 'YYYYMM'))
             INNER JOIN CONTACONTABIL CC ON (CC.CODIGO = AI.CD_CONTA_D)
             WHERE CAMPOALTERADO_ID = v_campoVlrBrutoId
        LOOP
            v_valAnterior = to_number(r.VALORANTERIOR, '9999999990D9999');
            v_valAtual = to_number(r.VALORATUALIZADO, '9999999990D9999');
            
            IF (v_valAnterior > v_valAtual) THEN
                v_valReducao = v_valAnterior - v_valAtual;    
                v_valReavaliacao = 0;        
            ELSE
                v_valReavaliacao = v_valAtual - v_valAnterior;
                v_valReducao = 0;        
            END IF;

            --> LANCAMENTO DE SAIDA DO CONTACONTABILMOVIMENTO 
            SELECT NEXTVAL('hibernate_sequence') INTO v_ccm_id;

            INSERT INTO public.contacontabilmovimento
                 ( id, datacriacao, dataedicao, version, datareferencia,
                   valor, contacontabil_id, tipomovimentocontacontabil_id,
                   idclassereferencia, dominioclassereferencia_id )
            VALUES
                 ( v_ccm_id, LOCALTIMESTAMP, LOCALTIMESTAMP, 0, r.DATAALTERACAO,
                   -v_valAnterior, r.CONTACONTABIL_ID, v_movsai, r.ID, v_classeRefAlteracao);
                   
            --> LANCAMENTO DE SAIDA DO CONTACONTABILMOVPATRIMONIO
            IF (v_valReducao > 0) THEN
                INSERT INTO public.contacontabilmovpatrimonio
                     ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id, reavaliacao)
                VALUES
                     ( v_ccm_id, 0, 0, -v_valReducao, R.BEMPATRIMONIAL_ID, true);
            ELSE
                INSERT INTO public.contacontabilmovpatrimonio
                     ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id, reavaliacao)
                VALUES
                     ( v_ccm_id, 0, 0, 0, R.BEMPATRIMONIAL_ID, true);
            END IF;

            SELECT NEXTVAL('hibernate_sequence') INTO v_ccm_id;
            
            --> LANCAMENTO DE ENTRADA DO CONTACONTABILMOVIMENTO
            INSERT INTO public.contacontabilmovimento
                 ( id, datacriacao, dataedicao, version, datareferencia, 
                   valor, contacontabil_id, tipomovimentocontacontabil_id, 
                   idclassereferencia, dominioclassereferencia_id )
            VALUES
                 ( v_ccm_id, LOCALTIMESTAMP, LOCALTIMESTAMP, 0, r.DATAALTERACAO,
                   v_valAtual, r.CONTACONTABIL_ID, v_movent, r.ID, v_classeRefAlteracao);
            
            --> LANCAMENTO DE ENTRADA DO CONTACONTABILMOVPATRIMONIO
            IF (v_valReavaliacao > 0) THEN
            INSERT INTO public.contacontabilmovpatrimonio
                 ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id, reavaliacao)
            VALUES
                 ( v_ccm_id, R.DEPRECIACAOACUMULADA, v_valReavaliacao, 0, R.BEMPATRIMONIAL_ID, true);                                       
            ELSE
            INSERT INTO public.contacontabilmovpatrimonio
                 ( id, valordepreciacao, valorreavaliacao, valorreducao, bempatrimonial_id, reavaliacao)
            VALUES
                 ( v_ccm_id, R.DEPRECIACAOACUMULADA, 0, 0, R.BEMPATRIMONIAL_ID, true);                           
            END IF;
        END LOOP;
    END$$;
-- #FIM :: MIGRACAO DAS REAVALIACOES\REDUCOES >> CONTACONTABILMOVIMENTO e CONTACONTABILMOVPATRIMONIO


BEGIN;  --CRIO NOVAMENTE AS CONSTRAINTS DAS TABELAS DE MOVIMENTO
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_tltd08eva1hdwc3h7jlwjws4j FOREIGN KEY (editor_id)
          REFERENCES seguranca_usuario (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_ixxyf53r9ft0t2tjgttwhq12r FOREIGN KEY (entrada_id)
          REFERENCES entrada (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_dpuxwhj1qoinbsbdem8hvey5l FOREIGN KEY (inativador_id)
          REFERENCES seguranca_usuario (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
          
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_c2crmvotnfof8iv19h96qdn1h FOREIGN KEY (dominioclassereferencia_id)
          REFERENCES dominio (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_blt6cqdh6lonms89du3m5wug8 FOREIGN KEY (tipomovimentocontacontabil_id)
          REFERENCES dominio (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_8q85bxfuhk0f536ndy3y876xl FOREIGN KEY (contacontabil_id)
          REFERENCES contacontabil (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_72shgmt8caaldg2m0kw2cvbhj FOREIGN KEY (autor_id)
          REFERENCES seguranca_usuario (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_114dqtx1g4ja80nkdqrw0ej0t FOREIGN KEY (transferenciaconta_id)
          REFERENCES transferenciacontacontabil (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovimento
      ADD CONSTRAINT fk_2yfuukmqt1uyv7r0c9dc20xiw FOREIGN KEY (baixa_id)
          REFERENCES baixa (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
          
    ALTER TABLE contacontabilmovpatrimonio
      ADD CONSTRAINT fk_qu9isdu7h3l1dabu9n9l2klab FOREIGN KEY (transferencia_id)
          REFERENCES transferencia (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovpatrimonio
      ADD CONSTRAINT fk_1rrslp97ar7119a4fjw9h8xq7 FOREIGN KEY (bempatrimonial_id)
          REFERENCES bempatrimonial (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
    
    ALTER TABLE contacontabilmovpatrimonio
      ADD CONSTRAINT fk_1uaukjmyd9srei1s6l3sueu9r FOREIGN KEY (id)
          REFERENCES contacontabilmovimento (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;    
COMMIT; --CRIO NOVAMENTE AS CONSTRAINTS DAS TABELAS DE MOVIMENTO


BEGIN;  --CRIO AS CONSTRAINTS DE DEPRECIACAOITEM NOVAMENTE
    ALTER TABLE depreciacao
        ADD CONSTRAINT fk_7ir0d4f00iv0d5k2tqnado80t FOREIGN KEY (organizacao_id)
        REFERENCES organizacao (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;
    
        ALTER TABLE depreciacao
        ADD CONSTRAINT fk_7qj52csr4ussngholioxwf8ny FOREIGN KEY (autor_id)
            REFERENCES seguranca_usuario (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
        ALTER TABLE depreciacao
        ADD CONSTRAINT fk_ax8wlx3nuo622jni9tlkf05t4 FOREIGN KEY (editor_id)
        REFERENCES seguranca_usuario (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
        ALTER TABLE depreciacao
        ADD CONSTRAINT fk_hxiqvyjv7su2fsn0b3hcmuirx FOREIGN KEY (inativador_id)
        REFERENCES seguranca_usuario (id) MATCH SIMPLE
        ON UPDATE NO ACTION ON DELETE NO ACTION;        
    
    ALTER TABLE depreciacaoitem
      ADD CONSTRAINT fk_flvqkobbb468h7m7twqpg27wm FOREIGN KEY (bempatrimonial_id)
          REFERENCES bempatrimonial (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
    ALTER TABLE depreciacaoitem
      ADD CONSTRAINT fk_e1qmf052vbg4kbym0c2rl0t9 FOREIGN KEY (autor_id)
          REFERENCES seguranca_usuario (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
    ALTER TABLE depreciacaoitem
      ADD CONSTRAINT fk_6dt6ljs2kog9j0hrugj4jp1cq FOREIGN KEY (editor_id)
          REFERENCES seguranca_usuario (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
    ALTER TABLE depreciacaoitem
      ADD CONSTRAINT fk_5dd5ba2uf8vd5im0j6wy73xue FOREIGN KEY (depreciacao_id)
          REFERENCES depreciacao (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
    ALTER TABLE depreciacaoitem
      ADD CONSTRAINT fk_2lv1atngy0npqsjbxvg2j0nd8 FOREIGN KEY (contacontabil_id)
          REFERENCES contacontabil (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;    
    
    ALTER TABLE depreciacaoitem
      ADD CONSTRAINT fk_1fssswosq1k83ghlnq8efennr FOREIGN KEY (inativador_id)
          REFERENCES seguranca_usuario (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION;
COMMIT; --CRIO AS CONSTRAINTS DE DEPRECIACAOITEM NOVAMENTE


BEGIN;  -- #INI :: GERACAO DO HISTORICO DOS BENS PATRIMONIAIS >> HISTORICOBEMPATRIMONIAL
    /*
     ======================================
     SCRIPT QUE GERA HISTORICOS DO BEM
     ======================================
    */
    ALTER TABLE historicobempatrimonial ALTER COLUMN descricao TYPE character varying(400);

    DO $$
    DECLARE
      hist_alteracao int;
      hist_entrada int;
      hist_baixa int;
      hist_adicao_bem int;
      hist_transf_interna int;      
      hist_atribuir_detentor int;

      mot_ajuste int;
      mot_atual_monetaria int;
      mot_reavaliacao int;
      mot_inventario int;
      mot_depreciacao int;
      mot_incorporacao int;
      mot_inicio_baixa int;
      mot_baixa int;
      mot_baixa_nao_autorizada int;
      mot_status_na_baixa int;
      mot_transf_bem_principal int;
      mot_transf_interna int;
      mot_detentor_bem_principal int;
      mot_responsavel_bem_principal int;
      mot_atribuicao_bem_principal int;
      mot_atribuicao_bens int;
      mot_estorno_baixa int;
      mot_estorno_item_baixa int;
      mot_exclusao_baixa int;
      mot_exclusao_item_baixa int;
      mot_definicao_detentor int;
      mot_exclusao_bem_vinculado int;
      mot_exclusao_vinculo int;
      mot_exclusao_detentor_desvinculo int;
      mot_exclusao_responsavel_desvinculo int;
      mot_definicao_responsavel int;
      mot_saida_temporaria int;
      mot_transf_detentor int;
      mot_exclusao_detentor_atrib_bem int;
      mot_exclusao_resp_atrib_bem int;
      mot_retorno_saida int;
      mot_exclusao_resp_detentor_nao_resp int;
      mot_contabilizacao int;
      mot_descontabilizacao int;
      classeId int;

      bens_filhos varchar;
      adicao record;
      adicaoitem record;
    BEGIN
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoHistorico' AND CODIGO=1 INTO hist_alteracao;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoHistorico' AND CODIGO=2 INTO hist_entrada;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoHistorico' AND CODIGO=3 INTO hist_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoHistorico' AND CODIGO=4 INTO hist_adicao_bem;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoHistorico' AND CODIGO=5 INTO hist_transf_interna;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoHistorico' AND CODIGO=6 INTO hist_atribuir_detentor;

      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=1 INTO mot_ajuste;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=2 INTO mot_atual_monetaria;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=3 INTO mot_reavaliacao;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=4 INTO mot_inventario;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=5 INTO mot_depreciacao;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=6 INTO mot_incorporacao;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=7 INTO mot_inicio_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=8 INTO mot_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=9 INTO mot_baixa_nao_autorizada;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=10 INTO mot_status_na_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=11 INTO mot_transf_bem_principal;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=12 INTO mot_transf_interna;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=13 INTO mot_detentor_bem_principal;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=14 INTO mot_responsavel_bem_principal;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=15 INTO mot_atribuicao_bem_principal;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=16 INTO mot_atribuicao_bens;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=17 INTO mot_estorno_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=18 INTO mot_estorno_item_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=19 INTO mot_exclusao_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=20 INTO mot_exclusao_item_baixa;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=21 INTO mot_definicao_detentor;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=22 INTO mot_exclusao_bem_vinculado;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=23 INTO mot_exclusao_vinculo;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=24 INTO mot_exclusao_detentor_desvinculo;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=25 INTO mot_exclusao_responsavel_desvinculo;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=26 INTO mot_definicao_responsavel;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=27 INTO mot_saida_temporaria;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=28 INTO mot_transf_detentor;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=29 INTO mot_exclusao_detentor_atrib_bem;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=30 INTO mot_exclusao_resp_atrib_bem;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=31 INTO mot_retorno_saida;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=32 INTO mot_exclusao_resp_detentor_nao_resp;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=33 INTO mot_contabilizacao;
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='tipoMotivoAlteracaoBem' AND CODIGO=34 INTO mot_descontabilizacao;
      
      SELECT ID FROM PUBLIC.DOMINIO WHERE CHAVE='classeReferencia' AND CODIGO=1 INTO classeId;
      
      INSERT INTO public.historicobempatrimonial
           ( id,
            datacriacao, 
            dataedicao, 
            version, 
            descricao, 
            valoranterior, 
            valornovo, 
            numeroprocesso,
            dataoperacao,
            organizacao_id,
            bempatrimonial_id,
            dominiotipohistorico_id,
            dominiotipomotivoalteracao_id,
            dominioclassereferencia_id,
            idClasseReferencia
           )
      SELECT 
            NEXTVAL('hibernate_sequence'),
            LOCALTIMESTAMP,
            LOCALTIMESTAMP,
            0,
            'Entrada em: '||TO_CHAR(E.DATARECEBIMENTO, 'dd/MM/YYYY')||' - Estrutura organizacional: '||eo.codigo||' - '||eo.nome||' – Número Patrimonial: '||b.numeropatrimonial||' - '||m.descricao as descricao,
            null as valoranterior,
            b.numeropatrimonial as valornovo,    
            null as numeroprocesso,
            e.datarecebimento as dataoperacao,
            1 as organizacao_id,
            b.id,
            hist_entrada,
            mot_incorporacao,
            classeId,
            E.ID
        FROM ENTRADA E
        INNER JOIN ENTRADAPATRIMONIO EP ON (EP.ID = E.ID)
        INNER JOIN ENTRADAPATRIMONIOITEM I ON (I.ENTRADA_ID = E.ID)
        INNER JOIN ESTRUTURAORGANIZACIONAL EO ON (EO.ID = EP.ESTRUTURAORGANIZACIONAL_ID)
        INNER JOIN BEMPATRIMONIAL B ON (B.ENTRADAITEM_ID = I.ID)
        INNER JOIN MATERIAL M ON (M.ID = B.MATERIAL_ID)
        ORDER BY E.ID;
        
        INSERT INTO public.historicobempatrimonial
           (
            id,
            datacriacao, 
            dataedicao, 
            version, 
            descricao, 
            valoranterior, 
            valornovo, 
            numeroprocesso,
            dataoperacao,
            organizacao_id,
            bempatrimonial_id,
            dominiotipohistorico_id,
            dominiotipomotivoalteracao_id,
            dominioclassereferencia_id,
            idClasseReferencia          
           )
      SELECT 
            NEXTVAL('hibernate_sequence'),
            LOCALTIMESTAMP,
            LOCALTIMESTAMP,
            0,
            'Contabilização realizada em: '||TO_CHAR(E.DATACONTABIL, 'dd/MM/YYYY') as descricao,
            null as valoranterior,
            TO_CHAR(E.DATACONTABIL, 'dd/MM/YYYY') as valornovo,    
            null as numeroprocesso,
            e.datacontabil as dataoperacao,
            1 as organizacao_id,
            b.id,
            hist_entrada,
            mot_contabilizacao,
            classeId,
            E.ID
        FROM ENTRADA E
        INNER JOIN ENTRADAPATRIMONIOITEM I ON (I.ENTRADA_ID = E.ID)
        INNER JOIN BEMPATRIMONIAL B ON (B.ENTRADAITEM_ID = I.ID)
        WHERE E.DATACONTABIL IS NOT null
        ORDER BY E.ID;

        select ID FROM PUBLIC.DOMINIO WHERE CHAVE='classeReferencia' AND CODIGO=2 INTO classeId;
        
        INSERT INTO public.historicobempatrimonial
        (   ID,
            datacriacao, 
            dataedicao, 
            version, 
            descricao, 
            valoranterior, 
            valornovo, 
            numeroprocesso,
            dataoperacao,
            organizacao_id,
            bempatrimonial_id,
            dominiotipohistorico_id,
            dominiotipomotivoalteracao_id,
            dominioclassereferencia_id,
            idClasseReferencia          
        )
        SELECT 
            NEXTVAL('hibernate_sequence'),
            LOCALTIMESTAMP,
            LOCALTIMESTAMP,
            0,
            'Processo de Baixa autorizado' as descricao,
            (SELECT NOME FROM PUBLIC.DOMINIO WHERE ID = bem.dominiostatus_id) as valoranterior,
            (SELECT NOME FROM PUBLIC.DOMINIO WHERE ID = bem.dominiostatus_id) as valornovo,    
            null as numeroprocesso,
            bp.datacontabilizacao as dataoperacao,
            1 as organizacao_id,
            bem.id,
            hist_baixa,
            mot_baixa,
            classeId,
            B.ID
        FROM BAIXA B
        INNER JOIN BAIXAPATRIMONIO BP ON (BP.ID = B.ID)
        INNER JOIN BAIXAPATRIMONIOITEM I ON (I.BAIXA_ID = BP.ID)
        INNER JOIN BEMPATRIMONIAL BEM ON (BEM.ID = I.BEMPATRIMONIAL_ID);

        select ID FROM PUBLIC.DOMINIO WHERE CHAVE='classeReferencia' AND CODIGO=3 INTO classeId;        
        
        INSERT INTO public.historicobempatrimonial
        (
            ID,
            datacriacao, 
            dataedicao, 
            version, 
            descricao, 
            valoranterior, 
            valornovo, 
            numeroprocesso,
            dataoperacao,
            organizacao_id,
            bempatrimonial_id,
            dominiotipohistorico_id,
            dominiotipomotivoalteracao_id,
            dominioclassereferencia_id,
            idClasseReferencia          
        )
        select 
            NEXTVAL('hibernate_sequence'),
            LOCALTIMESTAMP,
            LOCALTIMESTAMP,
            0,
            'Transferência foi realizada em: '||to_char(t.datatransferencia, 'dd/MM/YYYY')||' - Nova Estrutura Organizacional: '||ed.codigo||' - '||ed.nome||
            (CASE WHEN termo.id IS NOT NULL THEN ' - Número do Termo: '||termo.numerotermo ELSE '' END) as descricao,
            eo.nome as valoranterior,
            ed.nome as valornovo,    
            null as numeroprocesso,
            t.datatransferencia as dataoperacao,
            1 as organizacao_id,
            i.bempatrimonial_id,
            hist_transf_interna,
            mot_transf_interna,
            classeId,
            t.id
        from transferencia t
        inner join transferenciaitem i on (i.transferencia_id = t.id)
        inner join estruturaorganizacional ed on (ed.id = t.unidadedestino_id)
        inner join estruturaorganizacional eo on (eo.id = i.unidadeorigem_id)
        left join termoresponsabilidade termo on (termo.transferencia_id = t.id AND termo.unidadeorigem_id = i.unidadeorigem_id);

        select ID FROM PUBLIC.DOMINIO WHERE CHAVE='classeReferencia' AND CODIGO=10 INTO classeId;
        
        INSERT INTO public.historicobempatrimonial
        (    ID,
            datacriacao, 
            dataedicao, 
            version, 
            descricao, 
            valoranterior, 
            valornovo, 
            numeroprocesso,
            dataoperacao,
            organizacao_id,
            bempatrimonial_id,
            dominiotipohistorico_id,
            dominiotipomotivoalteracao_id,
            dominioclassereferencia_id,
            idClasseReferencia          
        )
        select 
            NEXTVAL('hibernate_sequence'),
            LOCALTIMESTAMP,
            LOCALTIMESTAMP,
            0,
            'Novo Detentor: '||p.nome||(CASE WHEN d.datafimatribuicao IS NOT NULL THEN (' atribuído para o período '||to_char(d.dataatribuicao, 'dd/MM/YYYY')||' a '||to_char(d.datafimatribuicao, 'dd/MM/YYYY')) ELSE '' END) as descricao,
            null as valoranterior,
            p.nome as valornovo,    
            null as numeroprocesso,
            di.dataatribuicao as dataoperacao,
            1 as organizacao_id,
            di.bempatrimonial_id,
            hist_atribuir_detentor,
            mot_definicao_detentor,
            classeId,
            d.id
        from definicaodetentor d
        inner join definicaodetentoritem di on (di.definicaodetentor_id = d.id)        
        inner join parceiro par on (par.id = d.colaborador_id)
        inner join pessoa p on (p.id = par.pessoa_id);

        select ID FROM PUBLIC.DOMINIO WHERE CHAVE='classeReferencia' AND CODIGO=9 INTO classeId;
        --saida temporaria
        INSERT INTO public.historicobempatrimonial
        (    ID,
            datacriacao, 
            dataedicao, 
            version, 
            descricao, 
            valoranterior, 
            valornovo, 
            numeroprocesso,
            dataoperacao,
            organizacao_id,
            bempatrimonial_id,
            dominiotipohistorico_id,
            dominiotipomotivoalteracao_id,
            dominioclassereferencia_id,
            idClasseReferencia          
        )
        select 
            NEXTVAL('hibernate_sequence'),
            LOCALTIMESTAMP,
            LOCALTIMESTAMP,
            0,
            'Bem está em saída temporária com o objetivo: '||objetivo.descricao||'.'||CASE WHEN s.previsaoretorno is null then ' Sem previsão de retorno' else ' Data Prevista para Retorno: '||to_char(s.previsaoretorno, 'FMDD "de" Month "de" YYYY') end||'.'  as descricao,
            NULL as valoranterior,
            null as valornovo,    
            null as numeroprocesso,
            s.datasaida as dataoperacao,
            1 as organizacao_id,
            bem.id,
            hist_alteracao as tipo_historico,
            mot_saida_temporaria as motivo_historico,
            classeId,
            s.id
        from saidatemporaria s
        inner join saidatemporariaitem si on (si.saidatemporaria_id = s.id)        
        inner join bempatrimonial bem on (bem.id = si.bempatrimonial_id)
        inner join dominio objetivo on (objetivo.id = s.dominiotipoobjetivo_id); 
        
        INSERT INTO public.historicobempatrimonial
        (    ID,
            datacriacao, 
            dataedicao, 
            version, 
            descricao, 
            valoranterior, 
            valornovo, 
            numeroprocesso,
            dataoperacao,
            organizacao_id,
            bempatrimonial_id,
            dominiotipohistorico_id,
            dominiotipomotivoalteracao_id, 
            dominioclassereferencia_id,
            idClasseReferencia          
        )
        select 
            NEXTVAL('hibernate_sequence'),
            LOCALTIMESTAMP,
            LOCALTIMESTAMP,
            0,
            'Alteração do status do bem devido ao retorno de saída temporária.'  as descricao,
            NULL as valoranterior,
            null as valornovo,    
            null as numeroprocesso,
            si.dataretorno as dataoperacao,
            1 as organizacao_id,
            bem.id,
            hist_alteracao as tipo_historico,
            mot_retorno_saida as motivo_historico,
            classeId,
            s.id
        from saidatemporaria s
        inner join saidatemporariaitem si on (si.saidatemporaria_id = s.id)        
        inner join bempatrimonial bem on (bem.id = si.bempatrimonial_id)
        inner join dominio status on (status.id = bem.dominiostatus_id)
        where si.dataretorno is not null;         

        FOR adicao IN SELECT * FROM ADICAOBEMPRINCIPAL loop

            for adicaoitem in select * from adicaobemprincipalitem loop
                bens_filhos = (select numeropatrimonial from bempatrimonial where id = adicaoitem.bempatrimonial_id)||' - '||(select material.descricao from material material inner join bempatrimonial bem on bem.material_id = material.id where bem.id = adicaoitem.bempatrimonial_id)||', ';
            end loop;

            select ID FROM PUBLIC.DOMINIO WHERE CHAVE='classeReferencia' AND CODIGO=11 INTO classeId;
            
            bens_filhos = substring(bens_filhos from 1  for (char_length(bens_filhos)-2));
            
            INSERT INTO public.historicobempatrimonial
            (    ID,
                datacriacao, 
                dataedicao, 
                version, 
                descricao, 
                valoranterior, 
                valornovo, 
                numeroprocesso,
                dataoperacao,
                organizacao_id,
                bempatrimonial_id,
                dominiotipohistorico_id,
                dominiotipomotivoalteracao_id,
                dominioclassereferencia_id,
                idClasseReferencia              
            )
            select 
                NEXTVAL('hibernate_sequence'),
                LOCALTIMESTAMP,
                LOCALTIMESTAMP,
                0,
                'Atribuição de bens filhos. Números Patrimoniais: '||bens_filhos,
                null as valoranterior,
                null as valornovo,    
                null as numeroprocesso,
                a.datacriacao as dataoperacao,
                1 as organizacao_id,
                a.bempatrimonial_id,
                hist_adicao_bem,
                mot_atribuicao_bens,
                classeId,
                a.id
            FROM ADICAOBEMPRINCIPAL A
            WHERE A.ID = ADICAO.ID;

            INSERT INTO public.historicobempatrimonial
            (    ID,
                datacriacao, 
                dataedicao, 
                version, 
                descricao, 
                valoranterior, 
                valornovo, 
                numeroprocesso,
                dataoperacao,
                organizacao_id,
                bempatrimonial_id,
                dominiotipohistorico_id,
                dominiotipomotivoalteracao_id,
                dominioclassereferencia_id,
                idClasseReferencia              
            )
            select 
                NEXTVAL('hibernate_sequence'),
                LOCALTIMESTAMP,
                LOCALTIMESTAMP,
                0,
                'Bem Principal: '||(select numeropatrimonial from bempatrimonial where id = a.bempatrimonial_id)||' - '||(select material.descricao from material material inner join bempatrimonial bem on bem.material_id = material.id where bem.id = a.bempatrimonial_id) as descricao,
                null as valoranterior,
                (select numeropatrimonial from bempatrimonial where id = a.bempatrimonial_id) as valornovo,    
                null as numeroprocesso,
                i.datareferencia as dataoperacao,
                1 as organizacao_id,
                i.bempatrimonial_id,
                hist_adicao_bem,
                mot_atribuicao_bem_principal,
                classeId,
                a.id
            FROM ADICAOBEMPRINCIPAL A
            INNER JOIN ADICAOBEMPRINCIPALITEM I ON (I.ADICAOBEMPRINCIPAL_ID = A.ID)
            WHERE A.ID = ADICAO.ID;            

        END LOOP;
      
    END$$;
    --Maquina Ju 1,85 min
COMMIT; -- #FIM :: GERACAO DO HISTORICO DOS BENS PATRIMONIAIS >> HISTORICOBEMPATRIMONIAL


--===========================================================================--
-- ##FIM :: IMPORTACAO TABELAS DE MOVIMENTO DE MATERIAS PERMANENTES          --
--===========================================================================--