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, }, )