Ajuste Convenios e Particular

This commit is contained in:
Leonardo
2026-03-13 21:09:34 -03:00
parent 06fb369beb
commit 587079e414
13 changed files with 971 additions and 277 deletions
+78 -12
View File
@@ -403,6 +403,7 @@
:initialStartISO="dialogStartISO"
:initialEndISO="dialogEndISO"
:ownerId="dialogOwnerId || clinicOwnerId"
:planOwnerId="clinicOwnerId"
:tenantId="tenantId || ''"
:allowOwnerEdit="false"
:ownerOptions="ownerOptions"
@@ -1071,7 +1072,7 @@ async function loadMonthSearchRows () {
try {
const { data, error } = await supabase
.from('agenda_eventos')
.select('id, owner_id, tenant_id, tipo, status, titulo, inicio_em, fim_em, observacoes, modalidade, determined_commitment_id, insurance_plan_id, insurance_guide_number, insurance_value, patients!agenda_eventos_patient_id_fkey(nome_completo)')
.select('id, owner_id, tenant_id, tipo, status, titulo, inicio_em, fim_em, observacoes, modalidade, determined_commitment_id, insurance_plan_id, insurance_guide_number, insurance_value, insurance_plan_service_id, patients!agenda_eventos_patient_id_fkey(nome_completo)')
.eq('tenant_id', tid)
.in('owner_id', ids)
.is('mirror_of_event_id', null)
@@ -1386,9 +1387,10 @@ async function onEventClick (info) {
titulo_custom: ep.titulo_custom ?? null,
extra_fields: ep.extra_fields ?? null,
price: ep.price != null ? Number(ep.price) : null,
insurance_plan_id: ep.insurance_plan_id ?? null,
insurance_guide_number: ep.insurance_guide_number ?? null,
insurance_value: ep.insurance_value != null ? Number(ep.insurance_value) : null,
insurance_plan_id: ep.insurance_plan_id ?? null,
insurance_guide_number: ep.insurance_guide_number ?? null,
insurance_value: ep.insurance_value != null ? Number(ep.insurance_value) : null,
insurance_plan_service_id: ep.insurance_plan_service_id ?? null,
// ── recorrência (nova arquitetura) ──────────────────────────
recurrence_id: ep.recurrenceId ?? ep.recurrence_id ?? ep.serie_id ?? null,
original_date: ep.originalDate ?? ep.original_date ?? ep.recurrence_date ?? null,
@@ -1524,6 +1526,7 @@ function pickDbFields (obj) {
'insurance_plan_id',
'insurance_guide_number',
'insurance_value',
'insurance_plan_service_id',
]
const out = {}
for (const k of allowed) {
@@ -1673,7 +1676,8 @@ async function onDialogSave (arg) {
}
// ── CASO C / C2: criação RECORRENTE (novo ou evento existente) ─────────
if (recorrencia?.tipo === 'recorrente') {
// Só cria nova regra se NÃO há série existente — se houver recurrenceId, cai para F/G/E
if (recorrencia?.tipo === 'recorrente' && !recurrenceId) {
const startDate = new Date(basePayload.inicio_em)
const tipoFreq = recorrencia.tipoFreq ?? 'semanal'
const dow = recorrencia.diaSemana ?? startDate.getDay()
@@ -1709,6 +1713,11 @@ async function onDialogSave (arg) {
titulo_custom: basePayload.titulo_custom ?? null,
observacoes: basePayload.observacoes ?? null,
extra_fields: basePayload.extra_fields ?? null,
price: basePayload.price ?? null,
insurance_plan_id: basePayload.insurance_plan_id ?? null,
insurance_guide_number: basePayload.insurance_guide_number ?? null,
insurance_value: basePayload.insurance_value ?? null,
insurance_plan_service_id: basePayload.insurance_plan_service_id ?? null,
status: 'ativo',
}
const createdRule = await createRule(rule)
@@ -1797,6 +1806,11 @@ async function onDialogSave (arg) {
modalidade: basePayload.modalidade ?? 'presencial',
observacoes: basePayload.observacoes ?? null,
extra_fields: basePayload.extra_fields ?? null,
price: basePayload.price ?? null,
insurance_plan_id: basePayload.insurance_plan_id ?? null,
insurance_guide_number: basePayload.insurance_guide_number ?? null,
insurance_value: basePayload.insurance_value ?? null,
insurance_plan_service_id: basePayload.insurance_plan_service_id ?? null,
}, { tenantId: tid })
eventId = mat.id
}
@@ -1825,7 +1839,12 @@ async function onDialogSave (arg) {
titulo_custom: basePayload.titulo_custom ?? null,
observacoes: basePayload.observacoes ?? null,
extra_fields: basePayload.extra_fields ?? null,
})
price: basePayload.price ?? null,
insurance_plan_id: basePayload.insurance_plan_id ?? null,
insurance_guide_number: basePayload.insurance_guide_number ?? null,
insurance_value: basePayload.insurance_value ?? null,
insurance_plan_service_id: basePayload.insurance_plan_service_id ?? null,
}
// Opção C — atualizar template e propagar para a nova sub-série
const serviceItemsE = arg.serviceItems
@@ -1853,8 +1872,29 @@ async function onDialogSave (arg) {
titulo_custom: basePayload.titulo_custom ?? null,
observacoes: basePayload.observacoes ?? null,
extra_fields: basePayload.extra_fields ?? null,
price: basePayload.price ?? null,
insurance_plan_id: basePayload.insurance_plan_id ?? null,
insurance_guide_number: basePayload.insurance_guide_number ?? null,
insurance_value: basePayload.insurance_value ?? null,
insurance_plan_service_id: basePayload.insurance_plan_service_id ?? null,
})
// Propaga campos não-serviço para sessões já materializadas da série
await supabase
.from('agenda_eventos')
.update({
modalidade: basePayload.modalidade ?? 'presencial',
titulo_custom: basePayload.titulo_custom ?? null,
observacoes: basePayload.observacoes ?? null,
extra_fields: basePayload.extra_fields ?? null,
price: basePayload.price ?? null,
insurance_plan_id: basePayload.insurance_plan_id ?? null,
insurance_guide_number: basePayload.insurance_guide_number ?? null,
insurance_value: basePayload.insurance_value ?? null,
insurance_plan_service_id: basePayload.insurance_plan_service_id ?? null,
})
.eq('recurrence_id', recurrenceId)
// Opção C — atualizar template e propagar para toda a série
const serviceItemsF = arg.serviceItems
if (recurrenceId && serviceItemsF?.length) {
@@ -1881,8 +1921,30 @@ async function onDialogSave (arg) {
titulo_custom: basePayload.titulo_custom ?? null,
observacoes: basePayload.observacoes ?? null,
extra_fields: basePayload.extra_fields ?? null,
price: basePayload.price ?? null,
insurance_plan_id: basePayload.insurance_plan_id ?? null,
insurance_guide_number: basePayload.insurance_guide_number ?? null,
insurance_value: basePayload.insurance_value ?? null,
insurance_plan_service_id: basePayload.insurance_plan_service_id ?? null,
})
// Propaga TODOS os campos para TODAS as sessões materializadas (sem exceção)
await supabase
.from('agenda_eventos')
.update({
modalidade: basePayload.modalidade ?? 'presencial',
titulo_custom: basePayload.titulo_custom ?? null,
observacoes: basePayload.observacoes ?? null,
extra_fields: basePayload.extra_fields ?? null,
price: basePayload.price ?? null,
insurance_plan_id: basePayload.insurance_plan_id ?? null,
insurance_guide_number: basePayload.insurance_guide_number ?? null,
insurance_value: basePayload.insurance_value ?? null,
insurance_plan_service_id: basePayload.insurance_plan_service_id ?? null,
services_customized: false,
})
.eq('recurrence_id', recurrenceId)
// Propaga para todos — incluindo services_customized=true — e reseta o flag
const serviceItemsG = arg.serviceItems
if (recurrenceId && serviceItemsG?.length) {
@@ -1890,12 +1952,6 @@ async function onDialogSave (arg) {
await propagateToSerie(recurrenceId, serviceItemsG, { ignoreCustomized: true })
}
// Reseta services_customized para false em todos os eventos da série
await supabase
.from('agenda_eventos')
.update({ services_customized: false })
.eq('recurrence_id', recurrenceId)
if (id) await arg.onSaved?.(id)
toast.add({ severity: 'success', summary: 'Salvo', detail: 'Todas as sessões da série foram atualizadas (sem exceção).', life: 2500 })
@@ -1922,6 +1978,16 @@ async function onDialogSave (arg) {
}
} catch (e) {
const msg = String(e?.message || '')
if (msg.includes('recurrence_rules_dates_chk') || (msg.includes('violates check constraint') && msg.includes('recurrence_rules'))) {
toast.add({
severity: 'warn',
summary: 'Não foi possível dividir a série',
detail: 'Esta é a primeira sessão da série. Para alterar todas as ocorrências, selecione "Todos" ou "Todos sem exceção".',
life: 6000
})
return
}
toast.add({ severity: 'warn', summary: 'Erro', detail: eventsError.value || e?.message || 'Falha ao salvar.', life: 4500 })
}
}