@fayz-ai/plugin-agenda 0.18.2 → 0.18.4
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/data/registries.d.ts.map +1 -1
- package/dist/data/supabase.d.ts.map +1 -1
- package/dist/index.js +61 -20
- package/dist/index.js.map +1 -1
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/views/CalendarView.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -13,6 +13,7 @@ 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";
|
|
16
17
|
export declare const MIGRATIONS: Array<{
|
|
17
18
|
id: string;
|
|
18
19
|
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,UAAU,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAiBzD,CAAA"}
|
|
@@ -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;AA2YjG,wBAAgB,YAAY,sBAm5D3B"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"status": "beta",
|
|
5
5
|
"dependencies": []
|
|
6
6
|
},
|
|
7
|
-
"version": "0.18.
|
|
7
|
+
"version": "0.18.4",
|
|
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.33.0",
|
|
46
|
+
"@fayz-ai/core": "^0.33.0",
|
|
47
|
+
"@fayz-ai/plugin-financial": "^0.18.0",
|
|
48
|
+
"@fayz-ai/plugin-forms": "^0.13.0",
|
|
49
|
+
"@fayz-ai/ui": "^0.33.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/react": "^18.3.0",
|