Files
Reem-Notas/db/migrate/20260703000002_create_consolidacao_veiculos.rb

62 lines
2.9 KiB
Ruby

# Unidade de FECHAMENTO por veículo dentro de uma consolidação. Espelha o padrão de
# consolidacao_motoristas (arquivamento reversível + valor_total), mas o que ela
# controla é o estado "fechado/consolidado" de cada carro — o PAGAMENTO continua no
# motorista (consolidacao_motoristas). Assim dá para consolidar um veículo pronto
# sem esperar os outros. O bucket sem veículo (termo/apontamento manual legado) usa
# o sentinel '(sem veículo)' para que o índice único funcione (NULL quebraria).
class CreateConsolidacaoVeiculos < ActiveRecord::Migration[7.1]
SEM_VEICULO = '(sem veículo)'
def up
unless table_exists?(:consolidacao_veiculos)
create_table :consolidacao_veiculos do |t|
t.references :consolidacao, null: false, foreign_key: { to_table: :consolidacoes }
t.string :motorista_nome, null: false
t.string :vehicle, null: false
t.decimal :valor_total, precision: 10, scale: 2, default: 0
t.datetime :fechado_em # NULL = aberto (ainda não consolidado)
t.integer :fechado_por
t.datetime :arquivado_em # NULL = ativo
t.integer :arquivado_por
t.timestamps
end
add_index :consolidacao_veiculos, %i[consolidacao_id motorista_nome vehicle],
unique: true, name: 'idx_consolidacao_veiculo_unique'
add_index :consolidacao_veiculos, :arquivado_em
end
# Backfill: uma linha por (consolidação · motorista · veículo) já classificado,
# somando o valor (desconto = tipo 3 subtrai). Consolidações já finalizadas
# (status 1) nascem FECHADAS, herdando quem/quando finalizou — para não
# "reabrir" o que já foi pago.
say_with_time 'backfill consolidacao_veiculos a partir das entregas' do
execute(<<~SQL.squish)
INSERT INTO consolidacao_veiculos
(consolidacao_id, motorista_nome, vehicle, valor_total,
fechado_em, fechado_por, created_at, updated_at)
SELECT ce.consolidacao_id,
ce.motorista_nome,
COALESCE(NULLIF(ce.vehicle, ''), '#{SEM_VEICULO}') AS vehicle,
COALESCE(SUM(CASE WHEN ce.tipo = 3
THEN -ce.valor_aplicado
ELSE ce.valor_aplicado END), 0) AS valor_total,
CASE WHEN c.status = 1 THEN c.finalizado_em END AS fechado_em,
CASE WHEN c.status = 1 THEN c.finalizado_por END AS fechado_por,
NOW(), NOW()
FROM consolidacao_entregas ce
JOIN consolidacoes c ON c.id = ce.consolidacao_id
GROUP BY ce.consolidacao_id, ce.motorista_nome,
COALESCE(NULLIF(ce.vehicle, ''), '#{SEM_VEICULO}'),
c.status, c.finalizado_em, c.finalizado_por
SQL
end
end
def down
drop_table :consolidacao_veiculos if table_exists?(:consolidacao_veiculos)
end
end