Ajuste Convenios e Particular
This commit is contained in:
@@ -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 })
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user