133 lines
4.7 KiB
Python
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,
|
|
},
|
|
)
|