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.
- package/dist/apps/evo-med/calendar/zod-schemas.js +13 -0
- package/dist/apps/evo-med/calendar/zod-schemas.ts +13 -0
- package/dist/types/evo-med/calendar/index.d.ts +32 -3
- package/dist/types/evo-med/calendar/index.js +23 -2
- package/dist/types/evo-med/calendar/index.ts +32 -3
- package/dist/types/nex-vendas/journey.d.ts +64 -0
- package/dist/types/nex-vendas/journey.ts +67 -0
- package/package.json +1 -1
|
@@ -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
|
-
/**
|
|
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 =
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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 =
|
|
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
|
-
/**
|
|
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 =
|
|
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
|
-
/**
|
|
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;
|