Agenda, Agendador, Configurações
This commit is contained in:
@@ -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 1–12
|
||||
*/
|
||||
export function getFeriadosNacionaisDoMes (ano, mes) {
|
||||
const m = String(mes).padStart(2, '0')
|
||||
return getFeriadosNacionais(ano).filter(f => f.data.slice(5, 7) === m)
|
||||
}
|
||||
@@ -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,
|
||||
]
|
||||
Reference in New Issue
Block a user