Múltiplos pilares por entrega + tela de preços só com pilares de preço

Consolidação — multi-pilar:
- Uma entrega pode ter vários pilares ao mesmo tempo (Normal + Bônus +
  Retirada…), somando os valores. Toggles viraram multi-seleção (liga/desliga
  por pilar; classificar agora faz toggle, em massa só adiciona).
- migration: unicidade passa de [consolidacao_id, tracking_id] para
  [consolidacao_id, tracking_id, tipo].
- classificadas_count/resumo contam entregas distintas (≥1 pilar).

Configurações:
- /admin/configuracoes lista só os pilares de PREÇO (empresa/notificações
  não são preço e saíram da tela).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 03:05:15 -03:00
parent a40cb29b96
commit 19a72c066f
8 changed files with 102 additions and 39 deletions

View File

@@ -40,7 +40,8 @@ export default class extends Controller {
tipo: tipo,
motorista: this.motoristaValue
})
this.marcarToggleAtivo(tracking, tipo)
// resp.ativo indica se o pilar ficou ligado ou desligado (toggle)
this.setToggle(tracking, tipo, resp.ativo)
this.atualizarResumo(resp)
} catch (e) {
alert("Erro ao classificar entrega. Tente novamente.")
@@ -59,7 +60,7 @@ export default class extends Controller {
motorista: this.motoristaValue,
tracking_ids: [] // vazio = todas
})
this.linhaTargets.forEach(l => this.marcarToggleAtivo(l.dataset.tracking, tipo))
this.linhaTargets.forEach(l => this.setToggle(l.dataset.tracking, tipo, true))
this.atualizarResumo(resp)
}
@@ -78,7 +79,7 @@ export default class extends Controller {
motorista: this.motoristaValue,
tracking_ids: ids
})
ids.forEach(id => this.marcarToggleAtivo(id, tipo))
ids.forEach(id => this.setToggle(id, tipo, true))
this.checkboxTargets.forEach(c => c.checked = false)
this.atualizarResumo(resp)
}
@@ -99,18 +100,23 @@ export default class extends Controller {
return resp.json()
}
marcarToggleAtivo(tracking, tipo) {
// Liga/desliga UM pilar (os demais pilares da entrega ficam como estão)
setToggle(tracking, tipo, ativo) {
const grupo = this.togglesTargets.find(t => t.dataset.tracking === tracking)
if (!grupo) return
grupo.querySelectorAll(".toggle-btn").forEach(b => {
const ativo = b.dataset.tipo === tipo
b.classList.toggle("ring-2", ativo)
b.classList.toggle("ring-green-400", ativo)
b.classList.toggle("scale-105", ativo)
b.classList.toggle("opacity-50", !ativo)
})
const btn = grupo.querySelector(`.toggle-btn[data-tipo="${tipo}"]`)
if (btn) {
btn.classList.toggle("ring-2", ativo)
btn.classList.toggle("ring-green-400", ativo)
btn.classList.toggle("scale-105", ativo)
btn.classList.toggle("opacity-50", !ativo)
}
// a linha está "classificada" se tiver qualquer pilar ligado
const algumAtivo = grupo.querySelectorAll(".toggle-btn.ring-2").length > 0
const linha = this.linhaTargets.find(l => l.dataset.tracking === tracking)
if (linha) linha.dataset.classificada = "1"
if (linha) linha.dataset.classificada = algumAtivo ? "1" : "0"
}
atualizarResumo(dados) {