diff --git a/models/intermediate/core/int_estoque__material_relacao_remume_por_estabelecimento.sql b/models/intermediate/core/int_estoque__material_relacao_remume_por_estabelecimento.sql index 4ce0d08d..3862a620 100644 --- a/models/intermediate/core/int_estoque__material_relacao_remume_por_estabelecimento.sql +++ b/models/intermediate/core/int_estoque__material_relacao_remume_por_estabelecimento.sql @@ -1,6 +1,11 @@ with - -- Sources - remume as (select * from {{ ref("raw_sheets__material_remume") }}), + -- Sources + remume as ( + select * + from {{ ref("raw_sheets__material_remume") }} + where + remume_grupo = "Atenção Básica - Medicamentos" or remume_grupo = "Hospital" -- só mostrar medicamentos por enquanto + ), estabelecimento as ( select * @@ -8,7 +13,6 @@ with where prontuario_estoque_tem_dado = "sim" -- só mostrar unidade que usam o modulo de estoque do prontuario ), - -- Unidades de Saúde combinacao_estabelecimento_remume as ( select @@ -29,11 +33,8 @@ with or id_cnes in unnest(estabelecimento_disponibilidade) ), - -- TPC - remume_distintos as ( - select distinct id_material from remume - ), + remume_distintos as (select distinct id_material from remume), relacao_remume_tpc as ( select @@ -45,7 +46,8 @@ with from remume_distintos as remume ) -select * from relacao_remume_unidades +select * +from relacao_remume_unidades union all -select * from relacao_remume_tpc - +select * +from relacao_remume_tpc diff --git a/models/intermediate/core/int_estoque__posicao_hoje_vitacare_com_zerados_remume.sql b/models/intermediate/core/int_estoque__posicao_hoje_vitacare_com_zerados_remume.sql index 7f03c4af..b4c4b82d 100644 --- a/models/intermediate/core/int_estoque__posicao_hoje_vitacare_com_zerados_remume.sql +++ b/models/intermediate/core/int_estoque__posicao_hoje_vitacare_com_zerados_remume.sql @@ -1,13 +1,60 @@ -- posicao do dia de hoje adicionado os materiais remume que estão zerados - with --- source - posicao_atual as (select * from {{ ref('raw_prontuario_vitacare__estoque_posicao') }} where - data_particao = current_date()) + -- source + posicao_atual as ( + select * + from {{ ref("raw_prontuario_vitacare__estoque_posicao") }} + where data_particao = current_date() + ), + + materiais as (select * from {{ ref("dim_material") }}), + -- relacão de unidades que posição de estoque na data atual + unidades_vitacare_com_posicao_atual as ( + select distinct id_cnes from posicao_atual + ), --- remume + -- relação de itens remume por estabelecimento + remume as ( + select remume.* + from + {{ ref("int_estoque__material_relacao_remume_por_estabelecimento") }} + as remume + left join unidades_vitacare_com_posicao_atual as est on remume.id_cnes = est.id_cnes + where est.id_cnes is not null + ), + -- Filtra as posições zeradas + posicao_zeradas as ( + select remume.id_material, remume.id_cnes, 0 as material_quantidade, + from remume + left join posicao_atual on remume.id_material = posicao_atual.id_material + where posicao_atual.id_material is null + ), + -- Transforma as posições zeradas na mesma estrutura da posição atual + posicao_zeradas_estruturada as ( + select + "" as id_estoque_posicao, + "" as area_programatica, + pz.id_cnes, + "" as id_lote, + pz.id_material, + "" as id_atc, + "" as estabelecimento_nome, + cast(null as date) as lote_data_cadastro, + cast(null as date) as lote_data_vencimento, + mat.nome as material_descricao, + pz.material_quantidade, + current_date() as data_particao, + current_datetime() as data_ingestao, + from posicao_zeradas as pz + left join materiais as mat on pz.id_material = mat.id_material + ) -select * from posicao_atual \ No newline at end of file +-- Une os itens zerados com a posição atual +select * +from posicao_atual +union all +select * +from posicao_zeradas_estruturada diff --git a/models/intermediate/core/int_estoque__posicao_hoje_vitai_com_zerados_remume.sql b/models/intermediate/core/int_estoque__posicao_hoje_vitai_com_zerados_remume.sql index e69de29b..a0f593bd 100644 --- a/models/intermediate/core/int_estoque__posicao_hoje_vitai_com_zerados_remume.sql +++ b/models/intermediate/core/int_estoque__posicao_hoje_vitai_com_zerados_remume.sql @@ -0,0 +1,62 @@ +-- posicao do dia de hoje adicionado os materiais remume que estão zerados + +with + -- source + posicao_atual as ( + select * + from {{ ref("raw_prontuario_vitai__estoque_posicao") }} + where data_particao = current_date() + ), + + materiais as (select * from {{ ref("dim_material") }}), + + -- relacão de unidades que posição de estoque na data atual + unidades_vitai_com_posicao_atual as ( + select distinct id_cnes from posicao_atual + ), + + -- relação de itens remume por estabelecimento + remume as ( + select remume.* + from + {{ ref("int_estoque__material_relacao_remume_por_estabelecimento") }} + as remume + left join unidades_vitai_com_posicao_atual as est on remume.id_cnes = est.id_cnes + where est.id_cnes is not null + ), + + -- Filtra as posições zeradas + posicao_zeradas as ( + select remume.id_material, remume.id_cnes, 0 as material_quantidade, + from remume + left join posicao_atual on remume.id_material = posicao_atual.id_material + where posicao_atual.id_material is null + ), + + -- Transforma as posições zeradas na mesma estrutura da posição atual + posicao_zeradas_estruturada as ( + select + pz.id_cnes, + "" as id_lote, + pz.id_material, + "" as estoque_secao, + mat.nome as material_descricao, + mat.unidade as material_unidade, + cast(null as date) as lote_data_vencimento, + pz.material_quantidade, + 0 as material_valor_unitario, + 0 as material_valor_total, + current_date() as data_particao, + current_datetime() as data_snapshot, + current_datetime() as data_carga, + from posicao_zeradas as pz + left join materiais as mat on pz.id_material = mat.id_material + ) + +-- Une os itens zerados com a posição atual +select * +from posicao_atual +union all +select * +from posicao_zeradas_estruturada +where lote_data_vencimento is not null diff --git a/models/intermediate/estoque/int_estoque__dispensacao_media_mensal.sql b/models/intermediate/estoque/int_estoque__dispensacao_media_mensal.sql index 439bdf2a..55c2dec1 100644 --- a/models/intermediate/estoque/int_estoque__dispensacao_media_mensal.sql +++ b/models/intermediate/estoque/int_estoque__dispensacao_media_mensal.sql @@ -1,5 +1,5 @@ select id_cnes, id_material, avg(quantidade_dispensada) as quantidade, from {{ ref("int_estoque__dispensacao_serie_historica_com_outliers_identificados") }} -where outlier = "nao" +where outlier = "nao" group by id_cnes, id_material order by id_cnes, id_material diff --git a/models/marts/core/facts/fct_estoque_posicao.sql b/models/marts/core/facts/fct_estoque_posicao.sql index 192f5d6f..45b0e72d 100644 --- a/models/marts/core/facts/fct_estoque_posicao.sql +++ b/models/marts/core/facts/fct_estoque_posicao.sql @@ -10,26 +10,49 @@ ) }} -# TODO: subtituir .tipo por .tipo - with + -- sources + --- Vitacare + vitacare_atual as ( + select * from {{ ref("int_estoque__posicao_hoje_vitacare_com_zerados_remume") }} + ), + vitacare_dias_anteriores as ( + select * + from {{ ref("raw_prontuario_vitacare__estoque_posicao") }} + where data_particao < current_date() + ), - remume as (select * from {{ ref('int_estoque__material_relacao_remume_por_estabelecimento') }}), - - -- importar a posicao vitacare - -- juntar posicao remume com seu respectivo prontuario - -- ajustar os campos nullos da remume na tabela de posicao - -- re-apontar o posicao_vitacare_final para a tabela de posicao ajustada + vitacare_completa as ( + select * from vitacare_atual + union all + select * from vitacare_dias_anteriores + ), + --- Vitai + vitai_atual as ( + select * from {{ ref("int_estoque__posicao_hoje_vitai_com_zerados_remume") }} + ), + vitai_dias_anteriores as ( + select * + from {{ ref("raw_prontuario_vitai__estoque_posicao") }} + where data_particao < current_date() + ), + + vitai_completa as ( + select * from vitai_atual + union all + select * from vitai_dias_anteriores + ), - posicao_vitacare_final as ( + -- constroi a posicação para cada source + posicao_vitacare as ( select estoque.id_cnes, estoque.id_lote, estoque.id_material, "" as estoque_secao, estoque.material_descricao, - "" as material_unidade, --payload da viticare não possui esta informação + "" as material_unidade, -- payload da viticare não possui esta informação estoque.lote_data_vencimento, estoque.material_quantidade, if( @@ -49,11 +72,11 @@ with estabelecimento.tipo as estabelecimento_tipo, estabelecimento.tipo_sms as estabelecimento_tipo_sms, estabelecimento.area_programatica as estabelecimento_area_programatica, - from {{ ref("raw_prontuario_vitacare__estoque_posicao") }} as estoque + from vitacare_completa as estoque left join {{ ref("dim_estabelecimento") }} as estabelecimento using (id_cnes) left join - {{ ref("int_estoque__material_valor_unitario_tpc") }} - as valor_unitario using (id_material) + {{ ref("int_estoque__material_valor_unitario_tpc") }} as valor_unitario + using (id_material) ), posicao_vitai as ( @@ -63,7 +86,7 @@ with estabelecimento.tipo as estabelecimento_tipo, estabelecimento.tipo_sms as estabelecimento_tipo_sms, estabelecimento.area_programatica as estabelecimento_area_programatica, - from {{ ref("raw_prontuario_vitai__estoque_posicao") }} as estoque + from vitai_completa as estoque left join {{ ref("dim_estabelecimento") }} as estabelecimento using (id_cnes) ), @@ -86,7 +109,17 @@ with from posicao_tpc union all select * - from posicao_vitacare_final + from posicao_vitacare + ), + + posicao_consolidada_com_remume as ( + select pos.*, + if(remume.id_material is null, "nao", "sim") as material_remume, + from posicao_consolidada as pos + left join {{ ref("int_estoque__material_relacao_remume_por_estabelecimento") }} as remume + on pos.id_cnes = remume.id_cnes + and pos.id_material = remume.id_material + ) select @@ -107,6 +140,7 @@ select end as id_curva_abc, -- Common Fields + material_remume, estoque_secao, material_descricao, material_unidade, @@ -120,4 +154,4 @@ select data_particao, data_snapshot, data_carga, -from posicao_consolidada +from posicao_consolidada_com_remume diff --git a/models/marts/estoque/mart_estoque__posicao_atual.sql b/models/marts/estoque/mart_estoque__posicao_atual.sql index e7201bde..58885d1f 100644 --- a/models/marts/estoque/mart_estoque__posicao_atual.sql +++ b/models/marts/estoque/mart_estoque__posicao_atual.sql @@ -124,6 +124,7 @@ select estabelecimento_administracao, estabelecimento_responsavel_sms, abc_categoria, + material_remume, material_descricao2 as material_descricao, material_unidade, material_cadastro_esta_correto, diff --git a/models/raw/prontuario_vitai/raw_prontuario_vitai__estoque_posicao.sql b/models/raw/prontuario_vitai/raw_prontuario_vitai__estoque_posicao.sql index c90d3339..57c7c7c9 100644 --- a/models/raw/prontuario_vitai/raw_prontuario_vitai__estoque_posicao.sql +++ b/models/raw/prontuario_vitai/raw_prontuario_vitai__estoque_posicao.sql @@ -10,10 +10,53 @@ }, ) }} +-- source +with + source as ( + select * from {{ source("brutos_prontuario_vitai_staging", "estoque_posicao") }} + ), + + -- fix mudança no formato dos campos de data de Date para Datetime + source_2023 as ( + select + *, + safe_cast( + safe_cast(datavencimento as datetime) as date + ) as lote_data_vencimento, + safe_cast(datahora as datetime) as data_snapshot, + from source + where data_particao <= '2023-12-31' + ), + + source_2024 as ( + select + *, + safe_cast( + datetime( + parse_timestamp('%Y-%m-%dT%H:%M:%E*S%Ez', datavencimento), + 'UTC-03:00' + ) as date + ) as lote_data_vencimento, + safe_cast( + datetime( + parse_timestamp('%Y-%m-%dT%H:%M:%E*S%Ez', datahora), + 'UTC-03:00' + ) as datetime + ) as data_snapshot, + from source + where data_particao > '2023-12-31' + ), + + source_merged as ( + select * + from source_2023 + union all + select * + from source_2024 + ) select -- Primary Key - -- Foreign Keys safe_cast(cnes as string) as id_cnes, safe_cast(lote as string) as id_lote, @@ -25,7 +68,7 @@ select safe_cast(secao as string) as estoque_secao, safe_cast(descricao as string) as material_descricao, safe_cast(apresentacao as string) as material_unidade, - safe_cast(safe_cast(datavencimento as datetime) as date) as lote_data_vencimento, + safe_cast(lote_data_vencimento as date) as lote_data_vencimento, safe_cast(saldo as float64) as material_quantidade, safe_cast(valormedio as float64) as material_valor_unitario, safe_cast(valormedio as float64) @@ -33,15 +76,17 @@ select -- metadata safe_cast(data_particao as date) as data_particao, - safe_cast(datahora as datetime) as data_snapshot, + data_snapshot, safe_cast(_data_carga as datetime) as data_carga, -from {{ source("brutos_prontuario_vitai_staging", "estoque_posicao") }} - -where cnes <> "2970619" -- Centro Carioca dos Olhos +from source_merged -{% if is_incremental() %} +where + cnes <> "2970619" -- Centro Carioca dos Olhos + + {% if is_incremental() %} - and safe_cast(data_particao as date) > (select max(data_particao) from {{ this }}) + and safe_cast(data_particao as date) + > (select max(data_particao) from {{ this }}) -{% endif %} + {% endif %} diff --git a/profiles.yml b/profiles.yml index 947adcde..d07eebe9 100644 --- a/profiles.yml +++ b/profiles.yml @@ -1,5 +1,5 @@ default: - target: devlocal + target: prodlocal outputs: dev: type: bigquery