Descrição do Problema / Contexto
Durante deploys e atualizações de banco de dados (atualizacoes-banco-de-dados.php), o sincronizador de banco de dados (sincronizarTabela()) compara os registros do JSON com os do banco.
As colunas de modificação (data_modificacao) possuem a regra ON UPDATE CURRENT_TIMESTAMP no MySQL.
Quando o sincronizador atualiza uma linha (por exemplo, porque o html ou outro campo mudou) e a data_modificacao do JSON é idêntica à do banco de dados, essa coluna é omitida do array $diff (e, portanto, da consulta UPDATE gerada). Como o MySQL executa um UPDATE sem especificar a coluna data_modificacao, o gatilho automático ON UPDATE CURRENT_TIMESTAMP é acionado e a data de modificação é sobrescrita com a hora atual (NOW()), ignorando o valor customizado/histórico presente no JSON.
Proposta de Alterações Detalhada
1. Forçar inclusão de data_modificacao no Sincronizador (atualizacoes-banco-de-dados.php)
No arquivo gestor/controladores/atualizacoes/atualizacoes-banco-de-dados.php, dentro da função sincronizarTabela(), devemos interceptar a verificação de $diff nos 3 pontos onde o UPDATE é gerado (Modo PK, Modo Chave Natural e modo Fallback Chave Natural).
Se houver qualquer divergência que acione o update (ou seja, $diff não é vazio) e a coluna data_modificacao estiver presente no registro de entrada e no schema da tabela, devemos forçar sua inclusão no $diff para que seja explicitamente enviada no UPDATE, prevenindo o gatilho automático do MySQL de sobrescrevê-la com a hora atual.
Lógica a ser inserida:
if ($diff) {
// Se data_modificacao está no JSON e no schema, mas não no diff, forçar a sua inclusão para evitar que o MySQL a atualize com o timestamp atual via trigger ON UPDATE
if (isset($row['data_modificacao']) && is_array($allowedCols) && isset($allowedCols['data_modificacao']) && !isset($diff['data_modificacao'])) {
$diff['data_modificacao'] = $row['data_modificacao'];
$oldVals['data_modificacao'] = $exist['data_modificacao'] ?? null;
}Pontos de inserção em atualizacoes-banco-de-dados.php:
-
Modo PK (dentro do laço de comparação por PK, logo após o fechamento da checagem de reset de
user_modifiede antes deif ($diff)). -
Modo Chave Natural (dentro do laço de comparação por chave natural, logo antes de
if ($diff)). -
Modo Fallback Chave Natural (dentro do bloco de fallback de chave natural, logo antes de
if ($diff)).
Validação e Testes
-
Verificação Estática:
-
Rodar
php -l gestor/controladores/atualizacoes/atualizacoes-banco-de-dados.phppara garantir sintaxe válida.
-
-
Validação Funcional:
-
Executar uma sincronização de teste (com registros alterados no HTML mas com
data_modificacaoidênticos no JSON) e certificar que a data de modificação gravada no banco respeita o valor original do JSON (sem ser atualizada paraNOW()).
-
-
Regressão:
-
Rodar
composer testcompleto e certificar que todos os testes existentes da suíte continuam passando normalmente.
-