Preciso que uma flag numa tabela permaneça com o seu status inicial inalterado mas que também o novo status também seja registrado

Olá pessoal, eu gostaria muito de entender como fazer com que uma flag no banco de dados, ao sofrer uma alteração manual no sistema, ela sofra a mudança claro, mas o status da mudança inicial permaneça no banco de dados.
Por exemplo: Imaginem que o rh da empresa cadastrou o Josá num convênico médico chamado de plano A. Ao fazer isso, na tabela plano_alterado_status uma flag é adicionada como 0. Contudo, aparece uma oportunidade de outro convênio médico B. Daí o José solicita ao rh, que o muda para o outro convênio médico chamado de plano B. Ao mudar o José para o plano B, na tabela plano_alterado_status uma flag é adicionada como 1. Ou seja, houve mudança de flag de 0 para 1. Indicando que houve a migração. Contudo, eu queria saber como fazer com que a flag 0 inicial permaneça como um status inicial inalterável, mas também quero que no banco a nova flag indique que sofreu alteração para flag 1.
Observação: Eu já identifiquei o service que faz isso. Por isso gostaria apenas de entender duas coisas: como você pensaria sobre isso, tipo, voce criaria uma nova tabela no banco? E a segunda vou colocar parte do código de uma service para ver se você pode me ajudar a mudar a validação por favor.
Trecho do código:

 public StatusConvenioMud getStatusNovoConvenio(Integer folhaBase, Integer folhaParcelaOrigem, Integer folhaInicialSituacaoMatricula, Integer folhaFinalSituacaoMatricula, TipoGeraDescontoFolha tipoCondicaoMatriculaDestino, Integer folhaCorrenteAtual, StatusParcelaFolha novoStatusIniciadoNaConvenioMigrada, StatusConvenioFolha statusAntesConvenioMigrada) {

    StatusConvenioFolha statusConvenioResult = null;

    if (nonNull(tipoSituacaoConvenioDestino)) {
        log.info("Verificando tipo de situação de convenio para atribuir o status ao convenio que está sendo criada");
        statusConvenioResult = verificaSituacaoConvenioMatriculaParaAtualizarParcela(folhaParcelaOrigem, folhaInicialSituacaoMatricula, folhaFinalConvenioMatricula, tipoSituacaoConvenioDestino, novoStatusIniciadoNaConvenioMigrada, statusAntesFolhaMigrada);
    }
    if (isNull(statusConvenioResult)) {
        if (folhaCorrenteAtual.equals(folhaBase) || (folhaCorrenteAtual > folhaBase)) {
            log.info("Migrando a partir do mês atual ou retroativo a convenio atual");
            if (folhaConvenioOrigem < folhaConvenioAtual) {
                if (folhaConvenioOrigem.equals(folhaBase)) {
                    return novoStatusIniciadoNaConvenioMigrada;
                }
                return statusAntesConvenioMigrada;
            } else {
                return novoStatusIniciadoNaConvenioMigrada;
            }
        } else {
            log.info("Migrando convenio futura à folha corrente");
            if (folhaConvenioOrigem < folhaBase) {
                return statusAntesConvenioMigrada;
            } else {
                return novoStatusIniciadoNaConvenioMigrada;
            }
        }
    }
    return statusConvenioResult;
}

Vc poderia explicar melhor? É porque o que vc quer não faz muito sentido.

O status inicial é sempre 0, correto?

Se sua aplicação encontra alguém com status 1, ela já pode assumir com total certeza que o plano daquela pessoa foi alterado. Não há a menor necessidade de guardar um valor que é fixo, no caso o 0.

O status é 0? Aquela pessoa está com o primeiro plano desde sempre, ela nunca mudou.

O status é 1? Aquela pessoa, em algum momento, fez a alteração do plano.

Faria mais sentido para mim se vc tivesse um cenário assim:

Vc tem 3 tabelas: pessoa, convenio, pessoa_convenio.

As tabelas pessoa e convenio seriam normais. A tabela pessoa_convenio seria algo assim:

CREATE TABLE pessoa_convenio (
  id_pessoa INT,
  id_convenio INT,
  entrada TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  saida TIMESTAMP DEFAULT NULL
);

Se uma pessoa deseja alterar o plano, vc faria algo assim:

START TRANSACTION;
UPDATE pessoa_convenio
SET saida = CURRENT_TIMESTAMP
WHERE id_pessoa = 1 AND saida IS NULL;

INSERT INTO pessoa_convenio (id_pessoa, id_convenio) VALUES (1, 2);
COMMIT;

Ou seja, adicionaria a data de saída do convênio anterior e adicionaria o novo convênio logo em seguida. Desta forma vc teria o histórico inteiro de mudanças da pessoa e para saber em qual convênio ela está atualmente bastaria fazer um SELECT com WHERE saida IS NULL.

1 curtida

Você está certo :smile:. Vou reformular. Obrigado por responder. Sua resposta não é bem o que preciso, mas a culpa foi minha. Está mal formulada a pergunta. Assim que modificar te comunico. Obrigado.

1 curtida

@Rept Faça como indicado pelo @wldomiciano que assim vc ainda terá o histórico de mudanças do convênio.