evo360-types 1.3.478 → 1.3.484

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.
@@ -633,6 +633,7 @@ export declare const zAppointmentSchema: z.ZodObject<{
633
633
  isDraft: z.ZodDefault<z.ZodBoolean>;
634
634
  draftExpirationMinutes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
635
635
  external_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
636
+ status_external_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
636
637
  tags: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
637
638
  name: z.ZodString;
638
639
  color: z.ZodOptional<z.ZodString>;
@@ -969,6 +970,7 @@ export declare const zAppointmentSchema: z.ZodObject<{
969
970
  isDraft: z.ZodDefault<z.ZodBoolean>;
970
971
  draftExpirationMinutes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
971
972
  external_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
973
+ status_external_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
972
974
  tags: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
973
975
  name: z.ZodString;
974
976
  color: z.ZodOptional<z.ZodString>;
@@ -1305,6 +1307,7 @@ export declare const zAppointmentSchema: z.ZodObject<{
1305
1307
  isDraft: z.ZodDefault<z.ZodBoolean>;
1306
1308
  draftExpirationMinutes: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
1307
1309
  external_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1310
+ status_external_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1308
1311
  tags: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
1309
1312
  name: z.ZodString;
1310
1313
  color: z.ZodOptional<z.ZodString>;
@@ -202,6 +202,15 @@ exports.zAppointmentSchema = zod_schemas_1.zFireDocSchema
202
202
  draftExpirationMinutes: zod_1.z.number().nullable().optional(), // tempo em minutos para expiração do rascunho
203
203
  // ID externo da consulta
204
204
  external_id: zod_1.z.string().nullable().optional(),
205
+ // ID do STATUS na agenda externa de origem — algumas agendas identificam o
206
+ // status por id além do rótulo (`status`), e os workflows n8n usam esse id
207
+ // pra reescrever o agendamento sem resolver o rótulo de volta.
208
+ //
209
+ // `coerce` de propósito: agenda externa que devolve id NUMÉRICO é caso
210
+ // conhecido nesta base (quebrou o `patient.create` uma vez). Com `z.string()`
211
+ // puro, um `4` faria o write-through reprovar com `contract_violation`.
212
+ // Nullable/optional resolvem ANTES da coerção — `null` continua `null`.
213
+ status_external_id: zod_1.z.coerce.string().nullable().optional(),
205
214
  tags: zod_1.z.array(zod_schemas_1.zTagSchema).nullable().optional(),
206
215
  })
207
216
  .passthrough();
@@ -223,6 +223,16 @@ export const zAppointmentSchema = zFireDocSchema
223
223
  // ID externo da consulta
224
224
  external_id: z.string().nullable().optional(),
225
225
 
226
+ // ID do STATUS na agenda externa de origem — algumas agendas identificam o
227
+ // status por id além do rótulo (`status`), e os workflows n8n usam esse id
228
+ // pra reescrever o agendamento sem resolver o rótulo de volta.
229
+ //
230
+ // `coerce` de propósito: agenda externa que devolve id NUMÉRICO é caso
231
+ // conhecido nesta base (quebrou o `patient.create` uma vez). Com `z.string()`
232
+ // puro, um `4` faria o write-through reprovar com `contract_violation`.
233
+ // Nullable/optional resolvem ANTES da coerção — `null` continua `null`.
234
+ status_external_id: z.coerce.string().nullable().optional(),
235
+
226
236
  tags: z.array(zTagSchema).nullable().optional(),
227
237
  })
228
238
  .passthrough();
@@ -69,6 +69,56 @@ export interface IMessagePricing {
69
69
  category?: 'service' | 'utility' | 'authentication' | 'marketing';
70
70
  billable?: boolean;
71
71
  }
72
+ export interface IRenderedTemplateButton {
73
+ type?: string;
74
+ text?: string;
75
+ /** Já resolvida: o sufixo dinâmico do link vem substituído pelo valor enviado. */
76
+ url?: string;
77
+ phone_number?: string;
78
+ }
79
+ export interface IRenderedTemplateComponent {
80
+ type?: string;
81
+ format?: string;
82
+ /** Já resolvido — sem `{{placeholders}}`, salvo os que ficaram sem valor. */
83
+ text?: string;
84
+ buttons?: IRenderedTemplateButton[];
85
+ }
86
+ /**
87
+ * A mensagem de template como foi enviada, já compilada.
88
+ *
89
+ * Sem isto, a thread é reconstruída na LEITURA a partir da definição corrente do
90
+ * canal: excluir o template apaga a mensagem da tela e editá-lo reescreve o
91
+ * histórico. Pior, a reconstrução ficava duplicada em cada cliente (Vue e Flutter),
92
+ * com algoritmos que divergiam entre si.
93
+ *
94
+ * O backend compila uma vez, no envio; o cliente só exibe.
95
+ */
96
+ export interface IRenderedTemplateSnapshot {
97
+ schema_version: 1;
98
+ /**
99
+ * Transcrição textual canônica — header textual, body, footer e rótulos dos
100
+ * botões, nesta ordem, um por linha. É o campo para quem só precisa LER o
101
+ * histórico: busca, exportação, BigQuery, auditoria, IA.
102
+ */
103
+ text: string;
104
+ /** Estrutura resolvida, para quem precisa DESENHAR o balão. */
105
+ components: IRenderedTemplateComponent[];
106
+ origin: 'send' | 'backfill';
107
+ /**
108
+ * `send_compiled` — compilado DURANTE o pipeline de envio, a partir dos componentes
109
+ * efetivamente enviados e da definição disponível naquele momento.
110
+ *
111
+ * NÃO afirma identidade com o que a Meta exibiu ao paciente: ela renderiza o template
112
+ * vivo. Em parte dos caminhos (endpoints de operador) o payload chega montado pelo
113
+ * frontend, então a definição usada aqui valida e compila o envio, mas não foi
114
+ * necessariamente a que o produziu.
115
+ *
116
+ * `historical_reconstruction` — remontado depois do envio, a partir do que sobrou.
117
+ */
118
+ fidelity: 'send_compiled' | 'historical_reconstruction';
119
+ /** Chaves sem valor. O placeholder fica visível no texto. Omitido quando vazio. */
120
+ unresolved?: string[];
121
+ }
72
122
  export interface IThreadMessage extends IFireDoc {
73
123
  model_ver: number;
74
124
  thread_id: string;
@@ -99,7 +149,10 @@ export interface IThreadMessage extends IFireDoc {
99
149
  template?: {
100
150
  name: string;
101
151
  language: string;
152
+ /** O que foi ENVIADO à Meta: os parâmetros (`{type:'body', parameters:[...]}`). */
102
153
  components?: unknown[];
154
+ /** feat-114: a mensagem já compilada, como foi enviada. Fonte de verdade do histórico. */
155
+ rendered?: IRenderedTemplateSnapshot;
103
156
  };
104
157
  context?: IMessageContext;
105
158
  call?: IMessageCall;
@@ -99,6 +99,66 @@ export interface IMessagePricing {
99
99
  billable?: boolean;
100
100
  }
101
101
 
102
+ // ── Mensagem de template compilada (feat-114) ──
103
+
104
+ export interface IRenderedTemplateButton {
105
+ type?: string;
106
+ text?: string;
107
+ /** Já resolvida: o sufixo dinâmico do link vem substituído pelo valor enviado. */
108
+ url?: string;
109
+ phone_number?: string;
110
+ }
111
+
112
+ export interface IRenderedTemplateComponent {
113
+ type?: string;
114
+ format?: string;
115
+ /** Já resolvido — sem `{{placeholders}}`, salvo os que ficaram sem valor. */
116
+ text?: string;
117
+ buttons?: IRenderedTemplateButton[];
118
+ }
119
+
120
+ /**
121
+ * A mensagem de template como foi enviada, já compilada.
122
+ *
123
+ * Sem isto, a thread é reconstruída na LEITURA a partir da definição corrente do
124
+ * canal: excluir o template apaga a mensagem da tela e editá-lo reescreve o
125
+ * histórico. Pior, a reconstrução ficava duplicada em cada cliente (Vue e Flutter),
126
+ * com algoritmos que divergiam entre si.
127
+ *
128
+ * O backend compila uma vez, no envio; o cliente só exibe.
129
+ */
130
+ export interface IRenderedTemplateSnapshot {
131
+ schema_version: 1;
132
+
133
+ /**
134
+ * Transcrição textual canônica — header textual, body, footer e rótulos dos
135
+ * botões, nesta ordem, um por linha. É o campo para quem só precisa LER o
136
+ * histórico: busca, exportação, BigQuery, auditoria, IA.
137
+ */
138
+ text: string;
139
+
140
+ /** Estrutura resolvida, para quem precisa DESENHAR o balão. */
141
+ components: IRenderedTemplateComponent[];
142
+
143
+ origin: 'send' | 'backfill';
144
+
145
+ /**
146
+ * `send_compiled` — compilado DURANTE o pipeline de envio, a partir dos componentes
147
+ * efetivamente enviados e da definição disponível naquele momento.
148
+ *
149
+ * NÃO afirma identidade com o que a Meta exibiu ao paciente: ela renderiza o template
150
+ * vivo. Em parte dos caminhos (endpoints de operador) o payload chega montado pelo
151
+ * frontend, então a definição usada aqui valida e compila o envio, mas não foi
152
+ * necessariamente a que o produziu.
153
+ *
154
+ * `historical_reconstruction` — remontado depois do envio, a partir do que sobrou.
155
+ */
156
+ fidelity: 'send_compiled' | 'historical_reconstruction';
157
+
158
+ /** Chaves sem valor. O placeholder fica visível no texto. Omitido quando vazio. */
159
+ unresolved?: string[];
160
+ }
161
+
102
162
  // ── Thread Message (evo-chat v3) ──
103
163
 
104
164
  export interface IThreadMessage extends IFireDoc {
@@ -126,7 +186,10 @@ export interface IThreadMessage extends IFireDoc {
126
186
  template?: {
127
187
  name: string;
128
188
  language: string;
189
+ /** O que foi ENVIADO à Meta: os parâmetros (`{type:'body', parameters:[...]}`). */
129
190
  components?: unknown[];
191
+ /** feat-114: a mensagem já compilada, como foi enviada. Fonte de verdade do histórico. */
192
+ rendered?: IRenderedTemplateSnapshot;
130
193
  };
131
194
  context?: IMessageContext;
132
195
 
@@ -159,6 +159,17 @@ export interface IAppointment extends IFireDoc {
159
159
  payment?: IAppointmentPayment | null;
160
160
  reschedules?: IAppointmentReschedule[] | null;
161
161
  external_id?: string | null;
162
+ /**
163
+ * ID do STATUS na agenda externa de origem. Algumas agendas identificam o
164
+ * status por id além do rótulo (`status`), e os workflows n8n precisam desse
165
+ * id pra reescrever o agendamento no externo sem ter que resolver o rótulo
166
+ * de volta.
167
+ *
168
+ * Opcional por natureza: só algumas agendas têm. Autoridade do externo — não
169
+ * declarado na base global de política, então resolve como `external`.
170
+ * Não replicado no embed do paciente (ver `IPatientAppointment`).
171
+ */
172
+ status_external_id?: string | null;
162
173
  isDraft: boolean;
163
174
  draftExpirationMinutes?: number | null;
164
175
  tags?: ITag[] | null;
@@ -201,6 +201,17 @@ export interface IAppointment extends IFireDoc {
201
201
  // Controle de remarcações
202
202
  reschedules?: IAppointmentReschedule[] | null;
203
203
  external_id?: string | null; // ID externo da consulta
204
+ /**
205
+ * ID do STATUS na agenda externa de origem. Algumas agendas identificam o
206
+ * status por id além do rótulo (`status`), e os workflows n8n precisam desse
207
+ * id pra reescrever o agendamento no externo sem ter que resolver o rótulo
208
+ * de volta.
209
+ *
210
+ * Opcional por natureza: só algumas agendas têm. Autoridade do externo — não
211
+ * declarado na base global de política, então resolve como `external`.
212
+ * Não replicado no embed do paciente (ver `IPatientAppointment`).
213
+ */
214
+ status_external_id?: string | null;
204
215
  // Propriedades para controle de rascunho
205
216
  isDraft: boolean;
206
217
  draftExpirationMinutes?: number | null; // tempo em minutos para expiração do rascunho
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evo360-types",
3
- "version": "1.3.478",
3
+ "version": "1.3.484",
4
4
  "description": "HREVO360 Shared Types",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",