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
+82
View File
@@ -0,0 +1,82 @@
// src/utils/feriadosBR.js
// Gera feriados nacionais brasileiros por algoritmo — sem API externa.
/**
* Calcula a data da Páscoa pelo algoritmo de Meeus/Jones/Butcher.
* @param {number} ano
* @returns {Date}
*/
function calcularPascoa (ano) {
const a = ano % 19
const b = Math.floor(ano / 100)
const c = ano % 100
const d = Math.floor(b / 4)
const e = b % 4
const f = Math.floor((b + 8) / 25)
const g = Math.floor((b - f + 1) / 3)
const h = (19 * a + b - d - g + 15) % 30
const i = Math.floor(c / 4)
const k = c % 4
const l = (32 + 2 * e + 2 * i - h - k) % 7
const m = Math.floor((a + 11 * h + 22 * l) / 451)
const mes = Math.floor((h + l - 7 * m + 114) / 31)
const dia = ((h + l - 7 * m + 114) % 31) + 1
return new Date(ano, mes - 1, dia)
}
function somarDias (data, dias) {
const d = new Date(data)
d.setDate(d.getDate() + dias)
return d
}
function toISO (data) {
const y = data.getFullYear()
const m = String(data.getMonth() + 1).padStart(2, '0')
const d = String(data.getDate()).padStart(2, '0')
return `${y}-${m}-${d}`
}
function feriado (data, nome, movel = false) {
return { data: toISO(data), nome, movel }
}
/**
* Retorna todos os feriados nacionais do ano informado.
* @param {number} ano
* @returns {{ data: string, nome: string, movel: boolean }[]}
*/
export function getFeriadosNacionais (ano) {
const pascoa = calcularPascoa(ano)
const lista = [
// ── Fixos ───────────────────────────────────────────────
feriado(new Date(ano, 0, 1), 'Confraternização Universal'),
feriado(new Date(ano, 3, 21), 'Tiradentes'),
feriado(new Date(ano, 4, 1), 'Dia do Trabalho'),
feriado(new Date(ano, 8, 7), 'Independência do Brasil'),
feriado(new Date(ano, 9, 12), 'Nossa Senhora Aparecida'),
feriado(new Date(ano, 10, 2), 'Finados'),
feriado(new Date(ano, 10, 15), 'Proclamação da República'),
feriado(new Date(ano, 11, 25), 'Natal'),
// ── Móveis ──────────────────────────────────────────────
feriado(somarDias(pascoa, -48), 'Segunda de Carnaval', true),
feriado(somarDias(pascoa, -47), 'Carnaval', true),
feriado(somarDias(pascoa, -2), 'Sexta-feira Santa', true),
feriado(pascoa, 'Páscoa', true),
feriado(somarDias(pascoa, 60), 'Corpus Christi', true)
]
return lista.sort((a, b) => a.data.localeCompare(b.data))
}
/**
* Retorna feriados nacionais de um mês específico.
* @param {number} ano
* @param {number} mes 112
*/
export function getFeriadosNacionaisDoMes (ano, mes) {
const m = String(mes).padStart(2, '0')
return getFeriadosNacionais(ano).filter(f => f.data.slice(5, 7) === m)
}
+69
View File
@@ -0,0 +1,69 @@
// src/utils/menuPageOptions.js
// Catálogo plano de páginas do sistema para o select de documentação SaaS.
// Menus com `to` em string são extraídos automaticamente.
// O menu da Clínica usa route names, então suas páginas são listadas manualmente.
import therapistMenuRaw from '@/navigation/menus/therapist.menu.js'
import saasMenuFn from '@/navigation/menus/saas.menu.js'
function flattenItems (items = [], groupLabel = '') {
const result = []
for (const item of items) {
const to = item.to
if (to && typeof to === 'string' && item.label) {
const prefix = groupLabel ? `${groupLabel} · ` : ''
result.push({ label: `${prefix}${item.label}`, path: to })
}
if (item.items?.length) {
result.push(...flattenItems(item.items, item.label || groupLabel))
}
}
return result
}
function flattenMenu (menu = []) {
const result = []
for (const group of menu) {
if (group.items?.length) {
result.push(...flattenItems(group.items, group.label))
} else if (group.to && typeof group.to === 'string' && group.label) {
result.push({ label: group.label, path: group.to })
}
}
return result
}
const therapistPages = flattenMenu(therapistMenuRaw)
.map(p => ({ ...p, label: `Terapeuta · ${p.label}` }))
const saasPages = flattenMenu(saasMenuFn({ isSaasAdmin: true }))
.map(p => ({ ...p, label: `SaaS · ${p.label}` }))
// Clínica usa route names → listagem manual com os paths reais das rotas
const clinicPages = [
{ label: 'Clínica · Dashboard', path: '/admin' },
{ label: 'Clínica · Agenda da Clínica', path: '/admin/agenda/clinica' },
{ label: 'Clínica · Compromissos', path: '/admin/agenda/compromissos' },
{ label: 'Clínica · Lista de Pacientes', path: '/admin/pacientes' },
{ label: 'Clínica · Grupos de Pacientes', path: '/admin/pacientes/grupos' },
{ label: 'Clínica · Tags de Pacientes', path: '/admin/pacientes/tags' },
{ label: 'Clínica · Link Externo', path: '/admin/pacientes/link-externo' },
{ label: 'Clínica · Cadastros Recebidos', path: '/admin/pacientes/cadastro/recebidos' },
{ label: 'Clínica · Profissionais', path: '/admin/clinic/professionals' },
{ label: 'Clínica · Tipos de Clínica', path: '/admin/clinic/features' },
{ label: 'Clínica · Meu Plano', path: '/admin/meu-plano' },
{ label: 'Clínica · Segurança', path: '/admin/settings/security' },
{ label: 'Clínica · Agendamento Online', path: '/admin/online-scheduling' },
]
const portalPages = [
{ label: 'Portal · Dashboard', path: '/portal' },
{ label: 'Portal · Minhas Sessões', path: '/portal/sessoes' },
]
export const PAGE_OPTIONS = [
...therapistPages,
...clinicPages,
...saasPages,
...portalPages,
]