62 lines
2.9 KiB
Ruby
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
|