Files
agenciapsilmno/src/services/agendaConfigService.js
T

92 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
}