Adição de mais um preço 'Termo especial'

This commit is contained in:
2026-07-15 16:27:20 -03:00
parent e129e991e4
commit 5af51534be
13 changed files with 158 additions and 62 deletions

View File

@@ -10,6 +10,7 @@ class Configuracao < ApplicationRecord
preco_desconto
preco_extraordinaria
preco_termo
preco_termo_especial
notificacao_whatsapp
notificacao_email
empresa_nome
@@ -23,6 +24,7 @@ class Configuracao < ApplicationRecord
preco_desconto
preco_extraordinaria
preco_termo
preco_termo_especial
].freeze
validates :chave, presence: true, inclusion: { in: CHAVES }, uniqueness: true
@@ -58,6 +60,10 @@ class Configuracao < ApplicationRecord
valor('preco_termo').to_f
end
def self.preco_termo_especial
valor('preco_termo_especial').to_f
end
# Mapa usado pelo DashboardController (Fase 3)
def self.mapa_de_precos
{
@@ -66,7 +72,8 @@ class Configuracao < ApplicationRecord
bonus: preco_bonus,
desconto: preco_desconto,
extraordinaria: preco_extraordinaria,
termo: preco_termo
termo: preco_termo,
termo_especial: preco_termo_especial
}
end
@@ -77,6 +84,7 @@ class Configuracao < ApplicationRecord
'preco_desconto' => 'Desconto',
'preco_extraordinaria' => 'Entrega Extraordinária',
'preco_termo' => 'Entrega de Termo',
'preco_termo_especial' => 'Entrega de Termo Especial',
'notificacao_whatsapp' => 'Notificação WhatsApp',
'notificacao_email' => 'Notificação E-mail',
'empresa_nome' => 'Nome da Empresa'
@@ -89,6 +97,7 @@ class Configuracao < ApplicationRecord
'preco_desconto' => '⚠️',
'preco_extraordinaria' => '✨',
'preco_termo' => '📄',
'preco_termo_especial' => '📋',
'notificacao_whatsapp' => '💬',
'notificacao_email' => '✉️',
'empresa_nome' => '🏢'

View File

@@ -339,10 +339,15 @@ class Consolidacao < ApplicationRecord
# para atrelar (só motorista + quantidade, a um preço fixo configurável). Fica
# numa única linha (manual: true): quantidade guarda o N e valor_aplicado guarda
# o total do lote, então recalcular_motorista! e demais somas seguem inalteradas.
def adicionar_termos!(motorista:, quantidade:, user:, vehicle: nil)
# `tipo` distingue termo normal ('termo') de termo especial ('termo_especial'),
# cada um com seu preço configurável.
def adicionar_termos!(motorista:, quantidade:, user:, vehicle: nil, tipo: 'termo')
nome = motorista.to_s.strip
raise ArgumentError, 'Informe o motorista do termo.' if nome.blank?
tipo = tipo.to_s
raise ArgumentError, 'Tipo de termo inválido.' unless %w[termo termo_especial].include?(tipo)
qtd = quantidade.to_i
raise ArgumentError, 'Informe uma quantidade válida de termos.' if qtd < 1
@@ -351,10 +356,10 @@ class Consolidacao < ApplicationRecord
consolidacao_entregas.create!(
tracking_id: "TERMO-#{SecureRandom.uuid}", # sintético: não há Entrega/NF
tipo: 'termo',
tipo: tipo,
motorista_nome: nome,
quantidade: qtd,
valor_aplicado: qtd * ConsolidacaoEntrega.valor_para('termo'), # total do lote
valor_aplicado: qtd * ConsolidacaoEntrega.valor_para(tipo), # total do lote
manual: true,
vehicle: vehicle.presence, # veículo escolhido no lançamento (Q3)
created_by: user&.id

View File

@@ -15,7 +15,8 @@ class ConsolidacaoEntrega < ApplicationRecord
bonus: 2,
desconto: 3,
extraordinaria: 4,
termo: 5
termo: 5,
termo_especial: 6
}
TIPO_CORES = {
@@ -24,7 +25,8 @@ class ConsolidacaoEntrega < ApplicationRecord
'bonus' => { bg: 'bg-white border border-orange-500', text: 'text-black', label: 'Bônus' },
'desconto' => { bg: 'bg-gray-900', text: 'text-white', label: 'Desconto' },
'extraordinaria' => { bg: 'bg-purple-600', text: 'text-white', label: 'Entrega Extraordinária' },
'termo' => { bg: 'bg-blue-600', text: 'text-white', label: 'Entrega de Termo' }
'termo' => { bg: 'bg-blue-600', text: 'text-white', label: 'Entrega de Termo' },
'termo_especial' => { bg: 'bg-cyan-600', text: 'text-white', label: 'Entrega de Termo Especial' }
}.freeze
# Uma entrega pode ter vários pilares (Normal + Bônus + Retirada…),
@@ -54,6 +56,7 @@ class ConsolidacaoEntrega < ApplicationRecord
when 'desconto' then Configuracao.preco_desconto
when 'extraordinaria' then Configuracao.preco_extraordinaria
when 'termo' then Configuracao.preco_termo
when 'termo_especial' then Configuracao.preco_termo_especial
else 0
end
end