// app/javascript/controllers/apontamento_termo_controller.js // Stimulus — Entrega de termo. Lança lotes de termos (normal e/ou especial) para // o motorista da tela. Entrega sem NF nem código de rastreio: só as quantidades // (um stepper − N + por tipo), cada tipo a um preço fixo configurável. import { Controller } from "@hotwired/stimulus" export default class extends Controller { static targets = ["modal", "quantidade", "quantidadeEspecial", "erro", "veiculo"] static values = { apontarTermoUrl: String, motorista: String } abrir() { this.erroTarget.classList.add("hidden") this.quantidadeTarget.value = "1" this.quantidadeEspecialTarget.value = "0" this.modalTarget.classList.remove("hidden") } fechar() { this.modalTarget.classList.add("hidden") } // Fecha ao clicar no fundo (fora do card) fundo(event) { if (event.target === this.modalTarget) this.fechar() } // Steppers (mínimo 0 em ambos; o envio exige ao menos 1 no total) mais() { this.quantidadeTarget.value = String(this.qtdAtual(this.quantidadeTarget) + 1) } menos() { this.quantidadeTarget.value = String(Math.max(0, this.qtdAtual(this.quantidadeTarget) - 1)) } maisEspecial() { this.quantidadeEspecialTarget.value = String(this.qtdAtual(this.quantidadeEspecialTarget) + 1) } menosEspecial() { this.quantidadeEspecialTarget.value = String(Math.max(0, this.qtdAtual(this.quantidadeEspecialTarget) - 1)) } qtdAtual(alvo) { const n = parseInt(alvo.value, 10) return Number.isFinite(n) && n > 0 ? n : 0 } async adicionar(event) { event?.preventDefault() const quantidade = this.qtdAtual(this.quantidadeTarget) const quantidadeEspecial = this.qtdAtual(this.quantidadeEspecialTarget) const motorista = this.motoristaValue.trim() if (!motorista) { this.mostrarErro("Motorista não identificado."); return } if (quantidade + quantidadeEspecial < 1) { this.mostrarErro("Informe ao menos um termo (normal ou especial).") return } const btn = event.currentTarget btn.disabled = true try { const resp = await fetch(this.apontarTermoUrlValue, { method: "POST", headers: { "Content-Type": "application/json", "Accept": "application/json", "X-CSRF-Token": document.querySelector('meta[name="csrf-token"]').content }, body: JSON.stringify({ motorista: motorista, quantidade: quantidade, quantidade_especial: quantidadeEspecial, vehicle: this.hasVeiculoTarget ? this.veiculoTarget.value : "" }) }) const data = await resp.json() if (!resp.ok || data.ok === false) { this.mostrarErro(data.erro || "Não foi possível adicionar as entregas de termo.") return } // Recarrega para refletir o valor atualizado do motorista. window.location.reload() } catch (e) { this.mostrarErro("Erro ao adicionar as entregas de termo. Tente novamente.") } finally { btn.disabled = false } } mostrarErro(msg) { this.erroTarget.textContent = msg this.erroTarget.classList.remove("hidden") } }