Files
Reem-Notas/db/migrate/20260827000004_add_permissao_romaneio_aos_perfis.rb

44 lines
1.8 KiB
Ruby

# Leva a chave nova `admin.romaneio` para os perfis de sistema JÁ SALVOS.
#
# Por que existe (mesma armadilha de 20260826000005): 20260826000003 é idempotente,
# então uma permissão acrescentada ao catálogo DEPOIS daquele deploy nunca chega às
# linhas de perfis_acesso. O sintoma é mudo — o item some do menu e a URL responde
# "sem permissão" sem nada explicando o porquê.
#
# Diferença deliberada para 20260826000005: aqui é ADITIVO (`permissoes || '[...]'`)
# em vez de reescrever a lista inteira. Reescrever é aceitável para o Administrador
# ("acesso total" por definição); para o Gerente desfaria qualquer ajuste que o ADM
# tenha feito na tela de Perfis.
#
# Gerente entra porque `admin.romaneio` é a mesma classe de ferramenta operacional
# que `admin.planilha_simpli_route`, que ele já tem. Operador NÃO entra por padrão —
# quem carrega o caminhão recebe a chave pela tela de Perfis, que existe para isso.
class AddPermissaoRomaneioAosPerfis < ActiveRecord::Migration[7.1]
CHAVE = 'admin.romaneio'.freeze
def up
return unless table_exists?(:perfis_acesso)
execute(<<~SQL.squish)
UPDATE perfis_acesso
SET permissoes = permissoes || #{quote([CHAVE].to_json)}::jsonb,
updated_at = NOW()
WHERE sistema = true
AND LOWER(nome) IN ('administrador', 'gerente')
AND NOT (permissoes ? #{quote(CHAVE)})
SQL
end
# Reversível: tirar a chave devolve os perfis ao estado anterior sem tocar em
# mais nada (o `-` de jsonb remove o elemento do array, se estiver lá).
def down
return unless table_exists?(:perfis_acesso)
execute(<<~SQL.squish)
UPDATE perfis_acesso
SET permissoes = permissoes - #{quote(CHAVE)}, updated_at = NOW()
WHERE permissoes ? #{quote(CHAVE)}
SQL
end
end