GAECO-7378

    0

    0

    Otávio Coelho

    do
    language plpgsql
    $$
    begin
      
      -- Insere em estoque_sisbov os brincos que possuem bnd e estão com animais
      insert into public.estoque_sisbov
      (status, implantations_id, users_id, sent, dt_entrada, valor, ano, animais_id, codigo, codigo_manejo, digito, propriedade_id, propriedade_produtor_id, empresa_certificadora_id)
      with cte_estoque_sisbov as(
      select
        id,
        implantations_id, 
        replace((to_char(es.codigo, '00000000'::text) || to_char(es.codigo_manejo, '000000'::text)) || to_char(es.digito, '0'::text), ' '::text, ''::text) sisbov
      from estoque_sisbov es
      )
      select 
      distinct on (a.sisbov)
      1 as status,
      coalesce(b.implantations_id, a.implantations_id) as implantations_id,
      1 as users_id,
      'N' as sent,
      extract(epoch from clock_timestamp()) as dt_entrada,
      0 as valor,
      0 as ano,
      a.id as animais_id,
      substring (coalesce(b.sisbov, a.sisbov)  from 1 for 8)::int8 as codigo,
      substring (coalesce(b.sisbov, a.sisbov) from 9 for 6)::int8 as codigo_manejo,
      substring (coalesce(b.sisbov, a.sisbov) from 15 for 1)::int4 as digito,
      coalesce(b.propriedade_id, a.propriedade_id) as propriedade_id,
      b.propriedade_produtor_id,
      b.certificadora_id
      from animais a 
      left join cte_estoque_sisbov on cte_estoque_sisbov.sisbov = a.sisbov and a.implantations_id = cte_estoque_sisbov.implantations_id
      left join bnd b on b.sisbov = a.sisbov and b.implantations_id = a.implantations_id 
      where cte_estoque_sisbov.sisbov is null 
      and a.sisbov is not null 
      and b.id is not null
      and b.status = 1
      order by a.sisbov desc
      on conflict do nothing;
    
      -- Insere em estoque_sisbov os brincos que possuem bnd e não estão com animais
      insert into public.estoque_sisbov
      (status, implantations_id, users_id, sent, dt_entrada, valor, ano, codigo, codigo_manejo, digito, propriedade_id, propriedade_produtor_id, empresa_certificadora_id)
      select 
      1 as status,
      b.implantations_id,
      1 as users_id,
      'N' as sent,
      extract(epoch from clock_timestamp()) as dt_entrada,
      0 as valor,
      0 as ano,
      substring (b.sisbov from 1 for 8)::int8 as codigo,
      substring (b.sisbov from 9 for 6)::int8 as codigo_manejo,
      substring (b.sisbov from 15 for 1)::int4 as digito,
      b.propriedade_id as propriedade_id,
      b.propriedade_produtor_id,
      b.certificadora_id
      from bnd b 
      left join view_estoque_sisbov ves on ves.sisbov = b.sisbov 
      where b.status = 1
      and ves.id is null
      on conflict do nothing;
      
      --Atualiza os animais com status -3 (morto) para resolver o problema do chamado	
      update estoque_sisbov 
      set animais_id = 1302700000001 
      where codigo = substring ('105520388547038' from 1 for 8)::int8
      and codigo_manejo = substring ('105520388547038' from 9 for 6)::int8
      and digito = substring ('105520388547038' from 15 for 1)::int4;
      update estoque_sisbov 
      set animais_id = 1264100000001 
      where codigo = substring ('105520388547291' from 1 for 8)::int8
      and codigo_manejo = substring ('105520388547291' from 9 for 6)::int8
      and digito = substring ('105520388547291' from 15 for 1)::int4;
    
      --Verifica e insere registros de documentos de saida (morte) para evitar problemas futuros
      insert into public.estoque_sisbov
      (status, implantations_id, users_id, sent, dt_entrada, valor, ano, animais_id, codigo, codigo_manejo, digito, propriedade_id, propriedade_produtor_id)
      select 
      1 as status,
      a.implantations_id,
      1 as users_id,
      'N' as sent,
      extract(epoch from clock_timestamp()) as dt_entrada,
      0 as valor,
      0 as ano,
      a.id as animais_id,
      substring (a.sisbov from 1 for 8)::int8 as codigo,
      substring (a.sisbov from 9 for 6)::int8 as codigo_manejo,
      substring (a.sisbov from 15 for 1)::int4 as digito,
      a.propriedade_id as propriedade_id,
      pp.id 
      from animais a
      join documento d on d.id = a.documento_saida_id and d.implantations_id = a.implantations_id and d.status = 1
      join comunicado_morte cm on d.comunicado_morte_id = cm.id  and cm.status = 1
      left join view_estoque_sisbov ves on ves.sisbov = a.sisbov and a.id = ves.animais_id 
      left join propriedade_produtores pp on pp.propriedade_id = a.propriedade_id
      where a.status = ANY (ARRAY[-3, -7]) and ves.id is null
      on conflict do nothing;
    
      --Insere animais ativos que não possuem sisbov em estoque_sisbov, ignorando os que derem erro
      with cte_values as (
      select 
        ves.id,
        1 as status,
        a.implantations_id,
        1 as users_id,
        'N' as sent,
        extract(epoch from clock_timestamp()) as dt_entrada,
        0 as valor,
        0 as ano,
        a.id as animais_id,
        substring (a.sisbov from 1 for 8)::int8 as codigo,
        substring (a.sisbov from 9 for 6)::int8 as codigo_manejo,
        substring (a.sisbov from 15 for 1)::int4 as digito,
        a.propriedade_id as propriedade_id
      from animais a 
      left join view_estoque_sisbov ves on ves.sisbov = a.sisbov 
      where a.status = 1 and a.sisbov is not null
      and ves.animais_id is null and ves.id is null
      )
      insert into public.estoque_sisbov
      (status, implantations_id, users_id, sent, dt_entrada, valor, ano, animais_id, codigo, codigo_manejo, digito, propriedade_id, propriedade_produtor_id)
      select 
      distinct on (animais_id)
      cte_values.status,
      cte_values.implantations_id,
      cte_values.users_id,
      cte_values.sent,
      cte_values.dt_entrada,
      cte_values.valor,
      cte_values.ano,
      cte_values.animais_id,
      cte_values.codigo,
      cte_values.codigo_manejo,
      cte_values.digito,
      cte_values.propriedade_id,
      pp.id
      from cte_values
      left join propriedade_produtores pp on pp.propriedade_id = cte_values.propriedade_id
      on conflict do nothing ;
    
      --Atualiza animais_id (animal status = 1) da tabela estoque_sisbov nos quais já possuem o sisbov registrado
      with cte_values as (
      select 
        ves.id,
        1 as status,
        a.implantations_id,
        1 as users_id,
        'N' as sent,
        extract(epoch from clock_timestamp()) as dt_entrada,
        0 as valor,
        0 as ano,
        a.id as animais_id,
        substring (a.sisbov from 1 for 8)::int8 as codigo,
        substring (a.sisbov from 9 for 6)::int8 as codigo_manejo,
        substring (a.sisbov from 15 for 1)::int4 as digito,
        a.propriedade_id as propriedade_id
      from animais a 
      left join view_estoque_sisbov ves on ves.sisbov = a.sisbov 
      where a.status = 1 and a.sisbov is not null
      and ves.animais_id is null and ves.id is not null
      )
      UPDATE estoque_sisbov es
      SET animais_id = cte_values.animais_id
      FROM cte_values
      WHERE es.id = cte_values.id;
      
    end;
    $$
    Codiga Logo
    Codiga Hub
    • Rulesets
    • Playground
    • Snippets
    • Cookbooks
    soc-2 icon

    We are SOC-2 Compliance Certified

    G2 high performer medal

    Codiga – All rights reserved 2022.