portal_publico/sqls/questor.py

133 lines
4.7 KiB
Python

from datetime import date
from textwrap import dedent
from database.query import SQLQuery
class QuestorSQL:
"""Consultas ao banco do Questor (`DatabaseConnection("QUESTOR")`) — só
leitura, nunca `execute`/`execute_returning` (ver
[[feedback_bancos_externos_somente_leitura]] na memória do projeto)."""
@staticmethod
def consulta_nome_empresa(codigo_empresa: str) -> SQLQuery:
sql = dedent(r"""
select
e.codigoempresa,
e.nomeempresa
from
empresa e
where
e.codigoempresa = :codigo_empresa
""")
return SQLQuery(sql=sql, params={"codigo_empresa": codigo_empresa})
@staticmethod
def consulta_planilha_plano_saude(
codigo_empresa: str, codigo_operadora: str, competencia: date
) -> SQLQuery:
"""Mesma informação da "planilha padrão" que o Questor hoje exporta
manualmente pra Importação de Plano de Saúde (ver
`portal_api.planos_saude.questor_planilha.busca_linhas_questor`),
pra uma única empresa+operadora+competência — consulta fornecida e
validada pelo usuário. `competencia` é sempre o primeiro dia do mês
(ex.: `date(2026, 8, 1)`); `codigo_operadora` filtra pra só o plano
da operadora selecionada (é `codigooutemp`, código de cadastro da
OPERADORA no Questor — não confundir com `codigo_empresa`, ver
`pipeline.OPERADORAS`)."""
sql = dedent(r"""
with periodo_plano as (
select
codigoempresa,
codigofunccontr,
codigooutemp,
max(datainicial) datainicial
from
funcplanosaude
where
codigoempresa = :codigo_empresa
and codigooutemp = :codigo_operadora
and datainicial <= :competencia
and (datafinal is null or datafinal >= :competencia)
group by
codigoempresa,
codigofunccontr,
codigooutemp
),
dados_plano_func as (
select
codigoempresa,
codigofunccontr,
codigooutemp,
datainicial,
datafinal,
null::int codigodepend
from
funcplanosaude
union
select
codigoempresa,
codigofunccontr,
codigooutemp,
datainicial,
null::date datafinal,
codigodepend
from
funcplanosaudedepend
)
select
d.codigoempresa,
fp.nomefunc,
fp.cpffunc,
d.codigooutemp codigooperadora,
oe.nomeoutemp nomeoperadora,
d.datainicial,
dep.nomedepend,
dep.cpfdepend,
0::numeric(18,2) valorempresa,
0::numeric(18,2) valor,
null::text descricao
from
dados_plano_func d
join
periodo_plano p on
d.codigoempresa = p.codigoempresa
and d.codigofunccontr = p.codigofunccontr
and d.codigooutemp = p.codigooutemp
and d.datainicial = p.datainicial
join
empresa e on
d.codigoempresa = e.codigoempresa
join
funccontrato fc on
d.codigoempresa = fc.codigoempresa
and d.codigofunccontr = fc.codigofunccontr
join
funcpessoa fp on
fc.codigofuncpessoa = fp.codigofuncpessoa
join
outraempresa oe on
d.codigooutemp = oe.codigooutemp
left join
dependente dep on
d.codigoempresa = dep.codigoempresa
and d.codigofunccontr = dep.codigofunccontr
and d.codigodepend = dep.codigodepend
where
d.codigoempresa = :codigo_empresa
and d.codigooutemp = :codigo_operadora
and (fc.datadem is null or fc.datadem >= :competencia)
order by
fp.nomefunc,
fp.cpffunc,
codigooperadora
""")
return SQLQuery(
sql=sql,
params={
"codigo_empresa": codigo_empresa,
"codigo_operadora": codigo_operadora,
"competencia": competencia,
},
)