Correcao Sidebar Classico e Rail, Correcao Layout, Ajuste de Breakpoint para Tailwind, Ajuste AppTopbar, Ajuste Menu PopOver, Recriado Paleta de Cores, Inserido algumas animações leves, Reajuste Cor items NOVOS da tabela, Drawer Ajuda Corrigido no Logout, Whatsapp, sms, email, recursos extras
This commit is contained in:
@@ -26,107 +26,94 @@
|
||||
// remove(id) – soft-delete (active = false)
|
||||
// loadActive(ownerId, patientId) – desconto ativo vigente para um paciente
|
||||
|
||||
import { ref } from 'vue'
|
||||
import { supabase } from '@/lib/supabase/client'
|
||||
import { ref } from 'vue';
|
||||
import { supabase } from '@/lib/supabase/client';
|
||||
|
||||
export function usePatientDiscounts () {
|
||||
const discounts = ref([])
|
||||
const loading = ref(false)
|
||||
const error = ref('')
|
||||
export function usePatientDiscounts() {
|
||||
const discounts = ref([]);
|
||||
const loading = ref(false);
|
||||
const error = ref('');
|
||||
|
||||
// ── Carregar todos os descontos do owner ─────────────────────────────
|
||||
async function load (ownerId) {
|
||||
if (!ownerId) return
|
||||
loading.value = true
|
||||
error.value = ''
|
||||
try {
|
||||
const { data, error: err } = await supabase
|
||||
.from('patient_discounts')
|
||||
.select('*')
|
||||
.eq('owner_id', ownerId)
|
||||
.order('created_at', { ascending: false })
|
||||
// ── Carregar todos os descontos do owner ─────────────────────────────
|
||||
async function load(ownerId) {
|
||||
if (!ownerId) return;
|
||||
loading.value = true;
|
||||
error.value = '';
|
||||
try {
|
||||
const { data, error: err } = await supabase.from('patient_discounts').select('*').eq('owner_id', ownerId).order('created_at', { ascending: false });
|
||||
|
||||
if (err) throw err
|
||||
discounts.value = data || []
|
||||
} catch (e) {
|
||||
error.value = e?.message || 'Falha ao carregar descontos.'
|
||||
discounts.value = []
|
||||
} finally {
|
||||
loading.value = false
|
||||
if (err) throw err;
|
||||
discounts.value = data || [];
|
||||
} catch (e) {
|
||||
error.value = e?.message || 'Falha ao carregar descontos.';
|
||||
discounts.value = [];
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Criar ou atualizar um desconto ───────────────────────────────────
|
||||
// payload deve conter: { owner_id, tenant_id, patient_id, discount_pct, discount_flat, ... }
|
||||
// Se payload.id estiver presente, faz UPDATE; caso contrário, INSERT.
|
||||
async function save (payload) {
|
||||
error.value = ''
|
||||
try {
|
||||
if (payload.id) {
|
||||
const { id, owner_id, tenant_id, ...fields } = payload
|
||||
const { error: err } = await supabase
|
||||
.from('patient_discounts')
|
||||
.update(fields)
|
||||
.eq('id', id)
|
||||
.eq('owner_id', owner_id)
|
||||
if (err) throw err
|
||||
} else {
|
||||
const { error: err } = await supabase
|
||||
.from('patient_discounts')
|
||||
.insert(payload)
|
||||
if (err) throw err
|
||||
}
|
||||
} catch (e) {
|
||||
error.value = e?.message || 'Falha ao salvar desconto.'
|
||||
throw e
|
||||
// ── Criar ou atualizar um desconto ───────────────────────────────────
|
||||
// payload deve conter: { owner_id, tenant_id, patient_id, discount_pct, discount_flat, ... }
|
||||
// Se payload.id estiver presente, faz UPDATE; caso contrário, INSERT.
|
||||
async function save(payload) {
|
||||
error.value = '';
|
||||
try {
|
||||
if (payload.id) {
|
||||
const { id, owner_id, tenant_id, ...fields } = payload;
|
||||
const { error: err } = await supabase.from('patient_discounts').update(fields).eq('id', id).eq('owner_id', owner_id);
|
||||
if (err) throw err;
|
||||
} else {
|
||||
const { error: err } = await supabase.from('patient_discounts').insert(payload);
|
||||
if (err) throw err;
|
||||
}
|
||||
} catch (e) {
|
||||
error.value = e?.message || 'Falha ao salvar desconto.';
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Soft-delete: marca active = false ───────────────────────────────
|
||||
async function remove (id) {
|
||||
error.value = ''
|
||||
try {
|
||||
const { error: err } = await supabase
|
||||
.from('patient_discounts')
|
||||
.update({ active: false })
|
||||
.eq('id', id)
|
||||
if (err) throw err
|
||||
discounts.value = discounts.value.filter(d => d.id !== id)
|
||||
} catch (e) {
|
||||
error.value = e?.message || 'Falha ao desativar desconto.'
|
||||
throw e
|
||||
// ── Soft-delete: marca active = false ───────────────────────────────
|
||||
async function remove(id) {
|
||||
error.value = '';
|
||||
try {
|
||||
const { error: err } = await supabase.from('patient_discounts').update({ active: false }).eq('id', id);
|
||||
if (err) throw err;
|
||||
discounts.value = discounts.value.filter((d) => d.id !== id);
|
||||
} catch (e) {
|
||||
error.value = e?.message || 'Falha ao desativar desconto.';
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Desconto ativo vigente para um paciente específico ───────────────
|
||||
// Retorna o primeiro registro que satisfaz:
|
||||
// active = true
|
||||
// active_from IS NULL OR active_from <= now()
|
||||
// active_to IS NULL OR active_to >= now()
|
||||
// Ordenado por created_at DESC (mais recente tem precedência).
|
||||
async function loadActive (ownerId, patientId) {
|
||||
if (!ownerId || !patientId) return null
|
||||
try {
|
||||
const now = new Date().toISOString()
|
||||
const { data, error: err } = await supabase
|
||||
.from('patient_discounts')
|
||||
.select('*')
|
||||
.eq('owner_id', ownerId)
|
||||
.eq('patient_id', patientId)
|
||||
.eq('active', true)
|
||||
.or(`active_from.is.null,active_from.lte.${now}`)
|
||||
.or(`active_to.is.null,active_to.gte.${now}`)
|
||||
.order('created_at', { ascending: false })
|
||||
.limit(1)
|
||||
.maybeSingle()
|
||||
// ── Desconto ativo vigente para um paciente específico ───────────────
|
||||
// Retorna o primeiro registro que satisfaz:
|
||||
// active = true
|
||||
// active_from IS NULL OR active_from <= now()
|
||||
// active_to IS NULL OR active_to >= now()
|
||||
// Ordenado por created_at DESC (mais recente tem precedência).
|
||||
async function loadActive(ownerId, patientId) {
|
||||
if (!ownerId || !patientId) return null;
|
||||
try {
|
||||
const now = new Date().toISOString();
|
||||
const { data, error: err } = await supabase
|
||||
.from('patient_discounts')
|
||||
.select('*')
|
||||
.eq('owner_id', ownerId)
|
||||
.eq('patient_id', patientId)
|
||||
.eq('active', true)
|
||||
.or(`active_from.is.null,active_from.lte.${now}`)
|
||||
.or(`active_to.is.null,active_to.gte.${now}`)
|
||||
.order('created_at', { ascending: false })
|
||||
.limit(1)
|
||||
.maybeSingle();
|
||||
|
||||
if (err) throw err
|
||||
return data || null
|
||||
} catch (e) {
|
||||
console.warn('[usePatientDiscounts] loadActive error:', e?.message)
|
||||
return null
|
||||
if (err) throw err;
|
||||
return data || null;
|
||||
} catch (e) {
|
||||
console.warn('[usePatientDiscounts] loadActive error:', e?.message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return { discounts, loading, error, load, save, remove, loadActive }
|
||||
return { discounts, loading, error, load, save, remove, loadActive };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user