44 lines
1.8 KiB
Ruby
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
|