# Snapshot do veículo em cada pilar da consolidação. O veículo vive só na tabela # externa de rastreio (db_reem_simplerout_2026), acessível via tracking_id. Guardar # uma cópia aqui permite fechar/consolidar POR VEÍCULO sem N+1 e mantém o histórico # estável mesmo que a base externa mude depois. Lançamentos sintéticos (apontamento # 100% manual "MAN-*" e entrega de termo "TERMO-*") não têm veículo na rastreio e # ficam NULL — o agrupamento trata NULL como "(sem veículo)". class AddVehicleToConsolidacaoEntregas < ActiveRecord::Migration[7.1] def up unless column_exists?(:consolidacao_entregas, :vehicle) add_column :consolidacao_entregas, :vehicle, :string add_index :consolidacao_entregas, %i[consolidacao_id motorista_nome vehicle], name: 'idx_consolidacao_entrega_veiculo' end # Backfill dos lançamentos já existentes a partir da rastreio. Só roda onde a # tabela externa existe (dev/prod) — no banco de teste ela é isolada, então # pulamos para não quebrar o db:migrate. return unless connection.table_exists?('db_reem_simplerout_2026') say_with_time 'backfill vehicle em consolidacao_entregas' do execute(<<~SQL.squish) UPDATE consolidacao_entregas ce SET vehicle = e.vehicle FROM db_reem_simplerout_2026 e WHERE e.tracking_id = ce.tracking_id AND ce.vehicle IS NULL SQL end end def down if index_exists?(:consolidacao_entregas, %i[consolidacao_id motorista_nome vehicle], name: 'idx_consolidacao_entrega_veiculo') remove_index :consolidacao_entregas, name: 'idx_consolidacao_entrega_veiculo' end remove_column :consolidacao_entregas, :vehicle if column_exists?(:consolidacao_entregas, :vehicle) end end