evo360-types 1.3.600 → 1.3.604

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.
@@ -42,12 +42,34 @@ export type NexFinopsProposalLoyaltyPeriod = 'none' | '3m' | '6m' | '1y' | '2y';
42
42
 
43
43
  // ── Prefill do cliente ──
44
44
 
45
- /** Dados que o vendedor já conhece e a página pública usa para pré-preencher. */
45
+ /**
46
+ * Dados que o vendedor já conhece e a página pública usa para pré-preencher.
47
+ * Os nomes seguem `INexVendasJourneyCustomerData`/`INexVendasJourneyCompany` da
48
+ * jornada, exceto `company`, que é a razão social (lá, `legal_name`).
49
+ *
50
+ * Com `customer_id` na proposta, o backend grava aqui um SNAPSHOT do cadastro do
51
+ * cliente a cada create/update (o que o vendedor enviar é sobrescrito); sem
52
+ * `customer_id`, vale o que o vendedor digitou. `document_number` e
53
+ * `responsible_cpf` são gravados só com dígitos.
54
+ */
46
55
  export interface INexFinopsProposalPrefill {
47
56
  name?: string | null;
48
57
  email?: string | null;
49
58
  phone?: string | null;
59
+ /** Razão social. */
50
60
  company?: string | null;
61
+ trade_name?: string | null;
62
+ document_type?: 'cpf' | 'cnpj' | null;
63
+ document_number?: string | null;
64
+ /** CPF de quem assina. No cadastro PF coincide com `document_number`. */
65
+ responsible_cpf?: string | null;
66
+ zip?: string | null;
67
+ street?: string | null;
68
+ number?: string | null;
69
+ complement?: string | null;
70
+ district?: string | null;
71
+ city?: string | null;
72
+ state?: string | null;
51
73
  }
52
74
 
53
75
  // ── Documento principal ──
@@ -127,13 +149,19 @@ export interface INexFinopsProposalPublic {
127
149
  */
128
150
  loyalty_period_label?: string | null;
129
151
  /**
130
- * Dados de contato que o vendedor cadastrou, por inteiro, para a página
131
- * pública pré-preencher o formulário. `null` quando a proposta não tem prefill;
132
- * cada campo é `null` quando ausente. Nunca documento (CPF/CNPJ).
152
+ * Dados que o vendedor cadastrou, por inteiro, para a página pública
153
+ * pré-preencher o formulário. `null` quando a proposta não tem prefill; cada
154
+ * campo é `null` quando ausente.
133
155
  *
134
156
  * Decisão do usuário (2026-09-23): a proposta existe para o cliente não
135
157
  * precisar preencher. Quem tem o link vê o contato do lead — risco aceito.
136
158
  * Supera, neste ponto, a projeção só-nome da feat-128.
159
+ *
160
+ * Documento INCLUÍDO desde a feat-194 (2026-09-24), revogando o "nunca
161
+ * documento" da fix-150: CNPJ, CPF do titular PF e CPF do responsável saem
162
+ * para quem tem o link, porque pré-preencher CPF/CNPJ só funciona se o
163
+ * endpoint público os entregar. Risco LGPD (CPF é dado pessoal) registrado;
164
+ * restringir a CNPJ depois muda só a projeção, não o contrato.
137
165
  */
138
166
  prefill: INexFinopsProposalPublicPrefill | null;
139
167
  /**
@@ -143,11 +171,26 @@ export interface INexFinopsProposalPublic {
143
171
  prefill_masked: { name: string | null };
144
172
  }
145
173
 
174
+ /** Mesmos campos de `INexFinopsProposalPrefill`, cada um `null` quando ausente. */
146
175
  export interface INexFinopsProposalPublicPrefill {
147
176
  name: string | null;
148
177
  email: string | null;
149
178
  phone: string | null;
179
+ /** Razão social. */
150
180
  company: string | null;
181
+ trade_name: string | null;
182
+ document_type: 'cpf' | 'cnpj' | null;
183
+ /** Só dígitos. */
184
+ document_number: string | null;
185
+ /** Só dígitos. */
186
+ responsible_cpf: string | null;
187
+ zip: string | null;
188
+ street: string | null;
189
+ number: string | null;
190
+ complement: string | null;
191
+ district: string | null;
192
+ city: string | null;
193
+ state: string | null;
151
194
  }
152
195
 
153
196
  // ── Transições de status ──
@@ -1,6 +1,6 @@
1
1
  export * from "../fb_collections";
2
2
  import { IProfile } from "../../evo-people";
3
- import type { FirestoreDocumentReference, IAddress, IContact, IExternalLink, ITag } from "../../shared";
3
+ import type { CaptureDataMap, FirestoreDocumentReference, IAddress, IContact, IExternalLink, ITag } from "../../shared";
4
4
  import { IMedication, PatientAttachmentBaseCategory } from "../dic";
5
5
  export declare const EvoMedProfessionalPermissions: {
6
6
  readonly List: "evo_med_people_professional_read";
@@ -184,6 +184,8 @@ export interface IPatient extends IProfile {
184
184
  attachments?: IPatientAttachment[] | null;
185
185
  attachmentExternalLinkKeys?: string[] | null;
186
186
  tags?: ITag[] | null;
187
+ /** Campos complementares (code → valor), validados contra o dicionário `dics/patients/capture-data` (feat-196). */
188
+ capture_data?: CaptureDataMap | null;
187
189
  userRef?: FirestoreDocumentReference;
188
190
  [key: string]: unknown;
189
191
  }
@@ -1,6 +1,7 @@
1
1
  export * from "../fb_collections";
2
2
  import { IProfile } from "../../evo-people";
3
3
  import type {
4
+ CaptureDataMap,
4
5
  FirestoreDocumentReference,
5
6
  IAddress,
6
7
  IContact,
@@ -249,6 +250,8 @@ export interface IPatient extends IProfile {
249
250
  attachments?: IPatientAttachment[] | null;
250
251
  attachmentExternalLinkKeys?: string[] | null;
251
252
  tags?: ITag[] | null;
253
+ /** Campos complementares (code → valor), validados contra o dicionário `dics/patients/capture-data` (feat-196). */
254
+ capture_data?: CaptureDataMap | null;
252
255
  userRef?: FirestoreDocumentReference;
253
256
  [key: string]: unknown; // index signature
254
257
  }
@@ -0,0 +1,49 @@
1
+ import type { IFireDoc } from "./index";
2
+ /** Nome da subcoleção do dicionário, sob `dics/{entidade}/`. */
3
+ export declare const CAPTURE_DATA_COLLECTION = "capture-data";
4
+ /** Entidades que têm dicionário de campos complementares (= segmento do path em `dics/`). */
5
+ export type CaptureDataEntity = "leads" | "patients";
6
+ export declare const CAPTURE_DATA_FIELD_TYPES: readonly ["text", "number", "date", "select", "boolean"];
7
+ /** Tipo do campo. Ausente no doc = `text` (campos legados de lead). */
8
+ export type CaptureDataFieldType = (typeof CAPTURE_DATA_FIELD_TYPES)[number];
9
+ /**
10
+ * Valor gravado no mapa `capture_data`. `date` é string `YYYY-MM-DD`;
11
+ * `select` grava o `value` da opção.
12
+ */
13
+ export type CaptureDataValue = string | number | boolean;
14
+ /** Mapa gravado na entidade (`lead.capture_data`, `patient.capture_data`). */
15
+ export type CaptureDataMap = Record<string, CaptureDataValue>;
16
+ /**
17
+ * Regra de CRIAÇÃO do `code` (aplicada no backend). Codes legados fora desse
18
+ * padrão (ex.: `Convênio`, `nome-paciente`) continuam válidos para leitura.
19
+ */
20
+ export declare const CAPTURE_DATA_CODE_PATTERN = "^[a-z][a-z0-9_]{0,63}$";
21
+ /** Limite de caracteres de um valor `text`. */
22
+ export declare const CAPTURE_DATA_TEXT_MAX_LENGTH = 2000;
23
+ export interface ICaptureDataFieldOption {
24
+ /** O que vai gravado no mapa. */
25
+ value: string;
26
+ /** O que a UI mostra. */
27
+ label: string;
28
+ }
29
+ export interface ICaptureDataField extends IFireDoc {
30
+ /** Chave no mapa `capture_data`. Imutável depois de criado. */
31
+ code: string;
32
+ name: string;
33
+ /** Ausente = `text` (legado). Imutável depois de definido. */
34
+ type?: CaptureDataFieldType;
35
+ /** Só para `select`. */
36
+ options?: ICaptureDataFieldOption[] | null;
37
+ required?: boolean;
38
+ order?: number | null;
39
+ /** Envia o valor ao índice de busca (Algolia, região US). Default false (D2). */
40
+ searchable?: boolean;
41
+ /** Instrução para a IA preencher o campo. */
42
+ mcp_description?: string | null;
43
+ /** Default true. */
44
+ mcp_enabled?: boolean;
45
+ }
46
+ /** Compatibilidade: o dicionário de lead é o genérico. */
47
+ export type ILeadCaptureDataField = ICaptureDataField;
48
+ /** Dicionário de campos complementares de paciente. */
49
+ export type IPatientCaptureDataField = ICaptureDataField;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CAPTURE_DATA_TEXT_MAX_LENGTH = exports.CAPTURE_DATA_CODE_PATTERN = exports.CAPTURE_DATA_FIELD_TYPES = exports.CAPTURE_DATA_COLLECTION = void 0;
4
+ // ----- Campos complementares (capture-data) — feat-196
5
+ //
6
+ // Dicionário genérico por entidade: cada tenant define campos próprios que são
7
+ // gravados em `{entidade}.capture_data` (mapa code → valor).
8
+ // leads → tenants/{t}/apps/evo-crm/dics/leads/capture-data/{id}
9
+ // patients → tenants/{t}/apps/evo-med/dics/patients/capture-data/{id}
10
+ // Herda do `base_tenant` (o tenant atual vence o base, deduplicado por `code`).
11
+ /** Nome da subcoleção do dicionário, sob `dics/{entidade}/`. */
12
+ exports.CAPTURE_DATA_COLLECTION = "capture-data";
13
+ exports.CAPTURE_DATA_FIELD_TYPES = [
14
+ "text",
15
+ "number",
16
+ "date",
17
+ "select",
18
+ "boolean",
19
+ ];
20
+ /**
21
+ * Regra de CRIAÇÃO do `code` (aplicada no backend). Codes legados fora desse
22
+ * padrão (ex.: `Convênio`, `nome-paciente`) continuam válidos para leitura.
23
+ */
24
+ exports.CAPTURE_DATA_CODE_PATTERN = "^[a-z][a-z0-9_]{0,63}$";
25
+ /** Limite de caracteres de um valor `text`. */
26
+ exports.CAPTURE_DATA_TEXT_MAX_LENGTH = 2000;
@@ -0,0 +1,74 @@
1
+ import type { IFireDoc } from "./index";
2
+
3
+ // ----- Campos complementares (capture-data) — feat-196
4
+ //
5
+ // Dicionário genérico por entidade: cada tenant define campos próprios que são
6
+ // gravados em `{entidade}.capture_data` (mapa code → valor).
7
+ // leads → tenants/{t}/apps/evo-crm/dics/leads/capture-data/{id}
8
+ // patients → tenants/{t}/apps/evo-med/dics/patients/capture-data/{id}
9
+ // Herda do `base_tenant` (o tenant atual vence o base, deduplicado por `code`).
10
+
11
+ /** Nome da subcoleção do dicionário, sob `dics/{entidade}/`. */
12
+ export const CAPTURE_DATA_COLLECTION = "capture-data";
13
+
14
+ /** Entidades que têm dicionário de campos complementares (= segmento do path em `dics/`). */
15
+ export type CaptureDataEntity = "leads" | "patients";
16
+
17
+ export const CAPTURE_DATA_FIELD_TYPES = [
18
+ "text",
19
+ "number",
20
+ "date",
21
+ "select",
22
+ "boolean",
23
+ ] as const;
24
+
25
+ /** Tipo do campo. Ausente no doc = `text` (campos legados de lead). */
26
+ export type CaptureDataFieldType = (typeof CAPTURE_DATA_FIELD_TYPES)[number];
27
+
28
+ /**
29
+ * Valor gravado no mapa `capture_data`. `date` é string `YYYY-MM-DD`;
30
+ * `select` grava o `value` da opção.
31
+ */
32
+ export type CaptureDataValue = string | number | boolean;
33
+
34
+ /** Mapa gravado na entidade (`lead.capture_data`, `patient.capture_data`). */
35
+ export type CaptureDataMap = Record<string, CaptureDataValue>;
36
+
37
+ /**
38
+ * Regra de CRIAÇÃO do `code` (aplicada no backend). Codes legados fora desse
39
+ * padrão (ex.: `Convênio`, `nome-paciente`) continuam válidos para leitura.
40
+ */
41
+ export const CAPTURE_DATA_CODE_PATTERN = "^[a-z][a-z0-9_]{0,63}$";
42
+
43
+ /** Limite de caracteres de um valor `text`. */
44
+ export const CAPTURE_DATA_TEXT_MAX_LENGTH = 2000;
45
+
46
+ export interface ICaptureDataFieldOption {
47
+ /** O que vai gravado no mapa. */
48
+ value: string;
49
+ /** O que a UI mostra. */
50
+ label: string;
51
+ }
52
+
53
+ export interface ICaptureDataField extends IFireDoc {
54
+ /** Chave no mapa `capture_data`. Imutável depois de criado. */
55
+ code: string;
56
+ name: string;
57
+ /** Ausente = `text` (legado). Imutável depois de definido. */
58
+ type?: CaptureDataFieldType;
59
+ /** Só para `select`. */
60
+ options?: ICaptureDataFieldOption[] | null;
61
+ required?: boolean;
62
+ order?: number | null;
63
+ /** Envia o valor ao índice de busca (Algolia, região US). Default false (D2). */
64
+ searchable?: boolean;
65
+ /** Instrução para a IA preencher o campo. */
66
+ mcp_description?: string | null;
67
+ /** Default true. */
68
+ mcp_enabled?: boolean;
69
+ }
70
+
71
+ /** Compatibilidade: o dicionário de lead é o genérico. */
72
+ export type ILeadCaptureDataField = ICaptureDataField;
73
+ /** Dicionário de campos complementares de paciente. */
74
+ export type IPatientCaptureDataField = ICaptureDataField;
@@ -1,5 +1,6 @@
1
1
  export * from "./fb_collections";
2
2
  export * from "./external-links";
3
+ export * from "./capture-data";
3
4
  export interface FirestoreDocumentReference {
4
5
  id: string;
5
6
  path: string;
@@ -17,6 +17,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.IEvoApp = void 0;
18
18
  __exportStar(require("./fb_collections"), exports);
19
19
  __exportStar(require("./external-links"), exports);
20
+ __exportStar(require("./capture-data"), exports);
20
21
  var IEvoApp;
21
22
  (function (IEvoApp) {
22
23
  IEvoApp["EvoActivity"] = "evo-activity";
@@ -1,5 +1,6 @@
1
1
  export * from "./fb_collections";
2
2
  export * from "./external-links";
3
+ export * from "./capture-data";
3
4
 
4
5
  // ----- FirestoreTypes
5
6
  // Definir o tipo unificado para DocumentReference
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.600",
3
+ "version": "1.3.604",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",