@in.pulse-crm/sdk 2.11.7 → 2.12.0

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.
@@ -0,0 +1,417 @@
1
+ # 🔄 Changelog - Ready Messages Client
2
+
3
+ ## 📅 Data: 15 de Outubro de 2025
4
+
5
+ ### ✨ Mudanças Implementadas
6
+
7
+ O `ReadyMessageClient` foi completamente atualizado para refletir a refatoração do backend que migrou de SQL raw para Prisma ORM.
8
+
9
+ ---
10
+
11
+ ## 🔀 Breaking Changes
12
+
13
+ ### 1️⃣ **Tipos Atualizados**
14
+
15
+ #### ❌ ANTES (Legado)
16
+ ```typescript
17
+ interface ReadyMessage {
18
+ CODIGO: number;
19
+ TITULO: string;
20
+ SETOR: number;
21
+ TEXTO_MENSAGEM: string;
22
+ ARQUIVO: string;
23
+ ARQUIVO_CODIGO: string;
24
+ LAST_UPDATE: Date;
25
+ }
26
+ ```
27
+
28
+ #### ✅ AGORA (Novo)
29
+ ```typescript
30
+ interface ReadyMessage {
31
+ id: number; // CODIGO → id
32
+ instance: string; // NOVO: identificador da instância
33
+ sectorId: number; // SETOR → sectorId
34
+ title: string; // TITULO → title
35
+ message: string; // TEXTO_MENSAGEM → message
36
+ fileId: number | null; // ARQUIVO_CODIGO → fileId (agora tipado)
37
+ fileName: string | null; // ARQUIVO → fileName
38
+ onlyAdmin: boolean; // NOVO: flag para mensagens exclusivas de admin
39
+ createdAt: Date; // NOVO: data de criação
40
+ updatedAt: Date; // LAST_UPDATE → updatedAt
41
+ }
42
+ ```
43
+
44
+ ### 2️⃣ **Assinatura de Métodos**
45
+
46
+ #### `createReadyMessage()`
47
+
48
+ ##### ❌ ANTES
49
+ ```typescript
50
+ await client.createReadyMessage(
51
+ file, // File primeiro
52
+ "Título", // Parâmetros separados
53
+ "Mensagem",
54
+ 10
55
+ );
56
+ ```
57
+
58
+ ##### ✅ AGORA
59
+ ```typescript
60
+ await client.createReadyMessage(
61
+ { // Objeto DTO
62
+ TITULO: "Título",
63
+ TEXTO_MENSAGEM: "Mensagem",
64
+ SETOR: 10, // Opcional!
65
+ APENAS_ADMIN: false
66
+ },
67
+ file // File por último
68
+ );
69
+ ```
70
+
71
+ **Benefícios:**
72
+ - ✅ Parâmetros nomeados (menos erros)
73
+ - ✅ SETOR opcional (usa setor do usuário se omitido)
74
+ - ✅ Suporte a `APENAS_ADMIN`
75
+
76
+ #### `updateReadyMessage()`
77
+
78
+ ##### ❌ ANTES
79
+ ```typescript
80
+ await client.updateReadyMessage(
81
+ 123,
82
+ entireReadyMessageObject, // Objeto completo obrigatório
83
+ file
84
+ );
85
+ ```
86
+
87
+ ##### ✅ AGORA
88
+ ```typescript
89
+ await client.updateReadyMessage(
90
+ 123,
91
+ { // Apenas campos que quer atualizar
92
+ TITULO: "Novo Título"
93
+ },
94
+ file // Opcional
95
+ );
96
+ ```
97
+
98
+ **Benefícios:**
99
+ - ✅ Update parcial (só envia o que mudou)
100
+ - ✅ File opcional
101
+ - ✅ Validação no backend
102
+
103
+ #### `deleteReadyMessage()`
104
+
105
+ ##### ❌ ANTES
106
+ ```typescript
107
+ await client.deleteReadyMessage(chatId); // Nome confuso
108
+ ```
109
+
110
+ ##### ✅ AGORA
111
+ ```typescript
112
+ await client.deleteReadyMessage(id); // Nome correto
113
+ ```
114
+
115
+ ---
116
+
117
+ ## 📚 Novos DTOs
118
+
119
+ ### `CreateReadyMessageDto`
120
+ ```typescript
121
+ interface CreateReadyMessageDto {
122
+ TITULO: string; // Obrigatório
123
+ TEXTO_MENSAGEM: string; // Obrigatório
124
+ SETOR?: number; // Opcional - usa setor do usuário
125
+ APENAS_ADMIN?: boolean; // Opcional - padrão: false
126
+ }
127
+ ```
128
+
129
+ ### `UpdateReadyMessageDto`
130
+ ```typescript
131
+ interface UpdateReadyMessageDto {
132
+ TITULO?: string; // Todos opcionais
133
+ TEXTO_MENSAGEM?: string;
134
+ APENAS_ADMIN?: boolean;
135
+ }
136
+ ```
137
+
138
+ ---
139
+
140
+ ## 🚀 Guia de Migração
141
+
142
+ ### Passo 1: Atualizar Criação
143
+
144
+ #### ❌ Código Antigo
145
+ ```typescript
146
+ const message = await readyMessageClient.createReadyMessage(
147
+ imageFile,
148
+ "Mensagem de Boas-vindas",
149
+ "Olá! Bem-vindo ao nosso atendimento.",
150
+ 10
151
+ );
152
+ ```
153
+
154
+ #### ✅ Código Novo
155
+ ```typescript
156
+ const message = await readyMessageClient.createReadyMessage(
157
+ {
158
+ TITULO: "Mensagem de Boas-vindas",
159
+ TEXTO_MENSAGEM: "Olá! Bem-vindo ao nosso atendimento.",
160
+ SETOR: 10, // Opcional se usuário estiver em um setor
161
+ APENAS_ADMIN: false
162
+ },
163
+ imageFile // Pode ser null
164
+ );
165
+ ```
166
+
167
+ ### Passo 2: Atualizar Listagem
168
+
169
+ #### ❌ Código Antigo
170
+ ```typescript
171
+ const messages = await readyMessageClient.getReadyMessages();
172
+
173
+ messages.forEach(msg => {
174
+ console.log(msg.TITULO); // UPPERCASE
175
+ console.log(msg.CODIGO);
176
+ console.log(msg.SETOR);
177
+ });
178
+ ```
179
+
180
+ #### ✅ Código Novo
181
+ ```typescript
182
+ const messages = await readyMessageClient.getReadyMessages();
183
+
184
+ messages.forEach(msg => {
185
+ console.log(msg.title); // camelCase
186
+ console.log(msg.id);
187
+ console.log(msg.sectorId);
188
+ console.log(msg.onlyAdmin); // Novo campo!
189
+ console.log(msg.instance); // Novo campo!
190
+ });
191
+ ```
192
+
193
+ ### Passo 3: Atualizar Updates
194
+
195
+ #### ❌ Código Antigo
196
+ ```typescript
197
+ const fullMessage = await readyMessageClient.getReadyMessages();
198
+ const messageToUpdate = fullMessage.find(m => m.CODIGO === 123);
199
+
200
+ messageToUpdate.TITULO = "Novo Título";
201
+
202
+ await readyMessageClient.updateReadyMessage(
203
+ 123,
204
+ messageToUpdate,
205
+ null
206
+ );
207
+ ```
208
+
209
+ #### ✅ Código Novo
210
+ ```typescript
211
+ // Muito mais simples!
212
+ await readyMessageClient.updateReadyMessage(
213
+ 123,
214
+ { TITULO: "Novo Título" } // Só o que mudou
215
+ // file é opcional
216
+ );
217
+ ```
218
+
219
+ ### Passo 4: Atualizar Deleção
220
+
221
+ #### ❌ Código Antigo
222
+ ```typescript
223
+ await readyMessageClient.deleteReadyMessage(chatId);
224
+ ```
225
+
226
+ #### ✅ Código Novo
227
+ ```typescript
228
+ await readyMessageClient.deleteReadyMessage(messageId);
229
+ ```
230
+
231
+ ---
232
+
233
+ ## 🎯 Novos Recursos
234
+
235
+ ### 1. **Mensagens Exclusivas para Admin**
236
+ ```typescript
237
+ const adminOnlyMessage = await client.createReadyMessage({
238
+ TITULO: "Mensagem Interna",
239
+ TEXTO_MENSAGEM: "Apenas admins veem isso",
240
+ APENAS_ADMIN: true // 🔒 Novo!
241
+ });
242
+ ```
243
+
244
+ ### 2. **Setor Automático**
245
+ ```typescript
246
+ // Se usuário já está em um setor, não precisa informar
247
+ const message = await client.createReadyMessage({
248
+ TITULO: "Resposta Rápida",
249
+ TEXTO_MENSAGEM: "Obrigado pelo contato!"
250
+ // SETOR omitido - usa setor do usuário logado
251
+ });
252
+ ```
253
+
254
+ ### 3. **Update Parcial**
255
+ ```typescript
256
+ // Atualizar só o título
257
+ await client.updateReadyMessage(123, {
258
+ TITULO: "Novo Título"
259
+ });
260
+
261
+ // Atualizar só a mensagem
262
+ await client.updateReadyMessage(123, {
263
+ TEXTO_MENSAGEM: "Nova mensagem"
264
+ });
265
+
266
+ // Atualizar apenas flag admin
267
+ await client.updateReadyMessage(123, {
268
+ APENAS_ADMIN: true
269
+ });
270
+ ```
271
+
272
+ ### 4. **Upload Opcional**
273
+ ```typescript
274
+ // Sem arquivo
275
+ await client.updateReadyMessage(123, {
276
+ TITULO: "Atualizado"
277
+ });
278
+
279
+ // Com arquivo
280
+ await client.updateReadyMessage(123, {
281
+ TITULO: "Atualizado"
282
+ }, newFile);
283
+ ```
284
+
285
+ ---
286
+
287
+ ## 🔒 Melhorias de Segurança
288
+
289
+ 1. ✅ **SQL Injection Eliminado** - Migração para Prisma
290
+ 2. ✅ **Validação de Tipos** - TypeScript strict mode
291
+ 3. ✅ **Validação de Permissões** - Backend valida setor
292
+ 4. ✅ **Sanitização de Dados** - DTOs validados
293
+
294
+ ---
295
+
296
+ ## 📊 Compatibilidade
297
+
298
+ ### Tipo Legado Mantido
299
+
300
+ Para facilitar migração gradual, o tipo legado ainda está disponível:
301
+
302
+ ```typescript
303
+ import { ReadyMessageLegacy } from './types/ready-messages.types';
304
+
305
+ // ⚠️ Depreciado - use ReadyMessage
306
+ const oldMessage: ReadyMessageLegacy = {
307
+ CODIGO: 1,
308
+ TITULO: "Test",
309
+ // ...
310
+ };
311
+ ```
312
+
313
+ **Aviso:** `ReadyMessageLegacy` será removido na v3.0.0
314
+
315
+ ---
316
+
317
+ ## 🧪 Exemplos Práticos
318
+
319
+ ### Criar Mensagem Simples
320
+ ```typescript
321
+ const client = new ReadyMessageClient("http://localhost:8000");
322
+ client.setAuth(userToken);
323
+
324
+ const message = await client.createReadyMessage({
325
+ TITULO: "Horário de Atendimento",
326
+ TEXTO_MENSAGEM: "Atendemos de segunda a sexta, 8h às 18h",
327
+ });
328
+
329
+ console.log(`Mensagem criada com ID: ${message.id}`);
330
+ ```
331
+
332
+ ### Criar com Arquivo
333
+ ```typescript
334
+ const fileInput = document.getElementById('file') as HTMLInputElement;
335
+ const file = fileInput.files?.[0];
336
+
337
+ const message = await client.createReadyMessage(
338
+ {
339
+ TITULO: "Catálogo de Produtos",
340
+ TEXTO_MENSAGEM: "Confira nosso catálogo em anexo",
341
+ SETOR: 5
342
+ },
343
+ file
344
+ );
345
+
346
+ console.log(`Arquivo anexado: ${message.fileName}`);
347
+ ```
348
+
349
+ ### Listar e Filtrar
350
+ ```typescript
351
+ const allMessages = await client.getReadyMessages();
352
+
353
+ // Filtrar apenas mensagens de admin
354
+ const adminMessages = allMessages.filter(m => m.onlyAdmin);
355
+
356
+ // Filtrar por setor
357
+ const sectorMessages = allMessages.filter(m => m.sectorId === 10);
358
+
359
+ // Ordenar por título
360
+ const sorted = allMessages.sort((a, b) =>
361
+ a.title.localeCompare(b.title)
362
+ );
363
+ ```
364
+
365
+ ### Atualizar Incrementalmente
366
+ ```typescript
367
+ const messageId = 123;
368
+
369
+ // Primeiro: atualizar título
370
+ await client.updateReadyMessage(messageId, {
371
+ TITULO: "Título Atualizado"
372
+ });
373
+
374
+ // Depois: adicionar arquivo
375
+ const newFile = await fetchFileFromSomewhere();
376
+ await client.updateReadyMessage(messageId, {}, newFile);
377
+
378
+ // Por fim: tornar admin-only
379
+ await client.updateReadyMessage(messageId, {
380
+ APENAS_ADMIN: true
381
+ });
382
+ ```
383
+
384
+ ---
385
+
386
+ ## ❓ FAQ
387
+
388
+ ### Por que os DTOs ainda usam UPPERCASE?
389
+
390
+ Para manter compatibilidade com o frontend existente que envia dados nesse formato. O controller faz a conversão para camelCase internamente.
391
+
392
+ ### Posso usar os dois formatos?
393
+
394
+ Não. O backend agora retorna apenas camelCase. Atualize seu código para usar os novos tipos.
395
+
396
+ ### E se eu não quiser especificar o setor?
397
+
398
+ Não precisa! Se omitido, o backend usa automaticamente o setor do usuário logado (exceto TI que pode escolher).
399
+
400
+ ### Como sei se meu usuário é TI?
401
+
402
+ Usuários do setor 3 são considerados TI e podem criar mensagens para qualquer setor.
403
+
404
+ ---
405
+
406
+ ## 📞 Suporte
407
+
408
+ Dúvidas sobre a migração?
409
+ - Consulte `docs/refatoracao-ready-messages.md` no whatsapp-service
410
+ - Veja os testes em `src/services/ready-messages.service.spec.ts`
411
+
412
+ ---
413
+
414
+ **Versão do SDK:** 3.0.0
415
+ **Data de Release:** 15/10/2025
416
+ **Breaking Changes:** Sim
417
+ **Migration Guide:** Este documento
@@ -0,0 +1,292 @@
1
+ # 🚀 Ready Messages Client - Migração para camelCase
2
+
3
+ ## 📋 Resumo das Mudanças
4
+
5
+ Os DTOs do Ready Messages Client foram atualizados para usar **camelCase em inglês** seguindo as melhores práticas do TypeScript/JavaScript.
6
+
7
+ ---
8
+
9
+ ## 🔄 DTOs Atualizados
10
+
11
+ ### ✅ Novos DTOs (camelCase)
12
+
13
+ ```typescript
14
+ // CreateReadyMessageDto
15
+ interface CreateReadyMessageDto {
16
+ title: string; // "Título da mensagem"
17
+ message: string; // "Conteúdo da mensagem"
18
+ sectorId?: number; // "ID do setor (opcional)"
19
+ onlyAdmin?: boolean; // "Apenas para admin (opcional)"
20
+ }
21
+
22
+ // UpdateReadyMessageDto
23
+ interface UpdateReadyMessageDto {
24
+ title?: string; // "Novo título (opcional)"
25
+ message?: string; // "Nova mensagem (opcional)"
26
+ onlyAdmin?: boolean; // "Flag admin (opcional)"
27
+ }
28
+ ```
29
+
30
+ ### 🔄 Conversão Automática
31
+
32
+ O client **automaticamente converte** camelCase para o formato que o backend espera:
33
+
34
+ ```typescript
35
+ // Input (camelCase - novo)
36
+ {
37
+ title: "Horário",
38
+ message: "8h às 18h",
39
+ sectorId: 10,
40
+ onlyAdmin: true
41
+ }
42
+
43
+ // ↓ Conversão automática ↓
44
+
45
+ // Output (UPPERCASE - backend)
46
+ {
47
+ TITULO: "Horário",
48
+ TEXTO_MENSAGEM: "8h às 18h",
49
+ SETOR: 10,
50
+ APENAS_ADMIN: true
51
+ }
52
+ ```
53
+
54
+ ---
55
+
56
+ ## 📝 Guia de Migração
57
+
58
+ ### Antes (UPPERCASE)
59
+ ```typescript
60
+ // ❌ Formato antigo
61
+ await client.createReadyMessage({
62
+ TITULO: "Mensagem de Boas-vindas",
63
+ TEXTO_MENSAGEM: "Olá! Bem-vindo!",
64
+ SETOR: 10,
65
+ APENAS_ADMIN: false
66
+ });
67
+
68
+ await client.updateReadyMessage(123, {
69
+ TITULO: "Novo Título",
70
+ TEXTO_MENSAGEM: "Nova mensagem"
71
+ });
72
+ ```
73
+
74
+ ### Agora (camelCase)
75
+ ```typescript
76
+ // ✅ Formato novo
77
+ await client.createReadyMessage({
78
+ title: "Mensagem de Boas-vindas",
79
+ message: "Olá! Bem-vindo!",
80
+ sectorId: 10,
81
+ onlyAdmin: false
82
+ });
83
+
84
+ await client.updateReadyMessage(123, {
85
+ title: "Novo Título",
86
+ message: "Nova mensagem"
87
+ });
88
+ ```
89
+
90
+ ---
91
+
92
+ ## 🛠️ Mapeamento de Campos
93
+
94
+ | Antigo (UPPERCASE) | Novo (camelCase) | Tipo | Descrição |
95
+ |-------------------|------------------|------|-----------|
96
+ | `TITULO` | `title` | `string` | Título da mensagem |
97
+ | `TEXTO_MENSAGEM` | `message` | `string` | Conteúdo da mensagem |
98
+ | `SETOR` | `sectorId` | `number?` | ID do setor (opcional) |
99
+ | `APENAS_ADMIN` | `onlyAdmin` | `boolean?` | Flag para admin (opcional) |
100
+
101
+ ---
102
+
103
+ ## 💡 Exemplos Práticos
104
+
105
+ ### 1. Criar Mensagem Simples
106
+ ```typescript
107
+ const message = await client.createReadyMessage({
108
+ title: "Horário de Funcionamento",
109
+ message: "Funcionamos de segunda a sexta, das 8h às 18h"
110
+ });
111
+ ```
112
+
113
+ ### 2. Criar Mensagem com Arquivo
114
+ ```typescript
115
+ const message = await client.createReadyMessage({
116
+ title: "Catálogo 2025",
117
+ message: "Confira nosso novo catálogo em anexo",
118
+ sectorId: 5,
119
+ onlyAdmin: false
120
+ }, fileObject);
121
+ ```
122
+
123
+ ### 3. Criar Mensagem Apenas para Admin
124
+ ```typescript
125
+ const adminMessage = await client.createReadyMessage({
126
+ title: "Procedimento Interno",
127
+ message: "Instruções confidenciais para administradores",
128
+ onlyAdmin: true // 🔒 Só admins veem
129
+ });
130
+ ```
131
+
132
+ ### 4. Atualização Parcial
133
+ ```typescript
134
+ // Atualizar apenas o título
135
+ await client.updateReadyMessage(123, {
136
+ title: "Título Atualizado"
137
+ });
138
+
139
+ // Atualizar apenas a mensagem
140
+ await client.updateReadyMessage(123, {
141
+ message: "Mensagem atualizada com novas informações"
142
+ });
143
+
144
+ // Tornar mensagem exclusiva para admin
145
+ await client.updateReadyMessage(123, {
146
+ onlyAdmin: true
147
+ });
148
+ ```
149
+
150
+ ### 5. Com Upload de Arquivo
151
+ ```typescript
152
+ const updatedMessage = await client.updateReadyMessage(
153
+ 123,
154
+ {
155
+ title: "Manual Atualizado",
156
+ message: "Nova versão do manual em anexo"
157
+ },
158
+ newFileObject
159
+ );
160
+ ```
161
+
162
+ ---
163
+
164
+ ## 🎯 Benefícios
165
+
166
+ ### ✅ Consistência
167
+ - Segue padrões TypeScript/JavaScript
168
+ - Alinhado com conventions modernas
169
+ - Melhor legibilidade do código
170
+
171
+ ### ✅ IntelliSense Melhorado
172
+ ```typescript
173
+ // Auto-complete mostra:
174
+ data.title // ✅ Claro e conciso
175
+ data.message // ✅ Descritivo
176
+ data.sectorId // ✅ Tipado como number
177
+
178
+ // Ao invés de:
179
+ data.TITULO // ❌ GRITANDO
180
+ data.TEXTO_MENSAGEM // ❌ Verboso
181
+ data.SETOR // ❌ Ambíguo
182
+ ```
183
+
184
+ ### ✅ Melhor Manutenibilidade
185
+ - Nomes em inglês facilitam colaboração internacional
186
+ - camelCase é padrão do ecossistema JS/TS
187
+ - Menos confusão entre frontend e backend
188
+
189
+ ---
190
+
191
+ ## 🔄 Compatibilidade
192
+
193
+ ### DTOs Legados Disponíveis
194
+
195
+ Para facilitar migração gradual, os tipos antigos ainda estão disponíveis:
196
+
197
+ ```typescript
198
+ import {
199
+ CreateReadyMessageDtoLegacy,
200
+ UpdateReadyMessageDtoLegacy
201
+ } from './types/ready-messages.types';
202
+
203
+ // ⚠️ Depreciado - migre para os novos DTOs
204
+ const oldData: CreateReadyMessageDtoLegacy = {
205
+ TITULO: "Test",
206
+ TEXTO_MENSAGEM: "Test message"
207
+ };
208
+ ```
209
+
210
+ **⚠️ Aviso:** DTOs legados serão removidos na versão 4.0.0
211
+
212
+ ---
213
+
214
+ ## 🧪 Testando a Migração
215
+
216
+ ### Teste Básico
217
+ ```typescript
218
+ import ReadyMessageClient from '@in.pulse-crm/sdk';
219
+
220
+ const client = new ReadyMessageClient('http://localhost:8000');
221
+ client.setAuth(token);
222
+
223
+ // Teste de criação
224
+ const message = await client.createReadyMessage({
225
+ title: "Teste de Migração",
226
+ message: "Se você está lendo isso, a migração funcionou! 🎉"
227
+ });
228
+
229
+ console.log('✅ Migração bem-sucedida!');
230
+ console.log('ID da mensagem:', message.id);
231
+ console.log('Título:', message.title);
232
+ ```
233
+
234
+ ### Teste com Todos os Campos
235
+ ```typescript
236
+ const fullTest = await client.createReadyMessage({
237
+ title: "Teste Completo",
238
+ message: "Testando todos os campos disponíveis",
239
+ sectorId: 10,
240
+ onlyAdmin: true
241
+ }, null);
242
+
243
+ // Teste de atualização
244
+ const updated = await client.updateReadyMessage(fullTest.id, {
245
+ title: "Título Atualizado",
246
+ onlyAdmin: false
247
+ });
248
+
249
+ console.log('✅ Teste completo bem-sucedido!');
250
+ ```
251
+
252
+ ---
253
+
254
+ ## ❓ FAQ
255
+
256
+ ### P: Preciso alterar o backend?
257
+ **R:** Não! O client faz a conversão automaticamente. O backend continua recebendo UPPERCASE.
258
+
259
+ ### P: E se eu usar os campos antigos por engano?
260
+ **R:** TypeScript mostrará erro de compilação. Isso evita bugs em produção.
261
+
262
+ ### P: Posso misturar formatos antigos e novos?
263
+ **R:** Não recomendado. Use apenas os novos DTOs para consistência.
264
+
265
+ ### P: Como saber se estou usando a versão correta?
266
+ **R:** Verifique se seus DTOs usam `title`, `message`, `sectorId`, `onlyAdmin`.
267
+
268
+ ---
269
+
270
+ ## 🎓 Resumo
271
+
272
+ ### O que mudou:
273
+ - ✅ DTOs agora usam camelCase em inglês
274
+ - ✅ Conversão automática para backend
275
+ - ✅ Melhor IntelliSense e documentação
276
+ - ✅ Compatibilidade mantida temporariamente
277
+
278
+ ### O que você precisa fazer:
279
+ 1. Atualizar seus DTOs para camelCase
280
+ 2. Testar a integração
281
+ 3. Remover referências aos DTOs legados
282
+
283
+ ### Deadline:
284
+ - **Migração recomendada:** Imediatamente
285
+ - **DTOs legados removidos:** Versão 4.0.0
286
+
287
+ ---
288
+
289
+ **Versão:** 3.1.0
290
+ **Data:** 15/10/2025
291
+ **Breaking Changes:** Não (compatibilidade mantida)
292
+ **Próxima versão:** DTOs legados serão removidos