From e2ca69358c321b37be89021454e810721397b0e8 Mon Sep 17 00:00:00 2001 From: Moran Date: Sat, 4 Apr 2026 15:00:02 -0300 Subject: [PATCH 1/2] =?UTF-8?q?Atualiza=20tombo.nome=5Fcientifico=20quando?= =?UTF-8?q?=20genero.nome=20ou=20especie.nome=20=C3=A9=20alterado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/taxonomias-controller.js | 7 +++- src/utils/atualiza-nome-cientifico.js | 47 ++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/utils/atualiza-nome-cientifico.js diff --git a/src/controllers/taxonomias-controller.js b/src/controllers/taxonomias-controller.js index 253eab92..57d6c57f 100644 --- a/src/controllers/taxonomias-controller.js +++ b/src/controllers/taxonomias-controller.js @@ -1,4 +1,5 @@ import limparEspacos from '@/helpers/limpa-espaco'; +import { atualizarNomeCientificoPorGenero, atualizarNomeCientificoPorEspecie } from '../utils/atualiza-nome-cientifico'; import BadRequestExeption from '../errors/bad-request-exception'; import models from '../models'; @@ -604,7 +605,8 @@ export const editarGenero = (request, response, next) => { id: generoId, }, transaction, - })); + })) + .then(() => atualizarNomeCientificoPorGenero(generoId, transaction)); sequelize.transaction(callback) .then(generoCriado => { if (!generoCriado) { @@ -837,7 +839,8 @@ export const editarEspecie = (request, response, next) => { id: especieId, }, transaction, - })); + })) + .then(() => atualizarNomeCientificoPorEspecie(especieId, transaction)); sequelize.transaction(callback) .then(especieCriado => { if (!especieCriado) { diff --git a/src/utils/atualiza-nome-cientifico.js b/src/utils/atualiza-nome-cientifico.js new file mode 100644 index 00000000..8ba1dbab --- /dev/null +++ b/src/utils/atualiza-nome-cientifico.js @@ -0,0 +1,47 @@ +import models from '../models'; + +const { sequelize } = models; + +/** + * Atualiza o nome_cientifico de todos os tombos que possuem o genero_id informado. + * Deve ser chamado quando o nome de um gĂȘnero for alterado. + */ +export async function atualizarNomeCientificoPorGenero(generoId, transaction) { + // Tombos com genero e especie + await sequelize.query(` + UPDATE tombos t + SET nome_cientifico = CONCAT(g.nome, ' ', e.nome) + FROM generos g, especies e + WHERE t.genero_id = g.id + AND t.especie_id = e.id + AND t.genero_id = :generoId + AND t.nome_cientifico IS DISTINCT FROM CONCAT(g.nome, ' ', e.nome) + `, { replacements: { generoId }, transaction }); + + // Tombos com apenas genero (sem especie) + await sequelize.query(` + UPDATE tombos t + SET nome_cientifico = g.nome + FROM generos g + WHERE t.genero_id = g.id + AND t.especie_id IS NULL + AND t.genero_id = :generoId + AND t.nome_cientifico IS DISTINCT FROM g.nome + `, { replacements: { generoId }, transaction }); +} + +/** + * Atualiza o nome_cientifico de todos os tombos que possuem o especie_id informado. + * Deve ser chamado quando o nome de uma espĂ©cie for alterado. + */ +export async function atualizarNomeCientificoPorEspecie(especieId, transaction) { + await sequelize.query(` + UPDATE tombos t + SET nome_cientifico = CONCAT(g.nome, ' ', e.nome) + FROM generos g, especies e + WHERE t.genero_id = g.id + AND t.especie_id = e.id + AND t.especie_id = :especieId + AND t.nome_cientifico IS DISTINCT FROM CONCAT(g.nome, ' ', e.nome) + `, { replacements: { especieId }, transaction }); +} From 7c799c036c4b9c1b805fc68f8c5824b62c7c86ae Mon Sep 17 00:00:00 2001 From: Moran Date: Sat, 4 Apr 2026 15:06:01 -0300 Subject: [PATCH 2/2] =?UTF-8?q?Revert=20"Migration=20para=20corre=C3=A7?= =?UTF-8?q?=C3=A3o=20de=20nomes=20cientificos=20inconsistentes,=20corrige?= =?UTF-8?q?=20tanto=20os=20nomes=20com=20genero=20e=20especie=20quanto=20o?= =?UTF-8?q?s=20apenas=20com=20genero"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit c6444123f4d38097800add1ed25be4872d79d23b. --- ...70000_fix-nome-cientifico-inconsistente.ts | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 src/database/migration/20260404170000_fix-nome-cientifico-inconsistente.ts diff --git a/src/database/migration/20260404170000_fix-nome-cientifico-inconsistente.ts b/src/database/migration/20260404170000_fix-nome-cientifico-inconsistente.ts deleted file mode 100644 index bac7528a..00000000 --- a/src/database/migration/20260404170000_fix-nome-cientifico-inconsistente.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Knex } from 'knex' - -export async function run(knex: Knex): Promise { - await knex.transaction(async trx => { - // Atualiza tombos que possuem genero e especie - await trx.raw(` - UPDATE tombos - SET nome_cientifico = CONCAT(g.nome, ' ', e.nome) - FROM generos g, especies e - WHERE tombos.genero_id = g.id - AND tombos.especie_id = e.id - AND ( - tombos.nome_cientifico IS DISTINCT FROM CONCAT(g.nome, ' ', e.nome) - OR e.genero_id IS DISTINCT FROM tombos.genero_id - ) - `) - - // Atualiza tombos que possuem apenas genero (sem especie) - await trx.raw(` - UPDATE tombos - SET nome_cientifico = g.nome - FROM generos g - WHERE tombos.genero_id = g.id - AND tombos.especie_id IS NULL - AND tombos.nome_cientifico IS DISTINCT FROM g.nome - `) - }) -}