@fayz-ai/plugin-agenda 0.18.2 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-RVO5ILXN.js → chunk-A77PUFY5.js} +85 -2
- package/dist/chunk-A77PUFY5.js.map +1 -0
- package/dist/components/AgendaFilterRail.d.ts +1 -1
- package/dist/components/AgendaGeneralSettings.d.ts.map +1 -1
- package/dist/components/AppointmentModal.d.ts.map +1 -1
- package/dist/components/AppointmentPopover.d.ts.map +1 -1
- package/dist/components/AvailabilityHeaderControl.d.ts +6 -0
- package/dist/components/AvailabilityHeaderControl.d.ts.map +1 -0
- package/dist/components/EventContextMenu.d.ts.map +1 -1
- package/dist/components/SeriesDeleteChoice.d.ts +20 -0
- package/dist/components/SeriesDeleteChoice.d.ts.map +1 -0
- package/dist/config.d.ts +5 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/data/mock.d.ts.map +1 -1
- package/dist/data/registries.d.ts.map +1 -1
- package/dist/data/supabase.d.ts.map +1 -1
- package/dist/data/turn-queue-types.d.ts +71 -0
- package/dist/data/turn-queue-types.d.ts.map +1 -0
- package/dist/data/turn-queue.d.ts +4 -0
- package/dist/data/turn-queue.d.ts.map +1 -0
- package/dist/data/types.d.ts +73 -0
- package/dist/data/types.d.ts.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3157 -902
- package/dist/index.js.map +1 -1
- package/dist/lib/recurrence.d.ts +122 -0
- package/dist/lib/recurrence.d.ts.map +1 -0
- package/dist/lib/turn-queue-plugin.d.ts +4 -0
- package/dist/lib/turn-queue-plugin.d.ts.map +1 -0
- package/dist/lib/turn-queue-presence.d.ts +4 -0
- package/dist/lib/turn-queue-presence.d.ts.map +1 -0
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +5 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/public/index.js +2 -2
- package/dist/store.d.ts +7 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/views/CalendarView.d.ts.map +1 -1
- package/dist/views/TurnQueuePage.d.ts +10 -0
- package/dist/views/TurnQueuePage.d.ts.map +1 -0
- package/package.json +6 -6
- package/dist/chunk-RVO5ILXN.js.map +0 -1
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/** How the rule steps. The seam for a custom RRULE editor is this union. */
|
|
2
|
+
export type RecurrenceFreq = 'daily' | 'weekly' | 'monthly_weekday';
|
|
3
|
+
/** What the modal offers. `none` is the absence of a rule, not a rule. */
|
|
4
|
+
export type RecurrencePresetId = 'none' | 'daily' | 'weekly' | 'biweekly' | 'monthly';
|
|
5
|
+
/** Which end condition the person picked. Exactly one of them applies. */
|
|
6
|
+
export type RecurrenceEndMode = 'until' | 'count';
|
|
7
|
+
export interface RecurrenceRule {
|
|
8
|
+
freq: RecurrenceFreq;
|
|
9
|
+
/** Every N periods. 1 = every week; 2 = every other week. */
|
|
10
|
+
interval: number;
|
|
11
|
+
/** Inclusive last day, `YYYY-MM-DD`. Mutually exclusive with `count`. */
|
|
12
|
+
until?: string | null;
|
|
13
|
+
/** Total occurrences, counting the first. Mutually exclusive with `until`. */
|
|
14
|
+
count?: number | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* THE HORIZON IS CAPPED, and the caller is told when the cap bit.
|
|
18
|
+
*
|
|
19
|
+
* "Daily until the end of 2030" is a sentence someone will type, and it is
|
|
20
|
+
* 1.500 real rows in `appointments` — written one by one from a browser tab
|
|
21
|
+
* that may be closed halfway. Two ceilings, whichever comes first, and the
|
|
22
|
+
* expansion REPORTS that it stopped short instead of quietly obeying.
|
|
23
|
+
*/
|
|
24
|
+
export declare const RECURRENCE_MAX_OCCURRENCES = 60;
|
|
25
|
+
export declare const RECURRENCE_HORIZON_DAYS = 730;
|
|
26
|
+
export interface RecurrenceExpansion {
|
|
27
|
+
/** Local day keys, `YYYY-MM-DD`, first occurrence included, ascending. */
|
|
28
|
+
dates: string[];
|
|
29
|
+
/** A cap stopped the series before its own end condition did. */
|
|
30
|
+
truncated: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Which occurrence of its weekday the day is inside its month: 1..5. */
|
|
33
|
+
export declare function weekdayOrdinalInMonth(key: string): number;
|
|
34
|
+
/** The preset, as the rule it means. `none` has no rule. */
|
|
35
|
+
export declare function ruleForPreset(preset: RecurrencePresetId): Pick<RecurrenceRule, 'freq' | 'interval'> | null;
|
|
36
|
+
/**
|
|
37
|
+
* A stored rule, back as the preset that describes it — so reopening a series
|
|
38
|
+
* shows "a cada 2 semanas" and not a blank control.
|
|
39
|
+
*
|
|
40
|
+
* `none` when nothing here describes it, which is what a rule written by a
|
|
41
|
+
* future custom editor will look like. The screen then says "personalizado"
|
|
42
|
+
* instead of claiming the rule is one of these five.
|
|
43
|
+
*/
|
|
44
|
+
export declare function presetForRule(rule: Pick<RecurrenceRule, 'freq' | 'interval'> | null | undefined): RecurrencePresetId;
|
|
45
|
+
/**
|
|
46
|
+
* The days this rule produces, starting ON `startDate`.
|
|
47
|
+
*
|
|
48
|
+
* The first occurrence is always the start day itself — it is the appointment
|
|
49
|
+
* somebody is booking, and the rule only says what comes after it.
|
|
50
|
+
*/
|
|
51
|
+
export declare function expandRecurrence(startDate: string, rule: RecurrenceRule): RecurrenceExpansion;
|
|
52
|
+
/**
|
|
53
|
+
* The two scopes this release ships, and they are the two Google puts first.
|
|
54
|
+
*
|
|
55
|
+
* "Este e os seguintes" is deliberately absent: it needs a split of the stored
|
|
56
|
+
* rule (one rule becomes two, the old one gaining an end date) and nothing
|
|
57
|
+
* below pretends to do that. Adding it later means a third member here and a
|
|
58
|
+
* rule-split in the provider — not a different data model.
|
|
59
|
+
*/
|
|
60
|
+
export type SeriesScope = 'this' | 'series';
|
|
61
|
+
export type SeriesTarget = {
|
|
62
|
+
kind: 'single';
|
|
63
|
+
bookingId: string;
|
|
64
|
+
} | {
|
|
65
|
+
kind: 'series';
|
|
66
|
+
seriesId: string;
|
|
67
|
+
bookingId: string;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* What the chosen scope actually points at.
|
|
71
|
+
*
|
|
72
|
+
* A booking with no `series_id` resolves to itself whatever the scope says: the
|
|
73
|
+
* caller asking for 'series' on a loose appointment is a screen bug, and
|
|
74
|
+
* inventing a series id to satisfy it would delete nothing or everything.
|
|
75
|
+
*/
|
|
76
|
+
export declare function resolveSeriesTarget(booking: {
|
|
77
|
+
id: string;
|
|
78
|
+
seriesId?: string | null;
|
|
79
|
+
}, scope: SeriesScope): SeriesTarget;
|
|
80
|
+
/** The fields a series edit may carry. The DAY is not one of them. */
|
|
81
|
+
export interface SeriesPatch<T> {
|
|
82
|
+
seriesId: string;
|
|
83
|
+
patch: T;
|
|
84
|
+
/** `HH:mm` local — what every occurrence's start time becomes. */
|
|
85
|
+
timeOfDay: string;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Exactly what to call, so the caller is not left guessing whether a series
|
|
89
|
+
* write already covered the occurrence it opened.
|
|
90
|
+
*
|
|
91
|
+
* Apply `series` FIRST and `single` second: the series write sets the time of
|
|
92
|
+
* every day, and the single write is the one that may move this occurrence to
|
|
93
|
+
* another day — it has to land last to win.
|
|
94
|
+
*/
|
|
95
|
+
export interface SeriesEditPlan<T> {
|
|
96
|
+
/** For the occurrence that was opened. Null = the series patch covered it. */
|
|
97
|
+
single: Partial<T> | null;
|
|
98
|
+
/** For every occurrence of the series. Null when the scope is 'this'. */
|
|
99
|
+
series: SeriesPatch<Omit<T, 'startsAt' | 'endsAt'>> | null;
|
|
100
|
+
/**
|
|
101
|
+
* The person moved the appointment to another DAY while asking for "all".
|
|
102
|
+
* The move lands on this occurrence only, and the screen has to say so —
|
|
103
|
+
* sending one date to a whole series would collapse it into that day.
|
|
104
|
+
*/
|
|
105
|
+
dateStaysLocal: boolean;
|
|
106
|
+
}
|
|
107
|
+
export declare function planSeriesEdit<T extends {
|
|
108
|
+
startsAt?: string;
|
|
109
|
+
endsAt?: string;
|
|
110
|
+
}>(args: {
|
|
111
|
+
booking: {
|
|
112
|
+
id: string;
|
|
113
|
+
seriesId?: string | null;
|
|
114
|
+
};
|
|
115
|
+
scope: SeriesScope;
|
|
116
|
+
patch: T;
|
|
117
|
+
/** `HH:mm` local, the time the form now shows. */
|
|
118
|
+
timeOfDay: string;
|
|
119
|
+
/** The form's day differs from the occurrence's own day. */
|
|
120
|
+
dateChanged: boolean;
|
|
121
|
+
}): SeriesEditPlan<T>;
|
|
122
|
+
//# sourceMappingURL=recurrence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurrence.d.ts","sourceRoot":"","sources":["../../src/lib/recurrence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PluginManifest } from '@fayz-ai/core';
|
|
2
|
+
import type { AgendaTurnQueuePluginOptions } from '../data/turn-queue-types';
|
|
3
|
+
export declare function createAgendaTurnQueuePlugin(options?: AgendaTurnQueuePluginOptions): PluginManifest;
|
|
4
|
+
//# sourceMappingURL=turn-queue-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-queue-plugin.d.ts","sourceRoot":"","sources":["../../src/lib/turn-queue-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAOnD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAA;AAE5E,wBAAgB,2BAA2B,CAAC,OAAO,GAAE,4BAAiC,GAAG,cAAc,CAsDtG"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function publishTurnQueueLeader(unitId: string, professionalId: string | null): void;
|
|
2
|
+
export declare function getTurnQueueLeader(unitId: string | null | undefined): string | null;
|
|
3
|
+
export declare function subscribeTurnQueueLeader(listener: (unitId: string, professionalId: string | null) => void): () => void;
|
|
4
|
+
//# sourceMappingURL=turn-queue-presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-queue-presence.d.ts","sourceRoot":"","sources":["../../src/lib/turn-queue-presence.ts"],"names":[],"mappings":"AAGA,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAG1F;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAEnF;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAChE,MAAM,IAAI,CAGZ"}
|
package/dist/locales/en.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgTrC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgTvC,CAAA"}
|
|
@@ -13,6 +13,11 @@ export declare const MIGRATION_011_A_SALA_ENTRA_NO_COMPROMISSO = "-- A sala entr
|
|
|
13
13
|
export declare const MIGRATION_012_A_SALA_SEM_NOME_TAMBEM_E_UMA_SALA = "-- A sala sem nome tamb\u00E9m \u00E9 uma sala.\n--\n-- 010 recusou a sala cujo `name` vem vazio: sem nome, o writer mandava para a\n-- quarentena. Uma linha de 223 \u2014 e 17 compromissos apontam para ela.\n--\n-- Recusar estava errado pelo mesmo motivo que `upsert_appointment_item` j\u00E1\n-- tinha resolvido para o servi\u00E7o: o nome \u00E9 uma ETIQUETA, e a falta dela n\u00E3o\n-- torna a linha amb\u00EDgua. O que se perde recusando \u00E9 o V\u00CDNCULO \u2014 17 atendimentos\n-- ficam sem saber em que sala aconteceram, para poupar um r\u00F3tulo feio.\n--\n-- Ent\u00E3o cai para o n\u00FAmero da origem, que \u00E9 sempre verdadeiro e diz na cara que\n-- \u00E9 um remendo: \"Sala 576\". Quem for arrumar o cadastro no V1 v\u00EA a linha e sabe\n-- o que procurar.\n--\n-- Idempotente.\n\nCREATE OR REPLACE FUNCTION migration.upsert_agenda_resource(\n p_tenant uuid, p_id uuid, p_row jsonb, p_args jsonb DEFAULT '{}'::jsonb\n) RETURNS jsonb\nLANGUAGE plpgsql SECURITY DEFINER SET search_path TO ''\nAS $function$\nDECLARE\n v_meta jsonb := coalesce(p_row -> 'metadata', '{}'::jsonb);\n v_unit uuid;\n v_name text;\n v_ref text;\n v_cap integer;\n v_existing uuid;\n v_created boolean := false;\n v_standalone boolean := migration._standalone();\nBEGIN\n IF v_standalone THEN PERFORM migration._assert_fence(p_tenant); PERFORM set_config('migration.writer', 'on', true); END IF;\n IF p_id IS NULL THEN\n RETURN jsonb_build_object('status', 'quarantined', 'kind', 'state', 'reason', 'a resource needs an id');\n END IF;\n\n BEGIN v_unit := (p_row ->> 'unit_id')::uuid; EXCEPTION WHEN OTHERS THEN v_unit := NULL; END;\n -- Sala sem unidade continua recusada, e a diferen\u00E7a com o nome \u00E9 essa: uma\n -- sala sem unidade apareceria na agenda de todas as 63 filiais. N\u00E3o \u00E9 r\u00F3tulo,\n -- \u00E9 escopo.\n IF v_unit IS NULL THEN\n RETURN jsonb_build_object('status', 'quarantined', 'kind', 'fk',\n 'reason', 'a resource needs the unit it lives in');\n END IF;\n\n v_ref := nullif(v_meta -> 'agenda' ->> 'v1_service_location_ref', '');\n v_name := coalesce(\n nullif(trim(coalesce(p_row ->> 'name', '')), ''),\n CASE WHEN v_ref IS NOT NULL THEN 'Sala ' || v_ref END,\n 'Sala');\n\n v_cap := greatest(coalesce(nullif(p_row ->> 'capacity', '')::integer, 1), 1);\n\n SELECT tenant_id INTO v_existing FROM public.plg_agenda_resources WHERE id = p_id;\n IF v_existing IS NOT NULL AND v_existing <> p_tenant THEN\n RETURN jsonb_build_object('status', 'quarantined', 'kind', 'tenant',\n 'reason', format('resource %s already exists in another tenant', p_id));\n END IF;\n\n IF v_existing IS NULL THEN\n INSERT INTO public.plg_agenda_resources\n (id, tenant_id, unit_id, name, kind, capacity, is_active, sort_order, metadata, created_at, updated_at)\n VALUES\n (p_id, p_tenant, v_unit, v_name, coalesce(p_args ->> 'kind', 'room'), v_cap,\n coalesce((p_row ->> 'is_active')::boolean, true),\n coalesce(nullif(p_row ->> 'sort_order', '')::integer, 0), v_meta,\n coalesce(nullif(p_row ->> 'created_at', '')::timestamptz, now()),\n coalesce(nullif(p_row ->> 'updated_at', '')::timestamptz, now()));\n v_created := true;\n ELSE\n UPDATE public.plg_agenda_resources SET\n unit_id = v_unit,\n name = v_name,\n capacity = v_cap,\n is_active = CASE WHEN p_row ? 'is_active' THEN coalesce((p_row ->> 'is_active')::boolean, true) ELSE is_active END,\n metadata = migration._merge_meta(metadata, v_meta),\n updated_at = coalesce(nullif(p_row ->> 'updated_at', '')::timestamptz, now())\n WHERE id = p_id;\n END IF;\n\n IF v_standalone THEN\n PERFORM migration._audit(p_tenant, 'public.plg_agenda_resources', p_id,\n jsonb_build_object('reason', CASE WHEN v_created THEN 'created' ELSE 'updated' END));\n END IF;\n RETURN jsonb_build_object('status', 'migrated', 'target_id', p_id,\n 'reason', CASE WHEN v_created THEN 'created' ELSE 'updated' END);\nEND $function$;\n\nREVOKE ALL ON FUNCTION migration.upsert_agenda_resource(uuid, uuid, jsonb, jsonb) FROM PUBLIC, anon, authenticated;\nGRANT EXECUTE ON FUNCTION migration.upsert_agenda_resource(uuid, uuid, jsonb, jsonb) TO service_role;\n";
|
|
14
14
|
export declare const MIGRATION_013_O_SELO_DO_ATENDIMENTO_TEM_ONDE_MORAR = "-- O selo do atendimento tem onde morar.\n--\n-- A grade, a sala e o bloqueio atravessaram nas 010..012: 1.331 janelas, 160\n-- salas, 352.002 agendamentos costurados \u00E0 sala. O que ficou de fora s\u00E3o os\n-- V\u00CDNCULO que a tela do atendimento l\u00EA para pintar selo \u2014 pouca linha, feature\n-- inteira.\n--\n-- appointment_prepaid_items 53 o selo \"Compra antecipada\"\n--\n-- \u2500\u2500 Por que 53 linhas merecem uma tabela \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- O V2 j\u00E1 tem o DESFECHO do item pr\u00E9-pago: `plg_clinical_prepaid_outcomes`, 30\n-- linhas migradas. N\u00E3o tem a PERGUNTA \u2014 o que este agendamento veio consumir.\n-- \u00C9 `PrepaidOutcomeGate.tsx` no V1, e o coment\u00E1rio do arquivo diz a fonte com\n-- todas as letras: \"Fonte: appointment_prepaid_items (o que o agendamento veio\n-- validar)\". Sem ela o port\u00E3o do V2 n\u00E3o tem o que perguntar, e o desfecho fica\n-- sendo a resposta de uma pergunta que sumiu.\n--\n-- \u2500\u2500 Por que a FK para public.items \u00E9 legal aqui \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `appointment_prepaid_items.invoice_item_id` aponta para a parcela do pacote.\n-- No V2 isso \u00E9 `public.items`, tabela da BASE \u2014 e financial roda ANTES de\n-- agenda na chain. Apontar para `plg_financial_*` seria o contr\u00E1rio e quebraria\n-- a ordem; apontar para `items` n\u00E3o.\n--\n-- \u2500\u2500 O que N\u00C3O est\u00E1 aqui \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `appointment_interests` (762 linhas) \u00E9 o selo \"Interesses\", e ele N\u00C3O mora\n-- aqui: aponta para `opportunity_interests`, que \u00E9 a cesta do funil. Uma tabela\n-- de agenda n\u00E3o pode ter FK numa de crm, porque crm roda DEPOIS. As duas vivem\n-- em plugin-crm, na migration da cesta.\n--\n-- `online_booking_configs` tamb\u00E9m n\u00E3o: \u00E9 CONFIGURA\u00C7\u00C3O de uma linha s\u00F3, e\n-- configura\u00E7\u00E3o no V2 n\u00E3o \u00E9 tabela \u2014 mora em `tenants.settings.plugins.agenda`.\n-- Ver a 014, que desfaz a tabela que esta migration chegou a criar.\n--\n-- `schedules.slot_interval_minutes` j\u00E1 est\u00E1 certo: 448 grades em 30min, 33 em\n-- 15min, 1 em 5min no V1; 1.280 / 50 / 1 no V2. A queixa \"intervalo por grade\"\n-- \u00E9 tela que n\u00E3o l\u00EA a coluna, n\u00E3o porte. Nada a fazer aqui.\n--\n-- Idempotente.\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 1. O que este agendamento veio consumir\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nCREATE TABLE IF NOT EXISTS public.plg_agenda_appointment_prepaid_items (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n -- A cerca da franquia. Herdada do agendamento: n\u00E3o h\u00E1 item pr\u00E9-pago sem\n -- agendamento, e o agendamento sempre tem unidade.\n unit_id uuid NOT NULL,\n appointment_id uuid NOT NULL,\n -- A parcela do pacote que este atendimento consome.\n item_id uuid NOT NULL,\n metadata jsonb DEFAULT '{}'::jsonb NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n CONSTRAINT plg_agenda_appointment_prepaid_items_pkey PRIMARY KEY (id)\n);\n\nDO $$\nBEGIN\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_agenda_prepaid_tenant_fk') THEN\n ALTER TABLE public.plg_agenda_appointment_prepaid_items\n ADD CONSTRAINT plg_agenda_prepaid_tenant_fk\n FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_agenda_prepaid_appointment_fk') THEN\n ALTER TABLE public.plg_agenda_appointment_prepaid_items\n ADD CONSTRAINT plg_agenda_prepaid_appointment_fk\n FOREIGN KEY (appointment_id) REFERENCES public.appointments(id) ON DELETE CASCADE;\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_agenda_prepaid_item_fk') THEN\n ALTER TABLE public.plg_agenda_appointment_prepaid_items\n ADD CONSTRAINT plg_agenda_prepaid_item_fk\n FOREIGN KEY (item_id) REFERENCES public.items(id) ON DELETE CASCADE;\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_agenda_prepaid_unit_fk') THEN\n ALTER TABLE public.plg_agenda_appointment_prepaid_items\n ADD CONSTRAINT plg_agenda_prepaid_unit_fk\n FOREIGN KEY (unit_id) REFERENCES app.units(id) ON DELETE CASCADE;\n END IF;\nEND $$;\n\n-- O mesmo item n\u00E3o se consome duas vezes no mesmo agendamento.\nCREATE UNIQUE INDEX IF NOT EXISTS plg_agenda_prepaid_uq\n ON public.plg_agenda_appointment_prepaid_items (appointment_id, item_id);\n-- A pergunta da tela: o que ESTE agendamento veio validar.\nCREATE INDEX IF NOT EXISTS plg_agenda_prepaid_appointment_idx\n ON public.plg_agenda_appointment_prepaid_items (tenant_id, appointment_id);\n-- A pergunta do port\u00E3o: este item j\u00E1 foi consumido em algum lugar?\nCREATE INDEX IF NOT EXISTS plg_agenda_prepaid_item_idx\n ON public.plg_agenda_appointment_prepaid_items (tenant_id, item_id);\n\nCOMMENT ON TABLE public.plg_agenda_appointment_prepaid_items IS\n 'O que o agendamento veio consumir de um pacote j\u00E1 pago \u2014 o selo \"Compra antecipada\". \u2190 appointment_prepaid_items';\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 3. updated_at\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nDO $$\nDECLARE t text;\nBEGIN\n FOREACH t IN ARRAY ARRAY['plg_agenda_appointment_prepaid_items'] LOOP\n EXECUTE format('DROP TRIGGER IF EXISTS %I ON public.%I', t || '_updated_at', t);\n EXECUTE format('CREATE TRIGGER %I BEFORE UPDATE ON public.%I FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at()', t || '_updated_at', t);\n END LOOP;\nEND $$;\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 4. Quem enxerga\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- O item pr\u00E9-pago \u00E9 de UNIDADE, como a sala da 010: quem v\u00EA a agenda da filial\n-- v\u00EA o que os agendamentos dela vieram consumir.\n--\n-- A configura\u00E7\u00E3o do agendamento online \u00E9 de TENANT e exige `agenda.manage`:\n-- \u00E9 a p\u00E1gina que o p\u00FAblico v\u00EA, e mud\u00E1-la n\u00E3o \u00E9 tarefa de recep\u00E7\u00E3o.\n\nALTER TABLE public.plg_agenda_appointment_prepaid_items ENABLE ROW LEVEL SECURITY;\nALTER TABLE public.plg_agenda_appointment_prepaid_items FORCE ROW LEVEL SECURITY;\nGRANT SELECT, INSERT, UPDATE, DELETE ON TABLE public.plg_agenda_appointment_prepaid_items TO authenticated;\nGRANT ALL ON TABLE public.plg_agenda_appointment_prepaid_items TO service_role;\n\nDROP POLICY IF EXISTS plg_agenda_prepaid_authz_select ON public.plg_agenda_appointment_prepaid_items;\nCREATE POLICY plg_agenda_prepaid_authz_select ON public.plg_agenda_appointment_prepaid_items\n FOR SELECT TO authenticated USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_unit(plg_agenda_appointment_prepaid_items.unit_id))\n AND (SELECT app.has_permission('agenda.read', plg_agenda_appointment_prepaid_items.unit_id)));\n\nDROP POLICY IF EXISTS plg_agenda_prepaid_authz_insert ON public.plg_agenda_appointment_prepaid_items;\nCREATE POLICY plg_agenda_prepaid_authz_insert ON public.plg_agenda_appointment_prepaid_items\n FOR INSERT TO authenticated WITH CHECK (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_unit(plg_agenda_appointment_prepaid_items.unit_id))\n AND (SELECT app.has_permission('agenda.create', plg_agenda_appointment_prepaid_items.unit_id)));\n\nDROP POLICY IF EXISTS plg_agenda_prepaid_authz_update ON public.plg_agenda_appointment_prepaid_items;\nCREATE POLICY plg_agenda_prepaid_authz_update ON public.plg_agenda_appointment_prepaid_items\n FOR UPDATE TO authenticated USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_unit(plg_agenda_appointment_prepaid_items.unit_id))\n AND (SELECT app.has_permission('agenda.edit', plg_agenda_appointment_prepaid_items.unit_id)))\n WITH CHECK (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_unit(plg_agenda_appointment_prepaid_items.unit_id))\n AND (SELECT app.has_permission('agenda.edit', plg_agenda_appointment_prepaid_items.unit_id)));\n\nDROP POLICY IF EXISTS plg_agenda_prepaid_authz_delete ON public.plg_agenda_appointment_prepaid_items;\nCREATE POLICY plg_agenda_prepaid_authz_delete ON public.plg_agenda_appointment_prepaid_items\n FOR DELETE TO authenticated USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (SELECT app.has_unit(plg_agenda_appointment_prepaid_items.unit_id))\n AND (SELECT app.has_permission('agenda.delete', plg_agenda_appointment_prepaid_items.unit_id)));\n\n-- N\u00C3O entra em `scoped_resources`, e isso \u00E9 decis\u00E3o. Aquele registro existe para\n-- o RECURSO que a tela de visibilidade oferece \u2014 e exige `owner_id`, porque a\n-- pergunta que ele responde \u00E9 \"quem \u00E9 o dono desta linha\". `plg_agenda_appointment_prepaid_items`\n-- \u00E9 uma PONTE: ela n\u00E3o tem dono, herda a unidade de quem ela liga, e a cerca\n-- dela j\u00E1 est\u00E1 nas pol\u00EDticas acima. Registr\u00E1-la ali pediria uma coluna\n-- `owner_id` inventada s\u00F3 para satisfazer um NOT NULL.\n";
|
|
15
15
|
export declare const MIGRATION_014_A_CONFIGURACAO_NAO_E_UMA_TABELA = "-- A configura\u00E7\u00E3o n\u00E3o \u00E9 uma tabela.\n--\n-- A 013 criou `public.plg_agenda_booking_configs` para receber\n-- `online_booking_configs` do V1. Era uma tabela de UMA linha, e foi erro meu.\n-- Esta migration a desfaz.\n--\n-- \u2500\u2500 Como o SDK guarda configura\u00E7\u00E3o de plugin \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `packages/admin/src/hooks/useTenantPluginSettings.ts`, e est\u00E1 escrito no\n-- cabe\u00E7alho do pr\u00F3prio arquivo:\n--\n-- tenants.settings = { ..., plugins: { [pluginId]: { key: value, ... } } }\n--\n-- A leitura sai de `currentOrg.settings.plugins[pluginId]` e a escrita de\n-- `adapter.updateOrg(orgId, { settings })`. \u00C9 por a\u00ED que passam as telas de\n-- /settings de agenda, crm, inventory, financial, tasks e courses.\n--\n-- E a agenda J\u00C1 usa: `AgendaGeneralSettings.tsx` importa\n-- `useTenantPluginSettings` e declara `AGENDA_TOGGLE_DEFAULTS`. Criar\n-- `plg_agenda_booking_configs` abriria um SEGUNDO lugar para a configura\u00E7\u00E3o da\n-- agenda \u2014 a tela lendo de um, o porte escrevendo no outro.\n--\n-- \u2500\u2500 Mas existem plg_*_settings no cluster \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- Existem, e n\u00E3o contradizem: `plg_shop_settings`, `plg_tables_settings`,\n-- `plg_reservations_settings`, `plg_crm_engagement_settings`,\n-- `plg_inventory_product_settings`. Todas t\u00EAm `unit_id` e existem porque a\n-- configura\u00E7\u00E3o delas varia POR UNIDADE e \u00E9 lida por RPC no caminho quente\n-- (fechar comanda, calcular frete) \u2014 n\u00E3o por uma tela de toggles.\n--\n-- `online_booking_configs` n\u00E3o \u00E9 nenhum dos dois casos: UMA linha no V1\n-- inteiro, tenant 1, e ningu\u00E9m a l\u00EA num caminho quente. \u00C9 toggle.\n--\n-- A troco de registro, se um dia ela precisar variar por unidade, o lugar certo\n-- \u00E9 `plg_agenda_settings` com `unit_id`, no formato das outras cinco \u2014 e n\u00E3o\n-- `_configs`, que n\u00E3o \u00E9 nome que este SDK usa.\n--\n-- \u2500\u2500 O que se perde, e \u00E9 de prop\u00F3sito \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `allowed_units`, `allowed_services` e `allowed_professionals` viram arrays de\n-- uuid DENTRO do jsonb, sem chave estrangeira. Apagar uma unidade deixa o id\n-- \u00F3rf\u00E3o na lista. \u00C9 a mesma troca que `tenants.settings.branding` j\u00E1 faz, e\n-- para uma linha ela paga: integridade referencial num array de configura\u00E7\u00E3o\n-- custaria uma tabela de liga\u00E7\u00E3o para resolver um problema que o V1 n\u00E3o tem em\n-- nenhum tenant.\n--\n-- Idempotente. A tabela nunca recebeu linha: o porte dela ainda n\u00E3o rodou.\n\nDO $$\nBEGIN\n IF to_regclass('public.plg_agenda_booking_configs') IS NOT NULL THEN\n IF EXISTS (SELECT 1 FROM public.plg_agenda_booking_configs) THEN\n RAISE EXCEPTION\n 'plg_agenda_booking_configs tem linha \u2014 mover para tenants.settings.plugins.agenda antes de derrubar';\n END IF;\n DROP TABLE public.plg_agenda_booking_configs;\n END IF;\nEND $$;\n";
|
|
16
|
+
export declare const MIGRATION_015_O_FERIADO_TAMBEM_TEM_OBSERVACAO_E_ETIQUETA = "-- ---------------------------------------------------------------------------\n-- O feriado tamb\u00E9m tem observa\u00E7\u00E3o e etiqueta.\n--\n-- Irm\u00E3 da 150 do n\u00FAcleo e da 103 do financeiro, para o \u00FAltimo cadastro que\n-- ficou de fora. Mesmo argumento, e aqui a etiqueta tem um uso imediato:\n-- \u00ABbanc\u00E1rio\u00BB, \u00ABmunicipal\u00BB, \u00ABponto facultativo\u00BB s\u00E3o recortes que mudam quem\n-- fecha e quem n\u00E3o fecha, e que nenhum campo do cadastro responde.\n-- ---------------------------------------------------------------------------\n\nALTER TABLE public.holidays\n ADD COLUMN IF NOT EXISTS notes text,\n ADD COLUMN IF NOT EXISTS tags text[] DEFAULT '{}'::text[];\n";
|
|
17
|
+
export declare const MIGRATION_016_A_VEZ_E_UM_FATO = "-- A lista da vez is an opt-in agenda addon. Its state is per unit, and every\n-- transition produces an immutable event so reception never becomes the\n-- unaudited explanation for why somebody was skipped.\n\nCREATE TABLE IF NOT EXISTS public.plg_agenda_turn_queues (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n unit_id uuid NOT NULL REFERENCES app.units(id) ON DELETE CASCADE,\n queue_key text NOT NULL DEFAULT 'walk_in',\n name text NOT NULL DEFAULT 'Pr\u00F3ximo da vez',\n is_active boolean NOT NULL DEFAULT true,\n geofence_required boolean NOT NULL DEFAULT true,\n geofence_radius_meters integer NOT NULL DEFAULT 80 CHECK (geofence_radius_meters BETWEEN 10 AND 1000),\n upcoming_booking_block_minutes integer NOT NULL DEFAULT 30 CHECK (upcoming_booking_block_minutes BETWEEN 0 AND 240),\n round_direction smallint NOT NULL DEFAULT 1 CHECK (round_direction IN (-1, 1)),\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (tenant_id, unit_id, queue_key)\n);\n\nCREATE TABLE IF NOT EXISTS public.plg_agenda_turn_entries (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n queue_id uuid NOT NULL REFERENCES public.plg_agenda_turn_queues(id) ON DELETE CASCADE,\n unit_id uuid NOT NULL REFERENCES app.units(id) ON DELETE CASCADE,\n professional_id uuid NOT NULL REFERENCES public.people(id) ON DELETE CASCADE,\n status text NOT NULL DEFAULT 'unavailable' CHECK (status IN ('available', 'serving', 'unavailable')),\n position bigint NOT NULL DEFAULT 0,\n previous_position bigint,\n available_at timestamptz,\n state_changed_at timestamptz NOT NULL DEFAULT now(),\n appointment_id uuid REFERENCES public.appointments(id) ON DELETE SET NULL,\n updated_at timestamptz NOT NULL DEFAULT now(),\n UNIQUE (queue_id, professional_id)\n);\n\nCREATE INDEX IF NOT EXISTS plg_agenda_turn_entries_order_idx\n ON public.plg_agenda_turn_entries (queue_id, status, position);\n\nCREATE TABLE IF NOT EXISTS public.plg_agenda_turn_events (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n queue_id uuid NOT NULL REFERENCES public.plg_agenda_turn_queues(id) ON DELETE CASCADE,\n unit_id uuid NOT NULL REFERENCES app.units(id) ON DELETE CASCADE,\n professional_id uuid NOT NULL REFERENCES public.people(id) ON DELETE CASCADE,\n event_type text NOT NULL,\n origin text NOT NULL CHECK (origin IN ('app', 'frontdesk', 'automatic')),\n actor_user_id uuid,\n appointment_id uuid REFERENCES public.appointments(id) ON DELETE SET NULL,\n reason text,\n inside_geofence boolean,\n location_accuracy_meters numeric,\n payload jsonb NOT NULL DEFAULT '{}'::jsonb,\n occurred_at timestamptz NOT NULL DEFAULT now()\n);\n\nCREATE INDEX IF NOT EXISTS plg_agenda_turn_events_timeline_idx\n ON public.plg_agenda_turn_events (queue_id, occurred_at DESC);\n\nALTER TABLE public.plg_agenda_turn_queues ENABLE ROW LEVEL SECURITY;\nALTER TABLE public.plg_agenda_turn_queues FORCE ROW LEVEL SECURITY;\nALTER TABLE public.plg_agenda_turn_entries ENABLE ROW LEVEL SECURITY;\nALTER TABLE public.plg_agenda_turn_entries FORCE ROW LEVEL SECURITY;\nALTER TABLE public.plg_agenda_turn_events ENABLE ROW LEVEL SECURITY;\nALTER TABLE public.plg_agenda_turn_events FORCE ROW LEVEL SECURITY;\n\nDO $$ BEGIN\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname = 'public' AND tablename = 'plg_agenda_turn_queues' AND policyname = 'plg_agenda_turn_queues_read') THEN\n CREATE POLICY plg_agenda_turn_queues_read ON public.plg_agenda_turn_queues\n FOR SELECT TO authenticated\n USING (tenant_id = app.current_tenant_id() AND app.has_unit(unit_id)\n AND app.has_permission('agenda.turn_queue.read', unit_id));\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname = 'public' AND tablename = 'plg_agenda_turn_entries' AND policyname = 'plg_agenda_turn_entries_read') THEN\n CREATE POLICY plg_agenda_turn_entries_read ON public.plg_agenda_turn_entries\n FOR SELECT TO authenticated\n USING (tenant_id = app.current_tenant_id() AND app.has_unit(unit_id)\n AND app.has_permission('agenda.turn_queue.read', unit_id));\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE schemaname = 'public' AND tablename = 'plg_agenda_turn_events' AND policyname = 'plg_agenda_turn_events_read') THEN\n CREATE POLICY plg_agenda_turn_events_read ON public.plg_agenda_turn_events\n FOR SELECT TO authenticated\n USING (tenant_id = app.current_tenant_id() AND app.has_unit(unit_id)\n AND app.has_permission('agenda.turn_queue.read', unit_id));\n END IF;\nEND $$;\n\nCREATE OR REPLACE FUNCTION public.agenda_turn_queue_set_availability(\n p_available boolean,\n p_unit_id uuid,\n p_latitude numeric DEFAULT NULL,\n p_longitude numeric DEFAULT NULL,\n p_accuracy_meters numeric DEFAULT NULL,\n p_origin text DEFAULT 'app'\n) RETURNS jsonb\nLANGUAGE plpgsql SECURITY DEFINER SET search_path = '' AS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_actor uuid := auth.uid();\n v_person uuid;\n v_queue public.plg_agenda_turn_queues%ROWTYPE;\n v_lat numeric;\n v_lng numeric;\n v_distance numeric;\n v_position bigint;\n v_entry uuid;\nBEGIN\n IF v_tenant IS NULL THEN\n RAISE EXCEPTION 'no_active_tenant' USING ERRCODE = '42501';\n END IF;\n IF p_unit_id IS NULL THEN\n RAISE EXCEPTION 'unit_required' USING ERRCODE = '22023';\n END IF;\n IF p_origin <> 'app' THEN\n RAISE EXCEPTION 'self_availability_origin_must_be_app' USING ERRCODE = '22023';\n END IF;\n IF NOT app.has_unit(p_unit_id) OR NOT app.has_permission('agenda.turn_queue.edit', p_unit_id) THEN\n RAISE EXCEPTION 'agenda.turn_queue.edit is required' USING ERRCODE = '42501';\n END IF;\n\n v_person := app.person_for_login(v_tenant, v_actor);\n IF v_person IS NULL THEN\n RAISE EXCEPTION 'sem_ficha_de_profissional' USING ERRCODE = '42501';\n END IF;\n\n INSERT INTO public.plg_agenda_turn_queues (tenant_id, unit_id)\n VALUES (v_tenant, p_unit_id)\n ON CONFLICT (tenant_id, unit_id, queue_key) DO NOTHING;\n\n SELECT * INTO v_queue\n FROM public.plg_agenda_turn_queues q\n WHERE q.tenant_id = v_tenant AND q.unit_id = p_unit_id\n AND q.queue_key = 'walk_in' AND q.is_active\n FOR UPDATE;\n IF v_queue.id IS NULL THEN\n RAISE EXCEPTION 'turn_queue_disabled' USING ERRCODE = '42501';\n END IF;\n\n IF p_available AND v_queue.geofence_required THEN\n SELECT u.latitude, u.longitude INTO v_lat, v_lng\n FROM public.v_units u\n WHERE u.id = p_unit_id AND u.tenant_id = v_tenant;\n IF v_lat IS NULL OR v_lng IS NULL THEN\n RAISE EXCEPTION 'unit_has_no_coordinates' USING ERRCODE = '22023';\n END IF;\n IF p_latitude IS NULL OR p_longitude IS NULL THEN\n RAISE EXCEPTION 'location_required' USING ERRCODE = '22023';\n END IF;\n v_distance := 6371000 * acos(least(1, greatest(-1,\n cos(radians(v_lat::double precision)) * cos(radians(p_latitude::double precision))\n * cos(radians(p_longitude::double precision) - radians(v_lng::double precision))\n + sin(radians(v_lat::double precision)) * sin(radians(p_latitude::double precision))\n )));\n IF v_distance > v_queue.geofence_radius_meters THEN\n RAISE EXCEPTION 'outside_geofence' USING ERRCODE = '42501';\n END IF;\n END IF;\n\n SELECT coalesce(max(e.position), 0) + 1 INTO v_position\n FROM public.plg_agenda_turn_entries e WHERE e.queue_id = v_queue.id;\n\n INSERT INTO public.plg_agenda_turn_entries\n (tenant_id, queue_id, unit_id, professional_id, status, position, available_at, state_changed_at, appointment_id, updated_at)\n VALUES\n (v_tenant, v_queue.id, p_unit_id, v_person,\n CASE WHEN p_available THEN 'available' ELSE 'unavailable' END,\n CASE WHEN p_available THEN v_position ELSE 0 END,\n CASE WHEN p_available THEN now() ELSE NULL END,\n now(), NULL, now())\n ON CONFLICT (queue_id, professional_id) DO UPDATE SET\n status = EXCLUDED.status,\n position = CASE WHEN p_available THEN v_position ELSE public.plg_agenda_turn_entries.position END,\n available_at = EXCLUDED.available_at,\n state_changed_at = now(),\n appointment_id = NULL,\n updated_at = now()\n RETURNING id INTO v_entry;\n\n INSERT INTO public.plg_agenda_turn_events\n (tenant_id, queue_id, unit_id, professional_id, event_type, origin, actor_user_id,\n inside_geofence, location_accuracy_meters, payload)\n VALUES\n (v_tenant, v_queue.id, p_unit_id, v_person,\n CASE WHEN p_available THEN 'available' ELSE 'left' END,\n 'app', v_actor, CASE WHEN p_available THEN true ELSE NULL END,\n CASE WHEN p_available THEN p_accuracy_meters ELSE NULL END,\n jsonb_build_object('entry_id', v_entry));\n\n RETURN jsonb_build_object('ok', true, 'status', CASE WHEN p_available THEN 'available' ELSE 'unavailable' END);\nEND $$;\n\nCREATE OR REPLACE FUNCTION public.agenda_turn_queue_snapshot(p_unit_id uuid)\nRETURNS jsonb\nLANGUAGE plpgsql SECURITY DEFINER SET search_path = '' STABLE AS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_queue public.plg_agenda_turn_queues%ROWTYPE;\n v_person uuid;\n v_entries jsonb;\n v_events jsonb;\nBEGIN\n IF p_unit_id IS NULL THEN\n RAISE EXCEPTION 'unit_required' USING ERRCODE = '22023';\n END IF;\n IF NOT app.has_unit(p_unit_id) OR NOT app.has_permission('agenda.turn_queue.read', p_unit_id) THEN\n RAISE EXCEPTION 'agenda.turn_queue.read is required' USING ERRCODE = '42501';\n END IF;\n v_person := app.person_for_login(v_tenant, auth.uid());\n SELECT * INTO v_queue FROM public.plg_agenda_turn_queues q\n WHERE q.tenant_id = v_tenant AND q.unit_id = p_unit_id AND q.queue_key = 'walk_in' AND q.is_active;\n IF v_queue.id IS NULL THEN\n RETURN jsonb_build_object('queue_id', NULL, 'unit_id', p_unit_id, 'queue_name', 'Pr\u00F3ximo da vez',\n 'current_professional_id', v_person, 'entries', '[]'::jsonb, 'events', '[]'::jsonb);\n END IF;\n\n SELECT coalesce(jsonb_agg(jsonb_build_object(\n 'id', e.id, 'queue_id', e.queue_id, 'unit_id', e.unit_id,\n 'professional_id', e.professional_id, 'professional_name', p.name,\n 'professional_avatar_url', p.avatar_url, 'status', e.status, 'position', e.position,\n 'state_changed_at', e.state_changed_at, 'available_at', e.available_at,\n 'appointment_id', e.appointment_id\n ) ORDER BY CASE e.status WHEN 'available' THEN 0 WHEN 'serving' THEN 1 ELSE 2 END, e.position), '[]'::jsonb)\n INTO v_entries\n FROM public.plg_agenda_turn_entries e\n JOIN public.people p ON p.id = e.professional_id AND p.tenant_id = e.tenant_id\n WHERE e.queue_id = v_queue.id;\n\n SELECT coalesce(jsonb_agg(jsonb_build_object(\n 'id', ev.id, 'professional_id', ev.professional_id, 'professional_name', p.name,\n 'event_type', ev.event_type, 'origin', ev.origin, 'reason', ev.reason,\n 'occurred_at', ev.occurred_at\n ) ORDER BY ev.occurred_at DESC), '[]'::jsonb)\n INTO v_events\n FROM (\n SELECT * FROM public.plg_agenda_turn_events\n WHERE queue_id = v_queue.id AND occurred_at >= date_trunc('day', now())\n ORDER BY occurred_at DESC LIMIT 50\n ) ev\n JOIN public.people p ON p.id = ev.professional_id AND p.tenant_id = ev.tenant_id;\n\n RETURN jsonb_build_object('queue_id', v_queue.id, 'unit_id', p_unit_id, 'queue_name', v_queue.name,\n 'current_professional_id', v_person, 'entries', v_entries, 'events', v_events);\nEND $$;\n\nCREATE OR REPLACE FUNCTION public.agenda_turn_queue_override(\n p_professional_id uuid,\n p_unit_id uuid,\n p_available boolean,\n p_reason text\n) RETURNS jsonb\nLANGUAGE plpgsql SECURITY DEFINER SET search_path = '' AS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_queue public.plg_agenda_turn_queues%ROWTYPE;\n v_position bigint;\nBEGIN\n IF NOT app.has_unit(p_unit_id) OR NOT app.has_permission('agenda.turn_queue.manage', p_unit_id) THEN\n RAISE EXCEPTION 'agenda.turn_queue.manage is required' USING ERRCODE = '42501';\n END IF;\n IF nullif(trim(p_reason), '') IS NULL THEN\n RAISE EXCEPTION 'override_reason_required' USING ERRCODE = '22023';\n END IF;\n SELECT * INTO v_queue FROM public.plg_agenda_turn_queues q\n WHERE q.tenant_id = v_tenant AND q.unit_id = p_unit_id AND q.queue_key = 'walk_in' AND q.is_active\n FOR UPDATE;\n IF v_queue.id IS NULL THEN RAISE EXCEPTION 'turn_queue_disabled' USING ERRCODE = '42501'; END IF;\n SELECT coalesce(max(position), 0) + 1 INTO v_position FROM public.plg_agenda_turn_entries WHERE queue_id = v_queue.id;\n INSERT INTO public.plg_agenda_turn_entries\n (tenant_id, queue_id, unit_id, professional_id, status, position, available_at, state_changed_at, updated_at)\n VALUES (v_tenant, v_queue.id, p_unit_id, p_professional_id,\n CASE WHEN p_available THEN 'available' ELSE 'unavailable' END,\n CASE WHEN p_available THEN v_position ELSE 0 END,\n CASE WHEN p_available THEN now() ELSE NULL END, now(), now())\n ON CONFLICT (queue_id, professional_id) DO UPDATE SET\n status = EXCLUDED.status, position = CASE WHEN p_available THEN v_position ELSE public.plg_agenda_turn_entries.position END,\n available_at = EXCLUDED.available_at, state_changed_at = now(), appointment_id = NULL, updated_at = now();\n INSERT INTO public.plg_agenda_turn_events\n (tenant_id, queue_id, unit_id, professional_id, event_type, origin, actor_user_id, reason)\n VALUES (v_tenant, v_queue.id, p_unit_id, p_professional_id,\n CASE WHEN p_available THEN 'override_available' ELSE 'override_left' END,\n 'frontdesk', auth.uid(), trim(p_reason));\n RETURN jsonb_build_object('ok', true);\nEND $$;\n\nCREATE OR REPLACE FUNCTION public.agenda_turn_queue_on_appointment_status()\nRETURNS trigger\nLANGUAGE plpgsql SECURITY DEFINER SET search_path = '' AS $$\nDECLARE\n v_entry public.plg_agenda_turn_entries%ROWTYPE;\n v_position bigint;\n v_event text;\nBEGIN\n IF NEW.assignee_id IS NULL OR NEW.unit_id IS NULL OR NEW.status IS NOT DISTINCT FROM OLD.status THEN RETURN NEW; END IF;\n SELECT * INTO v_entry FROM public.plg_agenda_turn_entries e\n WHERE e.tenant_id = NEW.tenant_id AND e.unit_id = NEW.unit_id AND e.professional_id = NEW.assignee_id\n FOR UPDATE;\n IF v_entry.id IS NULL THEN RETURN NEW; END IF;\n\n IF NEW.status = 'in_progress' AND OLD.status <> 'in_progress' AND v_entry.status = 'available' THEN\n SELECT coalesce(max(position), 0) + 1 INTO v_position FROM public.plg_agenda_turn_entries WHERE queue_id = v_entry.queue_id;\n UPDATE public.plg_agenda_turn_entries SET status = 'serving', previous_position = position,\n position = v_position, appointment_id = NEW.id, state_changed_at = now(), updated_at = now()\n WHERE id = v_entry.id;\n v_event := 'advanced_to_service';\n ELSIF OLD.status = 'in_progress' AND NEW.status = 'cancelled' AND v_entry.appointment_id = NEW.id THEN\n UPDATE public.plg_agenda_turn_entries SET status = 'available',\n position = coalesce(previous_position, position), appointment_id = NULL,\n state_changed_at = now(), updated_at = now() WHERE id = v_entry.id;\n v_event := 'service_cancelled_restored';\n ELSIF OLD.status = 'in_progress' AND NEW.status = 'completed' AND v_entry.appointment_id = NEW.id THEN\n UPDATE public.plg_agenda_turn_entries SET status = 'unavailable', appointment_id = NULL,\n state_changed_at = now(), updated_at = now() WHERE id = v_entry.id;\n v_event := 'service_completed';\n ELSE\n RETURN NEW;\n END IF;\n\n INSERT INTO public.plg_agenda_turn_events\n (tenant_id, queue_id, unit_id, professional_id, event_type, origin, appointment_id)\n VALUES (NEW.tenant_id, v_entry.queue_id, NEW.unit_id, NEW.assignee_id, v_event, 'automatic', NEW.id);\n RETURN NEW;\nEND $$;\n\nDROP TRIGGER IF EXISTS appointments_turn_queue_status ON public.appointments;\nCREATE TRIGGER appointments_turn_queue_status\n AFTER UPDATE OF status ON public.appointments\n FOR EACH ROW EXECUTE FUNCTION public.agenda_turn_queue_on_appointment_status();\n\nREVOKE ALL ON public.plg_agenda_turn_queues, public.plg_agenda_turn_entries, public.plg_agenda_turn_events FROM PUBLIC, anon, authenticated;\nGRANT SELECT ON public.plg_agenda_turn_queues, public.plg_agenda_turn_entries, public.plg_agenda_turn_events TO authenticated;\nREVOKE ALL ON FUNCTION public.agenda_turn_queue_set_availability(boolean, uuid, numeric, numeric, numeric, text) FROM PUBLIC;\nREVOKE ALL ON FUNCTION public.agenda_turn_queue_snapshot(uuid) FROM PUBLIC;\nREVOKE ALL ON FUNCTION public.agenda_turn_queue_override(uuid, uuid, boolean, text) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.agenda_turn_queue_set_availability(boolean, uuid, numeric, numeric, numeric, text) TO authenticated;\nGRANT EXECUTE ON FUNCTION public.agenda_turn_queue_snapshot(uuid) TO authenticated;\nGRANT EXECUTE ON FUNCTION public.agenda_turn_queue_override(uuid, uuid, boolean, text) TO authenticated;\n\nCOMMENT ON TABLE public.plg_agenda_turn_events IS\n 'Immutable audit trail for the walk-in turn queue. Location stores only the inside/outside verdict and accuracy, never coordinates.';\n";
|
|
18
|
+
export declare const MIGRATION_017_A_EQUIPE_DO_DIA_APARECE = "-- The board must show the whole team expected at this unit today, including\n-- professionals who have not explicitly joined the walk-in queue yet.\n\nCREATE OR REPLACE FUNCTION public.agenda_turn_queue_snapshot(p_unit_id uuid)\nRETURNS jsonb\nLANGUAGE plpgsql SECURITY DEFINER SET search_path = '' STABLE AS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_queue public.plg_agenda_turn_queues%ROWTYPE;\n v_person uuid;\n v_timezone text;\n v_day date;\n v_entries jsonb;\n v_events jsonb;\n v_professionals jsonb;\nBEGIN\n IF p_unit_id IS NULL THEN\n RAISE EXCEPTION 'unit_required' USING ERRCODE = '22023';\n END IF;\n IF NOT app.has_unit(p_unit_id) OR NOT app.has_permission('agenda.turn_queue.read', p_unit_id) THEN\n RAISE EXCEPTION 'agenda.turn_queue.read is required' USING ERRCODE = '42501';\n END IF;\n\n SELECT coalesce(t.settings->>'timezone', 'America/Sao_Paulo')\n INTO v_timezone\n FROM public.tenants t\n WHERE t.id = v_tenant;\n v_day := (now() AT TIME ZONE v_timezone)::date;\n v_person := app.person_for_login(v_tenant, auth.uid());\n\n SELECT * INTO v_queue\n FROM public.plg_agenda_turn_queues q\n WHERE q.tenant_id = v_tenant\n AND q.unit_id = p_unit_id\n AND q.queue_key = 'walk_in'\n AND q.is_active;\n\n SELECT coalesce(jsonb_agg(jsonb_build_object(\n 'id', e.id, 'queue_id', e.queue_id, 'unit_id', e.unit_id,\n 'professional_id', e.professional_id, 'professional_name', p.name,\n 'professional_avatar_url', p.avatar_url, 'status', e.status, 'position', e.position,\n 'state_changed_at', e.state_changed_at, 'available_at', e.available_at,\n 'appointment_id', e.appointment_id\n ) ORDER BY CASE e.status WHEN 'available' THEN 0 WHEN 'serving' THEN 1 ELSE 2 END, e.position), '[]'::jsonb)\n INTO v_entries\n FROM public.plg_agenda_turn_entries e\n JOIN public.people p ON p.id = e.professional_id AND p.tenant_id = e.tenant_id\n WHERE e.queue_id = v_queue.id;\n\n SELECT coalesce(jsonb_agg(jsonb_build_object(\n 'id', ev.id, 'professional_id', ev.professional_id, 'professional_name', p.name,\n 'event_type', ev.event_type, 'origin', ev.origin, 'reason', ev.reason,\n 'occurred_at', ev.occurred_at\n ) ORDER BY ev.occurred_at DESC), '[]'::jsonb)\n INTO v_events\n FROM (\n SELECT * FROM public.plg_agenda_turn_events\n WHERE queue_id = v_queue.id\n AND (occurred_at AT TIME ZONE v_timezone)::date = v_day\n ORDER BY occurred_at DESC LIMIT 50\n ) ev\n JOIN public.people p ON p.id = ev.professional_id AND p.tenant_id = ev.tenant_id;\n\n WITH scheduled AS (\n SELECT DISTINCT s.assignee_id AS professional_id\n FROM public.schedules s\n WHERE s.tenant_id = v_tenant\n AND s.kind = 'working_hours'\n AND s.assignee_id IS NOT NULL\n AND coalesce(s.unit_id, s.location_id) = p_unit_id\n AND (s.valid_from IS NULL OR s.valid_from <= v_day)\n AND (s.valid_to IS NULL OR v_day <= s.valid_to)\n AND (\n (s.specific_date = v_day AND s.is_active)\n OR (\n s.specific_date IS NULL\n AND s.is_active\n AND s.day_of_week = extract(dow FROM v_day)::smallint\n AND public.agenda_week_parity_active(s.valid_from, v_day, s.week_interval)\n AND NOT EXISTS (\n SELECT 1 FROM public.schedules day_override\n WHERE day_override.tenant_id = s.tenant_id\n AND day_override.assignee_id = s.assignee_id\n AND coalesce(day_override.unit_id, day_override.location_id) = p_unit_id\n AND day_override.specific_date = v_day\n )\n )\n )\n ), booked AS (\n SELECT a.assignee_id AS professional_id,\n count(*)::integer AS appointment_count,\n min(a.starts_at) FILTER (WHERE a.starts_at >= now()) AS next_appointment_at\n FROM public.appointments a\n WHERE a.tenant_id = v_tenant\n AND a.assignee_id IS NOT NULL\n AND coalesce(a.unit_id, a.location_id) = p_unit_id\n AND (a.starts_at AT TIME ZONE v_timezone)::date = v_day\n AND coalesce(a.status, '') NOT IN ('cancelled', 'canceled')\n GROUP BY a.assignee_id\n ), candidates AS (\n SELECT professional_id FROM scheduled\n UNION\n SELECT professional_id FROM booked\n UNION\n SELECT e.professional_id FROM public.plg_agenda_turn_entries e WHERE e.queue_id = v_queue.id\n )\n SELECT coalesce(jsonb_agg(jsonb_build_object(\n 'professional_id', p.id,\n 'professional_name', p.name,\n 'professional_avatar_url', p.avatar_url,\n 'status', coalesce(e.status, 'unavailable'),\n 'position', coalesce(e.position, 0),\n 'last_checkin_at', last_checkin.occurred_at,\n 'is_scheduled', scheduled.professional_id IS NOT NULL,\n 'appointment_count', coalesce(booked.appointment_count, 0),\n 'next_appointment_at', booked.next_appointment_at\n ) ORDER BY\n CASE coalesce(e.status, 'unavailable') WHEN 'available' THEN 0 WHEN 'serving' THEN 1 ELSE 2 END,\n CASE WHEN booked.next_appointment_at IS NOT NULL THEN 0 ELSE 1 END,\n e.position NULLS LAST,\n p.name), '[]'::jsonb)\n INTO v_professionals\n FROM candidates c\n JOIN public.people p ON p.id = c.professional_id AND p.tenant_id = v_tenant AND p.is_active\n LEFT JOIN scheduled ON scheduled.professional_id = p.id\n LEFT JOIN booked ON booked.professional_id = p.id\n LEFT JOIN public.plg_agenda_turn_entries e ON e.queue_id = v_queue.id AND e.professional_id = p.id\n LEFT JOIN LATERAL (\n SELECT ev.occurred_at\n FROM public.plg_agenda_turn_events ev\n WHERE ev.queue_id = v_queue.id\n AND ev.professional_id = p.id\n AND ev.event_type IN ('available', 'override_available')\n AND (ev.occurred_at AT TIME ZONE v_timezone)::date = v_day\n ORDER BY ev.occurred_at DESC\n LIMIT 1\n ) last_checkin ON true;\n\n RETURN jsonb_build_object(\n 'queue_id', v_queue.id,\n 'unit_id', p_unit_id,\n 'queue_name', coalesce(v_queue.name, 'Pr\u00F3ximo da vez'),\n 'current_professional_id', v_person,\n 'date', v_day,\n 'professionals', v_professionals,\n 'entries', v_entries,\n 'events', v_events\n );\nEND $$;\n\nREVOKE ALL ON FUNCTION public.agenda_turn_queue_snapshot(uuid) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.agenda_turn_queue_snapshot(uuid) TO authenticated;\n";
|
|
19
|
+
export declare const MIGRATION_018_O_AGENDAMENTO_QUE_SE_REPETE = "-- O agendamento que se repete.\n--\n-- \"Repetir\" no agendamento \u2014 o que o Google Calendar chama de s\u00E9rie. At\u00E9 aqui\n-- s\u00F3 o BLOQUEIO se repetia (`schedules` kind='block'); o compromisso de cliente\n-- era sempre avulso, e marcar o retorno de quinze em quinze dias por seis meses\n-- era doze aberturas do mesmo formul\u00E1rio.\n--\n-- \u2500\u2500 Por que aqui a ocorr\u00EAncia \u00E9 LINHA, e no bloqueio n\u00E3o \u00E9 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- A 010 escolheu o contr\u00E1rio, e escolheu certo para o que ela trata: o bloqueio\n-- recorrente \u00E9 UMA linha por dia da semana com vig\u00EAncia e paridade, expandida\n-- na LEITURA (`agenda_busy_blocks` no banco, `lib/schedule-engine.ts` na tela).\n-- O motivo est\u00E1 escrito l\u00E1: um almo\u00E7o de segunda a sexta at\u00E9 o fim do ano s\u00E3o\n-- 1.300 ocorr\u00EAncias de uma coisa que n\u00E3o tem identidade pr\u00F3pria \u2014 e a grade\n-- ETERNA (248 das 482 do V1 t\u00EAm `valid_to` nulo) n\u00E3o se expande de jeito nenhum.\n--\n-- Um compromisso de cliente \u00E9 o caso oposto, e por tr\u00EAs raz\u00F5es concretas que\n-- vivem neste schema:\n--\n-- 1. CADA OCORR\u00CANCIA \u00C9 UM FATO SEPARADO. Ela tem status pr\u00F3prio (a de 12/11\n-- foi falta, a de 26/11 foi atendida), check-in pr\u00F3prio (`checked_in_at`),\n-- e pode ter PEDIDO pr\u00F3prio \u2014 `order_id`, com fatura e recebimento. Nada\n-- disso cabe numa regra: a regra n\u00E3o pode estar \"paga\".\n-- 2. TODO LEITOR J\u00C1 L\u00CA LINHA. A grade da semana, `checkConflict`, a fila da\n-- vez (`plg_agenda_turn_entries.appointment_id`), as confirma\u00E7\u00F5es, o\n-- hist\u00F3rico da ficha. S\u00E9rie virtual obrigaria cada um deles a aprender a\n-- expandir uma regra \u2014 seis lugares, a mesma regra, divergindo em seis.\n-- 3. A JANELA \u00C9 FINITA POR NATUREZA. Ningu\u00E9m marca \"retorno toda semana para\n-- sempre\": marca at\u00E9 uma data ou um n\u00FAmero de vezes. O que n\u00E3o se expande\n-- \u00E9 a grade eterna, e esta n\u00E3o \u00E9 uma.\n--\n-- Por isso: ocorr\u00EAncia = linha em `public.appointments`, com `series_id` REAL.\n-- N\u00E3o por casamento de campos \u2014 a identidade do bloqueio \u00E9 reconstru\u00EDda\n-- comparando t\u00EDtulo + hor\u00E1rio + profissional (`views/CalendarView.tsx`), e \u00E9\n-- justamente a parte que n\u00E3o se deve copiar: dois almo\u00E7os de t\u00EDtulos iguais em\n-- hor\u00E1rios iguais s\u00E3o o mesmo bloqueio para aquela heur\u00EDstica.\n--\n-- \u2500\u2500 A regra tamb\u00E9m fica guardada \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- Materializar n\u00E3o dispensa a regra. Sem ela a tela n\u00E3o sabe dizer \"a cada 2\n-- semanas, 10 vezes\" ao reabrir uma ocorr\u00EAncia, e estender a s\u00E9rie depois seria\n-- adivinhar o intervalo pela dist\u00E2ncia entre duas linhas. O precedente \u00E9 o\n-- Financeiro: `RecurringBill` guarda a regra E materializa as parcelas.\n--\n-- \u2500\u2500 O que N\u00C3O est\u00E1 aqui \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- RRULE livre (v\u00E1rios dias da semana, \"primeira ter\u00E7a do m\u00EAs\" escolhida \u00E0 m\u00E3o).\n-- `freq` \u00E9 uma lista fechada de tr\u00EAs; crescer \u00E9 acrescentar valor ao CHECK e um\n-- caso no expansor de `lib/recurrence.ts`, n\u00E3o mudar o modelo.\n--\n-- \"Este e os seguintes\" tamb\u00E9m n\u00E3o: ele exige PARTIR a regra em duas (a antiga\n-- ganha `until_date`, a nova nasce do dia editado). Esta migration n\u00E3o impede \u2014\n-- \u00E9 um INSERT a mais no mesmo formato.\n--\n-- `v_appointments` N\u00C3O \u00E9 alargada. O provider j\u00E1 l\u00EA `public.appointments`\n-- direto e funde com a view (`data/supabase.ts`), justamente porque a view n\u00E3o\n-- exp\u00F5e `resource_id` nem `unit_id`; `series_id` entra pelo mesmo caminho e n\u00E3o\n-- custa uma redefini\u00E7\u00E3o de view que a 007 teve de reescrever inteira.\n--\n-- Idempotente.\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 1. A REGRA\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nCREATE TABLE IF NOT EXISTS public.plg_agenda_recurrences (\n id uuid DEFAULT gen_random_uuid() NOT NULL,\n tenant_id uuid NOT NULL,\n -- A cerca da franquia, herdada da primeira ocorr\u00EAncia. Nula \u00E9 leg\u00EDtima: a\n -- conta de uma unidade s\u00F3 n\u00E3o escolhe unidade, e a 004 estampa `unit_id` no\n -- agendamento por trigger \u2014 a regra nasce antes de a trigger ter rodado.\n unit_id uuid,\n -- `daily` | `weekly` | `monthly_weekday`. Mensal \u00E9 \"mesmo dia da semana\"\n -- (a 2\u00AA ter\u00E7a), n\u00E3o \"mesmo dia do m\u00EAs\": \u00E9 o que o retorno de sal\u00E3o e de\n -- cl\u00EDnica significa, e \u00E9 o que o Google oferece como preset.\n freq text NOT NULL,\n -- A cada N per\u00EDodos. 2 + weekly = \"a cada 2 semanas\".\n interval_count integer DEFAULT 1 NOT NULL,\n -- O dia da PRIMEIRA ocorr\u00EAncia, que \u00E9 a \u00E2ncora de tudo: o weekday da\n -- semanal e a ordinal do m\u00EAs da mensal saem dele.\n starts_on date NOT NULL,\n -- `HH:MM` da s\u00E9rie. Guardado para a edi\u00E7\u00E3o \"todos\" saber que hor\u00E1rio\n -- aplicar sem reler uma ocorr\u00EAncia qualquer e torcer para ser a certa.\n time_of_day time without time zone,\n -- O fim, por UMA ponta s\u00F3. Ver o CHECK abaixo.\n until_date date,\n occurrence_count integer,\n metadata jsonb DEFAULT '{}'::jsonb NOT NULL,\n created_at timestamp with time zone DEFAULT now() NOT NULL,\n updated_at timestamp with time zone DEFAULT now() NOT NULL,\n CONSTRAINT plg_agenda_recurrences_pkey PRIMARY KEY (id),\n CONSTRAINT plg_agenda_recurrences_freq_chk\n CHECK (freq IN ('daily', 'weekly', 'monthly_weekday')),\n CONSTRAINT plg_agenda_recurrences_interval_chk\n CHECK (interval_count BETWEEN 1 AND 12),\n -- UMA ponta, n\u00E3o duas. Data E contagem juntas dariam duas respostas para\n -- \"quando acaba\", e quem lesse a regra depois n\u00E3o saberia qual valeu.\n CONSTRAINT plg_agenda_recurrences_end_chk CHECK (\n (until_date IS NOT NULL AND occurrence_count IS NULL)\n OR (until_date IS NULL AND occurrence_count IS NOT NULL)\n ),\n -- O MESMO TETO DA TELA, no banco. `RECURRENCE_MAX_OCCURRENCES` em\n -- `lib/recurrence.ts` \u00E9 60; um teto que s\u00F3 existe no navegador n\u00E3o \u00E9 teto.\n CONSTRAINT plg_agenda_recurrences_count_chk\n CHECK (occurrence_count IS NULL OR occurrence_count BETWEEN 1 AND 60)\n);\n\nDO $$\nBEGIN\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_agenda_recurrences_tenant_fk') THEN\n ALTER TABLE public.plg_agenda_recurrences\n ADD CONSTRAINT plg_agenda_recurrences_tenant_fk\n FOREIGN KEY (tenant_id) REFERENCES public.tenants(id) ON DELETE CASCADE;\n END IF;\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'plg_agenda_recurrences_unit_fk') THEN\n ALTER TABLE public.plg_agenda_recurrences\n ADD CONSTRAINT plg_agenda_recurrences_unit_fk\n FOREIGN KEY (unit_id) REFERENCES app.units(id) ON DELETE SET NULL;\n END IF;\nEND $$;\n\nCREATE INDEX IF NOT EXISTS plg_agenda_recurrences_tenant_idx\n ON public.plg_agenda_recurrences (tenant_id, starts_on DESC);\n\nCOMMENT ON TABLE public.plg_agenda_recurrences IS\n 'A regra de uma s\u00E9rie de agendamentos (\"Repetir\"). As ocorr\u00EAncias s\u00E3o linhas reais em public.appointments, ligadas por appointments.series_id \u2014 ver o cabe\u00E7alho da migration 018 para por que aqui se materializa e no bloqueio n\u00E3o.';\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 2. A OCORR\u00CANCIA APONTA PARA A REGRA\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nALTER TABLE public.appointments ADD COLUMN IF NOT EXISTS series_id uuid;\n\nCOMMENT ON COLUMN public.appointments.series_id IS\n 'A s\u00E9rie de \"Repetir\" a que esta ocorr\u00EAncia pertence. NULL = agendamento avulso, que \u00E9 a esmagadora maioria. ON DELETE SET NULL: apagar a regra solta as ocorr\u00EAncias, nunca as apaga.';\n\nDO $$\nBEGIN\n IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'appointments_series_fk') THEN\n -- SET NULL, e n\u00E3o CASCADE. A 007 j\u00E1 custou uma agenda inteira a um CASCADE\n -- (\"o cascade levou a agenda junto\"): a regra \u00E9 METADADO da s\u00E9rie, e perder\n -- o metadado n\u00E3o pode apagar atendimentos que j\u00E1 aconteceram e j\u00E1 foram\n -- cobrados. Soltar a ocorr\u00EAncia \u00E9 a perda honesta.\n ALTER TABLE public.appointments\n ADD CONSTRAINT appointments_series_fk\n FOREIGN KEY (series_id) REFERENCES public.plg_agenda_recurrences(id) ON DELETE SET NULL;\n END IF;\nEND $$;\n\n-- A pergunta da tela: quais s\u00E3o as outras ocorr\u00EAncias desta s\u00E9rie, em ordem.\nCREATE INDEX IF NOT EXISTS idx_appointments_series\n ON public.appointments USING btree (tenant_id, series_id, starts_at)\n WHERE series_id IS NOT NULL;\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 3. updated_at\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nDROP TRIGGER IF EXISTS plg_agenda_recurrences_updated_at ON public.plg_agenda_recurrences;\nCREATE TRIGGER plg_agenda_recurrences_updated_at\n BEFORE UPDATE ON public.plg_agenda_recurrences\n FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 4. Quem enxerga\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- A mesma cerca das ocorr\u00EAncias: quem pode ler a agenda da unidade pode ler a\n-- regra das s\u00E9ries dela. Regra sem unidade (conta de uma unidade s\u00F3) fica no\n-- alcance de tenant \u2014 ela n\u00E3o guarda cliente nem valor, s\u00F3 freq e datas.\n\nALTER TABLE public.plg_agenda_recurrences ENABLE ROW LEVEL SECURITY;\nALTER TABLE public.plg_agenda_recurrences FORCE ROW LEVEL SECURITY;\nGRANT SELECT, INSERT, UPDATE, DELETE ON TABLE public.plg_agenda_recurrences TO authenticated;\nGRANT ALL ON TABLE public.plg_agenda_recurrences TO service_role;\n\nDROP POLICY IF EXISTS plg_agenda_recurrences_authz_select ON public.plg_agenda_recurrences;\nCREATE POLICY plg_agenda_recurrences_authz_select ON public.plg_agenda_recurrences\n FOR SELECT TO authenticated USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (plg_agenda_recurrences.unit_id IS NULL OR (SELECT app.has_unit(plg_agenda_recurrences.unit_id)))\n AND (SELECT app.has_permission('agenda.read', plg_agenda_recurrences.unit_id)));\n\nDROP POLICY IF EXISTS plg_agenda_recurrences_authz_insert ON public.plg_agenda_recurrences;\nCREATE POLICY plg_agenda_recurrences_authz_insert ON public.plg_agenda_recurrences\n FOR INSERT TO authenticated WITH CHECK (\n tenant_id = (SELECT app.current_tenant_id())\n AND (plg_agenda_recurrences.unit_id IS NULL OR (SELECT app.has_unit(plg_agenda_recurrences.unit_id)))\n AND (SELECT app.has_permission('agenda.create', plg_agenda_recurrences.unit_id)));\n\nDROP POLICY IF EXISTS plg_agenda_recurrences_authz_update ON public.plg_agenda_recurrences;\nCREATE POLICY plg_agenda_recurrences_authz_update ON public.plg_agenda_recurrences\n FOR UPDATE TO authenticated USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (plg_agenda_recurrences.unit_id IS NULL OR (SELECT app.has_unit(plg_agenda_recurrences.unit_id)))\n AND (SELECT app.has_permission('agenda.edit', plg_agenda_recurrences.unit_id)))\n WITH CHECK (\n tenant_id = (SELECT app.current_tenant_id())\n AND (plg_agenda_recurrences.unit_id IS NULL OR (SELECT app.has_unit(plg_agenda_recurrences.unit_id)))\n AND (SELECT app.has_permission('agenda.edit', plg_agenda_recurrences.unit_id)));\n\nDROP POLICY IF EXISTS plg_agenda_recurrences_authz_delete ON public.plg_agenda_recurrences;\nCREATE POLICY plg_agenda_recurrences_authz_delete ON public.plg_agenda_recurrences\n FOR DELETE TO authenticated USING (\n tenant_id = (SELECT app.current_tenant_id())\n AND (plg_agenda_recurrences.unit_id IS NULL OR (SELECT app.has_unit(plg_agenda_recurrences.unit_id)))\n AND (SELECT app.has_permission('agenda.delete', plg_agenda_recurrences.unit_id)));\n\n-- N\u00C3O entra em `scoped_resources`, pela mesma raz\u00E3o da 013: aquele registro\n-- pede `owner_id` porque responde \"de quem \u00E9 esta linha\". Uma regra de\n-- recorr\u00EAncia n\u00E3o tem dono \u2014 ela descreve as ocorr\u00EAncias, e a cerca das\n-- ocorr\u00EAncias j\u00E1 est\u00E1 em `appointments`.\n";
|
|
20
|
+
export declare const MIGRATION_019_A_SERIE_NASCE_NUMA_VIAGEM_SO = "-- 019_a_serie_nasce_numa_viagem_so.sql \u2014 a s\u00E9rie inteira em uma ida ao banco.\n--\n-- A 018 materializou a s\u00E9rie, e o cliente a escrevia no la\u00E7o: uma chamada por\n-- ocorr\u00EAncia, em s\u00E9rie, e cada ocorr\u00EAncia custava QUATRO requisi\u00E7\u00F5es \u2014 o RPC de\n-- cria\u00E7\u00E3o, o update da sala, a sincroniza\u00E7\u00E3o de convidados e o carimbo do\n-- `series_id`. Uma s\u00E9rie de doze ter\u00E7as era ~48 viagens, uma depois da outra,\n-- com a aba aberta o tempo todo. Sessenta (o teto) seriam 240.\n--\n-- O custo n\u00E3o \u00E9 s\u00F3 espera. Entre a primeira e a \u00FAltima n\u00E3o h\u00E1 transa\u00E7\u00E3o: fechar\n-- a aba no meio deixa metade da s\u00E9rie criada, e metade de uma s\u00E9rie \u00E9 pior que\n-- nenhuma \u2014 o cliente recebeu doze datas por telefone.\n--\n-- Ent\u00E3o o la\u00E7o desce para o banco. Uma chamada, uma transa\u00E7\u00E3o, tudo ou nada.\n--\n-- N\u00C3O \u00C9 UM SEGUNDO CAMINHO DE ESCRITA. Esta fun\u00E7\u00E3o n\u00E3o insere em\n-- `appointments`: ela chama `agenda_booking_create`, que \u00E9 a mesma porta que o\n-- cliente usava, dentro do la\u00E7o. Pedido, linhas, dura\u00E7\u00E3o e idempot\u00EAncia\n-- continuam decididos num lugar s\u00F3 \u2014 o que muda \u00E9 de onde o la\u00E7o roda. A sala\n-- e os convidados, que o cliente estampava depois porque a assinatura do RPC\n-- est\u00E1 congelada, entram aqui pelo mesmo motivo e na mesma transa\u00E7\u00E3o.\n\nSET check_function_bodies = false;\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- A s\u00E9rie, de uma vez\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- `p_days` s\u00E3o DIAS locais (`YYYY-MM-DD`) j\u00E1 expandidos por\n-- `lib/recurrence.expandRecurrence`. A expans\u00E3o fica no TypeScript de\n-- prop\u00F3sito: \u00E9 a parte que erra se algo errar, e teste de aritm\u00E9tica de datas\n-- n\u00E3o deve precisar de banco. O que o banco faz \u00E9 escrever.\n--\n-- `p_time_of_day` chega como texto `HH:MM` e o instante \u00E9 montado AQUI, dia a\n-- dia, no fuso da sess\u00E3o. Mandar 12 timestamps prontos daria no mesmo at\u00E9 a\n-- s\u00E9rie cruzar um hor\u00E1rio de ver\u00E3o \u2014 e a\u00ED a oitava ocorr\u00EAncia cairia uma hora\n-- fora sem ningu\u00E9m ter mexido nela.\nCREATE OR REPLACE FUNCTION public.agenda_series_create(\n p_days date[],\n p_time_of_day text,\n p_rule jsonb,\n p_lines jsonb DEFAULT '[]'::jsonb,\n p_party_id uuid DEFAULT NULL,\n p_assignee_id uuid DEFAULT NULL,\n p_unit_id uuid DEFAULT NULL,\n p_location_id uuid DEFAULT NULL,\n p_resource_id uuid DEFAULT NULL,\n p_kind text DEFAULT 'appointment',\n p_notes text DEFAULT NULL,\n p_metadata jsonb DEFAULT '{}'::jsonb,\n p_attendee_ids uuid[] DEFAULT NULL\n) RETURNS jsonb\n LANGUAGE plpgsql SECURITY DEFINER\n SET search_path TO ''\n AS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_series uuid;\n v_day date;\n v_starts timestamptz;\n v_res jsonb;\n v_booking uuid;\n v_ids uuid[] := '{}';\n v_failed jsonb := '[]'::jsonb;\nBEGIN\n IF v_tenant IS NULL THEN\n RAISE EXCEPTION 'agenda_series_create: no active tenant' USING ERRCODE = '42501';\n END IF;\n -- A MESMA permiss\u00E3o de uma ocorr\u00EAncia. Criar doze n\u00E3o \u00E9 um poder novo; \u00E9 o\n -- mesmo gesto doze vezes, e `agenda_booking_create` vai conferir de novo em\n -- cada uma. Conferir aqui \u00E9 para a s\u00E9rie falhar ANTES de escrever a regra.\n IF NOT (select app.has_permission('agenda.create', p_unit_id)) THEN\n RAISE EXCEPTION 'agenda_series_create: agenda.create is required' USING ERRCODE = '42501';\n END IF;\n IF p_days IS NULL OR array_length(p_days, 1) IS NULL THEN\n RAISE EXCEPTION 'agenda_series_create: a s\u00E9rie n\u00E3o tem nenhuma data' USING ERRCODE = '22023';\n END IF;\n -- O MESMO teto do expansor (`RECURRENCE_MAX_OCCURRENCES`). Aqui porque o\n -- cliente n\u00E3o \u00E9 a \u00FAnica porta: um agente ou um script chamam este RPC direto,\n -- e um `p_days` de mil datas \u00E9 uma transa\u00E7\u00E3o que segura a tabela.\n IF array_length(p_days, 1) > 60 THEN\n RAISE EXCEPTION 'agenda_series_create: uma s\u00E9rie tem no m\u00E1ximo 60 ocorr\u00EAncias' USING ERRCODE = '22023';\n END IF;\n\n INSERT INTO public.plg_agenda_recurrences (\n tenant_id, unit_id, freq, interval_count, starts_on, time_of_day, until_date, occurrence_count\n ) VALUES (\n v_tenant, p_unit_id,\n p_rule ->> 'freq',\n coalesce((p_rule ->> 'interval')::integer, 1),\n p_days[1],\n -- `time_of_day` \u00E9 `time`; o par\u00E2metro chega como `HH:MM` de texto porque \u00E9\n -- assim que a tela o tem. O cast \u00E9 expl\u00EDcito para o erro ser aqui, e n\u00E3o\n -- uma s\u00E9rie recusada inteira por causa de dois pontos.\n p_time_of_day::time,\n nullif(p_rule ->> 'until', '')::date,\n CASE WHEN nullif(p_rule ->> 'until', '') IS NULL\n THEN coalesce((p_rule ->> 'count')::integer, array_length(p_days, 1))\n ELSE NULL END\n )\n RETURNING id INTO v_series;\n\n FOREACH v_day IN ARRAY p_days LOOP\n v_starts := (v_day::text || ' ' || p_time_of_day)::timestamp AT TIME ZONE current_setting('TimeZone');\n\n BEGIN\n v_res := public.agenda_booking_create(\n p_starts_at => v_starts,\n p_ends_at => NULL,\n p_lines => p_lines,\n p_party_id => p_party_id,\n p_assignee_id => p_assignee_id,\n p_unit_id => p_unit_id,\n p_location_id => p_location_id,\n p_kind => p_kind,\n p_notes => p_notes,\n p_metadata => p_metadata);\n\n v_booking := (v_res ->> 'appointment_id')::uuid;\n\n -- S\u00E9rie e sala no mesmo UPDATE: as duas s\u00E3o colunas que a porta\n -- congelada de `agenda_booking_create` n\u00E3o escreve, e separ\u00E1-las seria\n -- escrever a mesma linha duas vezes.\n UPDATE public.appointments\n SET series_id = v_series,\n resource_id = coalesce(p_resource_id, resource_id)\n WHERE id = v_booking;\n\n IF p_attendee_ids IS NOT NULL AND array_length(p_attendee_ids, 1) > 0 THEN\n INSERT INTO public.appointment_attendees (tenant_id, booking_id, person_id, role)\n SELECT v_tenant, v_booking, a, 'required'\n FROM unnest(p_attendee_ids) a\n ON CONFLICT DO NOTHING;\n END IF;\n\n v_ids := v_ids || v_booking;\n EXCEPTION WHEN OTHERS THEN\n -- UMA DATA QUE N\u00C3O ENTROU N\u00C3O DERRUBA AS OUTRAS, e tamb\u00E9m n\u00E3o some: o\n -- bloco devolve o motivo e a tela conta quantas nasceram. \u00C9 a mesma\n -- regra do conflito \u2014 avisa, n\u00E3o impede \u2014, e o `EXCEPTION` aninhado\n -- desfaz s\u00F3 esta itera\u00E7\u00E3o, n\u00E3o a s\u00E9rie.\n v_failed := v_failed || jsonb_build_object('date', v_day::text, 'message', SQLERRM);\n END;\n END LOOP;\n\n RETURN jsonb_build_object(\n 'series_id', v_series,\n 'booking_ids', to_jsonb(v_ids),\n 'failed', v_failed);\nEND $$;\n\nREVOKE ALL ON FUNCTION public.agenda_series_create(date[], text, jsonb, jsonb, uuid, uuid, uuid, uuid, uuid, text, text, jsonb, uuid[]) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.agenda_series_create(date[], text, jsonb, jsonb, uuid, uuid, uuid, uuid, uuid, text, text, jsonb, uuid[]) TO authenticated, service_role;\n\nCOMMENT ON FUNCTION public.agenda_series_create(date[], text, jsonb, jsonb, uuid, uuid, uuid, uuid, uuid, text, text, jsonb, uuid[]) IS\n 'Cria a regra de recorr\u00EAncia e TODAS as ocorr\u00EAncias numa transa\u00E7\u00E3o, chamando agenda_booking_create por dia. Substitui o la\u00E7o de ~4 requisi\u00E7\u00F5es por ocorr\u00EAncia que o cliente fazia.';\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- Mudar a s\u00E9rie inteira\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- S\u00F3 o que \u00E9 DA S\u00C9RIE: o hor\u00E1rio, o profissional, a sala, o local, a nota e o\n-- status. O DIA de cada ocorr\u00EAncia \u00E9 dela \u2014 mandar um `starts_at` \u00FAnico para\n-- todas empilharia a s\u00E9rie num dia s\u00F3, que \u00E9 o defeito que `planSeriesEdit`\n-- existe para n\u00E3o deixar acontecer no cliente. Aqui \u00E9 a mesma regra, do lado\n-- do banco, para quem chamar direto.\n--\n-- AS LINHAS (servi\u00E7os) N\u00C3O ENTRAM. Reescrev\u00EA-las pede saber se o agendamento\n-- tem pedido ou n\u00E3o \u2014 a regra que `updateBooking` carrega no TypeScript \u2014 e\n-- duplic\u00E1-la aqui seria o segundo caminho de escrita que esta migration\n-- recusa. Quem muda servi\u00E7o numa s\u00E9rie inteira continua indo pelo cliente.\nCREATE OR REPLACE FUNCTION public.agenda_series_update(\n p_series_id uuid,\n p_time_of_day text,\n p_assignee_id uuid DEFAULT NULL,\n p_location_id uuid DEFAULT NULL,\n p_resource_id uuid DEFAULT NULL,\n p_notes text DEFAULT NULL,\n p_status text DEFAULT NULL,\n p_touch text[] DEFAULT '{}'\n) RETURNS jsonb\n LANGUAGE plpgsql SECURITY DEFINER\n SET search_path TO ''\n AS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_unit uuid;\n v_count integer;\nBEGIN\n IF v_tenant IS NULL THEN\n RAISE EXCEPTION 'agenda_series_update: no active tenant' USING ERRCODE = '42501';\n END IF;\n\n SELECT r.unit_id INTO v_unit FROM public.plg_agenda_recurrences r\n WHERE r.id = p_series_id AND r.tenant_id = v_tenant;\n IF NOT FOUND THEN\n RAISE EXCEPTION 'agenda_series_update: s\u00E9rie % n\u00E3o encontrada', p_series_id USING ERRCODE = 'P0002';\n END IF;\n IF NOT (select app.has_permission('agenda.edit', v_unit)) THEN\n RAISE EXCEPTION 'agenda_series_update: agenda.edit is required' USING ERRCODE = '42501';\n END IF;\n\n -- `p_touch` diz QUAIS campos a tela mexeu. Sem ele, um NULL seria amb\u00EDguo\n -- entre \"n\u00E3o mexi\" e \"esvaziei\" \u2014 e desatribuir o profissional de uma s\u00E9rie\n -- \u00E9 uma decis\u00E3o t\u00E3o leg\u00EDtima quanto troc\u00E1-lo.\n UPDATE public.appointments a\n SET starts_at = ((a.starts_at AT TIME ZONE current_setting('TimeZone'))::date::text\n || ' ' || p_time_of_day)::timestamp AT TIME ZONE current_setting('TimeZone'),\n ends_at = CASE WHEN a.ends_at IS NULL THEN NULL ELSE\n ((a.starts_at AT TIME ZONE current_setting('TimeZone'))::date::text\n || ' ' || p_time_of_day)::timestamp AT TIME ZONE current_setting('TimeZone')\n + (a.ends_at - a.starts_at) END,\n assignee_id = CASE WHEN 'assigneeId' = ANY(p_touch) THEN p_assignee_id ELSE a.assignee_id END,\n location_id = CASE WHEN 'locationId' = ANY(p_touch) THEN p_location_id ELSE a.location_id END,\n resource_id = CASE WHEN 'resourceId' = ANY(p_touch) THEN p_resource_id ELSE a.resource_id END,\n notes = CASE WHEN 'notes' = ANY(p_touch) THEN p_notes ELSE a.notes END,\n status = CASE WHEN 'status' = ANY(p_touch) THEN p_status ELSE a.status END,\n updated_at = now()\n WHERE a.series_id = p_series_id\n AND a.tenant_id = v_tenant;\n GET DIAGNOSTICS v_count = ROW_COUNT;\n\n UPDATE public.plg_agenda_recurrences\n SET time_of_day = p_time_of_day::time, updated_at = now()\n WHERE id = p_series_id;\n\n RETURN jsonb_build_object('updated', v_count);\nEND $$;\n\nREVOKE ALL ON FUNCTION public.agenda_series_update(uuid, text, uuid, uuid, uuid, text, text, text[]) FROM PUBLIC;\nGRANT EXECUTE ON FUNCTION public.agenda_series_update(uuid, text, uuid, uuid, uuid, text, text, text[]) TO authenticated, service_role;\n\nCOMMENT ON FUNCTION public.agenda_series_update(uuid, text, uuid, uuid, uuid, text, text, text[]) IS\n 'Aplica a mesma mudan\u00E7a a todas as ocorr\u00EAncias da s\u00E9rie num UPDATE s\u00F3, preservando o DIA de cada uma. N\u00E3o toca nas linhas de servi\u00E7o \u2014 essa regra vive no cliente.';\n";
|
|
16
21
|
export declare const MIGRATIONS: Array<{
|
|
17
22
|
id: string;
|
|
18
23
|
sql: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,05vEAg2ClC,CAAA;AAED,eAAO,MAAM,uDAAuD,mvEAgDnE,CAAA;AAED,eAAO,MAAM,4CAA4C,w6EAqDyB,CAAA;AAElF,eAAO,MAAM,oDAAoD,61CAyBhE,CAAA;AAED,eAAO,MAAM,8CAA8C,w7EA4C1D,CAAA;AAED,eAAO,MAAM,iDAAiD,woFAiD7D,CAAA;AAED,eAAO,MAAM,oDAAoD,kxOAmHhE,CAAA;AAED,eAAO,MAAM,4CAA4C,mrZA2OxD,CAAA;AAED,eAAO,MAAM,sCAAsC,8tuBAoXlD,CAAA;AAED,eAAO,MAAM,4CAA4C,wkIA8DxD,CAAA;AAED,eAAO,MAAM,qCAAqC,q5pDAo1BjD,CAAA;AAED,eAAO,MAAM,yCAAyC,0rIA+ErD,CAAA;AAED,eAAO,MAAM,+CAA+C,+sIA0F3D,CAAA;AAED,eAAO,MAAM,kDAAkD,ogYAoK9D,CAAA;AAED,eAAO,MAAM,6CAA6C,w/GA0DzD,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,05vEAg2ClC,CAAA;AAED,eAAO,MAAM,uDAAuD,mvEAgDnE,CAAA;AAED,eAAO,MAAM,4CAA4C,w6EAqDyB,CAAA;AAElF,eAAO,MAAM,oDAAoD,61CAyBhE,CAAA;AAED,eAAO,MAAM,8CAA8C,w7EA4C1D,CAAA;AAED,eAAO,MAAM,iDAAiD,woFAiD7D,CAAA;AAED,eAAO,MAAM,oDAAoD,kxOAmHhE,CAAA;AAED,eAAO,MAAM,4CAA4C,mrZA2OxD,CAAA;AAED,eAAO,MAAM,sCAAsC,8tuBAoXlD,CAAA;AAED,eAAO,MAAM,4CAA4C,wkIA8DxD,CAAA;AAED,eAAO,MAAM,qCAAqC,q5pDAo1BjD,CAAA;AAED,eAAO,MAAM,yCAAyC,0rIA+ErD,CAAA;AAED,eAAO,MAAM,+CAA+C,+sIA0F3D,CAAA;AAED,eAAO,MAAM,kDAAkD,ogYAoK9D,CAAA;AAED,eAAO,MAAM,6CAA6C,w/GA0DzD,CAAA;AAED,eAAO,MAAM,wDAAwD,mtBAYpE,CAAA;AAED,eAAO,MAAM,6BAA6B,y4hBAmVzC,CAAA;AAED,eAAO,MAAM,qCAAqC,utMAwJjD,CAAA;AAED,eAAO,MAAM,yCAAyC,09fAoNrD,CAAA;AAED,eAAO,MAAM,0CAA0C,o4aAyOtD,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAqBzD,CAAA"}
|
package/dist/public/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createMockAgendaProvider, createSupabasePublicBookingProvider } from '../chunk-
|
|
2
|
-
export { createSupabasePublicBookingProvider } from '../chunk-
|
|
1
|
+
import { createMockAgendaProvider, createSupabasePublicBookingProvider } from '../chunk-A77PUFY5.js';
|
|
2
|
+
export { createSupabasePublicBookingProvider } from '../chunk-A77PUFY5.js';
|
|
3
3
|
import { createContext, useState, useEffect, useMemo, useContext, useRef, createElement } from 'react';
|
|
4
4
|
import { ChevronLeft, ShieldCheck, Clock, ChevronRight, User, Check, Calendar, ChevronDown, Loader2, CreditCard, Plus, QrCode, CalendarCheck, Copy, Video } from 'lucide-react';
|
|
5
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
package/dist/store.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type StoreApi } from 'zustand/vanilla';
|
|
2
|
-
import type { AgendaDataProvider } from './data/types';
|
|
2
|
+
import type { AgendaDataProvider, SeriesCreateResult } from './data/types';
|
|
3
|
+
import type { RecurrenceRule } from './lib/recurrence';
|
|
3
4
|
import type { AgendaFinancialBridge } from './bridges/financial-bridge';
|
|
4
5
|
import type { ExternalBookingSource } from './config';
|
|
5
6
|
import type { CalendarBooking, Professional, Schedule, CreateBookingInput, UpdateBookingInput, ProfessionalQuery, ScheduleQuery } from './types';
|
|
@@ -92,6 +93,11 @@ export interface AgendaUIState {
|
|
|
92
93
|
createBooking(input: CreateBookingInput): Promise<CalendarBooking>;
|
|
93
94
|
updateBooking(id: string, data: UpdateBookingInput): Promise<CalendarBooking>;
|
|
94
95
|
deleteBooking(id: string): Promise<void>;
|
|
96
|
+
/** "Repetir": materializa a série. `dates` já expandidas (lib/recurrence). */
|
|
97
|
+
createBookingSeries(input: CreateBookingInput, rule: RecurrenceRule, dates: string[]): Promise<SeriesCreateResult>;
|
|
98
|
+
/** A mesma mudança em todas as ocorrências. O dia de cada uma é preservado. */
|
|
99
|
+
updateBookingSeries(seriesId: string, data: Omit<UpdateBookingInput, 'startsAt' | 'endsAt'>, timeOfDay: string): Promise<number>;
|
|
100
|
+
deleteBookingSeries(seriesId: string): Promise<number>;
|
|
95
101
|
updateBookingStatus(id: string, status: string): Promise<void>;
|
|
96
102
|
rescheduleBooking(id: string, newStart: string, newEnd: string, newProfessionalId?: string): Promise<void>;
|
|
97
103
|
setFilters(filters: Partial<{
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -78,6 +78,15 @@ export interface CalendarBooking {
|
|
|
78
78
|
resourceId?: string | null;
|
|
79
79
|
/** O NOME da sala, resolvido na leitura — sem ele a escolha fica invisível. */
|
|
80
80
|
resourceName?: string | null;
|
|
81
|
+
/**
|
|
82
|
+
* A SÉRIE de "Repetir" (`appointments.series_id`), quando esta ocorrência faz
|
|
83
|
+
* parte de uma. Ausente/nulo = agendamento avulso.
|
|
84
|
+
*
|
|
85
|
+
* É o que faz a tela oferecer o escopo ao editar e ao excluir: sem ele,
|
|
86
|
+
* "excluir" sobre uma de doze ocorrências não teria como perguntar se é esta
|
|
87
|
+
* ou são todas.
|
|
88
|
+
*/
|
|
89
|
+
seriesId?: string | null;
|
|
81
90
|
metadata: Record<string, unknown>;
|
|
82
91
|
clientId: string | null;
|
|
83
92
|
clientName: string | null;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CalendarView.d.ts","sourceRoot":"","sources":["../../src/views/CalendarView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6E,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"CalendarView.d.ts","sourceRoot":"","sources":["../../src/views/CalendarView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6E,MAAM,OAAO,CAAA;AA4YjG,wBAAgB,YAAY,sBAi6D3B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { TurnQueueDataProvider } from '../data/turn-queue-types';
|
|
3
|
+
import type { AgendaDataProvider } from '../data/types';
|
|
4
|
+
export declare function TurnQueuePage({ provider, agendaProvider, title, subtitle }: {
|
|
5
|
+
provider: TurnQueueDataProvider;
|
|
6
|
+
agendaProvider: Pick<AgendaDataProvider, 'getProfessionals'>;
|
|
7
|
+
title: string;
|
|
8
|
+
subtitle: string;
|
|
9
|
+
}): React.JSX.Element;
|
|
10
|
+
//# sourceMappingURL=TurnQueuePage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TurnQueuePage.d.ts","sourceRoot":"","sources":["../../src/views/TurnQueuePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,KAAK,EAAE,qBAAqB,EAA4D,MAAM,0BAA0B,CAAA;AAC/H,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AA6GvD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC3E,QAAQ,EAAE,qBAAqB,CAAA;IAC/B,cAAc,EAAE,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB,qBA0JA"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"status": "beta",
|
|
5
5
|
"dependencies": []
|
|
6
6
|
},
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.20.0",
|
|
8
8
|
"description": "Fayz SDK — plugin-agenda plugin",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"sideEffects": [
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"@fullcalendar/resource-timegrid": "^6.1.0",
|
|
43
43
|
"@fullcalendar/timegrid": "^6.1.20",
|
|
44
44
|
"@tanstack/react-table": "^8.20.0",
|
|
45
|
-
"@fayz-ai/admin": "^0.
|
|
46
|
-
"@fayz-ai/core": "^0.
|
|
47
|
-
"@fayz-ai/plugin-financial": "^0.
|
|
48
|
-
"@fayz-ai/plugin-forms": "^0.
|
|
49
|
-
"@fayz-ai/ui": "^0.
|
|
45
|
+
"@fayz-ai/admin": "^0.35.0",
|
|
46
|
+
"@fayz-ai/core": "^0.35.0",
|
|
47
|
+
"@fayz-ai/plugin-financial": "^0.18.3",
|
|
48
|
+
"@fayz-ai/plugin-forms": "^0.13.2",
|
|
49
|
+
"@fayz-ai/ui": "^0.35.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/react": "^18.3.0",
|