novo pilar tipo: termo (valor 5 no enum), lançado como uma linha por lote com manual: true e uma coluna nova quantidade. O valor_aplicado guarda o total do lote (qtd × preço), então recalcular_motorista! e todas as somas existentes seguem corretas sem mudança — linhas antigas ficam com quantidade = 1.

This commit is contained in:
2026-06-26 09:32:59 -03:00
parent f42949db78
commit 09867c8d39
17 changed files with 256 additions and 17 deletions

View File

@@ -159,8 +159,9 @@ class ConsolidacaoEntregasController < ApplicationController
todas = @consolidacao.consolidacao_entregas.where(motorista_nome: @motorista)
# Agregados calculados sobre o conjunto COMPLETO (não só a página exibida)
@resumo = todas.group(:tipo).count
# Agregados calculados sobre o conjunto COMPLETO (não só a página exibida).
# sum(:quantidade) (default 1) conta os termos lançados em lote como N entregas.
@resumo = todas.group(:tipo).sum(:quantidade)
@total = todas.sum do |c|
c.tipo == 'desconto' ? -c.valor_aplicado : c.valor_aplicado
end
@@ -255,6 +256,31 @@ class ConsolidacaoEntregasController < ApplicationController
render_apontamento_erro(e.message)
end
# POST /consolidacoes/:consolidacao_id/consolidacao_entregas/apontar_termo
# ENTREGA DE TERMO — lança um lote de N termos para o motorista. Não há NF nem
# código de rastreio: só a quantidade, a um preço fixo configurável.
def apontar_termo
authorize @consolidacao, :update?
motorista = @consolidacao.adicionar_termos!(
motorista: params[:motorista].to_s.strip,
quantidade: params[:quantidade],
user: current_user
)
auditar!(:editar, @consolidacao,
dados_novos: { entrega_termo: params[:quantidade].to_i, motorista: motorista })
respond_to do |format|
format.json { render json: resumo_json(motorista).merge(motorista: motorista) }
format.html do
redirect_to validar_consolidacao_consolidacao_entregas_path(@consolidacao, motorista: motorista),
notice: "#{params[:quantidade].to_i} entrega(s) de termo adicionada(s) para #{motorista}."
end
end
rescue ArgumentError => e
render_apontamento_erro(e.message)
end
# DELETE /consolidacoes/:consolidacao_id/consolidacao_entregas/remover_apontamento
# Remove um apontamento manual — por ?id= (um pilar) ou por ?tracking_id=&motorista=
# (todos os pilares daquela nota). Não passa pelo guard de elegibilidade, pois o