# 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