evo360-types 1.3.644 → 1.3.651

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.
@@ -225,6 +225,13 @@ exports.zAsaasEnvAuthConfigSchema = zod_1.z
225
225
  rate_limit_max_per_minute: zod_1.z.number().optional(),
226
226
  })
227
227
  .optional(),
228
+ /** feat-253 — IP enviado na cobrança com token quando a credencial não tem o do pagador. */
229
+ card_token: zod_1.z
230
+ .object({
231
+ remote_ip: zod_1.z.string().max(64).optional().nullable(),
232
+ })
233
+ .strip()
234
+ .optional(),
228
235
  })
229
236
  .passthrough();
230
237
  exports.zAsaasNfseCapabilitiesSchema = zod_1.z.object({
@@ -241,10 +248,14 @@ exports.zAsaasEnvFlagSchema = zod_1.z
241
248
  .strip();
242
249
  exports.zAsaasPaymentsCapabilitiesSchema = zod_1.z.object({
243
250
  enabled: zod_1.z.boolean(),
244
- /** feat-253 — kill-switch do caminho A. */
251
+ /** feat-253 — kill-switch do caminho A. @deprecated (caminho A saiu do modelo). */
245
252
  card_subscription_adjust: exports.zAsaasEnvFlagSchema.optional(),
246
- /** feat-253 — flag do caminho B (token). */
253
+ /** feat-253 — flag do caminho B (captura + cobrança com token). */
247
254
  card_token: exports.zAsaasEnvFlagSchema.optional(),
255
+ /** feat-253 — fatura hospedada (contingência C + entrada da captura). */
256
+ hosted_invoice: exports.zAsaasEnvFlagSchema.optional(),
257
+ /** feat-253 — job de cobrança automática no vencimento (fatia 8). */
258
+ card_token_auto: exports.zAsaasEnvFlagSchema.optional(),
248
259
  });
249
260
  exports.zAsaasProviderCapabilitiesSchema = zod_1.z.object({
250
261
  nfse: exports.zAsaasNfseCapabilitiesSchema,
@@ -951,13 +962,26 @@ exports.zNexFinopsContractPaymentMethodsWriteSchema = zod_1.z
951
962
  default_payment_method_id: zod_1.z.string().min(1).max(128).optional().nullable(),
952
963
  })
953
964
  .strip();
954
- /** `POST /billings/:id/card-charge` (F2/F3). */
965
+ /**
966
+ * `POST /billings/:id/card-charge` (feat-253 F2b).
967
+ * - `preview`: prévia da cobrança no cartão salvo (não escreve).
968
+ * - `charge_now`: cobra no cartão salvo (`confirm` + `expected_value`).
969
+ * - `send_invoice`: fatura hospedada do Asaas (`billing_type` CREDIT_CARD captura o cartão; UNDEFINED = cliente escolhe).
970
+ * - `cancel_invoice`: cancela a fatura aberta (`asaas_payment_id`).
971
+ * `.strip()`: dados de cartão/token nunca entram por aqui.
972
+ */
955
973
  exports.zNexFinopsBillingCardChargeSchema = zod_1.z
956
974
  .object({
957
- action: zod_1.z.enum(["preview", "adjust", "revert", "charge_now"]),
958
- expected_value: zod_1.z.number(),
975
+ action: zod_1.z.enum(["preview", "charge_now", "send_invoice", "cancel_invoice"]),
976
+ expected_value: zod_1.z.number().optional(),
959
977
  asaas_payment_id: zod_1.z.string().min(1).max(128).optional(),
960
978
  confirm: zod_1.z.boolean().optional(),
979
+ capture_card: zod_1.z.boolean().optional(),
980
+ billing_type: zod_1.z.enum(["CREDIT_CARD", "UNDEFINED"]).optional(),
981
+ provider_id: zod_1.z.string().min(1).max(128).optional(),
982
+ env: zod_1.z.enum(["sandbox", "production"]).optional(),
983
+ taker_id: zod_1.z.string().min(1).max(128).optional(),
984
+ allow_early: zod_1.z.boolean().optional(),
961
985
  })
962
986
  .strip();
963
987
  /** `POST /payment-methods/discover` — sem `confirm` é dry-run. */
@@ -237,6 +237,13 @@ export const zAsaasEnvAuthConfigSchema = z
237
237
  rate_limit_max_per_minute: z.number().optional(),
238
238
  })
239
239
  .optional(),
240
+ /** feat-253 — IP enviado na cobrança com token quando a credencial não tem o do pagador. */
241
+ card_token: z
242
+ .object({
243
+ remote_ip: z.string().max(64).optional().nullable(),
244
+ })
245
+ .strip()
246
+ .optional(),
240
247
  })
241
248
  .passthrough();
242
249
 
@@ -256,10 +263,14 @@ export const zAsaasEnvFlagSchema = z
256
263
 
257
264
  export const zAsaasPaymentsCapabilitiesSchema = z.object({
258
265
  enabled: z.boolean(),
259
- /** feat-253 — kill-switch do caminho A. */
266
+ /** feat-253 — kill-switch do caminho A. @deprecated (caminho A saiu do modelo). */
260
267
  card_subscription_adjust: zAsaasEnvFlagSchema.optional(),
261
- /** feat-253 — flag do caminho B (token). */
268
+ /** feat-253 — flag do caminho B (captura + cobrança com token). */
262
269
  card_token: zAsaasEnvFlagSchema.optional(),
270
+ /** feat-253 — fatura hospedada (contingência C + entrada da captura). */
271
+ hosted_invoice: zAsaasEnvFlagSchema.optional(),
272
+ /** feat-253 — job de cobrança automática no vencimento (fatia 8). */
273
+ card_token_auto: zAsaasEnvFlagSchema.optional(),
263
274
  });
264
275
 
265
276
  export const zAsaasProviderCapabilitiesSchema = z.object({
@@ -1046,13 +1057,26 @@ export const zNexFinopsContractPaymentMethodsWriteSchema = z
1046
1057
  })
1047
1058
  .strip();
1048
1059
 
1049
- /** `POST /billings/:id/card-charge` (F2/F3). */
1060
+ /**
1061
+ * `POST /billings/:id/card-charge` (feat-253 F2b).
1062
+ * - `preview`: prévia da cobrança no cartão salvo (não escreve).
1063
+ * - `charge_now`: cobra no cartão salvo (`confirm` + `expected_value`).
1064
+ * - `send_invoice`: fatura hospedada do Asaas (`billing_type` CREDIT_CARD captura o cartão; UNDEFINED = cliente escolhe).
1065
+ * - `cancel_invoice`: cancela a fatura aberta (`asaas_payment_id`).
1066
+ * `.strip()`: dados de cartão/token nunca entram por aqui.
1067
+ */
1050
1068
  export const zNexFinopsBillingCardChargeSchema = z
1051
1069
  .object({
1052
- action: z.enum(["preview", "adjust", "revert", "charge_now"]),
1053
- expected_value: z.number(),
1070
+ action: z.enum(["preview", "charge_now", "send_invoice", "cancel_invoice"]),
1071
+ expected_value: z.number().optional(),
1054
1072
  asaas_payment_id: z.string().min(1).max(128).optional(),
1055
1073
  confirm: z.boolean().optional(),
1074
+ capture_card: z.boolean().optional(),
1075
+ billing_type: z.enum(["CREDIT_CARD", "UNDEFINED"]).optional(),
1076
+ provider_id: z.string().min(1).max(128).optional(),
1077
+ env: z.enum(["sandbox", "production"]).optional(),
1078
+ taker_id: z.string().min(1).max(128).optional(),
1079
+ allow_early: z.boolean().optional(),
1056
1080
  })
1057
1081
  .strip();
1058
1082
 
@@ -165,10 +165,28 @@ export interface ICsqAlert {
165
165
  * Nexus linkar `/{tenant}/evo-med/calendar/{calendar_id}/appointment/{appointment_id}`. */
166
166
  appointment_id?: string;
167
167
  calendar_id?: string;
168
+ /** So em alertas de agenda (feat-206 F6a): o claim que gerou o alerta, gravado
169
+ * quando ele nasce. As rechecagens tardias (passos 3 e 4, `closed_at + 4 h` e
170
+ * `+ 24 h`) reconferem a agenda a partir DELE, porque o claim so existe em
171
+ * `report.claims` da avaliacao que o extraiu e um laudo mais novo do mesmo
172
+ * lead pode ter herdado o alerta. Ausente em alertas antigos: passo tardio
173
+ * nao se aplica (sem backfill). */
174
+ appointment_claim?: ICsqAlertAppointmentClaim;
168
175
  /** Ticket em que o alerta apareceu pela primeira vez (herdado x novo). */
169
176
  first_seen_ticket_id: string;
170
177
  created_at: Date;
171
178
  }
179
+ /** O que foi informado ao lead, copiado do claim `appointment_informed`
180
+ * (feat-206 F6a). Sem `evidence`: a evidencia ja esta em `ICsqAlert.evidence`. */
181
+ export interface ICsqAlertAppointmentClaim {
182
+ /** YYYY-MM-DD, TZ do tenant. */
183
+ date: string;
184
+ /** HH:mm. */
185
+ time?: string;
186
+ professional?: string;
187
+ patient_name?: string;
188
+ modality?: string;
189
+ }
172
190
  /** Indicadores quantitativos calculados por codigo, por lente
173
191
  * ("neste atendimento" e "na jornada"). `null` = nao aplicavel a lente ou
174
192
  * indisponivel (ex.: metricas liquidas sem horario comercial configurado). */
@@ -266,6 +284,10 @@ export interface ICsqClaimAppointmentInformed {
266
284
  modality?: string;
267
285
  /** Nome do paciente informado na conversa (mae/filho: pode diferir do lead). */
268
286
  patient_name?: string;
287
+ /** feat-206 F6: o agendamento informado deixou de valer DEPOIS, na mesma
288
+ * jornada (o lead cancelou/desistiu, ou foi trocado por outro horario). O
289
+ * codigo nao exige registro na agenda de um claim assim. */
290
+ superseded?: boolean;
269
291
  evidence: ICsqEvidence[];
270
292
  }
271
293
  /** "Prometi X ate quando". */
@@ -328,11 +350,19 @@ export interface ICsqClaimPriceInformed {
328
350
  /** Uniao discriminada por `type` — o juiz extrai, o codigo verifica (§5). */
329
351
  export type ICsqClaim = ICsqClaimAppointmentInformed | ICsqClaimPromise | ICsqClaimDataCollected | ICsqClaimRequiredData | ICsqClaimOutcome | ICsqClaimQuestionRequiresAnswer | ICsqClaimFirstConcreteOffer | ICsqClaimPatientStatus | ICsqClaimPriceInformed;
330
352
  export type CsqClaimType = ICsqClaim["type"];
353
+ /** Como o agendamento da agenda foi identificado como sendo do paciente da
354
+ * conversa, na ordem de forca da prova (feat-154 B1; `name_fuzzy` na feat-206
355
+ * F6a: nome com grafia diferente, so no mesmo dia e hora do claim). */
356
+ export type CsqAppointmentMatch = "linked" | "phone" | "name" | "name_fuzzy";
357
+ /** Resultado do cruzamento por codigo.
358
+ * - `cancelled_after` (feat-206 F6a): o agendamento EXISTIU e foi cancelado ou
359
+ * excluido DEPOIS da mensagem que o informou ao lead — nao e "nao registrado". */
360
+ export type CsqCrossCheckResult = "match" | "mismatch" | "missing" | "inconclusive" | "cancelled_after";
331
361
  /** Linha da tabela "o que foi dito x o que consta" (report-spec §2.5). */
332
362
  export interface ICsqCrossCheck {
333
363
  claim_type: CsqClaimType;
334
364
  /** Resultado da verificacao por codigo. */
335
- result: "match" | "mismatch" | "missing" | "inconclusive";
365
+ result: CsqCrossCheckResult;
336
366
  /** O que foi dito (resumo do claim). */
337
367
  expected: string;
338
368
  /** O que consta no sistema. */
@@ -343,6 +373,8 @@ export interface ICsqCrossCheck {
343
373
  /** So em cruzamentos de agenda: agendamento encontrado (link no Nexus). */
344
374
  appointment_id?: string;
345
375
  calendar_id?: string;
376
+ /** So em cruzamentos de agenda: como o agendamento foi identificado. */
377
+ matched_by?: CsqAppointmentMatch;
346
378
  }
347
379
  /** Nota de um criterio. Todo criterio < 100 exige evidencia valida; sem ela o
348
380
  * codigo zera para `null` e tira do denominador. */
@@ -453,7 +485,13 @@ export type CsqTriageMode = "skip_llm" | "full_review";
453
485
  /** Motivo da triagem. `skip_llm` sempre tem motivo; `full_review` normalmente
454
486
  * nao tem (lista vazia), salvo `forced` (replay do dry-run com
455
487
  * `--force-review`; producao nunca usa). */
456
- export type CsqTriageReason = "document_only" | "spam_close" | "reopen_without_new_messages" | "automation_only" | "ack_only" | "forced";
488
+ export type CsqTriageReason = "document_only" | "spam_close" | "reopen_without_new_messages" | "automation_only" | "ack_only"
489
+ /** feat-206 F6b: nenhum texto livre de atendente humano nem nota; a HubIA
490
+ * falou no maximo uma vez (saudacao/fora do expediente). */
491
+ | "no_attendant_message"
492
+ /** feat-206 F6b: o lead nao escreveu texto livre e todo texto da atendente
493
+ * e confirmacao curta (sem data/hora, valor ou pergunta). */
494
+ | "attendant_ack_only" | "forced";
457
495
  export interface ICsqTriageDecision {
458
496
  mode: CsqTriageMode;
459
497
  reasons: CsqTriageReason[];
@@ -558,6 +596,13 @@ export interface ICsqAppointmentFact {
558
596
  professional_name?: string;
559
597
  modality?: string;
560
598
  created_at?: Date;
599
+ /** feat-206 F6a: agendamento que saiu da agenda — excluido (`deleted_at`) ou
600
+ * cancelado (`status_base` cancelado). So vem marcado na leitura de
601
+ * candidatos da agenda; o verificador nunca o trata como agendamento vivo. */
602
+ removed?: "deleted" | "cancelled";
603
+ /** Quando saiu: `deleted_at`; cancelado sem `deleted_at` usa `updated_at`.
604
+ * Ausente = nao comparavel com a mensagem que informou o agendamento. */
605
+ removed_at?: Date;
561
606
  }
562
607
  /** Agendamento envolvido numa sobreposicao (lote 9). */
563
608
  export interface ICsqOverlapAppointmentFact {
@@ -365,11 +365,30 @@ export interface ICsqAlert {
365
365
  * Nexus linkar `/{tenant}/evo-med/calendar/{calendar_id}/appointment/{appointment_id}`. */
366
366
  appointment_id?: string;
367
367
  calendar_id?: string;
368
+ /** So em alertas de agenda (feat-206 F6a): o claim que gerou o alerta, gravado
369
+ * quando ele nasce. As rechecagens tardias (passos 3 e 4, `closed_at + 4 h` e
370
+ * `+ 24 h`) reconferem a agenda a partir DELE, porque o claim so existe em
371
+ * `report.claims` da avaliacao que o extraiu e um laudo mais novo do mesmo
372
+ * lead pode ter herdado o alerta. Ausente em alertas antigos: passo tardio
373
+ * nao se aplica (sem backfill). */
374
+ appointment_claim?: ICsqAlertAppointmentClaim;
368
375
  /** Ticket em que o alerta apareceu pela primeira vez (herdado x novo). */
369
376
  first_seen_ticket_id: string;
370
377
  created_at: Date;
371
378
  }
372
379
 
380
+ /** O que foi informado ao lead, copiado do claim `appointment_informed`
381
+ * (feat-206 F6a). Sem `evidence`: a evidencia ja esta em `ICsqAlert.evidence`. */
382
+ export interface ICsqAlertAppointmentClaim {
383
+ /** YYYY-MM-DD, TZ do tenant. */
384
+ date: string;
385
+ /** HH:mm. */
386
+ time?: string;
387
+ professional?: string;
388
+ patient_name?: string;
389
+ modality?: string;
390
+ }
391
+
373
392
  // ───────── Indicadores (report-spec §3) ─────────
374
393
 
375
394
  /** Indicadores quantitativos calculados por codigo, por lente
@@ -478,6 +497,10 @@ export interface ICsqClaimAppointmentInformed {
478
497
  modality?: string;
479
498
  /** Nome do paciente informado na conversa (mae/filho: pode diferir do lead). */
480
499
  patient_name?: string;
500
+ /** feat-206 F6: o agendamento informado deixou de valer DEPOIS, na mesma
501
+ * jornada (o lead cancelou/desistiu, ou foi trocado por outro horario). O
502
+ * codigo nao exige registro na agenda de um claim assim. */
503
+ superseded?: boolean;
481
504
  evidence: ICsqEvidence[];
482
505
  }
483
506
 
@@ -560,11 +583,26 @@ export type ICsqClaim =
560
583
 
561
584
  export type CsqClaimType = ICsqClaim["type"];
562
585
 
586
+ /** Como o agendamento da agenda foi identificado como sendo do paciente da
587
+ * conversa, na ordem de forca da prova (feat-154 B1; `name_fuzzy` na feat-206
588
+ * F6a: nome com grafia diferente, so no mesmo dia e hora do claim). */
589
+ export type CsqAppointmentMatch = "linked" | "phone" | "name" | "name_fuzzy";
590
+
591
+ /** Resultado do cruzamento por codigo.
592
+ * - `cancelled_after` (feat-206 F6a): o agendamento EXISTIU e foi cancelado ou
593
+ * excluido DEPOIS da mensagem que o informou ao lead — nao e "nao registrado". */
594
+ export type CsqCrossCheckResult =
595
+ | "match"
596
+ | "mismatch"
597
+ | "missing"
598
+ | "inconclusive"
599
+ | "cancelled_after";
600
+
563
601
  /** Linha da tabela "o que foi dito x o que consta" (report-spec §2.5). */
564
602
  export interface ICsqCrossCheck {
565
603
  claim_type: CsqClaimType;
566
604
  /** Resultado da verificacao por codigo. */
567
- result: "match" | "mismatch" | "missing" | "inconclusive";
605
+ result: CsqCrossCheckResult;
568
606
  /** O que foi dito (resumo do claim). */
569
607
  expected: string;
570
608
  /** O que consta no sistema. */
@@ -575,6 +613,8 @@ export interface ICsqCrossCheck {
575
613
  /** So em cruzamentos de agenda: agendamento encontrado (link no Nexus). */
576
614
  appointment_id?: string;
577
615
  calendar_id?: string;
616
+ /** So em cruzamentos de agenda: como o agendamento foi identificado. */
617
+ matched_by?: CsqAppointmentMatch;
578
618
  }
579
619
 
580
620
  // ───────── Avaliacao (report-spec §4) ─────────
@@ -714,6 +754,12 @@ export type CsqTriageReason =
714
754
  | "reopen_without_new_messages"
715
755
  | "automation_only"
716
756
  | "ack_only"
757
+ /** feat-206 F6b: nenhum texto livre de atendente humano nem nota; a HubIA
758
+ * falou no maximo uma vez (saudacao/fora do expediente). */
759
+ | "no_attendant_message"
760
+ /** feat-206 F6b: o lead nao escreveu texto livre e todo texto da atendente
761
+ * e confirmacao curta (sem data/hora, valor ou pergunta). */
762
+ | "attendant_ack_only"
717
763
  | "forced";
718
764
 
719
765
  export interface ICsqTriageDecision {
@@ -835,6 +881,13 @@ export interface ICsqAppointmentFact {
835
881
  professional_name?: string;
836
882
  modality?: string;
837
883
  created_at?: Date;
884
+ /** feat-206 F6a: agendamento que saiu da agenda — excluido (`deleted_at`) ou
885
+ * cancelado (`status_base` cancelado). So vem marcado na leitura de
886
+ * candidatos da agenda; o verificador nunca o trata como agendamento vivo. */
887
+ removed?: "deleted" | "cancelled";
888
+ /** Quando saiu: `deleted_at`; cancelado sem `deleted_at` usa `updated_at`.
889
+ * Ausente = nao comparavel com a mensagem que informou o agendamento. */
890
+ removed_at?: Date;
838
891
  }
839
892
 
840
893
  /** Agendamento envolvido numa sobreposicao (lote 9). */
@@ -84,12 +84,16 @@ export interface INexFinopsBillingPaymentMethodSnapshot {
84
84
  }
85
85
  export type NexFinopsBillingCardChargeMode = 'subscription_adjust'
86
86
  /** Contingência A′. */
87
- | 'subscription_value_update' | 'token_charge';
88
- export type NexFinopsBillingCardChargeStatus = 'scheduled' | 'stale' | 'confirmed' | 'refused' | 'refunded' | 'chargeback' | 'canceled' | 'reverted';
87
+ | 'subscription_value_update' | 'token_charge'
88
+ /** feat-253 F2b: fatura avulsa hospedada no Asaas (cartão com captura, ou cliente escolhe). */
89
+ | 'hosted_invoice';
90
+ export type NexFinopsBillingCardChargeStatus = 'scheduled'
91
+ /** Fatura enviada aguardando pagamento, ou cobrança com token em análise. */
92
+ | 'pending' | 'stale' | 'confirmed' | 'refused' | 'refunded' | 'chargeback' | 'canceled' | 'reverted';
89
93
  export interface INexFinopsBillingCardChargeHistoryEntry {
90
94
  at: string;
91
95
  by: string | null;
92
- action: 'adjust' | 'readjust' | 'revert' | 'charge' | 'event';
96
+ action: 'adjust' | 'readjust' | 'revert' | 'charge' | 'event' | 'send_invoice' | 'cancel_invoice' | 'capture';
93
97
  value?: number | null;
94
98
  event?: string | null;
95
99
  }
@@ -106,6 +110,7 @@ export interface INexFinopsBillingCardCharge {
106
110
  value_after: number;
107
111
  status: NexFinopsBillingCardChargeStatus;
108
112
  raw_status?: string | null;
113
+ /** Mantido por compatibilidade: na F2b é o momento/autor da criação do `pay_`. */
109
114
  adjusted_at: string;
110
115
  adjusted_by: {
111
116
  kind: 'user' | 'system';
@@ -119,7 +124,21 @@ export interface INexFinopsBillingCardCharge {
119
124
  } | null;
120
125
  /** Capado em 30 entradas. */
121
126
  history: INexFinopsBillingCardChargeHistoryEntry[];
127
+ /** Fatura hospedada que, paga no cartão, captura o token (`billing_type: 'CREDIT_CARD'`). */
128
+ capture_card?: boolean | null;
129
+ /** `invoiceUrl` da fatura hospedada (pagável pelo cliente). */
130
+ invoice_url?: string | null;
131
+ /** `billingType` pedido ao Asaas. */
132
+ billing_type?: 'CREDIT_CARD' | 'UNDEFINED' | null;
133
+ /** Resultado da captura do token após o pagamento. */
134
+ capture_status?: NexFinopsBillingCardCaptureStatus | null;
135
+ /** Método `atok_` capturado por esta cobrança (a tela oferece usar como padrão). Interno (fora do portal). */
136
+ captured_payment_method_id?: string | null;
137
+ /** Provider/ambiente onde o `pay_` foi criado. */
138
+ provider_id?: string | null;
139
+ env?: 'sandbox' | 'production' | null;
122
140
  }
141
+ export type NexFinopsBillingCardCaptureStatus = 'captured' | 'no_token' | 'skipped';
123
142
  export interface INexFinopsBilling extends IFireGlobalDoc {
124
143
  customer_id: string;
125
144
  customer_ref?: string | null;
@@ -151,6 +170,11 @@ export interface INexFinopsBilling extends IFireGlobalDoc {
151
170
  /** Todos os `pay_` do Asaas já associados (A e B) — chave do roteamento do webhook. Interno. */
152
171
  card_payment_ids?: string[];
153
172
  card_charge?: INexFinopsBillingCardCharge | null;
173
+ /** Trava curta da cobrança no cartão (`charge_now`). Interno (fora das projeções). */
174
+ card_charge_lock?: {
175
+ by: string | null;
176
+ until: string;
177
+ } | null;
154
178
  }
155
179
  /**
156
180
  * Transições permitidas de status de cobrança.
@@ -107,10 +107,14 @@ export type NexFinopsBillingCardChargeMode =
107
107
  | 'subscription_adjust'
108
108
  /** Contingência A′. */
109
109
  | 'subscription_value_update'
110
- | 'token_charge';
110
+ | 'token_charge'
111
+ /** feat-253 F2b: fatura avulsa hospedada no Asaas (cartão com captura, ou cliente escolhe). */
112
+ | 'hosted_invoice';
111
113
 
112
114
  export type NexFinopsBillingCardChargeStatus =
113
115
  | 'scheduled'
116
+ /** Fatura enviada aguardando pagamento, ou cobrança com token em análise. */
117
+ | 'pending'
114
118
  | 'stale'
115
119
  | 'confirmed'
116
120
  | 'refused'
@@ -122,7 +126,7 @@ export type NexFinopsBillingCardChargeStatus =
122
126
  export interface INexFinopsBillingCardChargeHistoryEntry {
123
127
  at: string;
124
128
  by: string | null;
125
- action: 'adjust' | 'readjust' | 'revert' | 'charge' | 'event';
129
+ action: 'adjust' | 'readjust' | 'revert' | 'charge' | 'event' | 'send_invoice' | 'cancel_invoice' | 'capture';
126
130
  value?: number | null;
127
131
  event?: string | null;
128
132
  }
@@ -140,6 +144,7 @@ export interface INexFinopsBillingCardCharge {
140
144
  value_after: number;
141
145
  status: NexFinopsBillingCardChargeStatus;
142
146
  raw_status?: string | null;
147
+ /** Mantido por compatibilidade: na F2b é o momento/autor da criação do `pay_`. */
143
148
  adjusted_at: string;
144
149
  adjusted_by: { kind: 'user' | 'system'; id: string | null };
145
150
  last_event?: string | null;
@@ -147,8 +152,26 @@ export interface INexFinopsBillingCardCharge {
147
152
  failure?: { event: string; description?: string | null } | null;
148
153
  /** Capado em 30 entradas. */
149
154
  history: INexFinopsBillingCardChargeHistoryEntry[];
155
+
156
+ // ── F2b (fatura hospedada / token) ──
157
+
158
+ /** Fatura hospedada que, paga no cartão, captura o token (`billing_type: 'CREDIT_CARD'`). */
159
+ capture_card?: boolean | null;
160
+ /** `invoiceUrl` da fatura hospedada (pagável pelo cliente). */
161
+ invoice_url?: string | null;
162
+ /** `billingType` pedido ao Asaas. */
163
+ billing_type?: 'CREDIT_CARD' | 'UNDEFINED' | null;
164
+ /** Resultado da captura do token após o pagamento. */
165
+ capture_status?: NexFinopsBillingCardCaptureStatus | null;
166
+ /** Método `atok_` capturado por esta cobrança (a tela oferece usar como padrão). Interno (fora do portal). */
167
+ captured_payment_method_id?: string | null;
168
+ /** Provider/ambiente onde o `pay_` foi criado. */
169
+ provider_id?: string | null;
170
+ env?: 'sandbox' | 'production' | null;
150
171
  }
151
172
 
173
+ export type NexFinopsBillingCardCaptureStatus = 'captured' | 'no_token' | 'skipped';
174
+
152
175
  // ── Main Document ──
153
176
 
154
177
  export interface INexFinopsBilling extends IFireGlobalDoc {
@@ -214,6 +237,8 @@ export interface INexFinopsBilling extends IFireGlobalDoc {
214
237
  /** Todos os `pay_` do Asaas já associados (A e B) — chave do roteamento do webhook. Interno. */
215
238
  card_payment_ids?: string[];
216
239
  card_charge?: INexFinopsBillingCardCharge | null;
240
+ /** Trava curta da cobrança no cartão (`charge_now`). Interno (fora das projeções). */
241
+ card_charge_lock?: { by: string | null; until: string } | null;
217
242
  }
218
243
 
219
244
  // ── Status transitions ──
@@ -70,6 +70,8 @@ export interface INexFinopsCustomerPaymentMethod extends IFireGlobalDoc {
70
70
  last_synced_at?: string | null;
71
71
  last_used_at?: string | null;
72
72
  last_charge?: INexFinopsPaymentMethodLastCharge | null;
73
+ /** feat-253 F2b: `asub_` migrado aponta para o `atok_` que o substituiu. */
74
+ replaced_by_payment_method_id?: string | null;
73
75
  }
74
76
  /** Prefixos determinísticos dos ids (idempotência da descoberta). */
75
77
  export declare const NEX_FINOPS_PAYMENT_METHOD_ID_PREFIX: Record<NexFinopsPaymentMethodKind, string>;
@@ -94,6 +94,8 @@ export interface INexFinopsCustomerPaymentMethod extends IFireGlobalDoc {
94
94
  last_synced_at?: string | null;
95
95
  last_used_at?: string | null;
96
96
  last_charge?: INexFinopsPaymentMethodLastCharge | null;
97
+ /** feat-253 F2b: `asub_` migrado aponta para o `atok_` que o substituiu. */
98
+ replaced_by_payment_method_id?: string | null;
97
99
  }
98
100
 
99
101
  /** Prefixos determinísticos dos ids (idempotência da descoberta). */
@@ -156,6 +156,13 @@ export interface IAsaasEnvAuthConfig {
156
156
  operational?: {
157
157
  rate_limit_max_per_minute?: number;
158
158
  };
159
+ /**
160
+ * feat-253 (caminho B) — cobrança com `creditCardToken`. `remote_ip` é o IP enviado ao Asaas
161
+ * quando a credencial não guardou o IP do pagador. Ausente nos dois → a cobrança falha fechada.
162
+ */
163
+ card_token?: {
164
+ remote_ip?: string | null;
165
+ };
159
166
  }
160
167
  export interface IAsaasNfseCapabilities {
161
168
  enabled: boolean;
@@ -170,10 +177,17 @@ export interface IAsaasEnvFlag {
170
177
  }
171
178
  export interface IAsaasPaymentsCapabilities {
172
179
  enabled: boolean;
173
- /** feat-253 — kill-switch do caminho A (ajuste do valor da cobrança pendente da assinatura). */
180
+ /**
181
+ * feat-253 — kill-switch do caminho A (ajuste do valor da cobrança pendente da assinatura).
182
+ * @deprecated O caminho A saiu do modelo (o Asaas trava valor/vencimento após a 1ª fatura paga). Não usar.
183
+ */
174
184
  card_subscription_adjust?: IAsaasEnvFlag;
175
- /** feat-253 — flag do caminho B (cobrança com `creditCardToken`). Desligado até o Asaas habilitar. */
185
+ /** feat-253 — flag do caminho B (captura do token + cobrança com `creditCardToken`). Desligado até o Asaas habilitar. */
176
186
  card_token?: IAsaasEnvFlag;
187
+ /** feat-253 — fatura hospedada do Asaas gerada pelo Nexus para a cobrança (contingência C e entrada da captura). */
188
+ hosted_invoice?: IAsaasEnvFlag;
189
+ /** feat-253 — job diário que cobra no cartão salvo no vencimento (fatia 8). */
190
+ card_token_auto?: IAsaasEnvFlag;
177
191
  }
178
192
  export interface IAsaasProviderCapabilities {
179
193
  nfse: IAsaasNfseCapabilities;
@@ -225,6 +225,14 @@ export interface IAsaasEnvAuthConfig {
225
225
  operational?: {
226
226
  rate_limit_max_per_minute?: number;
227
227
  };
228
+
229
+ /**
230
+ * feat-253 (caminho B) — cobrança com `creditCardToken`. `remote_ip` é o IP enviado ao Asaas
231
+ * quando a credencial não guardou o IP do pagador. Ausente nos dois → a cobrança falha fechada.
232
+ */
233
+ card_token?: {
234
+ remote_ip?: string | null;
235
+ };
228
236
  }
229
237
 
230
238
  export interface IAsaasNfseCapabilities {
@@ -245,10 +253,17 @@ export interface IAsaasEnvFlag {
245
253
 
246
254
  export interface IAsaasPaymentsCapabilities {
247
255
  enabled: boolean; // false for now, future for payment links/subscriptions
248
- /** feat-253 — kill-switch do caminho A (ajuste do valor da cobrança pendente da assinatura). */
256
+ /**
257
+ * feat-253 — kill-switch do caminho A (ajuste do valor da cobrança pendente da assinatura).
258
+ * @deprecated O caminho A saiu do modelo (o Asaas trava valor/vencimento após a 1ª fatura paga). Não usar.
259
+ */
249
260
  card_subscription_adjust?: IAsaasEnvFlag;
250
- /** feat-253 — flag do caminho B (cobrança com `creditCardToken`). Desligado até o Asaas habilitar. */
261
+ /** feat-253 — flag do caminho B (captura do token + cobrança com `creditCardToken`). Desligado até o Asaas habilitar. */
251
262
  card_token?: IAsaasEnvFlag;
263
+ /** feat-253 — fatura hospedada do Asaas gerada pelo Nexus para a cobrança (contingência C e entrada da captura). */
264
+ hosted_invoice?: IAsaasEnvFlag;
265
+ /** feat-253 — job diário que cobra no cartão salvo no vencimento (fatia 8). */
266
+ card_token_auto?: IAsaasEnvFlag;
252
267
  }
253
268
 
254
269
  export interface IAsaasProviderCapabilities {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.644",
3
+ "version": "1.3.651",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",