evo360-types 1.3.608 → 1.3.612

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.
@@ -105,6 +105,10 @@ exports.zMedCalendarNotificationConfigSchema = zod_1.z
105
105
  // Os únicos limites que o zod IMPÕE são os que a decisão declarou: retenção
106
106
  // 7..730 (D32) e duração 15..480 (plan §12). Os demais têm só teto de sanidade
107
107
  // — recusar um valor que a spec não proibiu seria inventar regra de negócio.
108
+ //
109
+ // O teto de 480 da duração NÃO acompanhou o teto de plataforma de 1h30 de
110
+ // 2026-09-25, e a razão está no comentário do campo: escrita permissiva,
111
+ // leitura clampada.
108
112
  exports.zMedCalendarVirtualCareRecordingSchema = zod_1.z
109
113
  .object({
110
114
  mode: zod_1.z
@@ -137,6 +141,15 @@ exports.zMedCalendarVirtualCareConfigSchema = zod_1.z
137
141
  .nullable()
138
142
  .optional(),
139
143
  allow_late_end: zod_1.z.boolean().nullable().optional(),
144
+ // `.max(480)` e NÃO 90 (o teto de plataforma de 1h30, 2026-09-25). Este é
145
+ // limite de ESCRITA, e baixá-lo quebraria o save de agenda já gravada:
146
+ // `CalendarModel.setProperties` relê o doc com `parseDoc` e valida o MERGE
147
+ // de doc + input com este schema, então uma agenda com 120 (o default
148
+ // publicado) ou 480 passaria a recusar o save de QUALQUER campo — o nome da
149
+ // agenda, a cor, o horário — por causa de um campo de telemedicina que o
150
+ // usuário nem abriu. Quem aplica o teto é a LEITURA
151
+ // (`VIRTUAL_CARE_PLATFORM_MAX_DURATION_MINUTES` em `packages/model`), que
152
+ // clampa e registra; a tela usa `VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX`.
140
153
  max_duration_minutes: zod_1.z.number().int().min(15).max(480).nullable().optional(),
141
154
  end_warning_minutes: zod_1.z.number().int().min(0).max(1440).nullable().optional(),
142
155
  // feat-160 R6 (D38): provider sugerido ao agendar telemedicina nesta agenda.
@@ -109,6 +109,10 @@ export const zMedCalendarNotificationConfigSchema = z
109
109
  // Os únicos limites que o zod IMPÕE são os que a decisão declarou: retenção
110
110
  // 7..730 (D32) e duração 15..480 (plan §12). Os demais têm só teto de sanidade
111
111
  // — recusar um valor que a spec não proibiu seria inventar regra de negócio.
112
+ //
113
+ // O teto de 480 da duração NÃO acompanhou o teto de plataforma de 1h30 de
114
+ // 2026-09-25, e a razão está no comentário do campo: escrita permissiva,
115
+ // leitura clampada.
112
116
  export const zMedCalendarVirtualCareRecordingSchema = z
113
117
  .object({
114
118
  mode: z
@@ -144,6 +148,15 @@ export const zMedCalendarVirtualCareConfigSchema = z
144
148
  .nullable()
145
149
  .optional(),
146
150
  allow_late_end: z.boolean().nullable().optional(),
151
+ // `.max(480)` e NÃO 90 (o teto de plataforma de 1h30, 2026-09-25). Este é
152
+ // limite de ESCRITA, e baixá-lo quebraria o save de agenda já gravada:
153
+ // `CalendarModel.setProperties` relê o doc com `parseDoc` e valida o MERGE
154
+ // de doc + input com este schema, então uma agenda com 120 (o default
155
+ // publicado) ou 480 passaria a recusar o save de QUALQUER campo — o nome da
156
+ // agenda, a cor, o horário — por causa de um campo de telemedicina que o
157
+ // usuário nem abriu. Quem aplica o teto é a LEITURA
158
+ // (`VIRTUAL_CARE_PLATFORM_MAX_DURATION_MINUTES` em `packages/model`), que
159
+ // clampa e registra; a tela usa `VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX`.
147
160
  max_duration_minutes: z.number().int().min(15).max(480).nullable().optional(),
148
161
  end_warning_minutes: z.number().int().min(0).max(1440).nullable().optional(),
149
162
  // feat-160 R6 (D38): provider sugerido ao agendar telemedicina nesta agenda.
@@ -172,9 +172,30 @@ export type VirtualCareRecordingMode = (typeof VirtualCareRecordingModeEnum)[key
172
172
  /** Limites de `recording.retention_days` (D32; D13 mantém 7 como default). */
173
173
  export declare const VIRTUAL_CARE_RETENTION_DAYS_MIN = 7;
174
174
  export declare const VIRTUAL_CARE_RETENTION_DAYS_MAX = 730;
175
- /** Limites de `max_duration_minutes`. */
175
+ /**
176
+ * Limites de `max_duration_minutes`.
177
+ *
178
+ * O teto desceu de 480 (8 h) para **90 (1h30)** em 2026-09-25, por pedido do
179
+ * dono do produto: sem teto a consulta "fica em curso indefinidamente" e nós
180
+ * pagamos minuto de sala, minuto de gravação e depois o processamento da
181
+ * transcrição.
182
+ *
183
+ * Duas coisas que este par de constantes NÃO é:
184
+ *
185
+ * - **não é a autoridade.** Quem garante o teto é o backend
186
+ * (`VIRTUAL_CARE_PLATFORM_MAX_DURATION_MINUTES`, em
187
+ * `packages/model/src/evo-telemedicine/virtual-care-policy.ts`), que clampa
188
+ * na LEITURA da agenda. Tem de ser lá porque o que roda em produção é a
189
+ * versão PUBLICADA deste pacote — um teto que só exista aqui não existe em
190
+ * produção até o publish chegar ao deploy;
191
+ * - **não é limite de escrita.** O `.max()` do zod continua em 480 de
192
+ * propósito — ver o comentário em `zMedCalendarVirtualCareConfigSchema`.
193
+ *
194
+ * O uso legítimo daqui é a TELA: é este número que o editor da agenda usa como
195
+ * `max` do campo e para avisar que o valor gravado está fora da faixa.
196
+ */
176
197
  export declare const VIRTUAL_CARE_MAX_DURATION_MINUTES_MIN = 15;
177
- export declare const VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX = 480;
198
+ export declare const VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX = 90;
178
199
  /** O que está GRAVADO no doc da agenda — tudo parcial (ausente = default). */
179
200
  export interface IMedCalendarVirtualCareConfig {
180
201
  /**
@@ -209,7 +230,15 @@ export interface IMedCalendarVirtualCareConfig {
209
230
  } | null;
210
231
  /** `true` = passar do fim previsto não encerra a consulta (comportamento atual). */
211
232
  allow_late_end?: boolean | null;
212
- /** Teto absoluto; o sweep encerra ao exceder (`reason: max_duration`). 15..480. */
233
+ /**
234
+ * Teto absoluto; o sweep encerra ao exceder (`reason: max_duration`).
235
+ *
236
+ * Faixa da TELA: 15..90 (1h30, desde 2026-09-25). Doc gravado antes disso
237
+ * pode ter 120 (o default) ou 480, e continua salvável: o backend clampa na
238
+ * leitura e o zod não recusa. O default de
239
+ * `CALENDAR_VIRTUAL_CARE_DEFAULTS` segue 120 e também é clampado — o teto é
240
+ * da plataforma, não da agenda.
241
+ */
213
242
  max_duration_minutes?: number | null;
214
243
  /** Aviso ao médico no SPA quando faltar N min para o fim. 0 = sem aviso. */
215
244
  end_warning_minutes?: number | null;
@@ -94,9 +94,30 @@ exports.VirtualCareRecordingModeEnum = {
94
94
  /** Limites de `recording.retention_days` (D32; D13 mantém 7 como default). */
95
95
  exports.VIRTUAL_CARE_RETENTION_DAYS_MIN = 7;
96
96
  exports.VIRTUAL_CARE_RETENTION_DAYS_MAX = 730;
97
- /** Limites de `max_duration_minutes`. */
97
+ /**
98
+ * Limites de `max_duration_minutes`.
99
+ *
100
+ * O teto desceu de 480 (8 h) para **90 (1h30)** em 2026-09-25, por pedido do
101
+ * dono do produto: sem teto a consulta "fica em curso indefinidamente" e nós
102
+ * pagamos minuto de sala, minuto de gravação e depois o processamento da
103
+ * transcrição.
104
+ *
105
+ * Duas coisas que este par de constantes NÃO é:
106
+ *
107
+ * - **não é a autoridade.** Quem garante o teto é o backend
108
+ * (`VIRTUAL_CARE_PLATFORM_MAX_DURATION_MINUTES`, em
109
+ * `packages/model/src/evo-telemedicine/virtual-care-policy.ts`), que clampa
110
+ * na LEITURA da agenda. Tem de ser lá porque o que roda em produção é a
111
+ * versão PUBLICADA deste pacote — um teto que só exista aqui não existe em
112
+ * produção até o publish chegar ao deploy;
113
+ * - **não é limite de escrita.** O `.max()` do zod continua em 480 de
114
+ * propósito — ver o comentário em `zMedCalendarVirtualCareConfigSchema`.
115
+ *
116
+ * O uso legítimo daqui é a TELA: é este número que o editor da agenda usa como
117
+ * `max` do campo e para avisar que o valor gravado está fora da faixa.
118
+ */
98
119
  exports.VIRTUAL_CARE_MAX_DURATION_MINUTES_MIN = 15;
99
- exports.VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX = 480;
120
+ exports.VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX = 90;
100
121
  /**
101
122
  * Defaults da spec (plan §12 / D13 / D32). Agenda sem `virtual_care` vale
102
123
  * exatamente isto — é o que faz "sem migração de dado" ser verdade.
@@ -213,9 +213,30 @@ export type VirtualCareRecordingMode =
213
213
  export const VIRTUAL_CARE_RETENTION_DAYS_MIN = 7;
214
214
  export const VIRTUAL_CARE_RETENTION_DAYS_MAX = 730;
215
215
 
216
- /** Limites de `max_duration_minutes`. */
216
+ /**
217
+ * Limites de `max_duration_minutes`.
218
+ *
219
+ * O teto desceu de 480 (8 h) para **90 (1h30)** em 2026-09-25, por pedido do
220
+ * dono do produto: sem teto a consulta "fica em curso indefinidamente" e nós
221
+ * pagamos minuto de sala, minuto de gravação e depois o processamento da
222
+ * transcrição.
223
+ *
224
+ * Duas coisas que este par de constantes NÃO é:
225
+ *
226
+ * - **não é a autoridade.** Quem garante o teto é o backend
227
+ * (`VIRTUAL_CARE_PLATFORM_MAX_DURATION_MINUTES`, em
228
+ * `packages/model/src/evo-telemedicine/virtual-care-policy.ts`), que clampa
229
+ * na LEITURA da agenda. Tem de ser lá porque o que roda em produção é a
230
+ * versão PUBLICADA deste pacote — um teto que só exista aqui não existe em
231
+ * produção até o publish chegar ao deploy;
232
+ * - **não é limite de escrita.** O `.max()` do zod continua em 480 de
233
+ * propósito — ver o comentário em `zMedCalendarVirtualCareConfigSchema`.
234
+ *
235
+ * O uso legítimo daqui é a TELA: é este número que o editor da agenda usa como
236
+ * `max` do campo e para avisar que o valor gravado está fora da faixa.
237
+ */
217
238
  export const VIRTUAL_CARE_MAX_DURATION_MINUTES_MIN = 15;
218
- export const VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX = 480;
239
+ export const VIRTUAL_CARE_MAX_DURATION_MINUTES_MAX = 90;
219
240
 
220
241
  /** O que está GRAVADO no doc da agenda — tudo parcial (ausente = default). */
221
242
  export interface IMedCalendarVirtualCareConfig {
@@ -251,7 +272,15 @@ export interface IMedCalendarVirtualCareConfig {
251
272
  } | null;
252
273
  /** `true` = passar do fim previsto não encerra a consulta (comportamento atual). */
253
274
  allow_late_end?: boolean | null;
254
- /** Teto absoluto; o sweep encerra ao exceder (`reason: max_duration`). 15..480. */
275
+ /**
276
+ * Teto absoluto; o sweep encerra ao exceder (`reason: max_duration`).
277
+ *
278
+ * Faixa da TELA: 15..90 (1h30, desde 2026-09-25). Doc gravado antes disso
279
+ * pode ter 120 (o default) ou 480, e continua salvável: o backend clampa na
280
+ * leitura e o zod não recusa. O default de
281
+ * `CALENDAR_VIRTUAL_CARE_DEFAULTS` segue 120 e também é clampado — o teto é
282
+ * da plataforma, não da agenda.
283
+ */
255
284
  max_duration_minutes?: number | null;
256
285
  /** Aviso ao médico no SPA quando faltar N min para o fim. 0 = sem aviso. */
257
286
  end_warning_minutes?: number | null;
@@ -39,6 +39,29 @@ export interface INexVendasJourneySignature {
39
39
  signed_at?: Date | null;
40
40
  last_error?: string | null;
41
41
  }
42
+ /**
43
+ * Envelope substituído por correção de dados antes da assinatura (feat-200).
44
+ *
45
+ * `canceled_at` null com `cancel_error` preenchido = o cancelamento no provider
46
+ * falhou e o documento ficou órfão no cofre: é a lista de limpeza manual.
47
+ */
48
+ export interface INexVendasJourneySignatureHistoryEntry {
49
+ envelope_id: string;
50
+ provider?: string | null;
51
+ requested_at?: Date | null;
52
+ canceled_at?: Date | null;
53
+ reason: 'customer_data_corrected' | (string & {});
54
+ cancel_error?: string | null;
55
+ }
56
+ /**
57
+ * Correção aplicada ao `customer_data` na janela antes da assinatura. Cada uma
58
+ * gera um envelope novo, e é o contador do teto por hora (feat-200 D3).
59
+ */
60
+ export interface INexVendasJourneyCorrection {
61
+ at: Date;
62
+ /** Só os NOMES dos campos alterados (ex.: `email`, `company.zip`). */
63
+ fields: string[];
64
+ }
42
65
  /**
43
66
  * PDF da proposta comercial já persistido no bucket, pronto para virar anexo do
44
67
  * envelope de assinatura (feat-136).
@@ -248,6 +271,16 @@ export interface INexVendasJourney extends IFireGlobalDoc {
248
271
  customer_id?: string | null;
249
272
  customer_data?: INexVendasJourneyCustomerData | null;
250
273
  signature?: INexVendasJourneySignature | null;
274
+ /** Envelopes substituídos por correção de dados (feat-200). */
275
+ signature_history?: INexVendasJourneySignatureHistoryEntry[] | null;
276
+ /** Correções de dados antes da assinatura (feat-200), com timestamp. */
277
+ corrections?: INexVendasJourneyCorrection[] | null;
278
+ /**
279
+ * `true` quando o cliente Nexus em `customer_id` foi CRIADO por esta jornada —
280
+ * só então a correção atualiza o cadastro. Ausente = pré-existente
281
+ * (LINK-ONLY) ou jornada anterior à feat-200.
282
+ */
283
+ customer_created_by_journey?: boolean | null;
251
284
  payment?: INexVendasJourneyPayment | null;
252
285
  /**
253
286
  * PDF da proposta pronto para anexar ao envelope (feat-136). Ausente = ainda
@@ -286,6 +319,28 @@ export interface INexVendasJourneyCustomerMasked {
286
319
  phone_masked: string | null;
287
320
  document_masked: string | null;
288
321
  }
322
+ /**
323
+ * Parâmetros do embed de assinatura da D4Sign (iframe
324
+ * `https://secure.d4sign.com.br/embed/viewblob/{document_uuid}?email=…`), que o
325
+ * shop monta dentro da própria página em vez de abrir o `sign_url`.
326
+ *
327
+ * Só existe com `signature.status === 'pending'` e provider `d4sign`; nos demais
328
+ * casos a projeção devolve `embed: null`. Exceção deliberada à regra de mascarar
329
+ * dados da projeção pública: o uuid já sai no `sign_url`, o e-mail é o que o
330
+ * próprio lead digitou e o CPF é exigido pela D4Sign para identificar o
331
+ * signatário. Os campos têm de bater com o signatário cadastrado no envelope.
332
+ */
333
+ export interface INexVendasJourneySignatureEmbed {
334
+ /** UUID do documento na D4Sign (`signature.envelope_id`). */
335
+ document_uuid: string;
336
+ /** E-mail do signatário cadastrado no envelope. */
337
+ signer_email: string;
338
+ signer_display_name: string | null;
339
+ /** CPF do signatário em dígitos (responsável no PJ, titular no PF), ou null. */
340
+ signer_documentation: string | null;
341
+ /** `key_signer` decodificado do signatário; parâmetro opcional do embed. */
342
+ signer_key_signer: string | null;
343
+ }
289
344
  /** O que o endpoint sem auth expõe. Sem ids internos de customer/tenant/contrato. */
290
345
  export interface INexVendasJourneyPublic {
291
346
  short_code: string;
@@ -294,9 +349,18 @@ export interface INexVendasJourneyPublic {
294
349
  proposal: INexFinopsProposalPublic;
295
350
  data_submitted: boolean;
296
351
  customer_masked: INexVendasJourneyCustomerMasked | null;
352
+ /**
353
+ * `customer_data` COMPLETO, só na janela de correção (`dados_coletados` sem
354
+ * assinatura concluída); fora dela `null`. É o que o próprio lead digitou,
355
+ * devolvido a quem tem o `short_code`, para reabrir o formulário preenchido.
356
+ * Ausente em backend anterior à feat-200.
357
+ */
358
+ editable_customer_data?: INexVendasJourneyCustomerData | null;
297
359
  signature: {
298
360
  status: NexVendasJourneySignatureStatus;
299
361
  sign_url: string | null;
362
+ /** Ausente em backend anterior à feat-199; null fora de pending/d4sign. */
363
+ embed?: INexVendasJourneySignatureEmbed | null;
300
364
  };
301
365
  payment: INexVendasJourneyPaymentPublic;
302
366
  contract: {
@@ -93,6 +93,31 @@ export interface INexVendasJourneySignature {
93
93
  last_error?: string | null;
94
94
  }
95
95
 
96
+ /**
97
+ * Envelope substituído por correção de dados antes da assinatura (feat-200).
98
+ *
99
+ * `canceled_at` null com `cancel_error` preenchido = o cancelamento no provider
100
+ * falhou e o documento ficou órfão no cofre: é a lista de limpeza manual.
101
+ */
102
+ export interface INexVendasJourneySignatureHistoryEntry {
103
+ envelope_id: string;
104
+ provider?: string | null;
105
+ requested_at?: Date | null;
106
+ canceled_at?: Date | null;
107
+ reason: 'customer_data_corrected' | (string & {});
108
+ cancel_error?: string | null;
109
+ }
110
+
111
+ /**
112
+ * Correção aplicada ao `customer_data` na janela antes da assinatura. Cada uma
113
+ * gera um envelope novo, e é o contador do teto por hora (feat-200 D3).
114
+ */
115
+ export interface INexVendasJourneyCorrection {
116
+ at: Date;
117
+ /** Só os NOMES dos campos alterados (ex.: `email`, `company.zip`). */
118
+ fields: string[];
119
+ }
120
+
96
121
  // ── PDF da proposta (anexo do envelope) ──
97
122
 
98
123
  /**
@@ -346,6 +371,16 @@ export interface INexVendasJourney extends IFireGlobalDoc {
346
371
 
347
372
  customer_data?: INexVendasJourneyCustomerData | null;
348
373
  signature?: INexVendasJourneySignature | null;
374
+ /** Envelopes substituídos por correção de dados (feat-200). */
375
+ signature_history?: INexVendasJourneySignatureHistoryEntry[] | null;
376
+ /** Correções de dados antes da assinatura (feat-200), com timestamp. */
377
+ corrections?: INexVendasJourneyCorrection[] | null;
378
+ /**
379
+ * `true` quando o cliente Nexus em `customer_id` foi CRIADO por esta jornada —
380
+ * só então a correção atualiza o cadastro. Ausente = pré-existente
381
+ * (LINK-ONLY) ou jornada anterior à feat-200.
382
+ */
383
+ customer_created_by_journey?: boolean | null;
349
384
  payment?: INexVendasJourneyPayment | null;
350
385
 
351
386
  /**
@@ -394,6 +429,29 @@ export interface INexVendasJourneyCustomerMasked {
394
429
  document_masked: string | null;
395
430
  }
396
431
 
432
+ /**
433
+ * Parâmetros do embed de assinatura da D4Sign (iframe
434
+ * `https://secure.d4sign.com.br/embed/viewblob/{document_uuid}?email=…`), que o
435
+ * shop monta dentro da própria página em vez de abrir o `sign_url`.
436
+ *
437
+ * Só existe com `signature.status === 'pending'` e provider `d4sign`; nos demais
438
+ * casos a projeção devolve `embed: null`. Exceção deliberada à regra de mascarar
439
+ * dados da projeção pública: o uuid já sai no `sign_url`, o e-mail é o que o
440
+ * próprio lead digitou e o CPF é exigido pela D4Sign para identificar o
441
+ * signatário. Os campos têm de bater com o signatário cadastrado no envelope.
442
+ */
443
+ export interface INexVendasJourneySignatureEmbed {
444
+ /** UUID do documento na D4Sign (`signature.envelope_id`). */
445
+ document_uuid: string;
446
+ /** E-mail do signatário cadastrado no envelope. */
447
+ signer_email: string;
448
+ signer_display_name: string | null;
449
+ /** CPF do signatário em dígitos (responsável no PJ, titular no PF), ou null. */
450
+ signer_documentation: string | null;
451
+ /** `key_signer` decodificado do signatário; parâmetro opcional do embed. */
452
+ signer_key_signer: string | null;
453
+ }
454
+
397
455
  /** O que o endpoint sem auth expõe. Sem ids internos de customer/tenant/contrato. */
398
456
  export interface INexVendasJourneyPublic {
399
457
  short_code: string;
@@ -402,9 +460,18 @@ export interface INexVendasJourneyPublic {
402
460
  proposal: INexFinopsProposalPublic;
403
461
  data_submitted: boolean;
404
462
  customer_masked: INexVendasJourneyCustomerMasked | null;
463
+ /**
464
+ * `customer_data` COMPLETO, só na janela de correção (`dados_coletados` sem
465
+ * assinatura concluída); fora dela `null`. É o que o próprio lead digitou,
466
+ * devolvido a quem tem o `short_code`, para reabrir o formulário preenchido.
467
+ * Ausente em backend anterior à feat-200.
468
+ */
469
+ editable_customer_data?: INexVendasJourneyCustomerData | null;
405
470
  signature: {
406
471
  status: NexVendasJourneySignatureStatus;
407
472
  sign_url: string | null;
473
+ /** Ausente em backend anterior à feat-199; null fora de pending/d4sign. */
474
+ embed?: INexVendasJourneySignatureEmbed | null;
408
475
  };
409
476
  payment: INexVendasJourneyPaymentPublic;
410
477
  contract: { status: NexFinopsContractStatus } | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.608",
3
+ "version": "1.3.612",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",