Agenda, Agendador, Configurações

This commit is contained in:
Leonardo
2026-03-12 08:58:36 -03:00
parent f733db8436
commit f4b185ae17
197 changed files with 33405 additions and 6507 deletions

View File

@@ -0,0 +1,57 @@
// src/features/agenda/composables/useProfessionalPricing.js
//
// Carrega a tabela professional_pricing do owner logado e expõe
// getPriceFor(commitmentId) → number | null
//
// null = commitment_id
// Regra: lookup exato → fallback NULL → null se nenhum configurado
import { ref } from 'vue'
import { supabase } from '@/lib/supabase/client'
export function useProfessionalPricing () {
const rows = ref([]) // professional_pricing rows
const loading = ref(false)
const error = ref('')
// ── Carregar todos os preços do owner ──────────────────────────────
async function load (ownerId) {
if (!ownerId) return
loading.value = true
error.value = ''
try {
const { data, error: err } = await supabase
.from('professional_pricing')
.select('id, determined_commitment_id, price, notes')
.eq('owner_id', ownerId)
if (err) throw err
rows.value = data || []
} catch (e) {
error.value = e?.message || 'Falha ao carregar precificação.'
rows.value = []
} finally {
loading.value = false
}
}
// ── Consulta: preço para um tipo de compromisso ────────────────────
// 1. Linha com determined_commitment_id === commitmentId
// 2. Fallback: linha com determined_commitment_id === null (preço padrão)
// 3. null se nada configurado
function getPriceFor (commitmentId) {
if (!rows.value.length) return null
// match exato
if (commitmentId) {
const exact = rows.value.find(r => r.determined_commitment_id === commitmentId)
if (exact && exact.price != null) return Number(exact.price)
}
// fallback padrão (commitment_id IS NULL)
const def = rows.value.find(r => r.determined_commitment_id === null)
return def && def.price != null ? Number(def.price) : null
}
return { rows, loading, error, load, getPriceFor }
}