@fayz-ai/plugin-registry 0.12.1 → 0.14.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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/entities.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { tl } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// entities — as fichas de referência, iguais em qualquer ofício.\n// ---------------------------------------------------------------------------\n// Estas dez definições estavam escritas à mão dentro de UM aplicativo\n// (beauty-saas/src/types/registry.ts), e por isso os Cadastros existiam só lá:\n// o aplicativo central abria a mesma conta, com os mesmos dados, e o menu não\n// tinha a rubrica — não porque ela estivesse escondida, mas porque as telas\n// não existiam para serem agrupadas.\n//\n// Nada aqui é de salão. São as tabelas da espinha vistas por dez recortes:\n// `people` por papel (equipe, fornecedor, contato, parceiro), `products` como\n// patrimônio, `categories` por tipo (origem, categoria de serviço, grupo de\n// locais), `services`, e `v_units` — a filial. Um restaurante tem fornecedor e\n// equipamento; uma escola tem contato e origem. O que muda por ofício é o\n// NOME de cada linha no menu, e isso o preset do banco já resolve.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Staff — person archetype + extension table\n// ---------------------------------------------------------------------------\nexport const staffEntity: EntityDef = {\n name: tl('Staff', 'Profissional'),\n namePlural: tl('Staff', 'Profissionais'),\n icon: 'UserCog',\n // staff_members is an extension table (no name column) — useless to the\n // agent's generic reader. The agent sees professionals through the\n // beauty:professionals read-model (people kind='staff') instead.\n agentHidden: true,\n layout: 'person',\n displayField: 'name',\n defaultSort: 'name',\n fieldGroups: [\n { id: 'professional', label: tl('Professional Info', 'Informações Profissionais'), columns: 2 },\n ],\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'email', label: 'E-mail', type: 'email', showInTable: true, searchable: true },\n { key: 'phone', label: tl('Phone', 'Telefone'), type: 'phone', showInTable: true },\n { key: 'profession', label: tl('Profession', 'Profissão'), type: 'text', showInTable: true, group: 'professional' },\n { key: 'commissionRate', label: tl('Commission (%)', 'Comissão (%)'), type: 'number', showInTable: true, group: 'professional', defaultValue: 0 },\n // Trabalhar aqui não é atender cliente: a recepção e o financeiro entram\n // por esta mesma tela. Sem a escolha no cadastro, todo mundo nascia com\n // coluna na grade da semana e horário livre para marcarem em cima.\n {\n key: 'isBookable', label: tl('Appears in the calendar', 'Aparece na agenda'), type: 'boolean',\n showInTable: true, defaultValue: true, inlineToggle: true, group: 'professional',\n hint: tl(\n 'Clients can be booked with this person.',\n 'Clientes podem ser marcados com esta pessoa.',\n ),\n },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n // No custom documents tab: the `person` archetype supplies the shared\n // custom_forms documents widget (same as clients / school-saas).\n data: {\n // Pessoa pura, como no resto-saas: quem é da equipe é `people.kind='staff'`.\n // A extensão `staff_members` e a view `v_staff` não existem mais.\n table: 'people',\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'staff',\n // `profession` e `commissionRate` eram colunas da extensão. A comissão de\n // verdade é a do motor de regras do Financeiro (plg_financial_commission_*),\n // que sabe dividir por serviço e por profissional; este número aqui é o\n // resquício de quando havia um só. Fica em custom_fields para não sumir.\n customFields: ['profession', 'commissionRate'],\n searchColumns: ['name', 'email', 'phone'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Suppliers — person archetype, direct query\n// ---------------------------------------------------------------------------\nexport const supplierEntity: EntityDef = {\n name: tl('Supplier', 'Fornecedor'),\n namePlural: tl('Suppliers', 'Fornecedores'),\n icon: 'Building2',\n layout: 'person',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n fieldGroups: [\n { id: 'identity', label: tl('Identity', 'Identificação'), columns: 2 },\n { id: 'contact', label: tl('Contact', 'Contato'), columns: 2 },\n { id: 'record', label: tl('Record', 'Cadastro'), columns: 1, column: 'side' },\n ],\n fields: [\n { key: 'name', label: tl('Legal name / Name', 'Razão social / Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n {\n key: 'serviceProviderType', label: tl('Service provider type', 'Tipo de prestador de serviço'), type: 'segmented',\n required: true, defaultValue: 'pj', group: 'identity', span: 2,\n options: [\n { value: 'pj', label: tl('Company', 'Pessoa jurídica') },\n { value: 'pf', label: tl('Individual', 'Pessoa física') },\n { value: 'autonomo', label: tl('Self-employed', 'Autônomo') },\n ],\n },\n { key: 'documentNumber', label: 'CNPJ / CPF', type: 'text', searchable: true, showInTable: true, group: 'identity' },\n { key: 'registrationNumber', label: tl('State / municipal registration', 'Inscrição estadual / municipal'), type: 'text', group: 'identity' },\n { key: 'email', label: 'E-mail', type: 'email', showInTable: true, searchable: true, group: 'contact' },\n { key: 'phone', label: tl('Phone', 'Telefone'), type: 'phone', showInTable: true, searchable: true, group: 'contact' },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true, group: 'record' },\n { key: 'notes', label: tl('Notes', 'Observações'), type: 'textarea', showInTable: false, group: 'record' },\n ],\n data: {\n table: 'people',\n schema: 'public',\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'supplier',\n filters: { kind: 'supplier' },\n defaults: { kind: 'supplier' },\n customFields: ['serviceProviderType', 'registrationNumber'],\n searchColumns: ['name', 'email', 'phone', 'document_number'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Contacts — person archetype, direct query\n// ---------------------------------------------------------------------------\nexport const contactEntity: EntityDef = {\n name: tl('Contact', 'Contato'),\n namePlural: tl('Contacts', 'Contatos'),\n icon: 'Contact',\n layout: 'person',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'email', label: 'E-mail', type: 'email', showInTable: true, searchable: true },\n { key: 'phone', label: tl('Phone', 'Telefone'), type: 'phone', showInTable: true, searchable: true },\n { key: 'notes', label: tl('Notes', 'Observações'), type: 'textarea', showInTable: false },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n data: {\n table: 'people',\n schema: 'public',\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'contact',\n filters: { kind: 'contact' },\n defaults: { kind: 'contact' },\n searchColumns: ['name', 'email', 'phone'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Partnerships — person archetype, direct query\n// ---------------------------------------------------------------------------\nexport const partnershipEntity: EntityDef = {\n name: tl('Partnership', 'Parceria'),\n namePlural: tl('Partnerships', 'Parcerias'),\n icon: 'Handshake',\n layout: 'person',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'phone', label: tl('Phone', 'Telefone'), type: 'phone', showInTable: true },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n data: {\n table: 'people',\n schema: 'public',\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'partner',\n filters: { kind: 'partner' },\n defaults: { kind: 'partner' },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Equipment — product archetype, direct query\n// ---------------------------------------------------------------------------\nexport const equipmentEntity: EntityDef = {\n name: tl('Equipment', 'Equipamento'),\n namePlural: tl('Equipment', 'Equipamentos'),\n icon: 'Wrench',\n layout: 'product',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'description', label: tl('Model', 'Modelo'), type: 'text', showInTable: true },\n { key: 'sku', label: tl('Serial Number', 'Número de Série'), type: 'text', showInTable: true },\n { key: 'status', label: 'Status', type: 'select', options: ['active', 'maintenance', 'retired'], showInTable: true, defaultValue: 'active' },\n ],\n data: {\n table: 'products',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'asset' },\n defaults: { kind: 'asset' },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Origins — category archetype, direct query\n// ---------------------------------------------------------------------------\nexport const originEntity: EntityDef = {\n name: tl('Origin', 'Origem'),\n namePlural: tl('Origins', 'Origens'),\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'origin' },\n defaults: { kind: 'origin' },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Service Categories — category archetype, direct query\n// ---------------------------------------------------------------------------\nexport const serviceCategoryEntity: EntityDef = {\n name: tl('Service Category', 'Categoria de Serviço'),\n namePlural: tl('Service Categories', 'Categorias de Serviço'),\n icon: 'Tag',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', showInTable: true, defaultValue: 0 },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'service_category' },\n defaults: { kind: 'service_category' },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Service Locations — location archetype, direct query\n// ---------------------------------------------------------------------------\nexport const serviceLocationEntity: EntityDef = {\n name: tl('Service Location', 'Local de Atendimento'),\n namePlural: tl('Service Locations', 'Locais de Atendimento'),\n icon: 'MapPin',\n layout: 'location',\n displayField: 'name',\n subtitleField: 'city',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'phone', label: tl('Phone', 'Telefone'), type: 'phone', showInTable: true },\n { key: 'city', label: tl('City', 'Cidade'), type: 'text', showInTable: true, searchable: true },\n { key: 'state', label: tl('State', 'Estado'), type: 'text', showInTable: true },\n { key: 'address', label: tl('Address', 'Endereço'), type: 'text' },\n { key: 'country', label: tl('Country', 'País'), type: 'text', defaultValue: 'BR' },\n { key: 'postalCode', label: tl('Postal Code', 'CEP'), type: 'text' },\n { key: 'email', label: 'E-mail', type: 'email' },\n { key: 'isHeadquarters', label: tl('Headquarters', 'Matriz'), type: 'boolean', showInTable: true, defaultValue: false },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n { key: 'notes', label: tl('Notes', 'Observações'), type: 'textarea' },\n ],\n data: {\n // A filial É a unidade. `v_units` é a ponte pública para o schema `app`, e\n // traz exatamente os campos desta tela (nome, contato, endereço, matriz,\n // ativo, observações). A tabela `locations` não existe mais.\n table: 'v_units',\n tenantScoped: true,\n archetype: 'location',\n archetypeKind: 'branch',\n searchColumns: ['name', 'city', 'state'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Location Groups — category archetype, direct query\n// ---------------------------------------------------------------------------\nexport const locationGroupEntity: EntityDef = {\n name: tl('Location Group', 'Grupo de Locais'),\n namePlural: tl('Location Groups', 'Grupos de Locais'),\n icon: 'Map',\n displayField: 'name',\n defaultSort: 'sortOrder',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', showInTable: true, defaultValue: 0 },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'location_group' },\n defaults: { kind: 'location_group' },\n searchColumns: ['name'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Services — service archetype, direct query on public.services\n// ---------------------------------------------------------------------------\nexport const serviceEntity: EntityDef = {\n name: tl('Service', 'Serviço'),\n icon: 'Briefcase',\n layout: 'service',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: tl('Service Name', 'Nome do Serviço'), type: 'text', required: true, searchable: true, showInTable: true },\n { key: 'description', label: tl('Description', 'Descrição'), type: 'textarea', showInTable: false },\n { key: 'durationMinutes', label: tl('Duration (min)', 'Duração (min)'), type: 'number', required: true, showInTable: true },\n { key: 'price', label: tl('Price', 'Preço'), type: 'currency', required: true, showInTable: true },\n // A pergunta que o BeautySoft responde com `service_kind`: isto se MARCA,\n // ou se VENDE? O tratamento entra num pacote e o que vai para a agenda é o\n // passo — a avaliação, a revisão, a entrega do que foi comprado antes.\n // Ver a migration 120 do spine.\n {\n key: 'isBookable', label: tl('Appears in the calendar', 'Aparece na agenda'), type: 'boolean',\n showInTable: true, defaultValue: true, inlineToggle: true,\n hint: tl(\n 'Can be picked when booking an appointment. Turn off for what is sold in a package and never booked on its own.',\n 'Pode ser escolhido ao marcar um horário. Desligue para o que é vendido em pacote e nunca se marca sozinho.',\n ),\n },\n { key: 'isActive', label: tl('Active', 'Ativo'), type: 'boolean', showInTable: true, defaultValue: true, inlineToggle: true },\n ],\n // Services are their own Ring-0 archetype table (public.services), not a\n // kind of product. Direct query by table+schema (no kind filter).\n data: {\n table: 'services',\n schema: 'public',\n tenantScoped: true,\n searchColumns: ['name'],\n },\n}\n","import type { PluginManifest, PluginScope, VerticalId, EntityDef } from '@fayz-ai/core'\nimport { Briefcase, Map, MapPin, Tag } from 'lucide-react'\nimport { adminNavigateTo, createCrudPage, type CrudNavTab } from '@fayz-ai/admin'\n\nimport {\n staffEntity, supplierEntity, contactEntity, partnershipEntity, equipmentEntity,\n originEntity, serviceCategoryEntity, serviceLocationEntity, locationGroupEntity,\n serviceEntity,\n} from './lib/entities'\n\n// ---------------------------------------------------------------------------\n// plugin-registry — os Cadastros.\n// ---------------------------------------------------------------------------\n// ── O buraco que ele fecha ─────────────────────────────────────────────────\n// O aplicativo central carrega o ofício de quem entra, e para o Espaço Facial\n// ele carregava tudo MENOS os Cadastros: a rubrica não desenhava porque as dez\n// telas dela não existiam ali. Elas estavam escritas dentro do beauty-saas, em\n// `src/config/pages.tsx` — um aplicativo só, e portanto uma conta só.\n//\n// Era o mesmo defeito que o preset resolveu para a ORDEM e a 118 para o NOME,\n// um degrau abaixo: não adianta o ofício saber agrupar e nomear se ninguém\n// serve a tela. Quem serve tela é plugin.\n//\n// ── Por que um plugin, e não mais uma pasta no aplicativo ──────────────────\n// Nenhuma destas fichas é de salão. Fornecedor, contato, equipamento, origem e\n// filial são o que QUALQUER casa cadastra; o restaurante compra de fornecedor\n// e a escola registra origem de matrícula. O que muda por ofício é o nome da\n// linha no menu — \"Funcionários\" no BeautySoft, \"Equipe\" no resto — e disso\n// cuida o `labels` do preset, no banco.\n//\n// ── O ofício liga o que usa ────────────────────────────────────────────────\n// `modules` desliga tela a tela: uma loja sem atendimento não quer Serviços\n// nem Categorias de Serviço, e uma rubrica cujos filhos saíram todos não\n// desenha. É o mesmo contrato dos outros plugins — oferecer, não impor.\n// ---------------------------------------------------------------------------\n\n/** Cada tela de cadastro, na ORDEM em que o menu as lê por padrão. */\nconst SCREENS = [\n { id: 'services', path: '/registry/services', entity: serviceEntity, icon: 'Briefcase', feature: 'services' },\n { id: 'serviceCategories', path: '/registry/categories', entity: serviceCategoryEntity, icon: 'Tag', feature: 'services', nested: true },\n { id: 'locations', path: '/registry/locations', entity: serviceLocationEntity, icon: 'MapPin', feature: 'services' },\n { id: 'locationGroups', path: '/registry/location-groups', entity: locationGroupEntity, icon: 'Map', feature: 'services', nested: true },\n { id: 'staff', path: '/registry/staff', entity: staffEntity, icon: 'UserCog' },\n { id: 'contacts', path: '/registry/contacts', entity: contactEntity, icon: 'Contact' },\n { id: 'suppliers', path: '/registry/suppliers', entity: supplierEntity, icon: 'Building2' },\n { id: 'partnerships', path: '/registry/partnerships', entity: partnershipEntity, icon: 'Handshake' },\n { id: 'equipment', path: '/registry/equipment', entity: equipmentEntity, icon: 'Wrench' },\n { id: 'origins', path: '/registry/origins', entity: originEntity, icon: 'Globe' },\n] as const\n\nexport type RegistryScreenId = (typeof SCREENS)[number]['id']\n\nconst serviceTabs = (): CrudNavTab[] => [\n { id: 'services', label: serviceEntity.namePlural ?? serviceEntity.name, icon: Briefcase, onSelect: () => adminNavigateTo('/registry/services') },\n { id: 'serviceCategories', label: serviceCategoryEntity.namePlural ?? serviceCategoryEntity.name, icon: Tag, onSelect: () => adminNavigateTo('/registry/categories') },\n]\n\nconst locationTabs = (): CrudNavTab[] => [\n { id: 'locations', label: serviceLocationEntity.namePlural ?? serviceLocationEntity.name, icon: MapPin, onSelect: () => adminNavigateTo('/registry/locations') },\n { id: 'locationGroups', label: locationGroupEntity.namePlural ?? locationGroupEntity.name, icon: Map, onSelect: () => adminNavigateTo('/registry/location-groups') },\n]\n\nexport interface RegistryPluginOptions {\n scope?: PluginScope\n verticalId?: VerticalId\n /** Onde a primeira linha cai no rail. As demais vêm em degraus de 0,1. */\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n /**\n * Quais telas esta casa tem. Ausente = todas.\n *\n * `false` é a única forma de negar: uma chave que ninguém respondeu cai no\n * padrão, não em \"não\" — do contrário, publicar uma ficha nova seria o dia\n * em que ela some de toda conta que não a listou.\n */\n modules?: Partial<Record<RegistryScreenId, boolean>>\n /**\n * Troca a definição de uma ficha sem trocar a tela.\n *\n * A casa que precisa de um campo a mais no fornecedor passa o EntityDef dela\n * aqui em vez de reimplementar a rota — que foi exatamente como as dez\n * acabaram dentro de um aplicativo.\n */\n entities?: Partial<Record<RegistryScreenId, EntityDef>>\n}\n\nexport function createRegistryPlugin(options?: RegistryPluginOptions): PluginManifest {\n const section = options?.navSection ?? 'main'\n const base = options?.navPosition ?? 80\n\n const active = SCREENS.filter((screen) => options?.modules?.[screen.id] !== false)\n\n const pages = active.map((screen, index) => {\n const entity = options?.entities?.[screen.id] ?? (screen.entity as EntityDef)\n const feature = (screen as { feature?: string }).feature\n const grouped = screen.id === 'services' || screen.id === 'serviceCategories'\n ? { navTabs: serviceTabs, activeNavTab: screen.id }\n : screen.id === 'locations' || screen.id === 'locationGroups'\n ? { navTabs: locationTabs, activeNavTab: screen.id }\n : {}\n return {\n screen,\n entity,\n position: base + index * 0.1,\n component: createCrudPage(entity, { ...(feature ? { feature } : {}), ...grouped }),\n permission: feature ? { feature, action: 'read' as const } : undefined,\n }\n })\n\n return {\n id: 'registry',\n name: 'Cadastros',\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n\n // Uma linha por ficha, plana. Quem as junta sob \"Cadastros\" — e em que\n // ordem, e com que nome — é o `rail` do ofício. Ver packages/admin\n // rail-preset.ts: o ofício AGRUPA, o plugin NOMEIA, e o `labels` do preset\n // é a casa dizendo que ali a ficha se chama outra coisa.\n navigation: pages.filter((page) => !('nested' in page.screen && page.screen.nested)).map((page) => ({\n section,\n position: page.position,\n label: page.entity.namePlural ?? page.entity.name,\n route: page.screen.path,\n icon: page.screen.icon,\n ...(page.permission ? { permission: page.permission } : {}),\n })),\n\n routes: pages.map((page) => ({\n path: page.screen.path,\n component: page.component as React.ComponentType<unknown>,\n title: page.entity.namePlural ?? page.entity.name,\n ...(page.permission ? { permission: page.permission } : {}),\n })),\n }\n}\n\nexport {\n staffEntity, supplierEntity, contactEntity, partnershipEntity, equipmentEntity,\n originEntity, serviceCategoryEntity, serviceLocationEntity, locationGroupEntity,\n serviceEntity,\n} from './lib/entities'\n"]}
1
+ {"version":3,"sources":["../src/lib/person-fields.ts","../src/lib/entities.ts","../src/index.ts"],"names":["tl","RECORD_GROUP","recordRailFields"],"mappings":"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","file":"index.js","sourcesContent":["import { tl, RECORD_GROUP, recordRailFields, activeFacet } from '@fayz-ai/core'\nimport type { FieldDef, FieldGroup } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// O que TODA ficha de pessoa deste módulo pergunta.\n//\n// No V1 estes cadastros são LITERALMENTE a mesma tabela: Contatos é a visão\n// completa de `contacts`, e Fornecedores e Parcerias são a mesma tabela\n// pré-filtrada por `contact_type`. O V2 já modela isso certo — `people` com\n// `kind` —, e aqui a consequência é declarar os campos uma vez em vez de três.\n//\n// O que NÃO entra: o que distingue uma espécie da outra. Fornecedor tem tipo de\n// prestador e inscrição estadual; parceria tem escopo de unidades. Esses ficam\n// na entidade que os tem, que é onde alguém vai procurar por eles.\n// ---------------------------------------------------------------------------\n\nexport const PERSON_GROUPS: FieldGroup[] = [\n // Nome e documento NÃO entram: o arquétipo `person` os hasteia para o\n // cabeçalho da ficha, ao lado da foto. O que sobra é o resto da pessoa.\n { id: 'identity', label: tl('Personal', 'Dados pessoais'), columns: 2 },\n { id: 'contact', label: tl('Contact', 'Contato'), columns: 2 },\n { id: 'where', label: tl('Address', 'Endereço'), columns: 1 },\n {\n id: 'banking', label: tl('Banking', 'Dados bancários'), columns: 1,\n description: tl(\n 'Where money goes OUT to this person — not an account of the house.',\n 'Para onde o dinheiro SAI para esta pessoa — não é conta da casa.',\n ),\n },\n { ...RECORD_GROUP, label: tl('Record', 'Situação') },\n]\n\n/** A lista abre em «Ativos», como toda lista de cadastro do V1. */\nexport const ACTIVE_FACET = activeFacet({\n active: tl('Active', 'Ativos'),\n inactive: tl('Inactive', 'Inativos'),\n all: tl('All', 'Todos'),\n})\n\n/**\n * Os canais de contato.\n *\n * Telefone e CELULAR são dois campos, e é o celular que leva o WhatsApp — a\n * régua de comunicação procura este, não o fixo.\n *\n * O V1 tem um SEGUNDO de cada (telefone 2, celular 2, e-mail 2), e eles estão\n * desligados: seis caixas de contato num cadastro cuja resposta costuma ser um\n * número e um e-mail são cinco perguntas a mais para a recepção rolar. As\n * chaves continuam declaradas em `customFields` de propósito — quem já tem o\n * segundo telefone gravado não o perde, e religar é descomentar três linhas.\n */\nexport function contactChannelFields(): FieldDef[] {\n return [\n { key: 'phone', label: tl('Phone', 'Telefone'), type: 'phone', showInTable: true, searchable: true, group: 'contact' },\n { key: 'mobile', label: tl('Mobile', 'Celular'), type: 'phone', showInTable: true, group: 'contact' },\n { key: 'email', label: 'E-mail', type: 'email', showInTable: true, searchable: true, group: 'contact', span: 2 },\n // Desligados — ver acima.\n // { key: 'phone2', label: tl('Phone 2', 'Telefone 2'), type: 'phone', showInTable: false, group: 'contact' },\n // { key: 'mobile2', label: tl('Mobile 2', 'Celular 2'), type: 'phone', showInTable: false, group: 'contact' },\n // { key: 'email2', label: tl('E-mail 2', 'E-mail 2'), type: 'email', showInTable: false, group: 'contact' },\n ]\n}\n\n/**\n * Endereço e conta, os dois campos que são UMA LINHA DE OUTRA TABELA\n * (`public.addresses` e `public.payee_accounts`).\n *\n * `showInDetail: false` nos dois: a ficha tem as seções completas logo abaixo,\n * que listam TODAS as linhas, editam e excluem. O campo existe para o momento\n * em que a seção não pode existir — a criação, quando ainda não há id.\n */\nexport function attachedFields(): FieldDef[] {\n return [\n { key: 'address', label: tl('Address', 'Endereço'), type: 'address', showInTable: false, showInDetail: false, group: 'where' },\n { key: 'payeeAccount', label: tl('Bank account', 'Conta bancária'), type: 'bank', showInTable: false, showInDetail: false, group: 'banking' },\n ]\n}\n\n/**\n * O rail direito, IGUAL em todo cadastro.\n *\n * A ordem é fixa de propósito: quem procura o interruptor «Ativo» não pode\n * ter de caçá-lo numa altura diferente a cada tela. Unidade e o interruptor\n * dividem a primeira linha — a unidade responde «de quem é» e o interruptor\n * «vale ou não», que é o par que se lê junto —, e embaixo vêm as duas coisas\n * que se ESCREVE sobre o registro: o texto solto e as etiquetas.\n *\n * As etiquetas são o recorte que a casa inventa e o produto não prevê\n * («cliente VIP», «fornecedor homologado»). Sem elas isso vai para\n * Observações, onde não filtra e não conta.\n */\nexport function recordFields(table = 'people', options: { unit?: boolean } = {}): FieldDef[] {\n return recordRailFields({\n tagsTable: table,\n activeLabel: tl('Active', 'Ativo'),\n // Um cadastro que já pergunta o ESCOPO de unidades não pergunta também a\n // unidade padrão: são duas perguntas parecidas e respostas diferentes, e\n // na tela viravam dois seletores de unidade — um multi à esquerda e um\n // único à direita — sem nada dizendo qual manda.\n unit: options.unit,\n })\n}\n\n/** O sexo, que no V1 é pergunta de contato e de cliente. */\nexport function genderField(): FieldDef {\n return {\n key: 'gender', label: tl('Gender', 'Sexo'), type: 'select', showInTable: false, group: 'identity',\n options: [\n { value: 'masculino', label: tl('Male', 'Masculino') },\n { value: 'feminino', label: tl('Female', 'Feminino') },\n { value: 'outro', label: tl('Other', 'Outro') },\n ],\n }\n}\n\n/**\n * As chaves que não são coluna de `people` e moram em `custom_fields`.\n *\n * `phone2`, `mobile2` e `email2` continuam aqui mesmo com os campos\n * desligados: é isto que faz o segundo telefone JÁ GRAVADO continuar sendo\n * lido, em vez de virar lixo no jsonb no dia em que o campo voltar.\n */\nexport const PERSON_CUSTOM_FIELDS = ['gender', 'mobile', 'phone2', 'mobile2', 'email2']\n","import { tl, RECORD_GROUP, recordRailFields } from '@fayz-ai/core'\nimport {\n PERSON_GROUPS, ACTIVE_FACET, PERSON_CUSTOM_FIELDS,\n contactChannelFields, attachedFields, recordFields, genderField,\n} from './person-fields'\nimport type { EntityDef } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// entities — as fichas de referência, iguais em qualquer ofício.\n// ---------------------------------------------------------------------------\n// Estas dez definições estavam escritas à mão dentro de UM aplicativo\n// (beauty-saas/src/types/registry.ts), e por isso os Cadastros existiam só lá:\n// o aplicativo central abria a mesma conta, com os mesmos dados, e o menu não\n// tinha a rubrica — não porque ela estivesse escondida, mas porque as telas\n// não existiam para serem agrupadas.\n//\n// Nada aqui é de salão. São as tabelas da espinha vistas por dez recortes:\n// `people` por papel (equipe, fornecedor, contato, parceiro), `products` como\n// patrimônio, `categories` por tipo (origem, categoria de serviço, grupo de\n// locais), `services`, e `v_units` — a filial. Um restaurante tem fornecedor e\n// equipamento; uma escola tem contato e origem. O que muda por ofício é o\n// NOME de cada linha no menu, e isso o preset do banco já resolve.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Staff — person archetype + extension table\n// ---------------------------------------------------------------------------\nexport const staffEntity: EntityDef = {\n name: tl('Staff', 'Profissional'),\n namePlural: tl('Staff', 'Profissionais'),\n icon: 'UserCog',\n // staff_members is an extension table (no name column) — useless to the\n // agent's generic reader. The agent sees professionals through the\n // beauty:professionals read-model (people kind='staff') instead.\n agentHidden: true,\n layout: 'person',\n displayField: 'name',\n subtitleField: 'profession',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n ...PERSON_GROUPS.filter((g) => g.id !== 'record'),\n {\n id: 'work', label: tl('Work', 'Trabalho'), columns: 2,\n description: tl(\n 'What this person does here, and how the calendar and the payroll see them.',\n 'O que esta pessoa faz aqui, e como a agenda e a folha a enxergam.',\n ),\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Full name', 'Nome completo'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n { key: 'documentNumber', label: 'CPF', type: 'text', showInTable: true, searchable: true, group: 'identity' },\n // RG: o V1 pede os dois documentos na ficha de quem trabalha aqui, e a\n // folha usa ambos.\n { key: 'rg', label: 'RG', type: 'text', showInTable: false, group: 'identity' },\n { key: 'dateOfBirth', label: tl('Date of birth', 'Data de nascimento'), type: 'date', showInTable: false, group: 'identity' },\n genderField(),\n ...contactChannelFields(),\n ...attachedFields(),\n\n { key: 'profession', label: tl('Profession', 'Profissão'), type: 'text', showInTable: true, group: 'work' },\n // O VÍNCULO muda o que a folha e o fisco esperam — um autônomo emite RPA,\n // um CLT entra na folha, um PJ manda nota.\n {\n key: 'employmentType', label: tl('Employment type', 'Tipo de vínculo'), type: 'select', showInTable: false, group: 'work',\n options: [\n { value: 'clt', label: 'CLT' },\n { value: 'pj', label: 'Pessoa jurídica' },\n { value: 'autonomo', label: 'Autônomo' },\n { value: 'estagio', label: 'Estágio' },\n { value: 'socio', label: 'Sócio' },\n ],\n },\n // CBO é o código que a folha e o eSocial pedem. Texto porque a tabela\n // oficial tem ~2.500 entradas e um seletor delas seria pior que o campo.\n { key: 'cboCode', label: tl('CBO code', 'CBO'), type: 'text', showInTable: false, group: 'work',\n hint: tl('Brazilian occupation code, used by payroll.', 'Classificação Brasileira de Ocupações — a folha pede.') },\n {\n key: 'teamId', label: tl('Team', 'Equipe'), type: 'relation',\n showInTable: true, group: 'work',\n relation: { table: 'categories', filter: { kind: 'staff_team', is_active: true } },\n hint: tl('Where this person works — reception, aesthetics, sales.', 'Onde esta pessoa trabalha — recepção, estética, vendas.'),\n },\n { key: 'commissionRate', label: tl('Commission (%)', 'Comissão (%)'), type: 'number', showInTable: true, group: 'work', defaultValue: 0 },\n // O CENTRO DE CUSTO da pessoa é o que permite alocar o custo dela por\n // área — é assim que a folha vira despesa de Operação e não um bolo só.\n {\n key: 'costCenterId', label: tl('Cost centre', 'Centro de custo'), type: 'relation', showInTable: false, group: 'work',\n relation: { table: 'plg_financial_cost_centers', labelField: 'name' },\n },\n // Trabalhar aqui não é atender cliente: a recepção e o financeiro entram\n // por esta mesma tela. Sem a escolha no cadastro, todo mundo nascia com\n // coluna na grade da semana e horário livre para marcarem em cima.\n {\n key: 'isBookable', label: tl('Appears in the calendar', 'Aparece na agenda'), type: 'boolean',\n showInTable: true, defaultValue: true, group: 'work',\n hint: tl(\n 'Clients can be booked with this person.',\n 'Clientes podem ser marcados com esta pessoa.',\n ),\n },\n // O que a recepção precisa saber ANTES de marcar com esta pessoa.\n { key: 'agendaNotes', label: tl('Calendar notes', 'Informações para a agenda'), type: 'textarea', showInTable: false, group: 'work', span: 2 },\n\n ...recordFields(),\n ],\n // No custom documents tab: the `person` archetype supplies the shared\n // custom_forms documents widget (same as clients / school-saas).\n data: {\n // Pessoa pura, como no resto-saas: quem é da equipe é `people.kind='staff'`.\n table: 'people',\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'staff',\n // `profession` e `commissionRate` eram colunas da extensão. A comissão de\n // verdade é a do motor de regras do Financeiro (plg_financial_commission_*),\n // que sabe dividir por serviço e por profissional; este número aqui é o\n // resquício de quando havia um só. Fica em custom_fields para não sumir.\n customFields: [\n ...PERSON_CUSTOM_FIELDS,\n 'profession', 'commissionRate', 'teamId', 'employmentType', 'cboCode', 'agendaNotes',\n 'rg', 'costCenterId',\n ],\n searchColumns: ['name', 'email', 'phone', 'document_number'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Suppliers — person archetype, direct query\n// ---------------------------------------------------------------------------\nexport const supplierEntity: EntityDef = {\n name: tl('Supplier', 'Fornecedor'),\n namePlural: tl('Suppliers', 'Fornecedores'),\n icon: 'Building2',\n layout: 'person',\n displayField: 'name',\n subtitleField: 'documentNumber',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: PERSON_GROUPS,\n fields: [\n { key: 'name', label: tl('Legal name / Name', 'Razão social / Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n // O tipo de prestador MUDA o documento: um autônomo assina com CPF, uma\n // empresa com CNPJ, e a inscrição estadual só existe para quem é inscrito.\n {\n key: 'serviceProviderType', label: tl('Service provider type', 'Tipo de prestador de serviço'), type: 'segmented',\n required: true, defaultValue: 'pj', group: 'identity', span: 2,\n options: [\n { value: 'pj', label: tl('Company', 'Pessoa jurídica') },\n { value: 'pf', label: tl('Individual', 'Pessoa física') },\n { value: 'autonomo', label: tl('Self-employed', 'Autônomo') },\n ],\n },\n {\n key: 'documentNumber', type: 'text', searchable: true, showInTable: true, group: 'identity',\n label: 'CNPJ / CPF',\n // Rotular sempre «CNPJ / CPF» faz o operador parar para escolher qual é.\n // Ele já escolheu na linha de cima.\n labelWhen: (v) => (v.serviceProviderType === 'pj' ? 'CNPJ' : 'CPF'),\n },\n {\n key: 'registrationNumber', label: tl('State / municipal registration', 'Inscrição estadual / municipal'), type: 'text', group: 'identity',\n // Pessoa física não tem inscrição estadual. Perguntar é convidar a\n // preencher o que ninguém vai ler.\n visibleWhen: (v) => v.serviceProviderType !== 'pf',\n },\n // O GRUPO do V1 («Grupo 1», «Grupo 2»): como a casa separa os fornecedores\n // dela. Texto livre porque no V1 é isso mesmo — uma taxonomia por conta\n // viraria um cadastro que ninguém pediu.\n { key: 'groupName', label: tl('Group', 'Grupo'), type: 'text', showInTable: false, group: 'identity' },\n ...contactChannelFields(),\n ...attachedFields(),\n ...recordFields(),\n ],\n data: {\n table: 'people',\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'supplier',\n filters: { kind: 'supplier' },\n defaults: { kind: 'supplier' },\n customFields: [...PERSON_CUSTOM_FIELDS, 'serviceProviderType', 'registrationNumber', 'groupName'],\n searchColumns: ['name', 'email', 'phone', 'document_number'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Contacts — person archetype, direct query\n// ---------------------------------------------------------------------------\nexport const contactEntity: EntityDef = {\n name: tl('Contact', 'Contato'),\n namePlural: tl('Contacts', 'Contatos'),\n icon: 'Contact',\n layout: 'person',\n displayField: 'name',\n subtitleField: 'documentNumber',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: PERSON_GROUPS,\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n { key: 'documentNumber', label: 'CPF / CNPJ', type: 'text', showInTable: true, searchable: true, group: 'identity' },\n genderField(),\n ...contactChannelFields(),\n ...attachedFields(),\n ...recordFields(),\n ],\n data: {\n table: 'people',\n // Sem `schema`, de propósito: com ele a entidade resolvia para o provider\n // genérico de tabela, que não sabe ler nem gravar `custom_fields` — e\n // metade desta ficha mora lá. `public` já é o padrão.\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'contact',\n filters: { kind: 'contact' },\n defaults: { kind: 'contact' },\n customFields: PERSON_CUSTOM_FIELDS,\n searchColumns: ['name', 'email', 'phone', 'document_number'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Partnerships — person archetype, direct query\n// ---------------------------------------------------------------------------\nexport const partnershipEntity: EntityDef = {\n name: tl('Partnership', 'Parceria'),\n namePlural: tl('Partnerships', 'Parcerias'),\n icon: 'Handshake',\n layout: 'person',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: PERSON_GROUPS,\n fields: [\n { key: 'name', label: tl('Partnership name', 'Nome da parceria'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n { key: 'documentNumber', label: 'CNPJ / CPF', type: 'text', showInTable: true, searchable: true, group: 'identity' },\n // O ESCOPO de unidades, que no V1 é o par «Limitar unidades? → quais».\n // Escolher «Todas» e ainda ver a lista de unidades é oferecer uma resposta\n // que não vale; por isso a lista só aparece depois da escolha.\n {\n key: 'unitScope', label: tl('Units', 'Unidades'), type: 'segmented',\n defaultValue: 'all', group: 'identity', span: 2,\n options: [\n { value: 'all', label: tl('All units', 'Todas as unidades') },\n { value: 'selected', label: tl('Pick units', 'Selecionar unidades') },\n ],\n },\n {\n key: 'units', label: tl('Selected units', 'Unidades selecionadas'), type: 'relation',\n showInTable: false, group: 'identity', span: 2,\n relation: { table: 'v_units', labelField: 'name' },\n visibleWhen: (v) => v.unitScope === 'selected',\n },\n ...contactChannelFields(),\n ...attachedFields(),\n ...recordFields('people', { unit: false }),\n ],\n data: {\n table: 'people',\n tenantScoped: true,\n archetype: 'person',\n archetypeKind: 'partner',\n filters: { kind: 'partner' },\n defaults: { kind: 'partner' },\n customFields: [...PERSON_CUSTOM_FIELDS, 'unitScope', 'units'],\n searchColumns: ['name', 'email', 'phone', 'document_number'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Equipment — product archetype, direct query\n// ---------------------------------------------------------------------------\nexport const equipmentEntity: EntityDef = {\n name: tl('Equipment', 'Equipamento'),\n namePlural: tl('Equipment', 'Equipamentos'),\n icon: 'Wrench',\n layout: 'product',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n { id: 'identity', label: tl('Identification', 'Identificação'), columns: 2 },\n { id: 'purchase', label: tl('Purchase', 'Compra e garantia'), columns: 2 },\n {\n id: 'maintenance', label: tl('Maintenance', 'Manutenção'), columns: 2,\n description: tl(\n 'The next date is what a list of equipment is FOR.',\n 'A próxima data é para o que uma lista de equipamentos serve.',\n ),\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n { key: 'brand', label: tl('Brand', 'Marca'), type: 'text', showInTable: true, group: 'identity' },\n { key: 'model', label: tl('Model', 'Modelo'), type: 'text', showInTable: true, group: 'identity' },\n // O NÚMERO DE SÉRIE é o que a assistência técnica pede e o que distingue\n // dois aparelhos iguais na mesma sala.\n { key: 'sku', label: tl('Serial number', 'Número de série'), type: 'text', showInTable: false, searchable: true, group: 'identity' },\n {\n key: 'status', label: 'Status', type: 'select', showInTable: true, defaultValue: 'active', group: 'identity',\n options: [\n { value: 'active', label: tl('Active', 'Ativo') },\n { value: 'maintenance', label: tl('In maintenance', 'Em manutenção') },\n { value: 'inactive', label: tl('Retired', 'Inativo') },\n ],\n },\n // A SALA onde ele está. Aponta para o cadastro de Locais.\n { key: 'serviceLocationId', label: tl('Location', 'Local'), type: 'relation', showInTable: true, group: 'identity',\n relation: { table: 'v_units', labelField: 'name' } },\n { key: 'purchaseDate', label: tl('Purchase date', 'Data de compra'), type: 'date', showInTable: false, group: 'purchase' },\n { key: 'purchaseValue', label: tl('Purchase value', 'Valor de compra'), type: 'currency', showInTable: false, group: 'purchase' },\n { key: 'warrantyExpiration', label: tl('Warranty ends', 'Vencimento da garantia'), type: 'date', showInTable: false, group: 'purchase' },\n { key: 'lastMaintenanceDate', label: tl('Last maintenance', 'Última manutenção'), type: 'date', showInTable: false, group: 'maintenance' },\n // A COLUNA que justifica a lista: quem abre «Equipamentos» está quase\n // sempre perguntando o que vence agora.\n { key: 'nextMaintenanceDate', label: tl('Next maintenance', 'Próxima manutenção'), type: 'date', showInTable: true, group: 'maintenance' },\n { key: 'maintenanceNotes', label: tl('Maintenance notes', 'Notas de manutenção'), type: 'textarea', showInTable: false, group: 'maintenance', span: 2 },\n { key: 'description', label: tl('Description', 'Descrição'), type: 'textarea', showInTable: false, group: 'identity', span: 2 },\n ...recordRailFields({ tagsTable: 'products', activeLabel: tl('Active', 'Ativo') }),\n ],\n data: {\n table: 'products',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'asset' },\n defaults: { kind: 'asset' },\n searchColumns: ['name', 'sku'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Origins — category archetype, direct query\n// ---------------------------------------------------------------------------\nexport const originEntity: EntityDef = {\n name: tl('Origin', 'Origem'),\n namePlural: tl('Origins', 'Origens'),\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n { id: 'identity', label: tl('Identification', 'Identificação'), columns: 1 },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity' },\n // «SOLICITAR PESSOA» é uma regra que vale do OUTRO lado: ligada, escolher\n // esta origem no cadastro de cliente passa a exigir quem indicou. Sem ela,\n // «indicação de amigo» vira uma estatística sem nome nenhum atrás.\n {\n key: 'requiresPerson', label: tl('Ask who referred', 'Solicitar pessoa'), type: 'boolean',\n showInTable: true, defaultValue: false, group: 'identity',\n hint: tl(\n 'Choosing this origin on a client will require naming who referred them.',\n 'Escolher esta origem num cliente passa a exigir dizer quem indicou.',\n ),\n },\n // A DESCRIÇÃO da origem é a observação: `categories` não tem coluna\n // separada, e duas colunas para uma frase é invenção. Ela vai para a\n // lista porque é o que distingue «Indicação» de «Indicação de parceiro».\n ...recordRailFields({ tagsTable: 'categories', activeLabel: tl('Active', 'Ativo'), unit: false, notesInTable: true }),\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'origin' },\n defaults: { kind: 'origin' },\n customFields: ['requiresPerson'],\n searchColumns: ['name'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Teams — category archetype, direct query\n// ---------------------------------------------------------------------------\n// O agrupamento da EQUIPE, irmão da categoria de serviço: mesma tabela, mesma\n// forma, outra espécie (`staff_team`, declarada pela 139 do espinha). Quem é\n// de qual equipe é escolha da ficha — ver `teamId` em `staffEntity`.\n//\n// Não confundir com `v_team_members`, que apesar do nome são os MEMBROS DO\n// TENANT (quem entra no sistema). Aqui é a ficha: a casa tem recepção e\n// estética antes de ter dois logins.\nexport const teamEntity: EntityDef = {\n name: tl('Team', 'Equipe'),\n namePlural: tl('Teams', 'Equipes'),\n icon: 'Users',\n displayField: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [{ ...RECORD_GROUP }],\n defaultSort: 'sortOrder',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n // A cor é o que faz a equipe se reconhecer de relance na grade da semana e\n // no quadro — é o mesmo papel que ela tem na etiqueta.\n { key: 'color', label: tl('Colour', 'Cor'), type: 'color', showInTable: true },\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', showInTable: true, defaultValue: 0 },\n ...recordRailFields({ tagsTable: 'categories', activeLabel: tl('Active', 'Ativo'), unit: false }),\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'staff_team' },\n defaults: { kind: 'staff_team' },\n searchColumns: ['name'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Service Categories — category archetype, direct query\n// ---------------------------------------------------------------------------\nexport const serviceCategoryEntity: EntityDef = {\n name: tl('Service Category', 'Categoria de Serviço'),\n namePlural: tl('Service Categories', 'Categorias de Serviço'),\n icon: 'Tag',\n displayField: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [{ ...RECORD_GROUP }],\n defaultSort: 'sortOrder',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', showInTable: true, defaultValue: 0 },\n ...recordRailFields({ tagsTable: 'categories', activeLabel: tl('Active', 'Ativo'), unit: false }),\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'service_category' },\n defaults: { kind: 'service_category' },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Service Locations — location archetype, direct query\n// ---------------------------------------------------------------------------\n// ---------------------------------------------------------------------------\n// Locais — a SALA, cadeira ou box onde se atende, DENTRO de uma unidade.\n//\n// Isto é o «Local Operacional» do V1, e é o que esta tela sempre deveria ter\n// sido. Ela apontava para `v_units` — a FILIAL —, que já tem a própria tela em\n// Configurações → Unidades: duas telas para o prédio, nenhuma para a sala.\n//\n// A diferença importa porque uma sala não é uma unidade em miniatura: ela não\n// tem caixa, não tem estoque e não recorta permissão. O que ela tem é LOTAÇÃO,\n// e é por isso que ela existe — ver a migration 153.\n// ---------------------------------------------------------------------------\nexport const serviceLocationEntity: EntityDef = {\n name: tl('Location', 'Local'),\n namePlural: tl('Locations', 'Locais'),\n icon: 'MapPin',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n {\n id: 'identity', label: tl('The location', 'O local'), columns: 2,\n description: tl(\n 'Where you attend, inside a unit. Not a unit: no till, no stock, no permission of its own.',\n 'Onde se atende, dentro de uma unidade. Não é unidade: não tem caixa, não tem estoque e não recorta permissão.',\n ),\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity' },\n { key: 'code', label: tl('Code', 'Código'), type: 'text', showInTable: true, searchable: true, group: 'identity' },\n {\n key: 'groupId', label: tl('Group', 'Grupo'), type: 'relation', showInTable: true, group: 'identity',\n relation: { table: 'categories', labelField: 'name', filter: { kind: 'location_group' } },\n },\n // A LOTAÇÃO é o que impede a agenda de marcar cinco pessoas às 14h onde\n // cabem quatro. Sem ela o local é só um rótulo.\n {\n key: 'capacity', label: tl('Capacity', 'Máximo de clientes simultâneos'), type: 'number',\n min: 1, defaultValue: 1, showInTable: true, group: 'identity',\n hint: tl('One chair is 1. A tanning room with four beds is 4.', 'Uma cadeira é 1. Uma sala de bronzeamento com quatro macas é 4.'),\n },\n // A unidade vem do RAIL, com todos os outros «de quem é este registro» —\n // e obrigatória, porque um local sem prédio não existe.\n ...recordRailFields({ tagsTable: 'rooms', activeLabel: tl('Active', 'Ativo'), unitRequired: true }),\n ],\n data: {\n table: 'rooms',\n schema: 'public',\n tenantScoped: true,\n searchColumns: ['name', 'code'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Location Groups — category archetype, direct query\n// ---------------------------------------------------------------------------\nexport const locationGroupEntity: EntityDef = {\n name: tl('Location Group', 'Grupo de Locais'),\n namePlural: tl('Location Groups', 'Grupos de Locais'),\n icon: 'Map',\n displayField: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [{ ...RECORD_GROUP }],\n defaultSort: 'sortOrder',\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true },\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', showInTable: true, defaultValue: 0 },\n ...recordRailFields({ tagsTable: 'categories', activeLabel: tl('Active', 'Ativo'), unit: false }),\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'location_group' },\n defaults: { kind: 'location_group' },\n searchColumns: ['name'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Services — service archetype, direct query on public.services\n// ---------------------------------------------------------------------------\nexport const serviceEntity: EntityDef = {\n name: tl('Service', 'Serviço'),\n namePlural: tl('Services', 'Serviços'),\n icon: 'Briefcase',\n layout: 'service',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n { id: 'identity', label: tl('Identification', 'Identificação'), columns: 2 },\n { id: 'pricing', label: tl('Price and time', 'Preço e tempo'), columns: 2 },\n {\n id: 'texts', label: tl('What the client reads', 'O que o cliente lê'), columns: 1,\n description: tl(\n 'Written once here, sent every time the service is booked or finished.',\n 'Escrito uma vez aqui, enviado toda vez que o serviço é marcado ou concluído.',\n ),\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Service name', 'Nome do serviço'), type: 'text', required: true, searchable: true, showInTable: true, group: 'identity', span: 2 },\n // O CÓDIGO INTERNO é como a casa chama o serviço na comanda e no relatório\n // — e é por ele que se procura quando o nome tem três variações.\n { key: 'internalCode', label: tl('Internal code', 'Código interno'), type: 'text', showInTable: true, searchable: true, group: 'identity' },\n { key: 'categoryId', label: tl('Category', 'Categoria'), type: 'relation', showInTable: true, group: 'identity',\n relation: { table: 'categories', labelField: 'name', filter: { kind: 'service_category' } } },\n // A COR identifica o serviço na grade da agenda, onde não cabe o nome.\n { key: 'color', label: tl('Colour', 'Cor de identificação'), type: 'color', showInTable: false, group: 'identity' },\n { key: 'description', label: tl('Description', 'Descrição'), type: 'textarea', showInTable: false, group: 'identity', span: 2 },\n\n { key: 'price', label: tl('Price', 'Preço'), type: 'currency', required: true, showInTable: true, group: 'pricing' },\n { key: 'durationMinutes', label: tl('Duration (min)', 'Duração (min)'), type: 'number', required: true, showInTable: true, group: 'pricing' },\n // VALIDADE em dias: quanto tempo o cliente tem para executar o que\n // comprou. É o que faz um pacote expirar, e sem ela ele nunca expira.\n { key: 'validityDays', label: tl('Validity (days)', 'Validade (dias)'), type: 'number', showInTable: false, group: 'pricing' },\n {\n key: 'isBookable', label: tl('Appears in the calendar', 'Aparece na agenda'), type: 'boolean',\n showInTable: true, defaultValue: true, group: 'pricing',\n hint: tl(\n 'Can be picked when booking an appointment. Turn off for what is sold in a package and never booked on its own.',\n 'Pode ser escolhido ao marcar um horário. Desligue para o que é vendido em pacote e nunca se marca sozinho.',\n ),\n },\n\n { key: 'schedulingAlertText', label: tl('Booking alert', 'Alertas para agendamento'), type: 'textarea', showInTable: false, group: 'texts' },\n { key: 'reminderText', label: tl('Reminder text', 'Texto do lembrete'), type: 'textarea', showInTable: false, group: 'texts' },\n { key: 'contractText', label: tl('Contract text', 'Texto para contrato'), type: 'textarea', showInTable: false, group: 'texts' },\n { key: 'postServiceText', label: tl('After-service text', 'Texto de pós-atendimento'), type: 'textarea', showInTable: false, group: 'texts' },\n\n ...recordRailFields({ tagsTable: 'services', activeLabel: tl('Active', 'Ativo') }),\n ],\n // Services are their own Ring-0 archetype table (public.services), not a\n // kind of product. Direct query by table+schema (no kind filter).\n data: {\n table: 'services',\n schema: 'public',\n tenantScoped: true,\n searchColumns: ['name'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Profissões — categoria, o `professions` do V1\n// ---------------------------------------------------------------------------\nexport const professionEntity: EntityDef = {\n name: tl('Profession', 'Profissão'),\n namePlural: tl('Professions', 'Profissões'),\n icon: 'BriefcaseBusiness',\n displayField: 'name',\n defaultSort: 'sortOrder',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n {\n id: 'identity', label: tl('Identification', 'Identificação'), columns: 2,\n description: tl(\n 'The list the house keeps, so a rota does not depend on how someone typed it.',\n 'A lista que a casa mantém, para a escala não depender de como alguém digitou.',\n ),\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', showInTable: true, defaultValue: 0, group: 'identity' },\n ...recordRailFields({ tagsTable: 'categories', activeLabel: tl('Active', 'Ativo'), unit: false, notesInTable: true }),\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'profession' },\n defaults: { kind: 'profession' },\n searchColumns: ['name'],\n },\n}\n\n// ---------------------------------------------------------------------------\n// Espécies de pet — categoria, o `pet_species` do V1\n// ---------------------------------------------------------------------------\nexport const petSpeciesEntity: EntityDef = {\n name: tl('Species', 'Espécie'),\n namePlural: tl('Animal species', 'Tipos de animais'),\n icon: 'PawPrint',\n displayField: 'name',\n defaultSort: 'sortOrder',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n { id: 'identity', label: tl('Identification', 'Identificação'), columns: 2 },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', span: 2 },\n // A ORDEM existe porque a espécie mais atendida tem de estar em cima: um\n // hotel para aves não quer «cachorro» na primeira posição.\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', showInTable: true, defaultValue: 0, group: 'identity' },\n ...recordRailFields({ tagsTable: 'categories', activeLabel: tl('Active', 'Ativo'), unit: false }),\n ],\n data: {\n table: 'categories',\n schema: 'public',\n tenantScoped: true,\n filters: { kind: 'pet_species' },\n defaults: { kind: 'pet_species' },\n searchColumns: ['name'],\n },\n}\n\n\n// ---------------------------------------------------------------------------\n// Pacotes de serviço — o conjunto vendido junto\n// ---------------------------------------------------------------------------\n//\n// As tabelas (`service_packages`, `service_package_items`) vieram inteiras do\n// porte do V1 e nunca tiveram tela: o pacote existia no banco de toda conta\n// migrada e não havia por onde abri-lo. Isto é a porta.\n//\n// O ITEM é uma lista relacionada, não uma aba inventada: `package_id` já diz\n// a relação, e `RelatedList` monta dela a mesma tela de CRUD que o item teria\n// sozinho, filtrada pelo pacote de onde foi aberta.\n// ---------------------------------------------------------------------------\n\nconst servicePackageItemEntity: EntityDef = {\n name: tl('Item', 'Item'),\n namePlural: tl('Items', 'Serviços do pacote'),\n icon: 'ListChecks',\n displayField: 'productId',\n defaultSort: 'sortOrder',\n fields: [\n {\n key: 'productId', label: tl('Service', 'Serviço'), type: 'relation', required: true, showInTable: true,\n relation: { table: 'services', labelField: 'name' },\n },\n // QUANTAS VEZES este serviço entra no pacote. «10 sessões de drenagem» é\n // uma linha com quantidade 10, não dez linhas.\n { key: 'quantity', label: tl('Quantity', 'Quantidade'), type: 'number', min: 1, defaultValue: 1, showInTable: true },\n { key: 'sortOrder', label: tl('Order', 'Ordem'), type: 'number', defaultValue: 0, showInTable: true },\n ],\n data: { table: 'service_package_items', schema: 'public', tenantScoped: true },\n}\n\nexport const servicePackageEntity: EntityDef = {\n name: tl('Package', 'Pacote'),\n namePlural: tl('Service packages', 'Pacotes de serviço'),\n icon: 'PackageCheck',\n displayField: 'name',\n defaultSort: 'name',\n formColumns: 2,\n facets: [ACTIVE_FACET],\n fieldGroups: [\n { id: 'identity', label: tl('Identification', 'Identificação'), columns: 1 },\n {\n id: 'pricing', label: tl('Price and validity', 'Preço e validade'), columns: 2,\n description: tl(\n 'What the client pays once, and until when they can use it.',\n 'O que o cliente paga de uma vez, e até quando pode usar.',\n ),\n },\n { ...RECORD_GROUP },\n ],\n fields: [\n { key: 'name', label: tl('Name', 'Nome'), type: 'text', required: true, showInTable: true, searchable: true, group: 'identity' },\n { key: 'description', label: tl('Description', 'Descrição'), type: 'textarea', showInTable: false, group: 'identity' },\n { key: 'price', label: tl('Price', 'Preço'), type: 'currency', required: true, showInTable: true, group: 'pricing' },\n // O TOTAL DE SESSÕES é o que o cliente comprou; os itens dizem de QUÊ.\n // Os dois existem porque um pacote pode vender «10 sessões» escolhendo o\n // serviço na hora, e outro pode listar exatamente o que entra.\n { key: 'sessionsTotal', label: tl('Sessions', 'Total de sessões'), type: 'number', min: 1, showInTable: true, group: 'pricing' },\n // SEM VALIDADE o pacote nunca expira, e o saldo de sessões vira uma dívida\n // sem prazo — é este número que faz o pacote vencer.\n {\n key: 'validityDays', label: tl('Validity (days)', 'Validade (dias)'), type: 'number', showInTable: true, group: 'pricing',\n hint: tl('Empty means it never expires.', 'Vazio significa que nunca vence.'),\n },\n ...recordRailFields({ tagsTable: 'service_packages', activeLabel: tl('Active', 'Ativo') }),\n ],\n relatedLists: [\n { entity: servicePackageItemEntity, foreignKey: 'packageId', icon: 'ListChecks' },\n ],\n data: {\n table: 'service_packages',\n schema: 'public',\n tenantScoped: true,\n searchColumns: ['name'],\n },\n}\n","import type { PluginManifest, PluginScope, VerticalId, EntityDef } from '@fayz-ai/core'\nimport { Briefcase, Map, MapPin, Tag, UserCog, Users } from 'lucide-react'\nimport { adminNavigateTo, createCrudPage, type CrudNavTab } from '@fayz-ai/admin'\n\nimport {\n staffEntity, supplierEntity, contactEntity, partnershipEntity, equipmentEntity,\n originEntity, serviceCategoryEntity, serviceLocationEntity, locationGroupEntity,\n professionEntity, petSpeciesEntity, servicePackageEntity,\n serviceEntity, teamEntity,\n} from './lib/entities'\n\n// ---------------------------------------------------------------------------\n// plugin-registry — os Cadastros.\n// ---------------------------------------------------------------------------\n// ── O buraco que ele fecha ─────────────────────────────────────────────────\n// O aplicativo central carrega o ofício de quem entra, e para o Espaço Facial\n// ele carregava tudo MENOS os Cadastros: a rubrica não desenhava porque as dez\n// telas dela não existiam ali. Elas estavam escritas dentro do beauty-saas, em\n// `src/config/pages.tsx` — um aplicativo só, e portanto uma conta só.\n//\n// Era o mesmo defeito que o preset resolveu para a ORDEM e a 118 para o NOME,\n// um degrau abaixo: não adianta o ofício saber agrupar e nomear se ninguém\n// serve a tela. Quem serve tela é plugin.\n//\n// ── Por que um plugin, e não mais uma pasta no aplicativo ──────────────────\n// Nenhuma destas fichas é de salão. Fornecedor, contato, equipamento, origem e\n// filial são o que QUALQUER casa cadastra; o restaurante compra de fornecedor\n// e a escola registra origem de matrícula. O que muda por ofício é o nome da\n// linha no menu — \"Funcionários\" no BeautySoft, \"Equipe\" no resto — e disso\n// cuida o `labels` do preset, no banco.\n//\n// ── O ofício liga o que usa ────────────────────────────────────────────────\n// `modules` desliga tela a tela: uma loja sem atendimento não quer Serviços\n// nem Categorias de Serviço, e uma rubrica cujos filhos saíram todos não\n// desenha. É o mesmo contrato dos outros plugins — oferecer, não impor.\n// ---------------------------------------------------------------------------\n\n/** Cada tela de cadastro, na ORDEM em que o menu as lê por padrão. */\nconst SCREENS = [\n { id: 'services', path: '/registry/services', entity: serviceEntity, icon: 'Briefcase', feature: 'services' },\n { id: 'serviceCategories', path: '/registry/categories', entity: serviceCategoryEntity, icon: 'Tag', feature: 'services', nested: true },\n // O pacote é catálogo como o serviço — aninhado nele, porque é um jeito de\n // vender serviço e não um assunto novo no menu.\n { id: 'servicePackages', path: '/registry/service-packages', entity: servicePackageEntity, icon: 'PackageCheck', feature: 'services', nested: true },\n { id: 'locations', path: '/registry/locations', entity: serviceLocationEntity, icon: 'MapPin', feature: 'services' },\n // A SALA, aninhada na unidade: ela é onde se atende dentro do prédio, e uma\n // linha solta no menu ao lado de «Unidades» repetiria a confusão que a 153\n // acabou de desfazer.\n { id: 'locationGroups', path: '/registry/location-groups', entity: locationGroupEntity, icon: 'Map', feature: 'services', nested: true },\n { id: 'staff', path: '/registry/staff', entity: staffEntity, icon: 'UserCog' },\n { id: 'teams', path: '/registry/teams', entity: teamEntity, icon: 'Users', nested: true },\n // Aninhada em Profissionais: a profissão é o vocabulário DELES, e uma linha\n // solta no menu para uma lista de cinco palavras custa mais do que vale.\n { id: 'professions', path: '/registry/professions', entity: professionEntity, icon: 'BriefcaseBusiness', nested: true },\n { id: 'contacts', path: '/registry/contacts', entity: contactEntity, icon: 'Contact' },\n { id: 'suppliers', path: '/registry/suppliers', entity: supplierEntity, icon: 'Building2' },\n { id: 'partnerships', path: '/registry/partnerships', entity: partnershipEntity, icon: 'Handshake' },\n { id: 'equipment', path: '/registry/equipment', entity: equipmentEntity, icon: 'Wrench' },\n { id: 'origins', path: '/registry/origins', entity: originEntity, icon: 'Globe' },\n // Só faz sentido em casa que atende pet — ver OPT_IN.\n { id: 'petSpecies', path: '/registry/pet-species', entity: petSpeciesEntity, icon: 'PawPrint', feature: 'pets' },\n] as const\n\nexport type RegistryScreenId = (typeof SCREENS)[number]['id']\n\n// ---------------------------------------------------------------------------\n// AS TELAS QUE NASCEM DESLIGADAS.\n//\n// A regra do `modules` é «ausente = tem», e ela está certa para o cadastro que\n// qualquer casa reconhece: publicar uma ficha nova não pode ser o dia em que\n// ela some de toda conta que não a listou.\n//\n// Só que \"Tipos de animais\" não é uma ficha que qualquer casa reconhece — é o\n// vocabulário de UM ofício. Nascendo ligada, ela apareceu em Cadastros do\n// restaurante, do salão, da clínica, da escola e da bilheteria, e em nenhuma\n// delas alguém vai cadastrar «cachorro». O padrão certo para a tela de um\n// ofício é o contrário: quem a quer, pede.\n//\n// `modules: { petSpecies: true }` liga — é o que o ofício de pet passa, do\n// mesmo jeito que hoje uma loja passa `services: false`.\n// ---------------------------------------------------------------------------\nconst OPT_IN = new Set<RegistryScreenId>(['petSpecies'])\n\nconst serviceTabs = (): CrudNavTab[] => [\n { id: 'services', label: serviceEntity.namePlural ?? serviceEntity.name, icon: Briefcase, onSelect: () => adminNavigateTo('/registry/services') },\n { id: 'serviceCategories', label: serviceCategoryEntity.namePlural ?? serviceCategoryEntity.name, icon: Tag, onSelect: () => adminNavigateTo('/registry/categories') },\n]\n\nconst staffTabs = (): CrudNavTab[] => [\n { id: 'staff', label: staffEntity.namePlural ?? staffEntity.name, icon: UserCog, onSelect: () => adminNavigateTo('/registry/staff') },\n { id: 'teams', label: teamEntity.namePlural ?? teamEntity.name, icon: Users, onSelect: () => adminNavigateTo('/registry/teams') },\n]\n\nconst locationTabs = (): CrudNavTab[] => [\n { id: 'locations', label: serviceLocationEntity.namePlural ?? serviceLocationEntity.name, icon: MapPin, onSelect: () => adminNavigateTo('/registry/locations') },\n { id: 'locationGroups', label: locationGroupEntity.namePlural ?? locationGroupEntity.name, icon: Map, onSelect: () => adminNavigateTo('/registry/location-groups') },\n]\n\nexport interface RegistryPluginOptions {\n scope?: PluginScope\n verticalId?: VerticalId\n /** Onde a primeira linha cai no rail. As demais vêm em degraus de 0,1. */\n navPosition?: number\n navSection?: 'main' | 'secondary' | 'settings'\n /**\n * Quais telas esta casa tem. Ausente = todas, menos as de ofício.\n *\n * `false` é a única forma de negar: uma chave que ninguém respondeu cai no\n * padrão, não em \"não\" — do contrário, publicar uma ficha nova seria o dia\n * em que ela some de toda conta que não a listou.\n *\n * A exceção é a tela que só um ofício reconhece (ver `OPT_IN`): essa nasce\n * desligada, e `true` é o que a liga.\n */\n modules?: Partial<Record<RegistryScreenId, boolean>>\n /**\n * Troca a definição de uma ficha sem trocar a tela.\n *\n * A casa que precisa de um campo a mais no fornecedor passa o EntityDef dela\n * aqui em vez de reimplementar a rota — que foi exatamente como as dez\n * acabaram dentro de um aplicativo.\n */\n entities?: Partial<Record<RegistryScreenId, EntityDef>>\n}\n\nexport function createRegistryPlugin(options?: RegistryPluginOptions): PluginManifest {\n const section = options?.navSection ?? 'main'\n const base = options?.navPosition ?? 80\n\n const active = SCREENS.filter((screen) => (\n OPT_IN.has(screen.id)\n ? options?.modules?.[screen.id] === true\n : options?.modules?.[screen.id] !== false\n ))\n\n const pages = active.map((screen, index) => {\n const entity = options?.entities?.[screen.id] ?? (screen.entity as EntityDef)\n const feature = (screen as { feature?: string }).feature\n const grouped = screen.id === 'services' || screen.id === 'serviceCategories'\n ? { navTabs: serviceTabs, activeNavTab: screen.id }\n : screen.id === 'locations' || screen.id === 'locationGroups'\n ? { navTabs: locationTabs, activeNavTab: screen.id }\n : screen.id === 'staff' || screen.id === 'teams'\n ? { navTabs: staffTabs, activeNavTab: screen.id }\n : {}\n return {\n screen,\n entity,\n position: base + index * 0.1,\n component: createCrudPage(entity, { ...(feature ? { feature } : {}), ...grouped }),\n permission: feature ? { feature, action: 'read' as const } : undefined,\n }\n })\n\n return {\n id: 'registry',\n name: 'Cadastros',\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'universal',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: [],\n\n // Uma linha por ficha, plana. Quem as junta sob \"Cadastros\" — e em que\n // ordem, e com que nome — é o `rail` do ofício. Ver packages/admin\n // rail-preset.ts: o ofício AGRUPA, o plugin NOMEIA, e o `labels` do preset\n // é a casa dizendo que ali a ficha se chama outra coisa.\n navigation: pages.filter((page) => !('nested' in page.screen && page.screen.nested)).map((page) => ({\n section,\n position: page.position,\n label: page.entity.namePlural ?? page.entity.name,\n route: page.screen.path,\n icon: page.screen.icon,\n ...(page.permission ? { permission: page.permission } : {}),\n })),\n\n routes: pages.map((page) => ({\n path: page.screen.path,\n component: page.component as React.ComponentType<unknown>,\n title: page.entity.namePlural ?? page.entity.name,\n ...(page.permission ? { permission: page.permission } : {}),\n })),\n }\n}\n\nexport {\n staffEntity, supplierEntity, contactEntity, partnershipEntity, equipmentEntity,\n originEntity, serviceCategoryEntity, serviceLocationEntity, locationGroupEntity,\n professionEntity, petSpeciesEntity, servicePackageEntity,\n serviceEntity, teamEntity,\n} from './lib/entities'\n"]}
@@ -5,8 +5,12 @@ export declare const contactEntity: EntityDef;
5
5
  export declare const partnershipEntity: EntityDef;
6
6
  export declare const equipmentEntity: EntityDef;
7
7
  export declare const originEntity: EntityDef;
8
+ export declare const teamEntity: EntityDef;
8
9
  export declare const serviceCategoryEntity: EntityDef;
9
10
  export declare const serviceLocationEntity: EntityDef;
10
11
  export declare const locationGroupEntity: EntityDef;
11
12
  export declare const serviceEntity: EntityDef;
13
+ export declare const professionEntity: EntityDef;
14
+ export declare const petSpeciesEntity: EntityDef;
15
+ export declare const servicePackageEntity: EntityDef;
12
16
  //# sourceMappingURL=entities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/lib/entities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAsB9C,eAAO,MAAM,WAAW,EAAE,SAiDzB,CAAA;AAKD,eAAO,MAAM,cAAc,EAAE,SA0C5B,CAAA;AAKD,eAAO,MAAM,aAAa,EAAE,SAwB3B,CAAA;AAKD,eAAO,MAAM,iBAAiB,EAAE,SAqB/B,CAAA;AAKD,eAAO,MAAM,eAAe,EAAE,SAoB7B,CAAA;AAKD,eAAO,MAAM,YAAY,EAAE,SAiB1B,CAAA;AAKD,eAAO,MAAM,qBAAqB,EAAE,SAkBnC,CAAA;AAKD,eAAO,MAAM,qBAAqB,EAAE,SA+BnC,CAAA;AAKD,eAAO,MAAM,mBAAmB,EAAE,SAmBjC,CAAA;AAKD,eAAO,MAAM,aAAa,EAAE,SAiC3B,CAAA"}
1
+ {"version":3,"file":"entities.d.ts","sourceRoot":"","sources":["../../src/lib/entities.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAsB9C,eAAO,MAAM,WAAW,EAAE,SAqGzB,CAAA;AAKD,eAAO,MAAM,cAAc,EAAE,SAuD5B,CAAA;AAKD,eAAO,MAAM,aAAa,EAAE,SAgC3B,CAAA;AAKD,eAAO,MAAM,iBAAiB,EAAE,SA4C/B,CAAA;AAKD,eAAO,MAAM,eAAe,EAAE,SA0D7B,CAAA;AAKD,eAAO,MAAM,YAAY,EAAE,SAuC1B,CAAA;AAYD,eAAO,MAAM,UAAU,EAAE,SAyBxB,CAAA;AAKD,eAAO,MAAM,qBAAqB,EAAE,SAqBnC,CAAA;AAgBD,eAAO,MAAM,qBAAqB,EAAE,SA0CnC,CAAA;AAKD,eAAO,MAAM,mBAAmB,EAAE,SAsBjC,CAAA;AAKD,eAAO,MAAM,aAAa,EAAE,SA6D3B,CAAA;AAKD,eAAO,MAAM,gBAAgB,EAAE,SA+B9B,CAAA;AAKD,eAAO,MAAM,gBAAgB,EAAE,SA2B9B,CAAA;AAmCD,eAAO,MAAM,oBAAoB,EAAE,SA4ClC,CAAA"}
@@ -0,0 +1,61 @@
1
+ import type { FieldDef, FieldGroup } from '@fayz-ai/core';
2
+ export declare const PERSON_GROUPS: FieldGroup[];
3
+ /** A lista abre em «Ativos», como toda lista de cadastro do V1. */
4
+ export declare const ACTIVE_FACET: {
5
+ field: string;
6
+ allLabel: string;
7
+ defaultValue: string;
8
+ options: {
9
+ value: string;
10
+ label: string;
11
+ }[];
12
+ };
13
+ /**
14
+ * Os canais de contato.
15
+ *
16
+ * Telefone e CELULAR são dois campos, e é o celular que leva o WhatsApp — a
17
+ * régua de comunicação procura este, não o fixo.
18
+ *
19
+ * O V1 tem um SEGUNDO de cada (telefone 2, celular 2, e-mail 2), e eles estão
20
+ * desligados: seis caixas de contato num cadastro cuja resposta costuma ser um
21
+ * número e um e-mail são cinco perguntas a mais para a recepção rolar. As
22
+ * chaves continuam declaradas em `customFields` de propósito — quem já tem o
23
+ * segundo telefone gravado não o perde, e religar é descomentar três linhas.
24
+ */
25
+ export declare function contactChannelFields(): FieldDef[];
26
+ /**
27
+ * Endereço e conta, os dois campos que são UMA LINHA DE OUTRA TABELA
28
+ * (`public.addresses` e `public.payee_accounts`).
29
+ *
30
+ * `showInDetail: false` nos dois: a ficha tem as seções completas logo abaixo,
31
+ * que listam TODAS as linhas, editam e excluem. O campo existe para o momento
32
+ * em que a seção não pode existir — a criação, quando ainda não há id.
33
+ */
34
+ export declare function attachedFields(): FieldDef[];
35
+ /**
36
+ * O rail direito, IGUAL em todo cadastro.
37
+ *
38
+ * A ordem é fixa de propósito: quem procura o interruptor «Ativo» não pode
39
+ * ter de caçá-lo numa altura diferente a cada tela. Unidade e o interruptor
40
+ * dividem a primeira linha — a unidade responde «de quem é» e o interruptor
41
+ * «vale ou não», que é o par que se lê junto —, e embaixo vêm as duas coisas
42
+ * que se ESCREVE sobre o registro: o texto solto e as etiquetas.
43
+ *
44
+ * As etiquetas são o recorte que a casa inventa e o produto não prevê
45
+ * («cliente VIP», «fornecedor homologado»). Sem elas isso vai para
46
+ * Observações, onde não filtra e não conta.
47
+ */
48
+ export declare function recordFields(table?: string, options?: {
49
+ unit?: boolean;
50
+ }): FieldDef[];
51
+ /** O sexo, que no V1 é pergunta de contato e de cliente. */
52
+ export declare function genderField(): FieldDef;
53
+ /**
54
+ * As chaves que não são coluna de `people` e moram em `custom_fields`.
55
+ *
56
+ * `phone2`, `mobile2` e `email2` continuam aqui mesmo com os campos
57
+ * desligados: é isto que faz o segundo telefone JÁ GRAVADO continuar sendo
58
+ * lido, em vez de virar lixo no jsonb no dia em que o campo voltar.
59
+ */
60
+ export declare const PERSON_CUSTOM_FIELDS: string[];
61
+ //# sourceMappingURL=person-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"person-fields.d.ts","sourceRoot":"","sources":["../../src/lib/person-fields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAezD,eAAO,MAAM,aAAa,EAAE,UAAU,EAcrC,CAAA;AAED,mEAAmE;AACnE,eAAO,MAAM,YAAY;;;;;;;;CAIvB,CAAA;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,IAAI,QAAQ,EAAE,CAUjD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,QAAQ,EAAE,CAK3C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,SAAW,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,QAAQ,EAAE,CAU3F;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,IAAI,QAAQ,CAStC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,UAAsD,CAAA"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "status": "beta",
5
5
  "dependencies": []
6
6
  },
7
- "version": "0.12.1",
7
+ "version": "0.14.0",
8
8
  "description": "Fayz SDK — os Cadastros: as telas de referência que todo ofício tem",
9
9
  "type": "module",
10
10
  "sideEffects": false,
@@ -27,8 +27,8 @@
27
27
  "lucide-react": ">=0.400.0 <1.0.0"
28
28
  },
29
29
  "dependencies": {
30
- "@fayz-ai/core": "^0.31.0",
31
- "@fayz-ai/admin": "^0.31.0"
30
+ "@fayz-ai/core": "^0.33.0",
31
+ "@fayz-ai/admin": "^0.33.0"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/react": "^18.3.0",