positiva-consultas-python-sdk 1.0.0__py3-none-any.whl

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,676 @@
1
+ # -*- coding: utf-8 -*-
2
+ """DTOs Positiva Juridico 360.
3
+
4
+ POST /api/client/provider/juridico360
5
+ POST /api/client/provider/juridico360/pdf
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass, field
10
+ from typing import Any
11
+
12
+ from positiva.consultas.dtos.enums import Juridico360ProductCode, MpKind
13
+ from positiva.consultas.dtos.serde import (
14
+ as_wire_dict,
15
+ digits_only,
16
+ from_dataclass,
17
+ omit_none,
18
+ to_wire,
19
+ )
20
+
21
+
22
+ # ---------------------------------------------------------------------------
23
+ # Request
24
+ # ---------------------------------------------------------------------------
25
+
26
+
27
+ @dataclass
28
+ class Juridico360Options:
29
+ """Opcoes opcionais: paginacao (processos) ou ``kind`` (MP/BNMP)."""
30
+
31
+ cursor: str | None = None
32
+ page_size: int | None = None
33
+ kind: str | MpKind | None = None
34
+
35
+ def to_dict(self) -> dict:
36
+ return omit_none({
37
+ 'cursor': self.cursor,
38
+ 'page_size': self.page_size,
39
+ 'kind': to_wire(self.kind),
40
+ })
41
+
42
+ @classmethod
43
+ def from_dict(
44
+ cls, data: dict | Juridico360Options | None
45
+ ) -> Juridico360Options | None:
46
+ return from_dataclass(cls, data)
47
+
48
+
49
+ @dataclass
50
+ class Juridico360Request:
51
+ document: str
52
+ product_code: list[str | Juridico360ProductCode]
53
+ options: Juridico360Options | None = None
54
+
55
+ def to_dict(self) -> dict:
56
+ return omit_none({
57
+ 'document': digits_only(self.document),
58
+ 'product_code': [to_wire(p) for p in self.product_code],
59
+ 'options': to_wire(self.options),
60
+ })
61
+
62
+ @classmethod
63
+ def from_dict(
64
+ cls, data: dict | Juridico360Request | None
65
+ ) -> Juridico360Request | None:
66
+ if data is None:
67
+ return None
68
+ if isinstance(data, cls):
69
+ return data
70
+ if not isinstance(data, dict):
71
+ raise TypeError(
72
+ f'Juridico360Request.from_dict espera dict, recebeu {type(data)!r}'
73
+ )
74
+ codes = data.get('product_code') or []
75
+ return cls(
76
+ document=str(data.get('document') or ''),
77
+ product_code=list(codes),
78
+ options=Juridico360Options.from_dict(data.get('options')),
79
+ )
80
+
81
+
82
+ # ---------------------------------------------------------------------------
83
+ # Shared nested models
84
+ # ---------------------------------------------------------------------------
85
+
86
+
87
+ @dataclass
88
+ class Identificacao:
89
+ valor: str | None = None
90
+ tipo: str | None = None
91
+
92
+ def to_dict(self) -> dict:
93
+ return as_wire_dict(self)
94
+
95
+ @classmethod
96
+ def from_dict(cls, data: dict | Identificacao | None) -> Identificacao | None:
97
+ return from_dataclass(cls, data)
98
+
99
+
100
+ @dataclass
101
+ class Parte:
102
+ papel: str | None = None
103
+ nome: str | None = None
104
+
105
+ def to_dict(self) -> dict:
106
+ return as_wire_dict(self)
107
+
108
+ @classmethod
109
+ def from_dict(cls, data: dict | Parte | None) -> Parte | None:
110
+ return from_dataclass(cls, data)
111
+
112
+
113
+ @dataclass
114
+ class Advogado:
115
+ nome: str | None = None
116
+ oab: str | None = None
117
+
118
+ def to_dict(self) -> dict:
119
+ return as_wire_dict(self)
120
+
121
+ @classmethod
122
+ def from_dict(cls, data: dict | Advogado | None) -> Advogado | None:
123
+ return from_dataclass(cls, data)
124
+
125
+
126
+ @dataclass
127
+ class ProcessoStatus:
128
+ inferido: str | None = None
129
+ normalizado: str | None = None
130
+ tribunal: str | None = None
131
+ data: str | None = None
132
+
133
+ def to_dict(self) -> dict:
134
+ return as_wire_dict(self)
135
+
136
+ @classmethod
137
+ def from_dict(
138
+ cls, data: dict | ProcessoStatus | None
139
+ ) -> ProcessoStatus | None:
140
+ return from_dataclass(cls, data)
141
+
142
+
143
+ @dataclass
144
+ class PenaPrevista:
145
+ """Detalhe de pena quando a API devolve objeto (comum em MP); pode ser null."""
146
+
147
+ raw: str | None = None
148
+ tipo_pena: str | None = None
149
+ min_periodo_pena_mes: int | None = None
150
+ max_periodo_pena_mes: int | None = None
151
+
152
+ def to_dict(self) -> dict:
153
+ return as_wire_dict(self)
154
+
155
+ @classmethod
156
+ def from_dict(cls, data: dict | PenaPrevista | None) -> PenaPrevista | None:
157
+ return from_dataclass(cls, data)
158
+
159
+
160
+ @dataclass
161
+ class Legislacao:
162
+ lei: str | None = None
163
+ # Homolog/docs às vezes sugerem string; retorno real usa objeto ou null.
164
+ pena_prevista: PenaPrevista | str | None = None
165
+
166
+ def to_dict(self) -> dict:
167
+ return omit_none({
168
+ 'lei': self.lei,
169
+ 'pena_prevista': to_wire(self.pena_prevista),
170
+ })
171
+
172
+ @classmethod
173
+ def from_dict(cls, data: dict | Legislacao | None) -> Legislacao | None:
174
+ if data is None:
175
+ return None
176
+ if isinstance(data, cls):
177
+ return data
178
+ if not isinstance(data, dict):
179
+ raise TypeError(f'Legislacao.from_dict espera dict, recebeu {type(data)!r}')
180
+ pena = data.get('pena_prevista')
181
+ if isinstance(pena, dict):
182
+ pena_parsed: PenaPrevista | str | None = PenaPrevista.from_dict(pena)
183
+ else:
184
+ pena_parsed = pena
185
+ return cls(lei=data.get('lei'), pena_prevista=pena_parsed)
186
+
187
+
188
+ @dataclass
189
+ class Tipificacao:
190
+ codigo_ocorrencia: str | None = None
191
+ tipo_de_ocorrencia: str | None = None
192
+ descricao_ocorrencia: str | None = None
193
+ legislacao: list[Legislacao] | None = None
194
+
195
+ def to_dict(self) -> dict:
196
+ return omit_none({
197
+ 'codigo_ocorrencia': self.codigo_ocorrencia,
198
+ 'tipo_de_ocorrencia': self.tipo_de_ocorrencia,
199
+ 'descricao_ocorrencia': self.descricao_ocorrencia,
200
+ 'legislacao': to_wire(self.legislacao),
201
+ })
202
+
203
+ @classmethod
204
+ def from_dict(cls, data: dict | Tipificacao | None) -> Tipificacao | None:
205
+ if data is None:
206
+ return None
207
+ if isinstance(data, cls):
208
+ return data
209
+ if not isinstance(data, dict):
210
+ raise TypeError(f'Tipificacao.from_dict espera dict, recebeu {type(data)!r}')
211
+ rows = data.get('legislacao')
212
+ return cls(
213
+ codigo_ocorrencia=data.get('codigo_ocorrencia'),
214
+ tipo_de_ocorrencia=data.get('tipo_de_ocorrencia'),
215
+ descricao_ocorrencia=data.get('descricao_ocorrencia'),
216
+ legislacao=[Legislacao.from_dict(i) for i in rows] if rows else None,
217
+ )
218
+
219
+
220
+ @dataclass
221
+ class ProcessoRelacionado:
222
+ numero_processo: str | None = None
223
+
224
+ def to_dict(self) -> dict:
225
+ return as_wire_dict(self)
226
+
227
+ @classmethod
228
+ def from_dict(
229
+ cls, data: dict | ProcessoRelacionado | None
230
+ ) -> ProcessoRelacionado | None:
231
+ return from_dataclass(cls, data)
232
+
233
+
234
+ @dataclass
235
+ class Pagination:
236
+ endCursor: str | None = None
237
+ hasNextPage: bool | None = None
238
+ total: int | None = None
239
+
240
+ def to_dict(self) -> dict:
241
+ return as_wire_dict(self)
242
+
243
+ @classmethod
244
+ def from_dict(cls, data: dict | Pagination | None) -> Pagination | None:
245
+ return from_dataclass(cls, data)
246
+
247
+
248
+ @dataclass
249
+ class Processo:
250
+ tipo_processo: str | None = None
251
+ processo_principal: bool | None = None
252
+ data_ultima_atualizacao: str | None = None
253
+ data_andamento_mais_recente: str | None = None
254
+ confianca_associacao: str | None = None
255
+ partes: list[Parte] | None = None
256
+ advogados: list[Advogado] | None = None
257
+ valor_causa: int | float | None = None
258
+ status: ProcessoStatus | None = None
259
+ tipificacao_identificada: bool | None = None
260
+ tipificacao: list[Tipificacao] | None = None
261
+ natureza: str | None = None
262
+ classe_processual: str | None = None
263
+ assunto: str | None = None
264
+ ano_do_processo: str | None = None
265
+ ano_distribuicao: str | None = None
266
+ polo_passivo: bool | None = None
267
+ tribunal: str | None = None
268
+ UF: str | None = None
269
+ comarca: str | None = None
270
+ papel: str | None = None
271
+ forum: str | None = None
272
+ nome_na_capa: str | None = None
273
+ numero_processo: str | None = None
274
+ processos_relacionados: list[ProcessoRelacionado] | None = None
275
+
276
+ def to_dict(self) -> dict:
277
+ return omit_none({
278
+ 'tipo_processo': self.tipo_processo,
279
+ 'processo_principal': self.processo_principal,
280
+ 'data_ultima_atualizacao': self.data_ultima_atualizacao,
281
+ 'data_andamento_mais_recente': self.data_andamento_mais_recente,
282
+ 'confianca_associacao': self.confianca_associacao,
283
+ 'partes': to_wire(self.partes),
284
+ 'advogados': to_wire(self.advogados),
285
+ 'valor_causa': self.valor_causa,
286
+ 'status': to_wire(self.status),
287
+ 'tipificacao_identificada': self.tipificacao_identificada,
288
+ 'tipificacao': to_wire(self.tipificacao),
289
+ 'natureza': self.natureza,
290
+ 'classe_processual': self.classe_processual,
291
+ 'assunto': self.assunto,
292
+ 'ano_do_processo': self.ano_do_processo,
293
+ 'ano_distribuicao': self.ano_distribuicao,
294
+ 'polo_passivo': self.polo_passivo,
295
+ 'tribunal': self.tribunal,
296
+ 'UF': self.UF,
297
+ 'comarca': self.comarca,
298
+ 'papel': self.papel,
299
+ 'forum': self.forum,
300
+ 'nome_na_capa': self.nome_na_capa,
301
+ 'numero_processo': self.numero_processo,
302
+ 'processos_relacionados': to_wire(self.processos_relacionados),
303
+ })
304
+
305
+ @classmethod
306
+ def from_dict(cls, data: dict | Processo | None) -> Processo | None:
307
+ if data is None:
308
+ return None
309
+ if isinstance(data, cls):
310
+ return data
311
+ if not isinstance(data, dict):
312
+ raise TypeError(f'Processo.from_dict espera dict, recebeu {type(data)!r}')
313
+ partes = data.get('partes')
314
+ advogados = data.get('advogados')
315
+ tipificacao = data.get('tipificacao')
316
+ relacionados = data.get('processos_relacionados')
317
+ return cls(
318
+ tipo_processo=data.get('tipo_processo'),
319
+ processo_principal=data.get('processo_principal'),
320
+ data_ultima_atualizacao=data.get('data_ultima_atualizacao'),
321
+ data_andamento_mais_recente=data.get('data_andamento_mais_recente'),
322
+ confianca_associacao=data.get('confianca_associacao'),
323
+ partes=[Parte.from_dict(i) for i in partes] if partes else None,
324
+ advogados=[Advogado.from_dict(i) for i in advogados] if advogados else None,
325
+ valor_causa=data.get('valor_causa'),
326
+ status=ProcessoStatus.from_dict(data.get('status')),
327
+ tipificacao_identificada=data.get('tipificacao_identificada'),
328
+ tipificacao=[Tipificacao.from_dict(i) for i in tipificacao] if tipificacao else None,
329
+ natureza=data.get('natureza'),
330
+ classe_processual=data.get('classe_processual'),
331
+ assunto=data.get('assunto'),
332
+ ano_do_processo=data.get('ano_do_processo'),
333
+ ano_distribuicao=data.get('ano_distribuicao'),
334
+ polo_passivo=data.get('polo_passivo'),
335
+ tribunal=data.get('tribunal'),
336
+ UF=data.get('UF'),
337
+ comarca=data.get('comarca'),
338
+ papel=data.get('papel'),
339
+ forum=data.get('forum'),
340
+ nome_na_capa=data.get('nome_na_capa'),
341
+ numero_processo=data.get('numero_processo'),
342
+ processos_relacionados=[
343
+ ProcessoRelacionado.from_dict(i) for i in relacionados
344
+ ]
345
+ if relacionados
346
+ else None,
347
+ )
348
+
349
+
350
+ @dataclass
351
+ class MovimentacaoMp:
352
+ url: str | None = None
353
+ data: str | None = None
354
+ detalhe: str | None = None
355
+ movimento: str | None = None
356
+
357
+ def to_dict(self) -> dict:
358
+ return as_wire_dict(self)
359
+
360
+ @classmethod
361
+ def from_dict(
362
+ cls, data: dict | MovimentacaoMp | None
363
+ ) -> MovimentacaoMp | None:
364
+ return from_dataclass(cls, data)
365
+
366
+
367
+ @dataclass
368
+ class RegistroMp:
369
+ sigla: str | None = None
370
+ confianca_associacao: str | None = None
371
+ papel: str | None = None
372
+ assunto: str | None = None
373
+ unidade_mp: str | None = None
374
+ numero_mp: str | None = None
375
+ numero_processo: str | None = None
376
+ tipo_procedimento: str | None = None
377
+ situacao: str | None = None
378
+ ano_do_inquerito: str | None = None
379
+ uf: str | None = None
380
+ autos: str | None = None
381
+ tipificacao: list[Tipificacao] | None = None
382
+ tipificacao_identificada: bool | None = None
383
+ movimentacoes: list[MovimentacaoMp] | None = None
384
+
385
+ def to_dict(self) -> dict:
386
+ return omit_none({
387
+ 'sigla': self.sigla,
388
+ 'confianca_associacao': self.confianca_associacao,
389
+ 'papel': self.papel,
390
+ 'assunto': self.assunto,
391
+ 'unidade_mp': self.unidade_mp,
392
+ 'numero_mp': self.numero_mp,
393
+ 'numero_processo': self.numero_processo,
394
+ 'tipo_procedimento': self.tipo_procedimento,
395
+ 'situacao': self.situacao,
396
+ 'ano_do_inquerito': self.ano_do_inquerito,
397
+ 'uf': self.uf,
398
+ 'autos': self.autos,
399
+ 'tipificacao': to_wire(self.tipificacao),
400
+ 'tipificacao_identificada': self.tipificacao_identificada,
401
+ 'movimentacoes': to_wire(self.movimentacoes),
402
+ })
403
+
404
+ @classmethod
405
+ def from_dict(cls, data: dict | RegistroMp | None) -> RegistroMp | None:
406
+ if data is None:
407
+ return None
408
+ if isinstance(data, cls):
409
+ return data
410
+ if not isinstance(data, dict):
411
+ raise TypeError(f'RegistroMp.from_dict espera dict, recebeu {type(data)!r}')
412
+ tipificacao = data.get('tipificacao')
413
+ movimentacoes = data.get('movimentacoes')
414
+ return cls(
415
+ sigla=data.get('sigla'),
416
+ confianca_associacao=data.get('confianca_associacao'),
417
+ papel=data.get('papel'),
418
+ assunto=data.get('assunto'),
419
+ unidade_mp=data.get('unidade_mp'),
420
+ numero_mp=data.get('numero_mp'),
421
+ numero_processo=data.get('numero_processo'),
422
+ tipo_procedimento=data.get('tipo_procedimento'),
423
+ situacao=data.get('situacao'),
424
+ ano_do_inquerito=data.get('ano_do_inquerito'),
425
+ uf=data.get('uf'),
426
+ autos=data.get('autos'),
427
+ tipificacao=[Tipificacao.from_dict(i) for i in tipificacao] if tipificacao else None,
428
+ tipificacao_identificada=data.get('tipificacao_identificada'),
429
+ movimentacoes=[MovimentacaoMp.from_dict(i) for i in movimentacoes]
430
+ if movimentacoes
431
+ else None,
432
+ )
433
+
434
+
435
+ @dataclass
436
+ class MandadoBnmp:
437
+ confianca_associacao: str | None = None
438
+ situacao: str | None = None
439
+ especie_prisao: str | None = None
440
+ data_expedicao: str | None = None
441
+ data_validade: str | None = None
442
+ tipificacao: list[Tipificacao] | None = None
443
+ tipificacao_identificada: bool | None = None
444
+ numero_bnmp: str | None = None
445
+ numero_processo: str | None = None
446
+ local_processo: str | None = None
447
+ tipo_processo: str | None = None
448
+
449
+ def to_dict(self) -> dict:
450
+ return omit_none({
451
+ 'confianca_associacao': self.confianca_associacao,
452
+ 'situacao': self.situacao,
453
+ 'especie_prisao': self.especie_prisao,
454
+ 'data_expedicao': self.data_expedicao,
455
+ 'data_validade': self.data_validade,
456
+ 'tipificacao': to_wire(self.tipificacao),
457
+ 'tipificacao_identificada': self.tipificacao_identificada,
458
+ 'numero_bnmp': self.numero_bnmp,
459
+ 'numero_processo': self.numero_processo,
460
+ 'local_processo': self.local_processo,
461
+ 'tipo_processo': self.tipo_processo,
462
+ })
463
+
464
+ @classmethod
465
+ def from_dict(cls, data: dict | MandadoBnmp | None) -> MandadoBnmp | None:
466
+ if data is None:
467
+ return None
468
+ if isinstance(data, cls):
469
+ return data
470
+ if not isinstance(data, dict):
471
+ raise TypeError(f'MandadoBnmp.from_dict espera dict, recebeu {type(data)!r}')
472
+ tipificacao = data.get('tipificacao')
473
+ return cls(
474
+ confianca_associacao=data.get('confianca_associacao'),
475
+ situacao=data.get('situacao'),
476
+ especie_prisao=data.get('especie_prisao'),
477
+ data_expedicao=data.get('data_expedicao'),
478
+ data_validade=data.get('data_validade'),
479
+ tipificacao=[Tipificacao.from_dict(i) for i in tipificacao] if tipificacao else None,
480
+ tipificacao_identificada=data.get('tipificacao_identificada'),
481
+ numero_bnmp=data.get('numero_bnmp'),
482
+ numero_processo=data.get('numero_processo'),
483
+ local_processo=data.get('local_processo'),
484
+ tipo_processo=data.get('tipo_processo'),
485
+ )
486
+
487
+
488
+ @dataclass
489
+ class EmpregadorIrregular:
490
+ confianca_associacao: str | None = None
491
+ sigla: str | None = None
492
+ uf: str | None = None
493
+ estabelecimento: str | None = None
494
+ cnae: str | None = None
495
+ ano_acao_fiscal: str | None = None
496
+ data_decisao_administrativa: str | None = None
497
+ data_inclusao: str | None = None
498
+ data_publicacao: str | None = None
499
+ quantidade_trabalhadores_envolvidos: int | None = None
500
+
501
+ def to_dict(self) -> dict:
502
+ return as_wire_dict(self)
503
+
504
+ @classmethod
505
+ def from_dict(
506
+ cls, data: dict | EmpregadorIrregular | None
507
+ ) -> EmpregadorIrregular | None:
508
+ return from_dataclass(cls, data)
509
+
510
+
511
+ # ---------------------------------------------------------------------------
512
+ # Product data envelopes
513
+ # ---------------------------------------------------------------------------
514
+
515
+
516
+ @dataclass
517
+ class Juridico360ProductData:
518
+ """Payload tipado de ``results.<PRODUTO>.data`` (campos conforme produto)."""
519
+
520
+ nome: str | None = None
521
+ identificacao: Identificacao | None = None
522
+ processos: list[Processo] | None = None
523
+ pagination: Pagination | None = None
524
+ mp: list[RegistroMp] | None = None
525
+ mandados: list[MandadoBnmp] | None = None
526
+ empregadores: list[EmpregadorIrregular] | None = None
527
+ raw: dict[str, Any] | None = field(default=None, repr=False)
528
+
529
+ def to_dict(self) -> dict:
530
+ return omit_none({
531
+ 'nome': self.nome,
532
+ 'identificacao': to_wire(self.identificacao),
533
+ 'processos': to_wire(self.processos),
534
+ 'pagination': to_wire(self.pagination),
535
+ 'mp': to_wire(self.mp),
536
+ 'mandados': to_wire(self.mandados),
537
+ 'empregadores': to_wire(self.empregadores),
538
+ })
539
+
540
+ @classmethod
541
+ def from_dict(
542
+ cls, data: dict | Juridico360ProductData | None
543
+ ) -> Juridico360ProductData | None:
544
+ if data is None:
545
+ return None
546
+ if isinstance(data, cls):
547
+ return data
548
+ if not isinstance(data, dict):
549
+ raise TypeError(
550
+ f'Juridico360ProductData.from_dict espera dict, recebeu {type(data)!r}'
551
+ )
552
+ processos = data.get('processos')
553
+ mp = data.get('mp')
554
+ mandados = data.get('mandados')
555
+ empregadores = data.get('empregadores')
556
+ return cls(
557
+ nome=data.get('nome'),
558
+ identificacao=Identificacao.from_dict(data.get('identificacao')),
559
+ processos=[Processo.from_dict(i) for i in processos] if processos else None,
560
+ pagination=Pagination.from_dict(data.get('pagination')),
561
+ mp=[RegistroMp.from_dict(i) for i in mp] if mp else None,
562
+ mandados=[MandadoBnmp.from_dict(i) for i in mandados] if mandados else None,
563
+ empregadores=[EmpregadorIrregular.from_dict(i) for i in empregadores]
564
+ if empregadores
565
+ else None,
566
+ raw=dict(data),
567
+ )
568
+
569
+
570
+ @dataclass
571
+ class Juridico360ProductResult:
572
+ success: bool | None = None
573
+ data: Juridico360ProductData | None = None
574
+ error: str | None = None
575
+ message: str | None = None
576
+
577
+ def to_dict(self) -> dict:
578
+ return omit_none({
579
+ 'success': self.success,
580
+ 'data': to_wire(self.data),
581
+ 'error': self.error,
582
+ 'message': self.message,
583
+ })
584
+
585
+ @classmethod
586
+ def from_dict(
587
+ cls, data: dict | Juridico360ProductResult | None
588
+ ) -> Juridico360ProductResult | None:
589
+ if data is None:
590
+ return None
591
+ if isinstance(data, cls):
592
+ return data
593
+ if not isinstance(data, dict):
594
+ raise TypeError(
595
+ f'Juridico360ProductResult.from_dict espera dict, recebeu {type(data)!r}'
596
+ )
597
+ return cls(
598
+ success=data.get('success'),
599
+ data=Juridico360ProductData.from_dict(data.get('data')),
600
+ error=data.get('error'),
601
+ message=data.get('message'),
602
+ )
603
+
604
+
605
+ @dataclass
606
+ class Juridico360Response:
607
+ success: bool | None = None
608
+ document: str | None = None
609
+ provider: str | None = None
610
+ query_date: str | None = None
611
+ results: dict[str, Juridico360ProductResult] | None = None
612
+
613
+ def to_dict(self) -> dict:
614
+ return omit_none({
615
+ 'success': self.success,
616
+ 'document': self.document,
617
+ 'provider': self.provider,
618
+ 'query_date': self.query_date,
619
+ 'results': {
620
+ key: to_wire(value) for key, value in (self.results or {}).items()
621
+ }
622
+ if self.results is not None
623
+ else None,
624
+ })
625
+
626
+ def get_product(
627
+ self, code: str | Juridico360ProductCode
628
+ ) -> Juridico360ProductResult | None:
629
+ if not self.results:
630
+ return None
631
+ return self.results.get(to_wire(code))
632
+
633
+ @classmethod
634
+ def from_dict(
635
+ cls, data: dict | Juridico360Response | None
636
+ ) -> Juridico360Response | None:
637
+ if data is None:
638
+ return None
639
+ if isinstance(data, cls):
640
+ return data
641
+ if not isinstance(data, dict):
642
+ raise TypeError(
643
+ f'Juridico360Response.from_dict espera dict, recebeu {type(data)!r}'
644
+ )
645
+ raw_results = data.get('results') or {}
646
+ results = {
647
+ key: Juridico360ProductResult.from_dict(value)
648
+ for key, value in raw_results.items()
649
+ if isinstance(value, dict)
650
+ }
651
+ return cls(
652
+ success=data.get('success'),
653
+ document=data.get('document'),
654
+ provider=data.get('provider'),
655
+ query_date=data.get('query_date'),
656
+ results=results,
657
+ )
658
+
659
+
660
+ @dataclass
661
+ class Juridico360PdfResponse:
662
+ success: bool | None = None
663
+ document: str | None = None
664
+ provider: str | None = None
665
+ query_date: str | None = None
666
+ mime_type: str | None = None
667
+ pdf_base64: str | None = None
668
+
669
+ def to_dict(self) -> dict:
670
+ return as_wire_dict(self)
671
+
672
+ @classmethod
673
+ def from_dict(
674
+ cls, data: dict | Juridico360PdfResponse | None
675
+ ) -> Juridico360PdfResponse | None:
676
+ return from_dataclass(cls, data)