78 lines
2.5 KiB
JavaScript
78 lines
2.5 KiB
JavaScript
/*
|
|
|--------------------------------------------------------------------------
|
|
| Agência PSI
|
|
|--------------------------------------------------------------------------
|
|
| Criado e desenvolvido por Leonardo Nohama
|
|
|
|
|
| Tecnologia aplicada à escuta.
|
|
| Estrutura para o cuidado.
|
|
|
|
|
| Arquivo: src/services/agendaConfigService.js
|
|
| Data: 2026
|
|
| Local: São Carlos/SP — Brasil
|
|
|--------------------------------------------------------------------------
|
|
| © 2026 — Todos os direitos reservados
|
|
|--------------------------------------------------------------------------
|
|
*/
|
|
import { supabase } from '@/lib/supabase/client';
|
|
|
|
export async function getOwnerId() {
|
|
const { data, error } = await supabase.auth.getUser();
|
|
if (error) throw error;
|
|
const uid = data?.user?.id;
|
|
if (!uid) throw new Error('Sessão inválida.');
|
|
return uid;
|
|
}
|
|
|
|
export async function fetchSlotsRegras(ownerId) {
|
|
const { data, error } = await supabase.from('agenda_slots_regras').select('*').eq('owner_id', ownerId).order('dia_semana', { ascending: true });
|
|
if (error) throw error;
|
|
return data || [];
|
|
}
|
|
|
|
export async function upsertSlotRegra(ownerId, payload) {
|
|
const row = {
|
|
owner_id: ownerId,
|
|
dia_semana: Number(payload.dia_semana),
|
|
passo_minutos: Number(payload.passo_minutos),
|
|
offset_minutos: Number(payload.offset_minutos),
|
|
buffer_antes_min: Number(payload.buffer_antes_min || 0),
|
|
buffer_depois_min: Number(payload.buffer_depois_min || 0),
|
|
min_antecedencia_horas: Number(payload.min_antecedencia_horas || 0),
|
|
ativo: !!payload.ativo
|
|
};
|
|
|
|
const { data, error } = await supabase.from('agenda_slots_regras').upsert(row, { onConflict: 'owner_id,dia_semana' }).select('*').single();
|
|
|
|
if (error) throw error;
|
|
return data;
|
|
}
|
|
|
|
export function normalizeHHMM(v) {
|
|
if (v == null) return null;
|
|
const s = String(v).trim();
|
|
if (/^\d{2}:\d{2}$/.test(s)) return s;
|
|
if (/^\d{2}:\d{2}:\d{2}$/.test(s)) return s.slice(0, 5);
|
|
return s;
|
|
}
|
|
|
|
export function ruleKey(r) {
|
|
return [r.dia_semana, normalizeHHMM(r.hora_inicio), normalizeHHMM(r.hora_fim), r.modalidade || 'ambos', !!r.ativo].join('|');
|
|
}
|
|
|
|
/**
|
|
* Remove duplicados exatos antes de mandar pro banco.
|
|
* (DB já tem UNIQUE, mas isso evita erro e deixa UX melhor)
|
|
*/
|
|
export function dedupeRegrasSemanais(regras) {
|
|
const seen = new Set();
|
|
const out = [];
|
|
for (const r of regras || []) {
|
|
const k = ruleKey(r);
|
|
if (seen.has(k)) continue;
|
|
seen.add(k);
|
|
out.push(r);
|
|
}
|
|
return out;
|
|
}
|