Correção Dash board e implantação Relaório de ADM

This commit is contained in:
2026-06-22 17:11:53 -03:00
parent e23ca0f10d
commit 94d8420bbd
16 changed files with 453 additions and 39 deletions

View File

@@ -9,14 +9,15 @@ export default class extends Controller {
"linha", "checkbox", "selecionarTodos", "modoRemover", "rotuloAcao",
"toggles", "barra", "percentual",
"contadorClassificadas", "contadorTotal",
"qtdNormal", "qtdRetirada", "qtdBonus", "qtdDesconto", "valorTotal"
"qtdNormal", "qtdRetirada", "qtdBonus", "qtdDesconto", "qtdExtraordinaria", "valorTotal"
]
static values = {
url: String, // POST classificar
massaUrl: String, // POST classificar_em_massa
motorista: String,
total: Number
url: String, // POST classificar
massaUrl: String, // POST classificar_em_massa
motorista: String,
total: Number,
precoExtraordinaria: Number // preço padrão sugerido no prompt
}
connect() {
@@ -34,12 +35,21 @@ export default class extends Controller {
const tracking = btn.dataset.tracking
const tipo = btn.dataset.tipo
// Pilar extraordinária: ao ATIVAR (botão ainda sem ring-2), pergunta o valor.
const ativando = !btn.classList.contains("ring-2")
let valor = null
if (tipo === "extraordinaria" && ativando) {
valor = this.pedirValor()
if (valor === null) return // admin cancelou
}
btn.disabled = true
try {
const resp = await this.post(this.urlValue, {
tracking_id: tracking,
tipo: tipo,
motorista: this.motoristaValue
motorista: this.motoristaValue,
valor: valor
})
// resp.ativo indica se o pilar ficou ligado ou desligado (toggle)
this.setToggle(tracking, tipo, resp.ativo)
@@ -58,11 +68,18 @@ export default class extends Controller {
const verbo = remover ? "REMOVER de TODAS as entregas" : "Marcar TODAS as entregas como"
if (!confirm(`${verbo} ${this.labelTipo(tipo)}?`)) return
let valor = null
if (tipo === "extraordinaria" && !remover) {
valor = this.pedirValor()
if (valor === null) return
}
const resp = await this.post(this.massaUrlValue, {
tipo: tipo,
motorista: this.motoristaValue,
tracking_ids: [], // vazio = todas
acao: remover ? "remover" : "adicionar"
acao: remover ? "remover" : "adicionar",
valor: valor
})
this.linhaTargets.forEach(l => this.setToggle(l.dataset.tracking, tipo, !remover))
this.atualizarResumo(resp)
@@ -97,11 +114,19 @@ export default class extends Controller {
}
const remover = this.modoRemover
let valor = null
if (tipo === "extraordinaria" && !remover) {
valor = this.pedirValor()
if (valor === null) return
}
const resp = await this.post(this.massaUrlValue, {
tipo: tipo,
motorista: this.motoristaValue,
tracking_ids: ids,
acao: remover ? "remover" : "adicionar"
acao: remover ? "remover" : "adicionar",
valor: valor
})
ids.forEach(id => this.setToggle(id, tipo, !remover))
this.checkboxTargets.forEach(c => c.checked = false)
@@ -150,6 +175,8 @@ export default class extends Controller {
this.qtdRetiradaTarget.textContent = porTipo["retirada"] || 0
this.qtdBonusTarget.textContent = porTipo["bonus"] || 0
this.qtdDescontoTarget.textContent = porTipo["desconto"] || 0
if (this.hasQtdExtraordinariaTarget)
this.qtdExtraordinariaTarget.textContent = porTipo["extraordinaria"] || 0
const valor = dados.valor_total || 0
this.valorTotalTarget.textContent =
@@ -171,6 +198,21 @@ export default class extends Controller {
labelTipo(tipo) {
return { entrega_normal: "Normal", retirada: "Retirada",
bonus: "Bônus", desconto: "Desconto" }[tipo] || tipo
bonus: "Bônus", desconto: "Desconto",
extraordinaria: "Extraordinária" }[tipo] || tipo
}
// Pergunta o valor da entrega extraordinária (pré-preenchido com o padrão).
// Retorna o número (>= 0) ou null se o admin cancelar.
pedirValor() {
const padrao = (this.precoExtraordinariaValue || 0).toFixed(2).replace(".", ",")
const entrada = prompt("Valor desta entrega extraordinária (R$):", padrao)
if (entrada === null) return null
const num = parseFloat(entrada.replace(",", "."))
if (isNaN(num) || num < 0) {
alert("Valor inválido. Informe um número maior ou igual a zero.")
return null
}
return num
}
}