evo360-types 1.3.512 → 1.3.516
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-finops/zod-schemas.d.ts +447 -0
- package/dist/apps/evo-finops/zod-schemas.js +165 -1
- package/dist/apps/evo-finops/zod-schemas.ts +182 -0
- package/dist/apps/evo-med/insurance/zod-schemas.d.ts +8 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.ts +1 -0
- package/dist/types/evo-chat/search/index.d.ts +75 -0
- package/dist/types/evo-chat/search/index.ts +88 -0
- package/dist/types/evo-finops/common/contract.d.ts +43 -1
- package/dist/types/evo-finops/common/contract.ts +52 -1
- package/dist/types/evo-finops/common/proposal.d.ts +71 -0
- package/dist/types/evo-finops/common/proposal.js +23 -0
- package/dist/types/evo-finops/common/proposal.ts +122 -0
- package/dist/types/evo-finops/index.d.ts +1 -0
- package/dist/types/evo-finops/index.js +1 -0
- package/dist/types/evo-finops/index.ts +1 -0
- package/dist/types/nex-vendas/index.d.ts +1 -0
- package/dist/types/nex-vendas/index.js +17 -0
- package/dist/types/nex-vendas/index.ts +1 -0
- package/dist/types/nex-vendas/journey.d.ts +273 -0
- package/dist/types/nex-vendas/journey.js +22 -0
- package/dist/types/nex-vendas/journey.ts +378 -0
- package/package.json +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { IFireGlobalDoc } from '../../shared';
|
|
2
|
+
/**
|
|
3
|
+
* `viewed` é carimbado pelo endpoint público no primeiro acesso ao `short_code`.
|
|
4
|
+
* `expired` é **derivado** de `valid_until` na leitura (não há cron): o documento
|
|
5
|
+
* pode continuar gravado como `sent` depois da data — quem lê é que resolve.
|
|
6
|
+
*/
|
|
7
|
+
export type NexFinopsProposalStatus = 'draft' | 'sent' | 'viewed' | 'accepted' | 'expired' | 'canceled';
|
|
8
|
+
/**
|
|
9
|
+
* Aberto para extensão de propósito: novos canais de originação entram sem
|
|
10
|
+
* mudança de tipo. Os valores em uso hoje são `vendas` e `site-hm`.
|
|
11
|
+
*/
|
|
12
|
+
export type NexFinopsProposalOrigem = 'vendas' | 'site-hm' | (string & {});
|
|
13
|
+
/**
|
|
14
|
+
* Não confundir com `NexFinopsPaymentMethod` (contratos), que é
|
|
15
|
+
* `'pix' | 'boleto' | 'payment_link'`. A proposta aceita assinatura em cartão e
|
|
16
|
+
* não oferece pix avulso; os dois conjuntos divergem de propósito.
|
|
17
|
+
*/
|
|
18
|
+
export type NexFinopsProposalPaymentMethod = 'boleto' | 'card_subscription' | 'payment_link';
|
|
19
|
+
/** Dados que o vendedor já conhece e a página pública usa para pré-preencher. */
|
|
20
|
+
export interface INexFinopsProposalPrefill {
|
|
21
|
+
name?: string | null;
|
|
22
|
+
email?: string | null;
|
|
23
|
+
phone?: string | null;
|
|
24
|
+
company?: string | null;
|
|
25
|
+
}
|
|
26
|
+
export interface INexFinopsProposal extends IFireGlobalDoc {
|
|
27
|
+
origem: NexFinopsProposalOrigem;
|
|
28
|
+
customer_id?: string | null;
|
|
29
|
+
customer_ref?: string | null;
|
|
30
|
+
prefill?: INexFinopsProposalPrefill | null;
|
|
31
|
+
/** Gerado no servidor, único, sem caracteres ambíguos. Nunca vem do cliente. */
|
|
32
|
+
short_code: string;
|
|
33
|
+
name?: string | null;
|
|
34
|
+
status: NexFinopsProposalStatus;
|
|
35
|
+
/** HTML descritivo escrito pelo vendedor. Sanitizar na renderização. */
|
|
36
|
+
html_content: string;
|
|
37
|
+
/** Mensalidade base em reais (decimal), mesma convenção do contrato. */
|
|
38
|
+
base_amount: number;
|
|
39
|
+
due_day: number;
|
|
40
|
+
accepted_payment_methods: NexFinopsProposalPaymentMethod[];
|
|
41
|
+
terms?: string | null;
|
|
42
|
+
currency: 'BRL';
|
|
43
|
+
valid_until: string;
|
|
44
|
+
sent_at?: Date | null;
|
|
45
|
+
viewed_at?: Date | null;
|
|
46
|
+
accepted_at?: Date | null;
|
|
47
|
+
notes?: string | null;
|
|
48
|
+
}
|
|
49
|
+
/** O que o endpoint sem auth expõe. Sem ids internos, sem dado sensível. */
|
|
50
|
+
export interface INexFinopsProposalPublic {
|
|
51
|
+
short_code: string;
|
|
52
|
+
status: NexFinopsProposalStatus;
|
|
53
|
+
html_content: string;
|
|
54
|
+
base_amount: number;
|
|
55
|
+
due_day: number;
|
|
56
|
+
accepted_payment_methods: NexFinopsProposalPaymentMethod[];
|
|
57
|
+
terms: string | null;
|
|
58
|
+
valid_until: string;
|
|
59
|
+
/** Só nome de exibição — nunca e-mail, telefone ou documento completos. */
|
|
60
|
+
prefill_masked: {
|
|
61
|
+
name: string | null;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export declare const NEX_FINOPS_PROPOSAL_STATUS_TRANSITIONS: Record<NexFinopsProposalStatus, NexFinopsProposalStatus[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Status em que `valid_until` no passado deve ser lido como `expired`.
|
|
67
|
+
* `readonly string[]` para que `.includes(x)` aceite qualquer string sem cast.
|
|
68
|
+
*/
|
|
69
|
+
export declare const NEX_FINOPS_PROPOSAL_EXPIRABLE_STATUSES: readonly string[];
|
|
70
|
+
/** Status em que a página pública deve mostrar a proposta. Os demais são 410. */
|
|
71
|
+
export declare const NEX_FINOPS_PROPOSAL_PUBLIC_VISIBLE_STATUSES: readonly string[];
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NEX_FINOPS_PROPOSAL_PUBLIC_VISIBLE_STATUSES = exports.NEX_FINOPS_PROPOSAL_EXPIRABLE_STATUSES = exports.NEX_FINOPS_PROPOSAL_STATUS_TRANSITIONS = void 0;
|
|
4
|
+
// ── Transições de status ──
|
|
5
|
+
exports.NEX_FINOPS_PROPOSAL_STATUS_TRANSITIONS = {
|
|
6
|
+
draft: ['sent', 'canceled'],
|
|
7
|
+
sent: ['viewed', 'accepted', 'expired', 'canceled'],
|
|
8
|
+
viewed: ['accepted', 'expired', 'canceled'],
|
|
9
|
+
accepted: [],
|
|
10
|
+
expired: [],
|
|
11
|
+
canceled: [],
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Status em que `valid_until` no passado deve ser lido como `expired`.
|
|
15
|
+
* `readonly string[]` para que `.includes(x)` aceite qualquer string sem cast.
|
|
16
|
+
*/
|
|
17
|
+
exports.NEX_FINOPS_PROPOSAL_EXPIRABLE_STATUSES = ['draft', 'sent', 'viewed'];
|
|
18
|
+
/** Status em que a página pública deve mostrar a proposta. Os demais são 410. */
|
|
19
|
+
exports.NEX_FINOPS_PROPOSAL_PUBLIC_VISIBLE_STATUSES = [
|
|
20
|
+
'sent',
|
|
21
|
+
'viewed',
|
|
22
|
+
'accepted',
|
|
23
|
+
];
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { IFireGlobalDoc } from '../../shared';
|
|
2
|
+
|
|
3
|
+
// ── Status, origem e formas de pagamento ──
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* `viewed` é carimbado pelo endpoint público no primeiro acesso ao `short_code`.
|
|
7
|
+
* `expired` é **derivado** de `valid_until` na leitura (não há cron): o documento
|
|
8
|
+
* pode continuar gravado como `sent` depois da data — quem lê é que resolve.
|
|
9
|
+
*/
|
|
10
|
+
export type NexFinopsProposalStatus =
|
|
11
|
+
| 'draft'
|
|
12
|
+
| 'sent'
|
|
13
|
+
| 'viewed'
|
|
14
|
+
| 'accepted'
|
|
15
|
+
| 'expired'
|
|
16
|
+
| 'canceled';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Aberto para extensão de propósito: novos canais de originação entram sem
|
|
20
|
+
* mudança de tipo. Os valores em uso hoje são `vendas` e `site-hm`.
|
|
21
|
+
*/
|
|
22
|
+
export type NexFinopsProposalOrigem = 'vendas' | 'site-hm' | (string & {});
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Não confundir com `NexFinopsPaymentMethod` (contratos), que é
|
|
26
|
+
* `'pix' | 'boleto' | 'payment_link'`. A proposta aceita assinatura em cartão e
|
|
27
|
+
* não oferece pix avulso; os dois conjuntos divergem de propósito.
|
|
28
|
+
*/
|
|
29
|
+
export type NexFinopsProposalPaymentMethod = 'boleto' | 'card_subscription' | 'payment_link';
|
|
30
|
+
|
|
31
|
+
// ── Prefill do cliente ──
|
|
32
|
+
|
|
33
|
+
/** Dados que o vendedor já conhece e a página pública usa para pré-preencher. */
|
|
34
|
+
export interface INexFinopsProposalPrefill {
|
|
35
|
+
name?: string | null;
|
|
36
|
+
email?: string | null;
|
|
37
|
+
phone?: string | null;
|
|
38
|
+
company?: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ── Documento principal ──
|
|
42
|
+
|
|
43
|
+
export interface INexFinopsProposal extends IFireGlobalDoc {
|
|
44
|
+
// Originação
|
|
45
|
+
origem: NexFinopsProposalOrigem;
|
|
46
|
+
|
|
47
|
+
// Vínculos (opcionais — a proposta pode nascer antes do cadastro do cliente)
|
|
48
|
+
customer_id?: string | null;
|
|
49
|
+
customer_ref?: string | null;
|
|
50
|
+
prefill?: INexFinopsProposalPrefill | null;
|
|
51
|
+
|
|
52
|
+
// Identificação
|
|
53
|
+
/** Gerado no servidor, único, sem caracteres ambíguos. Nunca vem do cliente. */
|
|
54
|
+
short_code: string;
|
|
55
|
+
name?: string | null;
|
|
56
|
+
status: NexFinopsProposalStatus;
|
|
57
|
+
|
|
58
|
+
// Conteúdo
|
|
59
|
+
/** HTML descritivo escrito pelo vendedor. Sanitizar na renderização. */
|
|
60
|
+
html_content: string;
|
|
61
|
+
|
|
62
|
+
// Valores efetivos
|
|
63
|
+
/** Mensalidade base em reais (decimal), mesma convenção do contrato. */
|
|
64
|
+
base_amount: number;
|
|
65
|
+
due_day: number;
|
|
66
|
+
accepted_payment_methods: NexFinopsProposalPaymentMethod[];
|
|
67
|
+
terms?: string | null;
|
|
68
|
+
currency: 'BRL';
|
|
69
|
+
|
|
70
|
+
// Validade — data ISO `YYYY-MM-DD`, igual a `starts_at`/`ends_at` do contrato
|
|
71
|
+
valid_until: string;
|
|
72
|
+
|
|
73
|
+
// Rastreio
|
|
74
|
+
sent_at?: Date | null;
|
|
75
|
+
viewed_at?: Date | null;
|
|
76
|
+
accepted_at?: Date | null;
|
|
77
|
+
|
|
78
|
+
notes?: string | null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ── Projeção pública ──
|
|
82
|
+
|
|
83
|
+
/** O que o endpoint sem auth expõe. Sem ids internos, sem dado sensível. */
|
|
84
|
+
export interface INexFinopsProposalPublic {
|
|
85
|
+
short_code: string;
|
|
86
|
+
status: NexFinopsProposalStatus;
|
|
87
|
+
html_content: string;
|
|
88
|
+
base_amount: number;
|
|
89
|
+
due_day: number;
|
|
90
|
+
accepted_payment_methods: NexFinopsProposalPaymentMethod[];
|
|
91
|
+
terms: string | null;
|
|
92
|
+
valid_until: string;
|
|
93
|
+
/** Só nome de exibição — nunca e-mail, telefone ou documento completos. */
|
|
94
|
+
prefill_masked: { name: string | null };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ── Transições de status ──
|
|
98
|
+
|
|
99
|
+
export const NEX_FINOPS_PROPOSAL_STATUS_TRANSITIONS: Record<
|
|
100
|
+
NexFinopsProposalStatus,
|
|
101
|
+
NexFinopsProposalStatus[]
|
|
102
|
+
> = {
|
|
103
|
+
draft: ['sent', 'canceled'],
|
|
104
|
+
sent: ['viewed', 'accepted', 'expired', 'canceled'],
|
|
105
|
+
viewed: ['accepted', 'expired', 'canceled'],
|
|
106
|
+
accepted: [],
|
|
107
|
+
expired: [],
|
|
108
|
+
canceled: [],
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Status em que `valid_until` no passado deve ser lido como `expired`.
|
|
113
|
+
* `readonly string[]` para que `.includes(x)` aceite qualquer string sem cast.
|
|
114
|
+
*/
|
|
115
|
+
export const NEX_FINOPS_PROPOSAL_EXPIRABLE_STATUSES: readonly string[] = ['draft', 'sent', 'viewed'];
|
|
116
|
+
|
|
117
|
+
/** Status em que a página pública deve mostrar a proposta. Os demais são 410. */
|
|
118
|
+
export const NEX_FINOPS_PROPOSAL_PUBLIC_VISIBLE_STATUSES: readonly string[] = [
|
|
119
|
+
'sent',
|
|
120
|
+
'viewed',
|
|
121
|
+
'accepted',
|
|
122
|
+
];
|
|
@@ -2,6 +2,7 @@ export * from "./fb_collections";
|
|
|
2
2
|
export * from "./common";
|
|
3
3
|
export * from "./common/taker";
|
|
4
4
|
export * from "./common/contract";
|
|
5
|
+
export * from "./common/proposal";
|
|
5
6
|
export * from "./common/billing";
|
|
6
7
|
export * from "./providers";
|
|
7
8
|
export * from "./providers/provider_fiscal_types";
|
|
@@ -19,6 +19,7 @@ __exportStar(require("./fb_collections"), exports);
|
|
|
19
19
|
__exportStar(require("./common"), exports);
|
|
20
20
|
__exportStar(require("./common/taker"), exports);
|
|
21
21
|
__exportStar(require("./common/contract"), exports);
|
|
22
|
+
__exportStar(require("./common/proposal"), exports);
|
|
22
23
|
__exportStar(require("./common/billing"), exports);
|
|
23
24
|
__exportStar(require("./providers"), exports);
|
|
24
25
|
__exportStar(require("./providers/provider_fiscal_types"), exports);
|
|
@@ -4,6 +4,7 @@ export * from "./fb_collections";
|
|
|
4
4
|
export * from "./common";
|
|
5
5
|
export * from "./common/taker";
|
|
6
6
|
export * from "./common/contract";
|
|
7
|
+
export * from "./common/proposal";
|
|
7
8
|
export * from "./common/billing";
|
|
8
9
|
export * from "./providers";
|
|
9
10
|
export * from "./providers/provider_fiscal_types";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './journey';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./journey"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './journey';
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import type { IFireGlobalDoc } from '../shared';
|
|
2
|
+
import type { INexFinopsProposalPublic, NexFinopsProposalOrigem } from '../evo-finops/common/proposal';
|
|
3
|
+
import type { NexFinopsContractStatus } from '../evo-finops/common/contract';
|
|
4
|
+
/**
|
|
5
|
+
* União completa dos estados da jornada de contratação (visão §5.2). A feat-130
|
|
6
|
+
* implementa até `contrato_assinado`; `aguardando_pagamento`/`pago` são da
|
|
7
|
+
* feat-131 e os estados de provisionamento da F2 — declarados aqui de uma vez
|
|
8
|
+
* para que as features seguintes não mexam na máquina.
|
|
9
|
+
*
|
|
10
|
+
* `expirada` NÃO é gravada por job: quando não existe doc de jornada, quem lê
|
|
11
|
+
* deriva de `valid_until` da proposta. Depois que a jornada nasce, o status
|
|
12
|
+
* gravado é a verdade. `abandonada` é ação de backoffice.
|
|
13
|
+
*/
|
|
14
|
+
export type NexVendasJourneyStatus = 'proposta_enviada' | 'proposta_aceita' | 'dados_coletados' | 'contrato_assinado' | 'aguardando_pagamento' | 'pago' | 'tenant_criado' | 'onboarding_em_curso' | 'concluida' | 'expirada' | 'abandonada';
|
|
15
|
+
export declare const NEX_VENDAS_JOURNEY_STATUS_TRANSITIONS: Record<NexVendasJourneyStatus, NexVendasJourneyStatus[]>;
|
|
16
|
+
/** Status em que a jornada ainda aceita ação do cliente na página pública. */
|
|
17
|
+
export declare const NEX_VENDAS_JOURNEY_OPEN_STATUSES: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* Próximo passo que a página pública deve mostrar. Derivado do status — o shop
|
|
20
|
+
* não reimplementa a máquina, só obedece.
|
|
21
|
+
*/
|
|
22
|
+
export type NexVendasJourneyNextStep = 'accept' | 'data' | 'sign' | 'payment' | 'wait' | 'done';
|
|
23
|
+
/**
|
|
24
|
+
* `unavailable`: não há provider de assinatura configurado. A jornada avança
|
|
25
|
+
* mesmo assim (o dado foi coletado); a página pública mostra "link de assinatura
|
|
26
|
+
* em instantes" e o polling resolve quando o provider entrar.
|
|
27
|
+
*/
|
|
28
|
+
export type NexVendasJourneySignatureStatus = 'none' | 'pending' | 'signed' | 'unavailable';
|
|
29
|
+
export interface INexVendasJourneySignature {
|
|
30
|
+
status: NexVendasJourneySignatureStatus;
|
|
31
|
+
/** Nome do provider que emitiu o envelope (ex.: `d4sign`). */
|
|
32
|
+
provider?: string | null;
|
|
33
|
+
/** Id do documento/envelope no provider — chave de busca do webhook. */
|
|
34
|
+
envelope_id?: string | null;
|
|
35
|
+
sign_url?: string | null;
|
|
36
|
+
/** Identificador do signatário no provider (D4Sign: `key_signer` decodificado). */
|
|
37
|
+
signer_key?: string | null;
|
|
38
|
+
requested_at?: Date | null;
|
|
39
|
+
signed_at?: Date | null;
|
|
40
|
+
last_error?: string | null;
|
|
41
|
+
}
|
|
42
|
+
export interface INexVendasJourneyCompany {
|
|
43
|
+
legal_name?: string | null;
|
|
44
|
+
trade_name?: string | null;
|
|
45
|
+
document_type?: 'cpf' | 'cnpj' | null;
|
|
46
|
+
document_number?: string | null;
|
|
47
|
+
zip?: string | null;
|
|
48
|
+
street?: string | null;
|
|
49
|
+
number?: string | null;
|
|
50
|
+
complement?: string | null;
|
|
51
|
+
district?: string | null;
|
|
52
|
+
city?: string | null;
|
|
53
|
+
state?: string | null;
|
|
54
|
+
}
|
|
55
|
+
export interface INexVendasJourneyCustomerData {
|
|
56
|
+
name: string;
|
|
57
|
+
email: string;
|
|
58
|
+
phone: string;
|
|
59
|
+
company?: INexVendasJourneyCompany | null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Métodos que o passo `g` oferece. Espelha `NexFinopsProposalPaymentMethod`: a
|
|
63
|
+
* proposta declara o que aceita, a jornada escolhe um deles.
|
|
64
|
+
*/
|
|
65
|
+
export type NexVendasJourneyPaymentMethod = 'card_subscription' | 'boleto' | 'payment_link';
|
|
66
|
+
/** Artefato criado para o método escolhido. */
|
|
67
|
+
export type NexVendasJourneyPaymentKind = 'asaas_checkout' | 'boleto' | 'payment_link';
|
|
68
|
+
/**
|
|
69
|
+
* `compensating` é boleto emitido em janela D+1..D+3 — a tela precisa dizer
|
|
70
|
+
* "recebemos, aguardando compensação" em vez de "pague agora".
|
|
71
|
+
*/
|
|
72
|
+
export type NexVendasJourneyPaymentState = 'none' | 'awaiting_payment' | 'compensating' | 'paid';
|
|
73
|
+
/**
|
|
74
|
+
* Dados do boleto avulso Asaas (Q3/Q8: boleto com pix embutido, não assinatura
|
|
75
|
+
* BOLETO). Nunca há dado de cartão aqui — o cartão é sempre checkout hospedado.
|
|
76
|
+
*/
|
|
77
|
+
export interface INexVendasJourneyBoleto {
|
|
78
|
+
payment_id?: string | null;
|
|
79
|
+
invoice_url?: string | null;
|
|
80
|
+
bank_slip_url?: string | null;
|
|
81
|
+
pix_qr_code?: string | null;
|
|
82
|
+
pix_copy_paste?: string | null;
|
|
83
|
+
/** Data civil `YYYY-MM-DD`. */
|
|
84
|
+
due_date?: string | null;
|
|
85
|
+
value?: number | null;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Trilha de webhooks do pagamento. A chave de dedupe é `(event, payment_id)`:
|
|
89
|
+
* o Asaas entrega at-least-once e o mesmo evento reentra.
|
|
90
|
+
*/
|
|
91
|
+
export interface INexVendasJourneyPaymentWebhookEvent {
|
|
92
|
+
event: string;
|
|
93
|
+
payment_id?: string | null;
|
|
94
|
+
payment_status?: string | null;
|
|
95
|
+
subscription_id?: string | null;
|
|
96
|
+
at: Date;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Artefato descartado quando o cliente troca de método. Fica registrado porque
|
|
100
|
+
* um checkout expirado ou um boleto cancelado ainda pode receber webhook.
|
|
101
|
+
*/
|
|
102
|
+
export interface INexVendasJourneyPaymentSuperseded {
|
|
103
|
+
method: NexVendasJourneyPaymentMethod;
|
|
104
|
+
kind: NexVendasJourneyPaymentKind;
|
|
105
|
+
checkout_id?: string | null;
|
|
106
|
+
payment_id?: string | null;
|
|
107
|
+
payment_link_id?: string | null;
|
|
108
|
+
at: Date;
|
|
109
|
+
/** `false` quando a API do provider recusou expirar/cancelar o artefato. */
|
|
110
|
+
revoked?: boolean | null;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Bloco `payment` da jornada. Um artefato por vez; trocar de método marca o
|
|
114
|
+
* anterior em `superseded` e cria outro.
|
|
115
|
+
*/
|
|
116
|
+
export interface INexVendasJourneyPayment {
|
|
117
|
+
state: NexVendasJourneyPaymentState;
|
|
118
|
+
method?: NexVendasJourneyPaymentMethod | null;
|
|
119
|
+
kind?: NexVendasJourneyPaymentKind | null;
|
|
120
|
+
checkout_id?: string | null;
|
|
121
|
+
redirect_url?: string | null;
|
|
122
|
+
expires_at?: Date | null;
|
|
123
|
+
boleto?: INexVendasJourneyBoleto | null;
|
|
124
|
+
payment_link_id?: string | null;
|
|
125
|
+
link?: string | null;
|
|
126
|
+
/** Id da 1ª cobrança — a assinatura não devolve isso na criação. */
|
|
127
|
+
first_payment_id?: string | null;
|
|
128
|
+
subscription_id?: string | null;
|
|
129
|
+
paid_at?: Date | null;
|
|
130
|
+
created_at?: Date | null;
|
|
131
|
+
webhook_events?: INexVendasJourneyPaymentWebhookEvent[] | null;
|
|
132
|
+
superseded?: INexVendasJourneyPaymentSuperseded[] | null;
|
|
133
|
+
last_error?: string | null;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Boleto na projeção pública: sem `payment_id`. O id da cobrança no Asaas é
|
|
137
|
+
* chave de roteamento interna, e o artefato do POST já o omite — a projeção
|
|
138
|
+
* pública não pode ser mais generosa que ele.
|
|
139
|
+
*/
|
|
140
|
+
export interface INexVendasJourneyBoletoPublic {
|
|
141
|
+
invoice_url: string | null;
|
|
142
|
+
bank_slip_url: string | null;
|
|
143
|
+
pix_qr_code: string | null;
|
|
144
|
+
pix_copy_paste: string | null;
|
|
145
|
+
due_date: string | null;
|
|
146
|
+
value: number | null;
|
|
147
|
+
}
|
|
148
|
+
/** Projeção pública do bloco: sem ids internos de assinatura nem trilha de webhook. */
|
|
149
|
+
export interface INexVendasJourneyPaymentPublic {
|
|
150
|
+
state: NexVendasJourneyPaymentState;
|
|
151
|
+
method: NexVendasJourneyPaymentMethod | null;
|
|
152
|
+
kind: NexVendasJourneyPaymentKind | null;
|
|
153
|
+
redirect_url: string | null;
|
|
154
|
+
expires_at: Date | null;
|
|
155
|
+
boleto: INexVendasJourneyBoletoPublic | null;
|
|
156
|
+
link: string | null;
|
|
157
|
+
paid_at: Date | null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Trilha SEMÂNTICA da jornada. Não substitui a subcollection `actions` que o
|
|
161
|
+
* DAL grava: aquela é auditoria campo-a-campo, esta é a narrativa do funil.
|
|
162
|
+
*/
|
|
163
|
+
export interface INexVendasJourneyEvent {
|
|
164
|
+
type: string;
|
|
165
|
+
at: Date;
|
|
166
|
+
/** `system`, `customer` ou o id do usuário de backoffice. */
|
|
167
|
+
actor?: string | null;
|
|
168
|
+
data?: Record<string, unknown> | null;
|
|
169
|
+
}
|
|
170
|
+
export interface INexVendasJourneyNotification {
|
|
171
|
+
channel: 'whatsapp' | 'email' | (string & {});
|
|
172
|
+
/** Passo do funil que originou o envio (ex.: `signed`). */
|
|
173
|
+
step: string;
|
|
174
|
+
dedup_key: string;
|
|
175
|
+
task_id?: string | null;
|
|
176
|
+
sent_at: Date;
|
|
177
|
+
error?: string | null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Slots que disparam efeito externo NÃO-idempotente e por isso precisam de
|
|
181
|
+
* reserva transacional: criar o contrato, criar o envelope de assinatura e
|
|
182
|
+
* (feat-131) criar o artefato de pagamento.
|
|
183
|
+
*
|
|
184
|
+
* `payment` difere dos outros dois num ponto: contrato e envelope são efeito
|
|
185
|
+
* ÚNICO por jornada, enquanto o artefato de pagamento pode legitimamente ser
|
|
186
|
+
* recriado quando o cliente troca de método. Por isso o slot de pagamento é um
|
|
187
|
+
* mutex puro — não tem valor "definitivo" que o torne `already_done`.
|
|
188
|
+
*/
|
|
189
|
+
export type NexVendasJourneySlot = 'contract' | 'signature' | 'payment';
|
|
190
|
+
/**
|
|
191
|
+
* Marca de reserva de um slot, gravada e liberada dentro de transaction.
|
|
192
|
+
*
|
|
193
|
+
* Existe porque um guard por leitura não segura corrida: dois POSTs em voo liam
|
|
194
|
+
* o `contract_ref` vazio ao mesmo tempo e criavam dois contratos, um órfão.
|
|
195
|
+
*
|
|
196
|
+
* `expires_at` é gravado (em vez de derivado na leitura) para que a reserva seja
|
|
197
|
+
* legível por quem abrir o documento: dá para ver que há um efeito externo em
|
|
198
|
+
* curso e até quando ele bloqueia uma nova tentativa. Passado o prazo, outro
|
|
199
|
+
* processo reassume — é o que impede que um crash trave o slot para sempre.
|
|
200
|
+
*/
|
|
201
|
+
export interface INexVendasJourneySlotClaim {
|
|
202
|
+
claimed_at: Date;
|
|
203
|
+
expires_at: Date;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Doc ID = `short_code` da proposta. É o aglutinador da retomada (D11) e a
|
|
207
|
+
* idempotência estrutural do aceite: aceitar duas vezes é um create que colide,
|
|
208
|
+
* não um segundo documento.
|
|
209
|
+
*/
|
|
210
|
+
export interface INexVendasJourney extends IFireGlobalDoc {
|
|
211
|
+
short_code: string;
|
|
212
|
+
status: NexVendasJourneyStatus;
|
|
213
|
+
origem: NexFinopsProposalOrigem;
|
|
214
|
+
proposal_ref: string;
|
|
215
|
+
contract_ref?: string | null;
|
|
216
|
+
tenant_ref?: string | null;
|
|
217
|
+
customer_id?: string | null;
|
|
218
|
+
customer_data?: INexVendasJourneyCustomerData | null;
|
|
219
|
+
signature?: INexVendasJourneySignature | null;
|
|
220
|
+
payment?: INexVendasJourneyPayment | null;
|
|
221
|
+
/**
|
|
222
|
+
* Espelho PLANO de todo id externo de pagamento que a jornada já produziu —
|
|
223
|
+
* checkout, cobrança, assinatura e link, **inclusive os superseded**.
|
|
224
|
+
*
|
|
225
|
+
* É o índice de roteamento do webhook: `array-contains` sobre um array usa
|
|
226
|
+
* índice single-field automático, então uma consulta só acha a jornada por
|
|
227
|
+
* qualquer das chaves, sem índice composto. Sem este campo o roteamento
|
|
228
|
+
* dependeria de o `externalReference` propagar do checkout para a cobrança
|
|
229
|
+
* (INCERTO, não validado em sandbox) e um pagamento de artefato trocado ficaria
|
|
230
|
+
* órfão, com a assinatura cobrando e a jornada parada.
|
|
231
|
+
*/
|
|
232
|
+
payment_refs?: string[] | null;
|
|
233
|
+
/** Cliente Asaas da conta MASTER, reusado entre tentativas de pagamento. */
|
|
234
|
+
asaas_customer_id?: string | null;
|
|
235
|
+
events: INexVendasJourneyEvent[];
|
|
236
|
+
notifications: INexVendasJourneyNotification[];
|
|
237
|
+
/**
|
|
238
|
+
* Reservas em curso, por slot. Bookkeeping do mecanismo de idempotência, não
|
|
239
|
+
* dado de negócio: nasce e morre dentro das transactions que criam contrato e
|
|
240
|
+
* envelope. Slot ausente = nada em curso.
|
|
241
|
+
*/
|
|
242
|
+
claims?: Partial<Record<NexVendasJourneySlot, INexVendasJourneySlotClaim>> | null;
|
|
243
|
+
abandon_reason?: string | null;
|
|
244
|
+
}
|
|
245
|
+
/** Nunca e-mail, telefone ou documento completos — só o suficiente para o cliente se reconhecer. */
|
|
246
|
+
export interface INexVendasJourneyCustomerMasked {
|
|
247
|
+
name: string | null;
|
|
248
|
+
email_masked: string | null;
|
|
249
|
+
phone_masked: string | null;
|
|
250
|
+
document_masked: string | null;
|
|
251
|
+
}
|
|
252
|
+
/** O que o endpoint sem auth expõe. Sem ids internos de customer/tenant/contrato. */
|
|
253
|
+
export interface INexVendasJourneyPublic {
|
|
254
|
+
short_code: string;
|
|
255
|
+
status: NexVendasJourneyStatus;
|
|
256
|
+
next_step: NexVendasJourneyNextStep;
|
|
257
|
+
proposal: INexFinopsProposalPublic;
|
|
258
|
+
data_submitted: boolean;
|
|
259
|
+
customer_masked: INexVendasJourneyCustomerMasked | null;
|
|
260
|
+
signature: {
|
|
261
|
+
status: NexVendasJourneySignatureStatus;
|
|
262
|
+
sign_url: string | null;
|
|
263
|
+
};
|
|
264
|
+
payment: INexVendasJourneyPaymentPublic;
|
|
265
|
+
contract: {
|
|
266
|
+
status: NexFinopsContractStatus;
|
|
267
|
+
} | null;
|
|
268
|
+
}
|
|
269
|
+
/** Falha de verificação devolvida no 422 de `POST /journeys/:short_code/data`. */
|
|
270
|
+
export interface INexVendasJourneyVerificationFailure {
|
|
271
|
+
id: string;
|
|
272
|
+
message: string;
|
|
273
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NEX_VENDAS_JOURNEY_OPEN_STATUSES = exports.NEX_VENDAS_JOURNEY_STATUS_TRANSITIONS = void 0;
|
|
4
|
+
exports.NEX_VENDAS_JOURNEY_STATUS_TRANSITIONS = {
|
|
5
|
+
proposta_enviada: ['proposta_aceita', 'expirada', 'abandonada'],
|
|
6
|
+
proposta_aceita: ['dados_coletados', 'expirada', 'abandonada'],
|
|
7
|
+
dados_coletados: ['contrato_assinado', 'abandonada'],
|
|
8
|
+
contrato_assinado: ['aguardando_pagamento', 'abandonada'],
|
|
9
|
+
aguardando_pagamento: ['pago', 'abandonada'],
|
|
10
|
+
pago: ['tenant_criado', 'abandonada'],
|
|
11
|
+
tenant_criado: ['onboarding_em_curso', 'abandonada'],
|
|
12
|
+
onboarding_em_curso: ['concluida', 'abandonada'],
|
|
13
|
+
concluida: [],
|
|
14
|
+
expirada: [],
|
|
15
|
+
abandonada: [],
|
|
16
|
+
};
|
|
17
|
+
/** Status em que a jornada ainda aceita ação do cliente na página pública. */
|
|
18
|
+
exports.NEX_VENDAS_JOURNEY_OPEN_STATUSES = [
|
|
19
|
+
'proposta_enviada',
|
|
20
|
+
'proposta_aceita',
|
|
21
|
+
'dados_coletados',
|
|
22
|
+
];
|