evo360-types 1.3.557 → 1.3.559

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.
@@ -12993,3 +12993,88 @@ export declare const zNexVendasJourneyPaymentSchema: z.ZodObject<{
12993
12993
  payment_link_id?: string | null | undefined;
12994
12994
  }[] | null | undefined;
12995
12995
  }>;
12996
+ /**
12997
+ * Franquia de uma métrica no contrato. `included` é número discreto e inteiro
12998
+ * (não fração): 0 = nada incluso.
12999
+ */
13000
+ export declare const zNexFinopsContractAllowanceSchema: z.ZodObject<{
13001
+ included: z.ZodNumber;
13002
+ /** Reservado para a feat-150 cheia (preço do excedente). Não usar ainda. */
13003
+ unit_price_excess: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
13004
+ }, "strip", z.ZodTypeAny, {
13005
+ included: number;
13006
+ unit_price_excess?: number | null | undefined;
13007
+ }, {
13008
+ included: number;
13009
+ unit_price_excess?: number | null | undefined;
13010
+ }>;
13011
+ /**
13012
+ * Mapa de franquias por métrica. A chave é `string` de propósito (ver
13013
+ * `NexFinopsMetricCatalog`): métrica nova é linha de catálogo, não publish do
13014
+ * evo-types. Métrica ausente = não contratada ⇒ não alerta.
13015
+ */
13016
+ export declare const zNexFinopsContractAllowancesSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
13017
+ included: z.ZodNumber;
13018
+ /** Reservado para a feat-150 cheia (preço do excedente). Não usar ainda. */
13019
+ unit_price_excess: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
13020
+ }, "strip", z.ZodTypeAny, {
13021
+ included: number;
13022
+ unit_price_excess?: number | null | undefined;
13023
+ }, {
13024
+ included: number;
13025
+ unit_price_excess?: number | null | undefined;
13026
+ }>>;
13027
+ /**
13028
+ * Gatilho de alerta: **fração** da franquia, não percentual — `0.8` é 80%.
13029
+ * `0` é rejeitado porque dispararia em qualquer consumo.
13030
+ */
13031
+ export declare const zNexFinopsAlertThresholdSchema: z.ZodNumber;
13032
+ /** Doc `platform/evo-billing/usage-alerts/config` — default herdado por todos os contratos. */
13033
+ export declare const zNexFinopsUsageAlertDefaultsSchema: z.ZodObject<{
13034
+ enabled: z.ZodBoolean;
13035
+ thresholds: z.ZodArray<z.ZodNumber, "many">;
13036
+ }, "strip", z.ZodTypeAny, {
13037
+ enabled: boolean;
13038
+ thresholds: number[];
13039
+ }, {
13040
+ enabled: boolean;
13041
+ thresholds: number[];
13042
+ }>;
13043
+ /**
13044
+ * Fragmento de escrita dos campos de franquia/alerta do contrato, para compor
13045
+ * (`.merge()`) nos schemas de create/update/upsert de contrato do
13046
+ * `@evo/nex-model`. Campo que não entra no schema de patch é aceito e
13047
+ * descartado em silêncio.
13048
+ *
13049
+ * `alerts_enabled` e `alert_thresholds` ausentes significam **herda o default
13050
+ * global** — nunca `false`/lista vazia.
13051
+ */
13052
+ export declare const zNexFinopsContractAllowancesWriteSchema: z.ZodObject<{
13053
+ allowances: z.ZodNullable<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
13054
+ included: z.ZodNumber;
13055
+ /** Reservado para a feat-150 cheia (preço do excedente). Não usar ainda. */
13056
+ unit_price_excess: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
13057
+ }, "strip", z.ZodTypeAny, {
13058
+ included: number;
13059
+ unit_price_excess?: number | null | undefined;
13060
+ }, {
13061
+ included: number;
13062
+ unit_price_excess?: number | null | undefined;
13063
+ }>>>>;
13064
+ alerts_enabled: z.ZodNullable<z.ZodOptional<z.ZodBoolean>>;
13065
+ alert_thresholds: z.ZodNullable<z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>>;
13066
+ }, "strip", z.ZodTypeAny, {
13067
+ allowances?: Record<string, {
13068
+ included: number;
13069
+ unit_price_excess?: number | null | undefined;
13070
+ }> | null | undefined;
13071
+ alerts_enabled?: boolean | null | undefined;
13072
+ alert_thresholds?: number[] | null | undefined;
13073
+ }, {
13074
+ allowances?: Record<string, {
13075
+ included: number;
13076
+ unit_price_excess?: number | null | undefined;
13077
+ }> | null | undefined;
13078
+ alerts_enabled?: boolean | null | undefined;
13079
+ alert_thresholds?: number[] | null | undefined;
13080
+ }>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.zProviderInvoiceLinksSchema = exports.zServiceTaxInfoSchema = exports.zServiceLineItemSchema = exports.zServiceInvoiceStateSchema = exports.zProviderServiceInvoiceStatusSchema = exports.zExternalLinkSchema = exports.zExternalObjectTypeSchema = exports.zInvoiceSourceRefSchema = exports.zInvoiceSourceTypeSchema = exports.zInvoiceTakerRefSchema = exports.zInvoiceTakerSnapshotSchema = exports.zInvoiceTakerSnapshotAddressSchema = exports.zTakerDocumentSchema = exports.zTakerTaxProfileSchema = exports.zTakerProviderRefsSchema = exports.zTakerAddressSchema = exports.zInvoiceTakerTypeSchema = exports.zServiceSchema = exports.zCustomerServiceTaxInfoSchema = exports.zIssuerTaxProfileSchema = exports.zIssuerNfseConfigSchema = exports.zIssuerMunicipalCredentialsRefSchema = exports.zIssuerTaxRegimeSchema = exports.zIssuerCompanyIdentitySchema = exports.zIssuerCompanyAddressSchema = exports.zTaxProfileSyncStateSchema = exports.zAsaasProviderSchema = exports.zAsaasProviderAsaasBlockSchema = exports.zAsaasProviderCapabilitiesSchema = exports.zAsaasPaymentsCapabilitiesSchema = exports.zAsaasNfseCapabilitiesSchema = exports.zAsaasEnvAuthConfigSchema = exports.zAsaasSubaccountInputSchema = exports.zAsaasAccountScopeSchema = exports.zAsaasWebhookConfigSchema = exports.zRetryPolicySchema = exports.zAsaasWebhookEventSchema = exports.zAsaasAccountScopeModeSchema = exports.zProviderRemoteRefsSchema = exports.zProviderFiscalInfoPayloadSchema = exports.zProviderCredentialsInputSchema = exports.zProviderCredentialsSecretRefsSchema = exports.zProviderMunicipalOptionsSnapshotSchema = exports.zProviderOptionItemSchema = exports.zProviderMunicipalAuthTypeSchema = exports.zFinopsProviderBaseSchema = exports.zProviderStatusSchema = exports.zFinopsActionSchema = exports.zFinopsProviderTypeSchema = exports.zProviderEnvSchema = void 0;
4
- exports.zNexVendasJourneyPaymentSchema = exports.zNexVendasJourneyPaymentSupersededSchema = exports.zNexVendasJourneyPaymentWebhookEventSchema = exports.zNexVendasJourneyBoletoSchema = exports.zNexVendasJourneyPaymentChooseSchema = exports.zNexVendasJourneyPaymentStateSchema = exports.zNexVendasJourneyPaymentKindSchema = exports.zNexVendasJourneyPaymentMethodSchema = exports.zNexFinopsContractAsaasInfoSchema = exports.zNexFinopsAsaasSubscriptionStatusSchema = exports.zNexFinopsPaymentMethodSchema = exports.zNexFinopsProposalSchema = exports.zNexFinopsProposalWriteSchema = exports.zNexFinopsProposalPrefillSchema = exports.zNexFinopsProposalLoyaltyPeriodSchema = exports.zNexFinopsProposalPaymentMethodSchema = exports.zNexFinopsProposalStatusSchema = exports.zServiceInvoiceSchema = exports.zPaymentLinkSchema = exports.zPaymentLinkDocumentStateSchema = exports.zAsaasPaymentLinkSubscriptionCycleSchema = exports.zAsaasPaymentLinkChargeTypeSchema = exports.zAsaasPaymentLinkBillingTypeSchema = exports.zProviderPayloadSnapshotSchema = exports.zProviderTraceSchema = exports.zProviderInvoiceErrorSchema = exports.zProviderInvoiceIdentifiersSchema = void 0;
4
+ exports.zNexFinopsContractAllowancesWriteSchema = exports.zNexFinopsUsageAlertDefaultsSchema = exports.zNexFinopsAlertThresholdSchema = exports.zNexFinopsContractAllowancesSchema = exports.zNexFinopsContractAllowanceSchema = exports.zNexVendasJourneyPaymentSchema = exports.zNexVendasJourneyPaymentSupersededSchema = exports.zNexVendasJourneyPaymentWebhookEventSchema = exports.zNexVendasJourneyBoletoSchema = exports.zNexVendasJourneyPaymentChooseSchema = exports.zNexVendasJourneyPaymentStateSchema = exports.zNexVendasJourneyPaymentKindSchema = exports.zNexVendasJourneyPaymentMethodSchema = exports.zNexFinopsContractAsaasInfoSchema = exports.zNexFinopsAsaasSubscriptionStatusSchema = exports.zNexFinopsPaymentMethodSchema = exports.zNexFinopsProposalSchema = exports.zNexFinopsProposalWriteSchema = exports.zNexFinopsProposalPrefillSchema = exports.zNexFinopsProposalLoyaltyPeriodSchema = exports.zNexFinopsProposalPaymentMethodSchema = exports.zNexFinopsProposalStatusSchema = exports.zServiceInvoiceSchema = exports.zPaymentLinkSchema = exports.zPaymentLinkDocumentStateSchema = exports.zAsaasPaymentLinkSubscriptionCycleSchema = exports.zAsaasPaymentLinkChargeTypeSchema = exports.zAsaasPaymentLinkBillingTypeSchema = exports.zProviderPayloadSnapshotSchema = exports.zProviderTraceSchema = exports.zProviderInvoiceErrorSchema = exports.zProviderInvoiceIdentifiersSchema = void 0;
5
5
  const zod_1 = require("zod");
6
6
  const zod_schemas_1 = require("../shared/zod-schemas");
7
7
  // ---- Provider enums and base ----
@@ -853,3 +853,52 @@ exports.zNexVendasJourneyPaymentSchema = zod_1.z
853
853
  last_error: zod_1.z.string().optional().nullable(),
854
854
  })
855
855
  .strip();
856
+ // ---- Nexus FinOps / Franquias e alertas de consumo (feat-150 F0) ----
857
+ /**
858
+ * Franquia de uma métrica no contrato. `included` é número discreto e inteiro
859
+ * (não fração): 0 = nada incluso.
860
+ */
861
+ exports.zNexFinopsContractAllowanceSchema = zod_1.z
862
+ .object({
863
+ included: zod_1.z.number().int().nonnegative(),
864
+ /** Reservado para a feat-150 cheia (preço do excedente). Não usar ainda. */
865
+ unit_price_excess: zod_1.z.number().nonnegative().optional().nullable(),
866
+ })
867
+ .strip();
868
+ /**
869
+ * Mapa de franquias por métrica. A chave é `string` de propósito (ver
870
+ * `NexFinopsMetricCatalog`): métrica nova é linha de catálogo, não publish do
871
+ * evo-types. Métrica ausente = não contratada ⇒ não alerta.
872
+ */
873
+ exports.zNexFinopsContractAllowancesSchema = zod_1.z.record(zod_1.z.string().min(1).max(64), exports.zNexFinopsContractAllowanceSchema);
874
+ /**
875
+ * Gatilho de alerta: **fração** da franquia, não percentual — `0.8` é 80%.
876
+ * `0` é rejeitado porque dispararia em qualquer consumo.
877
+ */
878
+ exports.zNexFinopsAlertThresholdSchema = zod_1.z
879
+ .number()
880
+ .gt(0, "threshold must be a fraction greater than 0 (0.8 = 80%)")
881
+ .lte(1, "threshold must be a fraction less than or equal to 1 (1 = 100%)");
882
+ /** Doc `platform/evo-billing/usage-alerts/config` — default herdado por todos os contratos. */
883
+ exports.zNexFinopsUsageAlertDefaultsSchema = zod_1.z
884
+ .object({
885
+ enabled: zod_1.z.boolean(),
886
+ thresholds: zod_1.z.array(exports.zNexFinopsAlertThresholdSchema),
887
+ })
888
+ .strip();
889
+ /**
890
+ * Fragmento de escrita dos campos de franquia/alerta do contrato, para compor
891
+ * (`.merge()`) nos schemas de create/update/upsert de contrato do
892
+ * `@evo/nex-model`. Campo que não entra no schema de patch é aceito e
893
+ * descartado em silêncio.
894
+ *
895
+ * `alerts_enabled` e `alert_thresholds` ausentes significam **herda o default
896
+ * global** — nunca `false`/lista vazia.
897
+ */
898
+ exports.zNexFinopsContractAllowancesWriteSchema = zod_1.z
899
+ .object({
900
+ allowances: exports.zNexFinopsContractAllowancesSchema.optional().nullable(),
901
+ alerts_enabled: zod_1.z.boolean().optional().nullable(),
902
+ alert_thresholds: zod_1.z.array(exports.zNexFinopsAlertThresholdSchema).optional().nullable(),
903
+ })
904
+ .strip();
@@ -932,3 +932,61 @@ export const zNexVendasJourneyPaymentSchema = z
932
932
  last_error: z.string().optional().nullable(),
933
933
  })
934
934
  .strip();
935
+
936
+ // ---- Nexus FinOps / Franquias e alertas de consumo (feat-150 F0) ----
937
+
938
+ /**
939
+ * Franquia de uma métrica no contrato. `included` é número discreto e inteiro
940
+ * (não fração): 0 = nada incluso.
941
+ */
942
+ export const zNexFinopsContractAllowanceSchema = z
943
+ .object({
944
+ included: z.number().int().nonnegative(),
945
+ /** Reservado para a feat-150 cheia (preço do excedente). Não usar ainda. */
946
+ unit_price_excess: z.number().nonnegative().optional().nullable(),
947
+ })
948
+ .strip();
949
+
950
+ /**
951
+ * Mapa de franquias por métrica. A chave é `string` de propósito (ver
952
+ * `NexFinopsMetricCatalog`): métrica nova é linha de catálogo, não publish do
953
+ * evo-types. Métrica ausente = não contratada ⇒ não alerta.
954
+ */
955
+ export const zNexFinopsContractAllowancesSchema = z.record(
956
+ z.string().min(1).max(64),
957
+ zNexFinopsContractAllowanceSchema,
958
+ );
959
+
960
+ /**
961
+ * Gatilho de alerta: **fração** da franquia, não percentual — `0.8` é 80%.
962
+ * `0` é rejeitado porque dispararia em qualquer consumo.
963
+ */
964
+ export const zNexFinopsAlertThresholdSchema = z
965
+ .number()
966
+ .gt(0, "threshold must be a fraction greater than 0 (0.8 = 80%)")
967
+ .lte(1, "threshold must be a fraction less than or equal to 1 (1 = 100%)");
968
+
969
+ /** Doc `platform/evo-billing/usage-alerts/config` — default herdado por todos os contratos. */
970
+ export const zNexFinopsUsageAlertDefaultsSchema = z
971
+ .object({
972
+ enabled: z.boolean(),
973
+ thresholds: z.array(zNexFinopsAlertThresholdSchema),
974
+ })
975
+ .strip();
976
+
977
+ /**
978
+ * Fragmento de escrita dos campos de franquia/alerta do contrato, para compor
979
+ * (`.merge()`) nos schemas de create/update/upsert de contrato do
980
+ * `@evo/nex-model`. Campo que não entra no schema de patch é aceito e
981
+ * descartado em silêncio.
982
+ *
983
+ * `alerts_enabled` e `alert_thresholds` ausentes significam **herda o default
984
+ * global** — nunca `false`/lista vazia.
985
+ */
986
+ export const zNexFinopsContractAllowancesWriteSchema = z
987
+ .object({
988
+ allowances: zNexFinopsContractAllowancesSchema.optional().nullable(),
989
+ alerts_enabled: z.boolean().optional().nullable(),
990
+ alert_thresholds: z.array(zNexFinopsAlertThresholdSchema).optional().nullable(),
991
+ })
992
+ .strip();
@@ -44,6 +44,66 @@ export interface INexFinopsContractServiceItem {
44
44
  /** Valor unitário (decimal, BRL). */
45
45
  amount: number;
46
46
  }
47
+ /**
48
+ * Franquia de uma métrica dentro do contrato.
49
+ *
50
+ * Franquia é **número discreto** e **não tem default global**: é o que foi
51
+ * vendido àquele cliente. Só o gatilho (percentual) e o liga/desliga têm
52
+ * default de plataforma — ver `INexFinopsUsageAlertDefaults`.
53
+ */
54
+ export interface INexFinopsContractAllowance {
55
+ /** Quantidade incluída no ciclo. 0 = nada incluso; ausente = não contratado. */
56
+ included: number;
57
+ /** Reservado para a feat-150 cheia (preço do excedente). Não usar ainda. */
58
+ unit_price_excess?: number | null;
59
+ }
60
+ /**
61
+ * Catálogo de métricas com franquia. É o que a tela do Nexus renderiza (`v-for`)
62
+ * e o que o motor de alerta itera.
63
+ *
64
+ * Métrica nova = **uma linha aqui**. Nenhuma migração, nenhum campo novo.
65
+ */
66
+ export declare const NexFinopsMetricCatalog: {
67
+ readonly attendances: {
68
+ readonly label: "Atendimentos";
69
+ readonly unit: "contatos";
70
+ };
71
+ readonly sms: {
72
+ readonly label: "SMS enviados";
73
+ readonly unit: "mensagens";
74
+ };
75
+ readonly email: {
76
+ readonly label: "E-mails enviados";
77
+ readonly unit: "mensagens";
78
+ };
79
+ };
80
+ /**
81
+ * Chaves conhecidas do catálogo — para iterar e para tipar escolha de métrica
82
+ * na UI.
83
+ *
84
+ * ⚠️ NÃO usar para tipar a chave de `INexFinopsContract.allowances`: o mapa é
85
+ * deliberadamente aberto (`string`) para que uma métrica nova seja só uma linha
86
+ * de catálogo, sem publish do evo-types antes de o dado poder existir.
87
+ */
88
+ export type NexFinopsMetricKey = keyof typeof NexFinopsMetricCatalog;
89
+ /** Doc de config global dos alertas de consumo (convenção `/platform/<app>`). */
90
+ export declare const EVO_BILLING_USAGE_ALERTS_CONFIG_PATH = "platform/evo-billing/usage-alerts/config";
91
+ /**
92
+ * Default de plataforma dos alertas de consumo, herdado por todos os contratos.
93
+ * Vive em `EVO_BILLING_USAGE_ALERTS_CONFIG_PATH`.
94
+ *
95
+ * O contrato pode sobrescrever os dois campos (`alerts_enabled`,
96
+ * `alert_thresholds`); franquia nunca tem default aqui.
97
+ */
98
+ export interface INexFinopsUsageAlertDefaults {
99
+ /** Alertas ligados para todos os contratos, salvo override. Nasce `true`. */
100
+ enabled: boolean;
101
+ /**
102
+ * Frações da franquia que disparam aviso — **frações, não percentuais**:
103
+ * `0.8` = 80%. Nasce `[0.8, 1.0]`.
104
+ */
105
+ thresholds: number[];
106
+ }
47
107
  export interface INexFinopsContract extends IFireGlobalDoc {
48
108
  customer_id: string;
49
109
  customer_ref?: string | null;
@@ -71,6 +131,38 @@ export interface INexFinopsContract extends IFireGlobalDoc {
71
131
  /** Método com que o primeiro pagamento foi feito. `accepted_payment_methods` é a oferta; este é o fato. */
72
132
  payment_method?: NexFinopsPaymentMethod | null;
73
133
  asaas?: INexFinopsContractAsaasInfo | null;
134
+ /**
135
+ * Franquia incluída no ciclo, por métrica. A CHAVE é o id da métrica (ver
136
+ * `NexFinopsMetricCatalog`) e é deliberadamente `string`: métrica nova é um
137
+ * item de catálogo, não uma mudança de schema.
138
+ *
139
+ * Métrica ausente do mapa = **não contratada** ⇒ não gera alerta. Alertar em
140
+ * qualquer consumo sem franquia produziria alarme falso em massa.
141
+ *
142
+ * Vigência: a franquia herda `starts_at`/`ends_at` do contrato — mudar
143
+ * franquia é alterar o contrato.
144
+ *
145
+ * ⚠️ NÃO existe congelamento por competência ainda. Enquanto a feat-150 cheia
146
+ * não resolver isso, `allowances` **não pode** ser usado para recalcular
147
+ * competência fechada: reabrir junho leria a franquia de hoje, não a de junho.
148
+ */
149
+ allowances?: Record<string, INexFinopsContractAllowance> | null;
150
+ /**
151
+ * Override do liga/desliga global de alertas de consumo.
152
+ *
153
+ * ⚠️ **Ausente ≠ `false`.** Ausente = HERDA o default global
154
+ * (`INexFinopsUsageAlertDefaults.enabled`); `false` explícito é o kill-switch
155
+ * por cliente. Ler ausente como `false` desliga alerta de todo mundo.
156
+ */
157
+ alerts_enabled?: boolean | null;
158
+ /**
159
+ * Override dos gatilhos globais. Frações da franquia (`0.8` = 80%), válidas
160
+ * para todas as métricas do contrato.
161
+ *
162
+ * ⚠️ **Ausente ≠ lista vazia.** Ausente = HERDA
163
+ * `INexFinopsUsageAlertDefaults.thresholds`.
164
+ */
165
+ alert_thresholds?: number[] | null;
74
166
  }
75
167
  export declare const NEX_FINOPS_CONTRACT_STATUS_TRANSITIONS: Record<NexFinopsContractStatus, NexFinopsContractStatus[]>;
76
168
  /**
@@ -1,6 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NEX_FINOPS_BILLABLE_CONTRACT_STATUSES = exports.NEX_FINOPS_CONTRACT_STATUS_TRANSITIONS = void 0;
3
+ exports.NEX_FINOPS_BILLABLE_CONTRACT_STATUSES = exports.NEX_FINOPS_CONTRACT_STATUS_TRANSITIONS = exports.EVO_BILLING_USAGE_ALERTS_CONFIG_PATH = exports.NexFinopsMetricCatalog = void 0;
4
+ /**
5
+ * Catálogo de métricas com franquia. É o que a tela do Nexus renderiza (`v-for`)
6
+ * e o que o motor de alerta itera.
7
+ *
8
+ * Métrica nova = **uma linha aqui**. Nenhuma migração, nenhum campo novo.
9
+ */
10
+ exports.NexFinopsMetricCatalog = {
11
+ attendances: { label: 'Atendimentos', unit: 'contatos' },
12
+ sms: { label: 'SMS enviados', unit: 'mensagens' },
13
+ email: { label: 'E-mails enviados', unit: 'mensagens' },
14
+ };
15
+ /** Doc de config global dos alertas de consumo (convenção `/platform/<app>`). */
16
+ exports.EVO_BILLING_USAGE_ALERTS_CONFIG_PATH = 'platform/evo-billing/usage-alerts/config';
4
17
  // ── Status transitions ──
5
18
  exports.NEX_FINOPS_CONTRACT_STATUS_TRANSITIONS = {
6
19
  draft: ['active', 'canceled'],
@@ -54,6 +54,64 @@ export interface INexFinopsContractServiceItem {
54
54
  amount: number;
55
55
  }
56
56
 
57
+ // ── Franquias e alertas de consumo (feat-150 F0) ──
58
+
59
+ /**
60
+ * Franquia de uma métrica dentro do contrato.
61
+ *
62
+ * Franquia é **número discreto** e **não tem default global**: é o que foi
63
+ * vendido àquele cliente. Só o gatilho (percentual) e o liga/desliga têm
64
+ * default de plataforma — ver `INexFinopsUsageAlertDefaults`.
65
+ */
66
+ export interface INexFinopsContractAllowance {
67
+ /** Quantidade incluída no ciclo. 0 = nada incluso; ausente = não contratado. */
68
+ included: number;
69
+ /** Reservado para a feat-150 cheia (preço do excedente). Não usar ainda. */
70
+ unit_price_excess?: number | null;
71
+ }
72
+
73
+ /**
74
+ * Catálogo de métricas com franquia. É o que a tela do Nexus renderiza (`v-for`)
75
+ * e o que o motor de alerta itera.
76
+ *
77
+ * Métrica nova = **uma linha aqui**. Nenhuma migração, nenhum campo novo.
78
+ */
79
+ export const NexFinopsMetricCatalog = {
80
+ attendances: { label: 'Atendimentos', unit: 'contatos' },
81
+ sms: { label: 'SMS enviados', unit: 'mensagens' },
82
+ email: { label: 'E-mails enviados', unit: 'mensagens' },
83
+ } as const;
84
+
85
+ /**
86
+ * Chaves conhecidas do catálogo — para iterar e para tipar escolha de métrica
87
+ * na UI.
88
+ *
89
+ * ⚠️ NÃO usar para tipar a chave de `INexFinopsContract.allowances`: o mapa é
90
+ * deliberadamente aberto (`string`) para que uma métrica nova seja só uma linha
91
+ * de catálogo, sem publish do evo-types antes de o dado poder existir.
92
+ */
93
+ export type NexFinopsMetricKey = keyof typeof NexFinopsMetricCatalog;
94
+
95
+ /** Doc de config global dos alertas de consumo (convenção `/platform/<app>`). */
96
+ export const EVO_BILLING_USAGE_ALERTS_CONFIG_PATH = 'platform/evo-billing/usage-alerts/config';
97
+
98
+ /**
99
+ * Default de plataforma dos alertas de consumo, herdado por todos os contratos.
100
+ * Vive em `EVO_BILLING_USAGE_ALERTS_CONFIG_PATH`.
101
+ *
102
+ * O contrato pode sobrescrever os dois campos (`alerts_enabled`,
103
+ * `alert_thresholds`); franquia nunca tem default aqui.
104
+ */
105
+ export interface INexFinopsUsageAlertDefaults {
106
+ /** Alertas ligados para todos os contratos, salvo override. Nasce `true`. */
107
+ enabled: boolean;
108
+ /**
109
+ * Frações da franquia que disparam aviso — **frações, não percentuais**:
110
+ * `0.8` = 80%. Nasce `[0.8, 1.0]`.
111
+ */
112
+ thresholds: number[];
113
+ }
114
+
57
115
  // ── Main Document ──
58
116
 
59
117
  export interface INexFinopsContract extends IFireGlobalDoc {
@@ -106,6 +164,43 @@ export interface INexFinopsContract extends IFireGlobalDoc {
106
164
  /** Método com que o primeiro pagamento foi feito. `accepted_payment_methods` é a oferta; este é o fato. */
107
165
  payment_method?: NexFinopsPaymentMethod | null;
108
166
  asaas?: INexFinopsContractAsaasInfo | null;
167
+
168
+ // ── Franquias e alertas de consumo (feat-150 F0) ──
169
+
170
+ /**
171
+ * Franquia incluída no ciclo, por métrica. A CHAVE é o id da métrica (ver
172
+ * `NexFinopsMetricCatalog`) e é deliberadamente `string`: métrica nova é um
173
+ * item de catálogo, não uma mudança de schema.
174
+ *
175
+ * Métrica ausente do mapa = **não contratada** ⇒ não gera alerta. Alertar em
176
+ * qualquer consumo sem franquia produziria alarme falso em massa.
177
+ *
178
+ * Vigência: a franquia herda `starts_at`/`ends_at` do contrato — mudar
179
+ * franquia é alterar o contrato.
180
+ *
181
+ * ⚠️ NÃO existe congelamento por competência ainda. Enquanto a feat-150 cheia
182
+ * não resolver isso, `allowances` **não pode** ser usado para recalcular
183
+ * competência fechada: reabrir junho leria a franquia de hoje, não a de junho.
184
+ */
185
+ allowances?: Record<string, INexFinopsContractAllowance> | null;
186
+
187
+ /**
188
+ * Override do liga/desliga global de alertas de consumo.
189
+ *
190
+ * ⚠️ **Ausente ≠ `false`.** Ausente = HERDA o default global
191
+ * (`INexFinopsUsageAlertDefaults.enabled`); `false` explícito é o kill-switch
192
+ * por cliente. Ler ausente como `false` desliga alerta de todo mundo.
193
+ */
194
+ alerts_enabled?: boolean | null;
195
+
196
+ /**
197
+ * Override dos gatilhos globais. Frações da franquia (`0.8` = 80%), válidas
198
+ * para todas as métricas do contrato.
199
+ *
200
+ * ⚠️ **Ausente ≠ lista vazia.** Ausente = HERDA
201
+ * `INexFinopsUsageAlertDefaults.thresholds`.
202
+ */
203
+ alert_thresholds?: number[] | null;
109
204
  }
110
205
 
111
206
  // ── Status transitions ──
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.557",
3
+ "version": "1.3.559",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",