(Mapeamento)Transfere Usuário PSE
Execução do Menu é iniciada da Classe: contratoTransPSENegocio
BOTÃO TRANSFERENCIA ENTRE CONTRATO
Pesquisa do contrato executa o método (ajudaContratoPSTrans) dentro da classe
ContratoPSAjuda), ao abrir a pesquisa a primeira regra a ser feita é verificar se já existe uma
consulta existente, caso não tenha ele retorna uma pesquisa com as seguintes verificações:
Define os campos para filtro de pesquisa:
Se for um Mantenedor logado ele retorna a seguinte SELECT:
Select com Objetivo de trazer todos contratosPS no nosso sistema, passando na
clausula WHERE o id da pessoa ou da entidade desejada de acordo com quem estiver
logado e o modelo = 1
SELECT
co.contratoPS, co.contratops, co.codigo,
DECODE(co.empresaBeneficiada, NULL, DECODE(ent.validacaoAberta,
0, ent.nome, getEVNome(ent.entidade, " + pessoaLogada + ")),
DECODE(ent.validacaoAberta, 0, ent.nome, getEVNome(ent.entidade, " +
pessoaLogada + ")) || ' / ' || DECODE(ent2.validacaoAberta, 0, ent2.nome,
getEVNome(ent2.entidade, " + pessoaLogada + "))),
ps.nome, co.validadeInicio, co.validadeFim, co.resppag,
co.admissaoTitularComoBen
FROM
ContratoPS co
JOIN ContratoPSMantenedor cpm ON cpm.contratoPS = co.contratoPS
JOIN Entidade ent ON co.entidade = ent.entidade
JOIN Entidade ent2 ON co.empresaBeneficiada = ent2.entidade
JOIN PlanoSaude ps ON co.planoSaude = ps.planoSaud
WHERE
cpm.pessoal = ? AND co.modelo = ?;
SELECT
co.contratoPS, co.contratops, co.codigo,
DECODE(co.empresaBeneficiada, NULL,
DECODE(ent.validacaoAberta, 0, ent.nome, getEVNome(ent.entidade, " + pessoaLogada +
"))
DECODE(ent.validacaoAberta, 0, ent.nome,
getEVNome(ent.entidade, " + pessoaLogada + ")) || ' / ' || DECODE(ent2.validacaoAberta, 0,
ent2.nome, getEVNome(ent2.entidade, " + pessoaLogada + ")))
ps.nome, co.validadeInicio, co.validadeFim, co.resppag,
co.admissaoTitularComoBen
FROM ContratoPS co
LEFT JOIN Entidade ent ON co.entidade = ent.entidadeLEFT JOIN Entidade ent2 ON co.empresaBeneficiada =
ent2.entidade
LEFT JOIN PlanoSaude ps ON co.planoSaude = ps.planoSaude
WHERE
co.modelo = ? AND ps.entidade = ?
Campo Beneficiários a serem transferidos:
Com o Flag selecionado com (Todos os beneficiários vinculados ao titular), O botão de
pesquisa fica disponível e ele faz a pesquisa utilizando a seguinte SELECT da classe
(ContratoBenPSAjuda) -> metodo (ajudaTitular):
Select com Objetivo de retornar os titulares do contrato, passando como parâmetro os ID
do ContratoPS que possui o Titular, se for null lista os grupos Familiares da entidade logada
SELECT
grp.grupofamiliar, grp.grupoFamiliar,
DECODE(pes.validacaoAberta,0,pes.nome,getPVNome(pes.pessoal, pes2.pessoal)),
grp.dataInclusao, grp.dataExclusao, pes.pessoal, grp.pessoalInternet, pi.email,
grp.dtAdmissao, grp.condicaoAdmissao, ca.descricao, ben.mae,
listBeneficiarioByTitular(grp.grupoFamiliar, '
', pes2.pessoal), grp.codigoEmpresa
FROM
Pessoal pes_GrupoFamiliar grp_ContratoPS co_PessoalInternet pi_Pessoal
pes2_CondicaoAdmissao ca_Beneficiario ben
WHERE
grp.contratoPS = ? AND pes2.pessoal = ? AND grp.pessoal = pes.pessoal
AND grp.pessoalInternet = pi.pessoalInternet(+) AND grp.contratoPS = co.contratoPS
AND grp.condicaoAdmissao = ca.condicaoAdmissao AND grp.contratops =
ben.contratops(+)
AND grp.pessoal = ben.pessoal(+)
(!excluidos ? "AND (grp.dataExclusao IS NULL OR TRUNC12(SYSDATE) <
TRUNC12(grp.dataExclusao))" : "AND TRUNC(grp.dataExclusao) <= TRUNC(SYSDATE)");
SE NÃO
SELECTgrp.grupofamiliar, grp.grupoFamiliar,
DECODE(pes.validacaoAberta,0,pes.nome,getPVNome(pes.pessoal,
pes2.pessoal)),grp.dataInclusao, grp.dataExclusao,
listBeneficiarioByTitular(grp.grupoFamiliar, '
', pes2.pessoal)
FROM
Pessoal pes_GrupoFamiliar grp_Pessoal pes2
WHERE
grp.pessoal=pes.pessoal AND pes2.pessoal = ?
!excluidos ? "AND (grp.dataExclusao IS NULL OR TRUNC12(SYSDATE) <
TRUNC12(grp.dataExclusao))" : "AND TRUNC(grp.dataExclusao) <= TRUNC(SYSDATE);
Caso a outra opção seja selecionada:
Ele traz todos os titulares (ativos no contrato selecionado a cima).
Próximo passo:
Define o destino para qual contrato serão transferidos.
A pesquisa executa o mesmo Método do item 1 (Origem do contrato).
Ao preencher todas as informações e clicar em (Confirmar)
É executado a classe (ContratoTransPSENegocio) e o método (contratoTransPSE_X_entreContrato_exec).
A primeira verificação que é feita é qual tipo de seleção (Beneficiários a serem transferido)
foi selecionado, caso for a primeira opção “(Todos os beneficiários vinculados ao titular) =
Checked”
E faz a (SELECT admissaoTitularComoBen FROM ContratoPS WHERE contratoPS = ?), para
verificar se o titular deve ser obrigatoriamente o primeiro a ser cadastrado como
beneficiário.
Caso não houver nenhum erro até o momento ele faz uma nova verificação para ver qual
tipo de seleção (Beneficiários a serem transferido) foi selecionado, caso for a primeira opção
“(Todos os beneficiários vinculados ao titular) = "Checked"
Ele faz os seguintes passos:
Obtém pessoa titular do contrato de origem
Busca a SELECT:
SELECT pessoal FROM grupoFamiliar WHERE grupoFamiliar = ? (IdDoTitular)
2) Obtém titular do contrato de destino.
Obtém titular ativo em uma data específica a partir da pessoa e do contrato.
SELECT grupoFamiliar FROM GrupoFamiliar
WHERE
contratoPS = ? (idContrato) AND pessoal = ? (idPessoal) AND (dataExclusao IS
NULL OR dataExclusao > ? (Data de referência.))
3) Obtém todos dados do titular
Retorna todos os dados do titular dos campos citados abaixo, campo sincContador -
é o código do contator no Delphi para sincronismo
SELECT g.contratoPS, g.pessoal, g.contratoCorVendaConsultor, g.vencimento,
g.dataInclusao, g.dtAdmissao, g.pessoalInternet, g.pessoalEndereco, g.pessoalBanco,
g.codigoEmpresa, g.condicaoAdmissao, g.grupoFamiliarAnterior, g.grupoFamiliarOrigem,
g.sincCaptador, g.dataExclusao, g.motivoExclusao, g.outrosMotivos, g.sincContador,
g.causaDesligamento, g.dtComunicacao, g.contribuiuPlano, g.tempoContribuicao,
g.permanenciaNoPlano, g.enderecoOficial FROM GrupoFamiliar g
WHERE g.grupoFamiliar = ? (idTitular)
Obtém data de exclusão do titular do contrato de origem
Busca CCO do titular
SELECT b.cco FROM GrupoFamiliar g
JOIN Beneficiario b ON (g.grupoFamiliar = b.grupoFamiliar AND g.pessoal = b.pessoal)WHERE g.grupoFamiliar = :idTitular (idTitular)
Verifica se é necessário incluir titular no contrato de destino e obtém os dados
do novo titular
Valida dados do titular
Verifica se é necessário incluir o titular no contrato de destino e valida os
dados do novo titular
Valida todas as informações necessárias para incluir um titular.
Executa Método (validateTitular) da classe (ContratoBenPSPublico).
Traz todos IDs:
@param idTitularExistente Id do titular existente ou null se for uma validação de inclusão.
@param campos Map com os campos a serem validados (*campos obrigatórios):
*idContrato - Id do Contrato onde será incluído o benficiário (Integer);
*idPessoal - Id da pessoa que será titular (Integer);
*diaVencimento - Dia do vencimento para pagamento. Somente para contrato Adesão
(Integer);
*dtInclusao - Data de inclusão (GregorianCalendar);
*dtAdmissao - Data de admissão (GregorianCalendar);
*idEmail - Id do email da pessoa (Integer);
*idEndereco - Id do endereço da pessoa (Integer);
@param fechamento Se true, verifica se o mês da data de inclusão já está fechado.
@param transferencia Se true, é uma transferência. Neste caso, a data de admissão não é
validada para o correto cálculo de carência
@param mesFuturo Se true, permite inclusão para mês futuro
Primeira execução a ser feita se já tiver um titular é: Obtém campos do beneficiário existente
Executa a SELECT: (Passando o idTitular na clausula WHERE e retornando todos os dados
do beneficiario)
SELECT g.contratoPS, g.pessoal,
g.contratoCorVendaConsultor, g.vencimento, g.dataInclusao, g.dtAdmissao,
g.pessoalInternet, g.pessoalEndereco, g.pessoalBanco, g.codigoEmpresa,
g.condicaoAdmissao, g.grupoFamiliarAnterior, g.grupoFamiliarOrigem, g.sincCaptador,
g.dataExclusao, g.motivoExclusao, g.outrosMotivos, g.sincContador, g.causaDesligamento,
g.dtComunicacao, g.contribuiuPlano, g.tempoContribuicao, g.permanenciaNoPlano,
g.enderecoOficial
FROM GrupoFamiliar g
WHERE g.grupoFamiliar = ?
Segunda Execução a ser feita é obter o modelo do contrato de plano de saúde:
SELECT: Retorna o modelo de contrato para verifica se é PESSOAL, EMPRESARIAL OU
ADESÃO
SELECT modelo FROM ContratoPS WHERE contratoPS = ?
Se Modelo = 0 -> Pessoal
Se Modelo = 1 -> Empresarial
Se modelo = 2 -> Adesão
Para contratos PSA - (Tipo Adesão)
-Se o contrato for de uma ‘Administradora de Beneficios’, verifica se a empresa
beneficiada foi preenchida.
-Executa método que obtém o ID da tabela EntidadeModelo a partir da Entidade e
retorna o Id da EntidadeModelo
Método executa SELECT(Que obtém o ID da entidade que é a contratante (PSA / PSE)):
SELECT entidade From ContratoPS WHERE contratops = ? (id contratoPS)
Para Contratos PSE - (Tipo Empresarial)
Verifica se a pessoa já existe como titular.
E executa método que obtém o titular ativo em uma data específica a partir da pessoa e do contrato que retorna o ID do titular ou null se não encontrou.
Método Executa a seguinte Select:
SELECT grupoFamiliar FROM GrupoFamiliar
WHERE contratoPS = ? (Id do contrato) AND pessoal = ? (Id pessoal)
AND (dataExclusao IS NULL OR dataExclusao > ?)
Próximas verificações:
• Verifica se titular possui CPF cadastrado.
• Verifica se o e-mail pertence ao titular.
• Verifica se o endereço pertence ao titular.
• Não permite data de inclusão do titular menor que a data de nascimento.
• Verifica data de admissão (Transferência) obs: a data de inclusão não pode ser
menor que a data de admissão.
• Verifica data de inclusão e exclusão:
Obs: A data de inclusão do titular não pode ser menor do que a data de inclusão do
contrato.
E
A data de inclusão do titular não pode ser maior ou igual do que a validade final do
contrato
• Valida data de inclusão do titular
• Valida consumidor negativo
Se for uma transferência e não tiver ID do titular ele executa o método
(validateConsumidorNegativoPessoalTitular), Método Obtém ID da tabela
consumidorNegativo e retorna o ID do consumidor ou Vazio caso código não seja
encontrado.
SELECT executada:
SELECT c.bloqueio FROM consumidorNegativo c WHERE c.pessoal = ? (Idpessoal) AND
c.proprietario = ? (idOperadora)
• Verifica o contrato do corretor
FIM VALIDAÇÃO TITULAR
• Verifica se é necessário incluir o titular no contrato de destino e inclui o novo titular
OBS: Os campos para INSERT já devem ter sido validados pelo método (validadeTitular).
Este método não gera mensagens de Sincronismo e Sib
• Obtém código de usuário para o sincronismo
Após fazer o INSERT na tabela (GRUPOFAMILIAR)
• Gera comissão para o consultor se tiver idContratoCorVendaConsultor
Da INSERT na tabela ContratoPSComissionado e retorna o ID do contratoPSComissionado.
• Gera renumeração
• Verifica se o contrato está com data de exclusão futura, se tiver ele dá um UPDATE
na tabela GrupoFamiliar passando as novas datas de exclusão que é = a validadeFim
da tabela contratoPS.
• Grava uma ocorrência de incluir titular na tabela ContratoPSOcorrencia
• Cria relacionamento / tipo
Cria relacionamento na tabela PesEntRelTipoRel
8.1) Gera Mensagens de sincronismo
• Sincroniza novo titular.
• Busca todas as informações necessária como idContrato do titular, campo origem
para o sincronismo, modelo do contrato e o idPessoal da pessoa do titular
E dá um UPDATE no grupoFamiliar setando o sincResponsavel retornado do método
(msgCriarResponsavel)
Obtém todos os dados para transferência do beneficiário.
Faz a validação dos dados do beneficiário titular
Insere o beneficiário titular
• Verifica se é necessário criar o beneficiário titular no contrato de
destino e insere o beneficiário
• Método (insertBeneficiario) da classe (ContratoBenPSPublico)
Nesse insert ele cria um novo ID de beneficário, mantendo o mesmo numero de CCO, mantendo o mesmo ID pessoal, os dados de nome da mãe, pessoalEndereco,preço, pessoaInternet e Troca ID do beneficiario (é gerado um novo beneficiario) e com numero de carteira diferente.
• Da um INSERT na tabela Beneficiário.
• Cria uma declaração de saúde para o Beneficiário na tabela (beneficiarioDeclaracaoSaude)
• Cria produto adicional do beneficiário
• INSERT na tabela beneficiarioProdutoAd
• Cria uma Ocorrência na tabela (ContratoPSOcorrencia)
• Cria Relacionamento / tipo
• INSERT na tabela (pesEntRelTipoRel)
• Calcula e insere carência para o beneficiário
• Cria a data de CPT, esta não tenha sido informada.
• Requisita carteirinha para impressão
• UPDATE na tabela Beneficiario no campo (validadeCarteirinha).
• Calcula e gera (se necessário) um endereço oficial dado um beneficiário
• Altera Endereço oficial do Beneficiário
• Da um UPDATE na tabela Beneficiario na coluna (enderecoOficial)
• Gera evento SIB de inclusão (Evento SIB Beneficiário).
• Define titular SIB inicial.
• Da UPDATE na tabela BENEFICIÁRIO na coluna (titularSib).
• Se o tipo do evento for tipo (EVENTO_RETIFICACAO)
Faz uma verificação entre CNS provisório e definitivo
• Faz um INSERT na tabela SIBEVENTO
• Gera mensagens de sincronismo
• Sincroniza novo beneficiário
• Cria mensagem de sincronismo de criar beneficiário
• Recebe valores para mensagens através da SELECT:
SELECT co.sincEmpresa, DECODE(gf.sincContador,null,co.sincContador,gf.sincContador),
ben.sincDependencia,
DECODE(pes.validacaoAberta,0,pes.nome,getPVNome(pes.pessoal, pes2.pessoal)), ben.mae,
gf.codigoEmpresa, tl.descricao || ' ' || pe.logradouro, pe.numero, pe.complemento,pe.bairro, cid.ibge, pe.cep, pt.ddd, pt.telefone, pi.email,
DECODE(pes.validacaoAberta,0,pes.dtNascimento,getPVNascimento(pes.pessoal, pes2.pessoal)),
gf.dtAdmissao,
DECODE(pes.validacaoAberta,0,pes.sexo,getPVSexo(pes.pessoal, pes2.pessoal)),
pegaPessoalDocumento(pes.pessoal, Constante.DOCUMENTO_TIPO_PESSOAL_RG + "),
pegaPessoalDocumento(pes.pessoal, Constante.DOCUMENTO_TIPO_PESSOAL_CPF + "),
pegaPessoalDocumento(pes.pessoal, Constante.DOCUMENTO_TIPO_PESSOAL_DN + "),
DECODE(pes.validacaoAberta,0,pes.estadoCivil,getPVEstadoCivil(pes.pessoal, pes2.pessoal)),
ben.dataInclusao, ben.codigoInclusao, co.sincPlanoSaude, co.sincConcessionario,
DECODE(co.sincCaptador,0,gf.sincCaptador,co.sincCaptador), co.sincRepresentante, ben.preco,
pe.pessoalEndereco, co.sincSecundario, co.sincEmpresa2, ben.temLiminar, COALESCE(ebGf.fantasia,
eb.fantasia)
FROM ContratoPS co, GrupoFamiliar gf, Beneficiario ben, Pessoal pes, Pessoal pes2, PessoalEndereco
pe, TipoLogradouro tl,
PessoalTelefone pt, PessoalInternet pi, Cidade cid, Entidade eb, Entidade ebGf
WHERE ben.contratoPS=co.contratoPS AND ben.grupoFamiliar=gf.grupoFamiliar(+) AND
pes.pessoal=ben.pessoal AND
pe.pessoalEndereco=ben.pessoalEndereco AND pe.tipoLogradouro=tl.tipoLogradouro(+) AND
pt.pessoalEndereco(+)=pe.pessoalEndereco AND pi.pessoal(+)=ben.pessoal AND pi.principal(+)=1
AND
pe.cidade=cid.cidade AND co.empresaBeneficiada=eb.entidade(+) AND
gf.empresaBeneficiada=ebGf.entidade(+) AND ben.beneficiario=? AND pes2.pessoal=?
ORDER BY pt.pessoalTelefone, pi.pessoalInternet
• Guarda mensagem de sincronismo na lista de mensagens pendentes.
• Cria mensagem de sincronismo de alterar dia de vencimento para contratos PSA - (TIPO
ADESAO).
• Cria mensagem de sincronismo para produtos adicionais
• Cria mensagem de sincronismo para co-participação.
• Cria mensagem de sincronismo de excluir beneficiário.
• Cria uma ocorrência para um Beneficiário
• Da um INSERT na tabela (CONTRATOPSOCORRENCIA)
• Transfere um beneficiário entre contratos diferentes.
• Método (TransferBeneficiarioEntreContratos) classe (ContratoTransPS).
• Executa o metodo (removeBeneficiario)
• Remove um Beneficiário .
• Importante: Este método gera mensagens de Sincronismo e Sib.
• Busca as informações do beneficiário e faz as seguintes verificações:
• Faz uma verificação para ver se o beneficiário é o beneficiário titular.
• Obtém os dados do contrato.
• Método isAdmissaoTitularComoBeneficiario
• Executa SELECT:
SELECT admissaoTitularComoBen FROM contratoPS WHERE contratoPS = ? (idcontratoPS)
• Método isBeneficiarioTitular
• Executa a SELECT
SELECT g.grupoFamiliar
FROM Beneficiario b, GrupoFamiliar g
WHERE b.grupoFamiliar = g.grupoFamiliar AND b.pessoal = g.pessoal AND b.beneficiario = ?
• Faz uma verificação para ver se o beneficiário excluído possui uma data de exclusão menor
que o mês corrente
• Verifica se o beneficiário é garantido por liminar
• Através do método (getTemLiminarByIdBeneficiario) executa a SELECT:
SELECT temLiminar FROM Beneficiario WHERE beneficiario = ? (idBeneficiario)
• Após as verificações citadas acima, ele faz a remoção do Beneficiário dando o Seguinte
UPDATE:
UPDATE Beneficiario
SET dataExclusao = ?, motivoExclusao = ?, obsExclusao = ?, dataSolicitacaoExclusao = null
WHERE beneficiario = ?
• Verifica se a exclusão desse beneficiário impede eleição de novo TitularSIB
• Gera mensagem SIB
• Gera mensagem Sincronismo.
• Envia E-mail para o PVS
• SE NÃO, Executa UPDATE na tabela BENEFICIARIO setando a dataExclusao.
• Faz uma validação dos dados para transferência do beneficiário
• Por último faz a transferência do beneficiário.
13) Remove titular no contrato de origem
• Se existir titularOrigemAtivo
• Faz a remoção do titular
• Se não, altera titular no contrato de origem dando um UPDATE na tabela GrupoFamiliar na
coluna dataExclusao.