bb_api 0.1.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,1886 @@
1
+ import os
2
+ import base64
3
+ import datetime
4
+ from typing import cast
5
+
6
+ import pandas as pd
7
+ import requests
8
+
9
+ import bb_api.common as common
10
+
11
+
12
+ class _AccountabilityV3BaseAPI:
13
+ _app_key: str
14
+ _client_id: str
15
+ _api_domain: str
16
+ _access_token: str
17
+ _oauth_domain: str
18
+ _client_secret: str
19
+ _ambiente: common.Ambiente
20
+ _base64_credentials: str
21
+ _last_access_token_request_timestamp: datetime.datetime | None
22
+
23
+ def __init__(
24
+ self,
25
+ ambiente: common.Ambiente = common.Ambiente.HOMOLOGACAO,
26
+ app_key: str | None = None,
27
+ client_id: str | None = None,
28
+ client_secret: str | None = None,
29
+ ):
30
+ """Inicia uma instância do encapsulador da API Accountability V3 do Banco do Brasil.
31
+
32
+ Parâmetros
33
+ ----------
34
+ app_key: str
35
+ Chave da aplicação fornecida pelo Banco do Brasil.
36
+ client_id: str
37
+ ID do cliente fornecido pelo Banco do Brasil ou gerada pela API do Banco do Brasil.
38
+ client_secret: str
39
+ Credencial do cliente gerada pela API do Banco do Brasil.
40
+
41
+ Para gerar o ``client_id`` e ``client_secret``, siga os passos disponíveis no Portal BB Developers (<https://apoio.developers.bb.com.br/referency/post/641877548600960012b32cd6>).
42
+ """
43
+ self._ambiente = ambiente
44
+
45
+ if ambiente == common.Ambiente.DESENVOLVIMENTO:
46
+ self._api_domain = common.dese_api_domain
47
+ self._oauth_domain = common.dese_oauth_domain
48
+ elif ambiente == common.Ambiente.HOMOLOGACAO:
49
+ self._api_domain = common.homo_api_domain
50
+ self._oauth_domain = common.homo_oauth_domain
51
+ elif ambiente == common.Ambiente.HOMOLOGACAO_ALTERNATIVO:
52
+ self._api_domain = common.homo_alt_api_domain
53
+ self._oauth_domain = common.homo_alt_oauth_domain
54
+ elif ambiente == common.Ambiente.PRODUCAO:
55
+ self._api_domain = common.prod_api_domain
56
+ self._oauth_domain = common.prod_oauth_domain
57
+
58
+ app_key = os.getenv("BB_API_APP_KEY", app_key)
59
+ if app_key is not None:
60
+ self._app_key = app_key
61
+ else:
62
+ raise ValueError(
63
+ "Uma chave de aplicação inválida foi utilizada. Defina a chave"
64
+ + " por meio do parâmetro 'app_key' ou pelo variável de ambiente"
65
+ + " 'BB_API_APP_KEY'."
66
+ )
67
+
68
+ client_id = os.getenv("BB_API_CLIENT_ID", client_id)
69
+ if client_id is not None:
70
+ self._client_id = client_id
71
+ else:
72
+ raise ValueError(
73
+ "Um ID de cliente inválido foi utilizado. Defina a chave por"
74
+ + " meio do parâmetro 'client_id' ou pelo variável de ambiente"
75
+ + " 'BB_API_CLIENT_ID'."
76
+ )
77
+
78
+ client_secret = os.getenv("BB_API_CLIENT_SECRET", client_secret)
79
+ if client_secret is not None:
80
+ self._client_secret = client_secret
81
+ else:
82
+ raise ValueError(
83
+ "Um segredo de cliente inválido foi utilizado. Defina a chave"
84
+ + " por meio do parâmetro 'client_secret' ou pelo variável de"
85
+ + "ambiente 'BB_API_CLIENT_SECRET'."
86
+ )
87
+
88
+ base64_credentials = (
89
+ base64
90
+ .b64encode(
91
+ f"{client_id}:{client_secret}".encode("utf-8")
92
+ )
93
+ .decode("utf-8")
94
+ )
95
+ self._access_token = ""
96
+ self._base64_credentials = base64_credentials
97
+ self._last_access_token_request_timestamp = None
98
+
99
+ def _check_and_update_access_token(self) -> None:
100
+ now = datetime.datetime.now()
101
+ last_request = self._last_access_token_request_timestamp
102
+
103
+ if last_request is None:
104
+ diff_between_requests = datetime.timedelta(0)
105
+ else:
106
+ diff_between_requests = now - last_request
107
+
108
+ is_access_token_expired = (
109
+ diff_between_requests > common.time_between_access_token_requests
110
+ )
111
+
112
+ if last_request is not None and not is_access_token_expired:
113
+ return
114
+
115
+ res = requests.request(
116
+ "POST",
117
+ f"{self._oauth_domain}/oauth/token",
118
+ headers={
119
+ "Content-Type": "application/x-www-form-urlencoded",
120
+ "Authorization": f"Basic {self._base64_credentials}",
121
+ },
122
+ data={
123
+ "grant_type": "client_credentials",
124
+ "scope": "accountability.statements",
125
+ },
126
+ )
127
+
128
+ if res.status_code != 200:
129
+ raise Exception(
130
+ "Não foi possível adquirir as novas credenciais de acesso."
131
+ )
132
+
133
+ data = common.parse_json_object(res)
134
+ self._access_token = cast("str", data["access_token"])
135
+ self._last_access_token_request_timestamp = datetime.datetime.now()
136
+
137
+ def _get_access_token(self) -> str:
138
+ self._check_and_update_access_token()
139
+ return self._access_token
140
+
141
+ def get_agencias_proximas(
142
+ self,
143
+ cnpj: str,
144
+ cep: str,
145
+ ) -> pd.DataFrame:
146
+ access_token = self._get_access_token()
147
+ cnpj = common.handle_numeric_string_with_symbols(cnpj)
148
+ cep = common.handle_numeric_string_with_symbols(cep)
149
+
150
+ res = requests.request(
151
+ "GET",
152
+ f"{self._api_domain}/accountability/v3/agencias-proximas",
153
+ headers=common.get_headers(access_token),
154
+ params={
155
+ "gw-dev-app-key": self._app_key,
156
+ "cnpj": cnpj,
157
+ "cep": cep,
158
+ },
159
+ )
160
+
161
+ if res.status_code != 200:
162
+ raise Exception(
163
+ "Não foi possível listar as categorias do programa de governo."
164
+ )
165
+
166
+ res = common.parse_json_object(res)
167
+ return common.handle_results(
168
+ res,
169
+ main_list="listaAgencia",
170
+ insertables=[
171
+ "quantidadeAgencia",
172
+ ],
173
+ rename_dict={
174
+ "quantidadeAgencia": "Quantidade Agências",
175
+ "codigo": "Código",
176
+ "digito": "Dígito",
177
+ "nome": "Nome",
178
+ "cep": "CEP",
179
+ "logradouro": "Logradouro",
180
+ "bairro": "Bairro",
181
+ "municipio": "Munícipio",
182
+ "siglaUF": "Sigla UF",
183
+ "sugerida": "Sugerida",
184
+ },
185
+ )
186
+
187
+
188
+ class AccountabilityV3RepasseAPI(_AccountabilityV3BaseAPI):
189
+ """Representa um encapsulador da API Accountability V3 do Banco do Brasil
190
+ para os órgaos de repasse.
191
+
192
+ Esse encapsulador já reutiliza o token de acesso por 10 minutos e gera um
193
+ novo sempre que o atual estiver expirado.
194
+ """
195
+
196
+ def __init__(
197
+ self,
198
+ ambiente: common.Ambiente = common.Ambiente.HOMOLOGACAO,
199
+ app_key: str | None = None,
200
+ client_id: str | None = None,
201
+ client_secret: str | None = None,
202
+ ):
203
+ super().__init__(
204
+ ambiente,
205
+ app_key,
206
+ client_id,
207
+ client_secret,
208
+ )
209
+
210
+ def get_extrato_programa_governo(
211
+ self,
212
+ branch_code: int,
213
+ account_number: int,
214
+ start_date: common.DateLike,
215
+ end_date: common.DateLike,
216
+ ) -> pd.DataFrame:
217
+ access_token = self._get_access_token()
218
+ start_date = common.handle_dates(start_date)
219
+ end_date = common.handle_dates(end_date)
220
+
221
+ res = requests.request(
222
+ "GET",
223
+ f"{self._api_domain}/accountability/v3/statements/{branch_code}-{account_number}",
224
+ headers=common.get_headers(access_token),
225
+ params={
226
+ "gw-dev-app-key": self._app_key,
227
+ "startDate": start_date,
228
+ "endDate": end_date,
229
+ },
230
+ )
231
+
232
+ if res.status_code != 200:
233
+ raise Exception(
234
+ "Não foi possível reaver o extrato do órgão repassador."
235
+ )
236
+
237
+ res = common.parse_json_object(res)
238
+
239
+ return common.handle_results(
240
+ res,
241
+ main_list="transactions",
242
+ insertables=[
243
+ "governmentProgramCode",
244
+ "governmentProgramName",
245
+ "governmentSubProgramCode",
246
+ "governmentSubProgramName",
247
+ ],
248
+ explodeables=[
249
+ "expensesDocuments",
250
+ ],
251
+ rename_dict={
252
+ "governmentProgramCode": "Código Programa Governo",
253
+ "governmentProgramName": "Nome Programa Governo",
254
+ "governmentSubProgramCode": "Código SubPrograma Governo",
255
+ "governmentSubProgramName": "Nome SubPrograma Governo",
256
+ "id": "ID Transação",
257
+ "bookingDate": "Data Agendamento",
258
+ "orderIndex": "Índice Ordem",
259
+ "valueDate": "Data Valor",
260
+ "referenceNumber": "Número Referência",
261
+ "value": "Valor",
262
+ "accountBalance": "Saldo Conta",
263
+ "descriptionCode": "Código Descrição",
264
+ "descriptionName": "Nome Descrição",
265
+ "descriptionBatchNumber": "Número Lote Descrição",
266
+ "creditDebitIndicator": "Indicador Crédito Débito",
267
+ "beneficiaryBankIdentifierCode": "Código Identificador Banco Beneficiário",
268
+ "beneficiaryBranchCode": "Código Agência Beneficiário",
269
+ "beneficiaryAccountNumber": "Número Conta Beneficiário",
270
+ "beneficiaryPersonType": "Tipo Pessoa Beneficiário",
271
+ "beneficiaryDocumentId": "ID Documento Beneficiário",
272
+ "beneficiaryName": "Nome Beneficiário",
273
+ "pendingExpenseConciliation": "Conciliação Despesa Pendente",
274
+ "attachedExpenseDocumentIndicator": "Indicador Anexo Documento Despesa",
275
+ "expenseCategoryCode": "Código Categoria Despesa",
276
+ "expenseIdentificationStatus": "Status Identificação Despesa",
277
+ "subTransactionQuantity": "Quantidade Subtransações",
278
+ "bankOrderRuleCode": "Código Ordem Pagamento Banco",
279
+ "bankOrderPurposeCode": "Código Finalidade Ordem Banco",
280
+ "bankOrderPurposeDescription": "Descrição Finalidade Ordem Banco",
281
+ "expenseSequentialNumber": "Número Sequencial Despesa",
282
+ "expensesCategory": "Categoria Despesa",
283
+ "expensesDocuments": "ID Documento Despesa",
284
+ },
285
+ )
286
+
287
+ def get_documento_despesas_programa_governo(
288
+ self,
289
+ branch_code: int,
290
+ account_number: int,
291
+ transaction_id: int,
292
+ document_id: int,
293
+ booking_date: common.DateLike,
294
+ ) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:
295
+ access_token = self._get_access_token()
296
+ booking_date = common.handle_dates(booking_date)
297
+
298
+ res = requests.request(
299
+ "GET",
300
+ f"{self._api_domain}/accountability/v3/expenses/{branch_code}-{account_number}/transactions/{transaction_id}/documents/{document_id}",
301
+ headers=common.get_headers(access_token),
302
+ params={
303
+ "gw-dev-app-key": self._app_key,
304
+ "bookingDate": booking_date,
305
+ },
306
+ )
307
+
308
+ if res.status_code != 200:
309
+ raise Exception(
310
+ "Não foi possível reaver o extrato do órgão repassador."
311
+ )
312
+
313
+ res = common.parse_json_object(res)
314
+
315
+ df_issuer = common.handle_results(
316
+ res["issuer"],
317
+ rename_dict={
318
+ "corporateTaxPayerRegistry": "CNPJ",
319
+ "individualTaxPayerRegistry": "CPF",
320
+ "stateRegistrationNumber": "RG",
321
+ "legalName": "Nome Legal",
322
+ "tradeName": "Nome Social",
323
+ "countryName": "Nacionalidade",
324
+ "stateAbbreviation": "UF",
325
+ "cityName": "Cidade",
326
+ "districtName": "Bairro",
327
+ "additionalAddressInformation": "Endereço",
328
+ "postalCode": "CEP",
329
+ "phoneNumber": "Telefone",
330
+ },
331
+ )
332
+
333
+ df_recipient = common.handle_results(
334
+ res["recipient"],
335
+ rename_dict={
336
+ "corporateTaxPayerRegistry": "CNPJ",
337
+ "individualTaxPayerRegistry": "CPF",
338
+ "stateRegistrationNumber": "RG",
339
+ "legalName": "Nome Legal",
340
+ "tradeName": "Nome Social",
341
+ "countryName": "Nacionalidade",
342
+ "stateAbbreviation": "UF",
343
+ "cityName": "Cidade",
344
+ "districtName": "Bairro",
345
+ "additionalAddressInformation": "Endereço",
346
+ "postalCode": "CEP",
347
+ "phoneNumber": "Telefone",
348
+ "presenceTypeCode": "Código Tipo Presença",
349
+ "typeConsumerCode": "Código Tipo Consumidor",
350
+ },
351
+ )
352
+
353
+ df_document = common.handle_results(
354
+ res["expenseDocument"],
355
+ main_list="items",
356
+ insertables=[
357
+ "accessKey",
358
+ "receiptTypeCode",
359
+ "typeCode",
360
+ "serialCode",
361
+ "number",
362
+ "issueDate",
363
+ "movementDate",
364
+ "itemDeliveryDate",
365
+ "value",
366
+ "operationTypeName",
367
+ "operation",
368
+ "paymentMethod",
369
+ "digitalSignatureCode",
370
+ "pronafAbilityRegistration",
371
+ "timestamp",
372
+ "userId",
373
+ "discountValue",
374
+ "totalDiscountValue",
375
+ "realeaseInstrumentCode",
376
+ "realeaseInstrumentName",
377
+ "realeaseInstrumentDate",
378
+ "additionalInformation",
379
+ ],
380
+ rename_dict={
381
+ "accessKey": "Chave Acesso",
382
+ "receiptTypeCode": "Código Tipo Recibo",
383
+ "typeCode": "Código Tipo",
384
+ "serialCode": "Código Série",
385
+ "number": "Número",
386
+ "issueDate": "Data Emissão",
387
+ "movementDate": "Data Movimentação",
388
+ "itemDeliveryDate": "Data Entrega",
389
+ "value": "Valor",
390
+ "operationTypeName": "Nome Tipo Operação",
391
+ "operation": "Operação",
392
+ "paymentMethod": "Método Pagamento",
393
+ "digitalSignatureCode": "Código Assinatura Digital",
394
+ "pronafAbilityRegistration": "Registro Habilidade Pronaf",
395
+ "timestamp": "Momento",
396
+ "userId": "ID Usuário",
397
+ "discountValue": "Valor Desconto",
398
+ "totalDiscountValue": "Valor Total Desconto",
399
+ "realeaseInstrumentCode": "Código Liberação de Instrumento",
400
+ "realeaseInstrumentName": "Nome Liberação Instrumento",
401
+ "realeaseInstrumentDate": "Data Liberação Instrumento",
402
+ "additionalInformation": "Informação Adicional",
403
+ "description": "Descrição Item",
404
+ "quantity": "Quantidade Item",
405
+ "metric": "Métrica Item",
406
+ "unitValue": "Valor Unitário Item",
407
+ "totalValue": "Valor Total Item",
408
+ "mercosurCommonNameId": "ID Nome Comum Mercosul",
409
+ "itemDiscountValue": "Valor Desconto Item",
410
+ },
411
+ )
412
+
413
+ return (
414
+ df_issuer,
415
+ df_recipient,
416
+ df_document,
417
+ )
418
+
419
+ def get_documento_despesas_prestacao_contas(
420
+ self,
421
+ branch_code: int,
422
+ account_number: int,
423
+ transaction_id: int,
424
+ subtransaction_id: int,
425
+ document_id: int,
426
+ booking_date: common.DateLike,
427
+ ) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:
428
+ access_token = self._get_access_token()
429
+ booking_date = common.handle_dates(booking_date)
430
+
431
+ res = requests.request(
432
+ "GET",
433
+ f"{self._api_domain}/accountability/v3/expenses/{branch_code}-{account_number}/transactions/{transaction_id}/subTransactions/{subtransaction_id}/documents/{document_id}",
434
+ headers=common.get_headers(access_token),
435
+ params={
436
+ "gw-dev-app-key": self._app_key,
437
+ "bookingDate": booking_date,
438
+ },
439
+ )
440
+
441
+ if res.status_code != 200:
442
+ raise Exception(
443
+ "Não foi possível reaver o extrato do órgão repassador."
444
+ )
445
+
446
+ res = common.parse_json_object(res)
447
+
448
+ df_issuer = common.handle_results(
449
+ res["issuer"],
450
+ rename_dict={
451
+ "corporateTaxPayerRegistry": "CNPJ",
452
+ "individualTaxPayerRegistry": "CPF",
453
+ "stateRegistrationNumber": "RG",
454
+ "legalName": "Nome Legal",
455
+ "tradeName": "Nome Social",
456
+ "countryName": "Nacionalidade",
457
+ "stateAbbreviation": "UF",
458
+ "cityName": "Cidade",
459
+ "districtName": "Bairro",
460
+ "additionalAddressInformation": "Endereço",
461
+ "postalCode": "CEP",
462
+ "phoneNumber": "Telefone",
463
+ },
464
+ )
465
+
466
+ df_recipient = common.handle_results(
467
+ res["recipient"],
468
+ rename_dict={
469
+ "corporateTaxPayerRegistry": "CNPJ",
470
+ "individualTaxPayerRegistry": "CPF",
471
+ "stateRegistrationNumber": "RG",
472
+ "legalName": "Nome Legal",
473
+ "tradeName": "Nome Social",
474
+ "countryName": "Nacionalidade",
475
+ "stateAbbreviation": "UF",
476
+ "cityName": "Cidade",
477
+ "districtName": "Bairro",
478
+ "additionalAddressInformation": "Endereço",
479
+ "postalCode": "CEP",
480
+ "phoneNumber": "Telefone",
481
+ "presenceTypeCode": "Código Tipo Presença",
482
+ "typeConsumerCode": "Código Tipo Consumidor",
483
+ },
484
+ )
485
+
486
+ df_document = common.handle_results(
487
+ res["expenseDocument"],
488
+ main_list="items",
489
+ insertables=[
490
+ "accessKey",
491
+ "receiptTypeCode",
492
+ "typeCode",
493
+ "serialCode",
494
+ "number",
495
+ "issueDate",
496
+ "movementDate",
497
+ "itemDeliveryDate",
498
+ "value",
499
+ "operationTypeName",
500
+ "operation",
501
+ "paymentMethod",
502
+ "digitalSignatureCode",
503
+ "pronafAbilityRegistration",
504
+ "timestamp",
505
+ "userId",
506
+ "discountValue",
507
+ "totalDiscountValue",
508
+ "realeaseInstrumentCode",
509
+ "realeaseInstrumentName",
510
+ "realeaseInstrumentDate",
511
+ "additionalInformation",
512
+ ],
513
+ rename_dict={
514
+ "accessKey": "Chave Acesso",
515
+ "receiptTypeCode": "Código Tipo Recibo",
516
+ "typeCode": "Código Tipo",
517
+ "serialCode": "Código Série",
518
+ "number": "Número",
519
+ "issueDate": "Data Emissão",
520
+ "movementDate": "Data Movimentação",
521
+ "itemDeliveryDate": "Data Entrega",
522
+ "value": "Valor",
523
+ "operationTypeName": "Nome Tipo Operação",
524
+ "operation": "Operação",
525
+ "paymentMethod": "Método Pagamento",
526
+ "digitalSignatureCode": "Código Assinatura Digital",
527
+ "pronafAbilityRegistration": "Registro Habilidade Pronaf",
528
+ "timestamp": "Momento",
529
+ "userId": "ID Usuário",
530
+ "discountValue": "Valor Desconto",
531
+ "totalDiscountValue": "Valor Total Desconto",
532
+ "realeaseInstrumentCode": "Código Liberação de Instrumento",
533
+ "realeaseInstrumentName": "Nome Liberação Instrumento",
534
+ "realeaseInstrumentDate": "Data Liberação Instrumento",
535
+ "additionalInformation": "Informação Adicional",
536
+ "description": "Descrição Item",
537
+ "quantity": "Quantidade Item",
538
+ "metric": "Métrica Item",
539
+ "unitValue": "Valor Unitário Item",
540
+ "totalValue": "Valor Total Item",
541
+ "mercosurCommonNameId": "ID Nome Comum Mercosul",
542
+ "itemDiscountValue": "Valor Desconto Item",
543
+ },
544
+ )
545
+
546
+ return (
547
+ df_issuer,
548
+ df_recipient,
549
+ df_document,
550
+ )
551
+
552
+ def get_extrato_subtransacoes_programa_governo(
553
+ self,
554
+ branch_code: int,
555
+ account_number: int,
556
+ id: int,
557
+ id_subtransaction: str | None = None,
558
+ ) -> pd.DataFrame:
559
+ access_token = self._get_access_token()
560
+
561
+ params = {
562
+ "gw-dev-app-key": self._app_key,
563
+ }
564
+
565
+ if id_subtransaction is not None:
566
+ params["idSubtransaction"] = id_subtransaction
567
+
568
+ res = requests.request(
569
+ "GET",
570
+ f"{self._api_domain}/accountability/v3/statements/{branch_code}-{account_number}/debits/{id}/subtransactions",
571
+ headers=common.get_headers(access_token),
572
+ params=params,
573
+ )
574
+
575
+ if res.status_code != 200:
576
+ raise Exception(
577
+ "Não foi possível reaver o extrato do órgão repassador."
578
+ )
579
+
580
+ res = common.parse_json_object(res)
581
+
582
+ return common.handle_results(
583
+ res,
584
+ main_list="subtransactions",
585
+ insertables=[
586
+ "governmentProgramCode",
587
+ "governmentProgramName",
588
+ "governmentSubProgramCode",
589
+ "governmentSubProgramName",
590
+ ],
591
+ explodeables=[
592
+ "expensesCategory",
593
+ "expensesDocuments",
594
+ ],
595
+ rename_dict={
596
+ "governmentProgramCode": "Código Programa Governo",
597
+ "governmentProgramName": "Nome Programa Governo",
598
+ "governmentSubProgramCode": "Código SubPrograma Governo",
599
+ "governmentSubProgramName": "Nome SubPrograma Governo",
600
+ "id": "ID",
601
+ "codeSubtransactionState": "Estado Código Subtransação",
602
+ "paymentState": "Estado Pagamento",
603
+ "paymentDate": "Data Pagamento",
604
+ "value": "Valor",
605
+ "beneficiaryBankIdentifierCode": "Código Identificador Banco Beneficiário",
606
+ "beneficiaryBranchCode": "Código Agência Beneficiário",
607
+ "beneficiaryAccountNumber": "Número Conta Beneficiário",
608
+ "beneficiaryPersonType": "Tipo Pessoa Beneficiário",
609
+ "beneficiaryDocumentId": "ID Documento Beneficiário",
610
+ "beneficiaryName": "Nome Beneficiário",
611
+ "attachedExpenseDocumentIndicator": "Indicador Anexo Documento Despesa",
612
+ "expenseCategoryCode": "Código Categoria Despesa",
613
+ "subtransactionAccountabilityIndicator": "Indicador Contabilidade Subtransação",
614
+ "subtransactionAccountabilityName": "Nome Contabilidade Subtransação",
615
+ "bankOrderPurposeCode": "Código Finalidade Ordem Banco",
616
+ "bankOrderRuleCode": "Código Ordem Pagamento Banco",
617
+ "bankOrderPurposeDescription": "Descrição Finalidade Ordem Banco",
618
+ "expenseSequentialNumber": "Número Sequencial Despesa",
619
+ "code": "Código Categoria Despesa",
620
+ "parentCode": "Código Pai Categoria Despesa",
621
+ "name": "Nome Categoria Despesa",
622
+ "expensesDocuments": "Documentos Despesa",
623
+ },
624
+ )
625
+
626
+ def get_extrato_fundos_investimento(
627
+ self,
628
+ agencia: int,
629
+ conta_corrente: int,
630
+ fundo_investimento_id: int,
631
+ mes: int,
632
+ ano: int,
633
+ ) -> pd.DataFrame:
634
+ access_token = self._get_access_token()
635
+
636
+ res = requests.request(
637
+ "GET",
638
+ f"{self._api_domain}/accountability/v3/extratos/{agencia}-{conta_corrente}/fundos-investimentos/{fundo_investimento_id}",
639
+ headers=common.get_headers(access_token),
640
+ params={
641
+ "mes": mes,
642
+ "ano": ano,
643
+ "gw-dev-app-key": self._app_key,
644
+ },
645
+ )
646
+
647
+ if res.status_code != 200:
648
+ raise Exception(
649
+ "Não foi possível listar as categorias do programa de governo."
650
+ )
651
+
652
+ res = common.parse_json_object(res)
653
+ extrato = cast("dict[str, object]", res["extrato"])
654
+ extrato["valorCotaExtrato"] = extrato.pop("valorCota")
655
+ df = common.handle_results(
656
+ extrato,
657
+ main_list="listaLancamentosExtrato",
658
+ insertables=[
659
+ "numeroAgenciaRecebedora",
660
+ "digitoVerificadorContaRecebedora",
661
+ "numeroContaCorrenteRecebedora",
662
+ "numeroDigitoVerificadorContaCorrenteRecebedora",
663
+ "nomeClienteRecebedor",
664
+ "nomeFundoInvestimento",
665
+ "CNPJFundoInvestimento",
666
+ "valorCotaExtrato",
667
+ "dataAfericaoValorCota",
668
+ "ultimaCotacaoCota",
669
+ "dataUltimaCotacaoCota",
670
+ "sinalRentabilidadeMes",
671
+ "valorRentabilidadeMes",
672
+ "sinalRentabilidadeAno",
673
+ "valorRentabilidadeAno",
674
+ "sinalRentabilidadeResgateTotal",
675
+ "valorRentabilidadeResgateTotal",
676
+ "valorDisponivelResgate",
677
+ "valorCarenciaResgate",
678
+ "valorIRPrevisto",
679
+ "percentualIRPrevisto",
680
+ "valorIRComplementarPrevisto",
681
+ "valorIOFPrevisto",
682
+ "valorTaxaSaida",
683
+ "valorBonusDesempenho",
684
+ "valorBloqueado",
685
+ "valorAplicado",
686
+ "valorResgate",
687
+ "valorSaldoAnterior",
688
+ "quantidadeCotaAnterior",
689
+ "dataSaldoAnterior",
690
+ "valorTotalAplicadoPeriodo",
691
+ "valorTotalResgatadoPeriodo",
692
+ "sinalRendimentoBrutoPeriodo",
693
+ "valorRendimentoBrutoPeriodo",
694
+ "valorTotalIRPeriodo",
695
+ "valorTotalIOFPeriodo",
696
+ "valorTotalTaxaSaidaPeriodo",
697
+ "valorTotalBonusDesempenhoPeriodo",
698
+ "sinalRendimentoLiquido",
699
+ "valorRendimentoLiquido",
700
+ "valorSaldoMesAnterior",
701
+ "quantidadeCotaMesAnterior",
702
+ "dataSaldoMesAnterior",
703
+ "numeroLancamento",
704
+ ],
705
+ rename_dict={
706
+ "numeroAgenciaRecebedora": "Número Agência Recebedora",
707
+ "digitoVerificadorContaRecebedora": "Dígito Verificador Conta Recebedora",
708
+ "numeroContaCorrenteRecebedora": "Número Conta Corrente Recebedora",
709
+ "numeroDigitoVerificadorContaCorrenteRecebedora": "Número Dígito Verificador Conta Corrente Recebedora",
710
+ "nomeClienteRecebedor": "Nome Cliente Recebedor",
711
+ "nomeFundoInvestimento": "Nome Fundo Investimento",
712
+ "CNPJFundoInvestimento": " CNPJ Fundo Investimento",
713
+ "valorCotaExtrato": "Valor Cota Extrato",
714
+ "dataAfericaoValorCota": "Data Afericão Valor Cota",
715
+ "ultimaCotacaoCota": "Última Cotação Cota",
716
+ "dataUltimaCotacaoCota": "Data Última Cotação Cota",
717
+ "sinalRentabilidadeMes": "Sinal Rentabilidade Mês",
718
+ "valorRentabilidadeMes": "Valor Rentabilidade Mês",
719
+ "sinalRentabilidadeAno": "Sinal Rentabilidade Ano",
720
+ "valorRentabilidadeAno": "Valor Rentabilidade Ano",
721
+ "sinalRentabilidadeResgateTotal": "Sinal Rentabilidade Resgate Total",
722
+ "valorRentabilidadeResgateTotal": "Valor Rentabilidade Resgate Total",
723
+ "valorDisponivelResgate": "Valor Disponível Resgate",
724
+ "valorCarenciaResgate": "Valor Carência Resgate",
725
+ "valorIRPrevisto": "Valor IR Previsto",
726
+ "percentualIRPrevisto": "Percentual IR Previsto",
727
+ "valorIRComplementarPrevisto": "Valor IR Complementar Previsto",
728
+ "valorIOFPrevisto": "Valor IOF Previsto",
729
+ "valorTaxaSaida": "Valor Taxa Saída",
730
+ "valorBonusDesempenho": "Valor Bônus Desempenho",
731
+ "valorBloqueado": "Valor Bloqueado",
732
+ "valorAplicado": "Valor Aplicado",
733
+ "valorResgate": "Valor Resgate",
734
+ "valorSaldoAnterior": "Valor Saldo Anterior",
735
+ "quantidadeCotaAnterior": "Quantidade Cota Anterior",
736
+ "dataSaldoAnterior": "Data Saldo Anterior",
737
+ "valorTotalAplicadoPeriodo": "Valor Total Aplicado Período",
738
+ "valorTotalResgatadoPeriodo": "Valor Total Resgatado Período",
739
+ "sinalRendimentoBrutoPeriodo": "Sinal Rendimento Bruto Período",
740
+ "valorRendimentoBrutoPeriodo": "Valor Rendimento Bruto Período",
741
+ "valorTotalIRPeriodo": "Valor Total IR Período",
742
+ "valorTotalIOFPeriodo": "Valor Total IOF Período",
743
+ "valorTotalTaxaSaidaPeriodo": "Valor Total Taxa Saída Período",
744
+ "valorTotalBonusDesempenhoPeriodo": "Valor Total Bônus Desempenho Período",
745
+ "sinalRendimentoLiquido": "Sinal Rendimento Líquido",
746
+ "valorRendimentoLiquido": "Valor Rendimento Líquido",
747
+ "valorSaldoMesAnterior": "Valor Saldo Mês Anterior",
748
+ "quantidadeCotaMesAnterior": "Quantidade Cota Mês Anterior",
749
+ "dataSaldoMesAnterior": "Data Saldo Mês Anterior",
750
+ "numeroLancamento": "Número Lançamento",
751
+ "dataLancamento": "Data Lançamento",
752
+ "descricao": "Descrição",
753
+ "valorLancamento": "Valor Lançamento",
754
+ "valorIR": "Valor IR",
755
+ "valorPrejuizo": "Valor Prejuízo",
756
+ "valorIOF": "Valor IOF",
757
+ "quantidadeCota": "Quantidade Cota",
758
+ "valorCota": "Valor Cota Lançamento",
759
+ "saldoCotas": "Saldo Cotas",
760
+ "valorBaseCalculoIR": "Valor Base Cálculo IR",
761
+ "numeroDocumentoLancamento": "Número Documento Lançamento",
762
+ },
763
+ )
764
+
765
+ df["Código Programa Governo"] = cast("common.Scalar", res["codigoProgramaGoverno"])
766
+ df["Nome Programa Governo"] = cast("common.Scalar", res["nomeProgramaGoverno"])
767
+ df["Código SubPrograma Governo"] = cast(
768
+ "common.Scalar", res["codigoSubProgramaGoverno"]
769
+ )
770
+ df["Nome SubPrograma Governo"] = cast(
771
+ "common.Scalar", res["nomeSubProgramaGoverno"]
772
+ )
773
+
774
+ return df
775
+
776
+ def get_extrato_poupanca(
777
+ self,
778
+ agencia: int,
779
+ conta_corrente: int,
780
+ variacao_poupanca: int,
781
+ mes: int,
782
+ ano: int,
783
+ ) -> pd.DataFrame:
784
+ access_token = self._get_access_token()
785
+
786
+ res = requests.request(
787
+ "GET",
788
+ f"{self._api_domain}/accountability/v3/extratos/{agencia}-{conta_corrente}/poupanca/{variacao_poupanca}",
789
+ headers=common.get_headers(access_token),
790
+ params={
791
+ "mes": mes,
792
+ "ano": ano,
793
+ "gw-dev-app-key": self._app_key,
794
+ },
795
+ )
796
+
797
+ if res.status_code != 200:
798
+ raise Exception(
799
+ "Não foi possível listar as categorias do programa de governo."
800
+ )
801
+
802
+ res = common.parse_json_object(res)
803
+ return common.handle_results(
804
+ res,
805
+ main_list="listaLancamentos",
806
+ insertables=[
807
+ "codigoProgramaGoverno",
808
+ "nomeProgramaGoverno",
809
+ "codigoSubProgramaGoverno",
810
+ "nomeSubProgramaGoverno",
811
+ "nomeCliente",
812
+ "identificadorCliente",
813
+ "saldoAnterior",
814
+ "saldoAtual",
815
+ "saldoBloqueado",
816
+ "saldoDisponivel",
817
+ ],
818
+ rename_dict={
819
+ "codigoProgramaGoverno": "Código Programa Governo",
820
+ "nomeProgramaGoverno": "Nome Programa Governo",
821
+ "codigoSubProgramaGoverno": "Código SubPrograma Governo",
822
+ "nomeSubProgramaGoverno": "Nome SubPrograma Governo",
823
+ "nomeCliente": "Nome Cliente",
824
+ "identificadorCliente": "Identificador Cliente",
825
+ "saldoAnterior": "Saldo Anterior",
826
+ "saldoAtual": "Saldo Atual",
827
+ "saldoBloqueado": "Saldo Bloqueado",
828
+ "saldoDisponivel": "Saldo Disponível",
829
+ "dataLancamento": "Data Lançamento",
830
+ "dataMovimento": "Data Movimento",
831
+ "diaLancamento": "Dia Lançamento",
832
+ "codigoHistorico": "Código Histórico",
833
+ "descricaoHistorico": "Descrição Histórico",
834
+ "indicadorDebitoCredito": "Indicador Débito Crédito",
835
+ "agenciaOrigem": "Agência Origem",
836
+ "numeroDocumento": "Número Documento",
837
+ "valorLancamento": "Valor Lançamento",
838
+ },
839
+ )
840
+
841
+ def get_lancamentos_atualizados(
842
+ self,
843
+ numero_programa_governo: int,
844
+ data_inicio: common.DateLike,
845
+ data_fim: common.DateLike,
846
+ pagina: int = 1,
847
+ ) -> pd.DataFrame:
848
+ access_token = self._get_access_token()
849
+ data_inicio = common.handle_dates(data_inicio)
850
+ data_fim = common.handle_dates(data_fim)
851
+
852
+ res = requests.request(
853
+ "GET",
854
+ f"{self._api_domain}/accountability/v3/programas-governo/{numero_programa_governo}/orgaos-repasse/lancamentos-atualizados",
855
+ headers=common.get_headers(access_token),
856
+ params={
857
+ "dataInicio": data_inicio,
858
+ "dataFim": data_fim,
859
+ "pagina": pagina,
860
+ "gw-dev-app-key": self._app_key,
861
+ },
862
+ )
863
+
864
+ if res.status_code != 200:
865
+ raise Exception(
866
+ "Não foi possível listar as categorias do programa de governo."
867
+ )
868
+
869
+ res = common.parse_json_object(res)
870
+ return common.handle_results(
871
+ res,
872
+ main_list="listaLancamentos",
873
+ insertables=[
874
+ "totalPaginas",
875
+ ],
876
+ rename_dict={
877
+ "totalPaginas": "Total Páginas",
878
+ "agencia": "Agência",
879
+ "contaCorrente": "Conta Corrente",
880
+ "sequencialLancamento": "Sequencial Lançamento",
881
+ },
882
+ )
883
+
884
+ def get_sublancamentos_atualizados(
885
+ self,
886
+ numero_programa_governo: int,
887
+ data_inicio: common.DateLike,
888
+ data_fim: common.DateLike,
889
+ pagina: int = 1,
890
+ ) -> pd.DataFrame:
891
+ access_token = self._get_access_token()
892
+ data_inicio = common.handle_dates(data_inicio)
893
+ data_fim = common.handle_dates(data_fim)
894
+
895
+ res = requests.request(
896
+ "GET",
897
+ f"{self._api_domain}/accountability/v3/programas-governo/{numero_programa_governo}/orgaos-repasse/sublancamentos-atualizados",
898
+ headers=common.get_headers(access_token),
899
+ params={
900
+ "dataInicio": data_inicio,
901
+ "dataFim": data_fim,
902
+ "pagina": pagina,
903
+ "gw-dev-app-key": self._app_key,
904
+ },
905
+ )
906
+
907
+ if res.status_code != 200:
908
+ raise Exception(
909
+ "Não foi possível listar as categorias do programa de governo."
910
+ )
911
+
912
+ res = common.parse_json_object(res)
913
+ return common.handle_results(
914
+ res,
915
+ main_list="listaSublancamentos",
916
+ insertables=[
917
+ "totalPaginas",
918
+ ],
919
+ rename_dict={
920
+ "totalPaginas": "Total Páginas",
921
+ "agencia": "Agência",
922
+ "contaCorrente": "Conta Corrente",
923
+ "sequencialLancamento": "Sequencial Lançamento",
924
+ "sequencialSublancamento": "Sequencial Sublançamento",
925
+ },
926
+ )
927
+
928
+ def get_categorias_programa_governo(
929
+ self,
930
+ numero_programa_governo: int,
931
+ ) -> pd.DataFrame:
932
+ access_token = self._get_access_token()
933
+
934
+ res = requests.request(
935
+ "GET",
936
+ f"{self._api_domain}/accountability/v3/programas-governo/{numero_programa_governo}/categorias",
937
+ headers=common.get_headers(access_token),
938
+ params={
939
+ "gw-dev-app-key": self._app_key,
940
+ },
941
+ )
942
+
943
+ if res.status_code != 200:
944
+ raise Exception(
945
+ "Não foi possível listar as categorias do programa de governo."
946
+ )
947
+
948
+ res = common.parse_json_object(res)
949
+ return common.handle_results(
950
+ res,
951
+ main_list="categorias",
952
+ rename_dict={
953
+ "codigo": "Código Categoria",
954
+ "nome": "Nome Categoria",
955
+ "codigoCategoriaAgrupadora": "Código Categoria Agrupadora",
956
+ "indicadorDespesaAtiva": "Indicador Despesa Ativa",
957
+ },
958
+ )
959
+
960
+ def get_saldo_aplicacoes_financeiras(
961
+ self,
962
+ agencia: int,
963
+ conta_corrente: int,
964
+ ) -> pd.DataFrame:
965
+ access_token = self._get_access_token()
966
+
967
+ res = requests.request(
968
+ "GET",
969
+ f"{self._api_domain}/accountability/v3/saldos/{agencia}-{conta_corrente}/aplicacoes-financeiras",
970
+ headers=common.get_headers(access_token),
971
+ params={
972
+ "gw-dev-app-key": self._app_key,
973
+ },
974
+ )
975
+
976
+ if res.status_code != 200:
977
+ raise Exception(
978
+ "Não foi possível listar as categorias do programa de governo."
979
+ )
980
+
981
+ res = common.parse_json_object(res)
982
+ return common.handle_results(
983
+ res,
984
+ main_list="operacoes",
985
+ insertables=[
986
+ "dataSaldo",
987
+ "valorDisponibilidade",
988
+ ],
989
+ rename_dict={
990
+ "dataSaldo": "Data Saldo",
991
+ "valorDisponibilidade": "Valor Disponibilidade",
992
+ "codigo": "Código",
993
+ "valor": "Valor",
994
+ "indicadorSaldoNaoDisponivel": "Indicador Saldo Não Disponível",
995
+ "mensagemSaldoApurado": "Mensagem Saldo Apurado",
996
+ },
997
+ )
998
+
999
+ def get_saldo_conta_corrente(
1000
+ self,
1001
+ agencia: str,
1002
+ conta_corrente: str,
1003
+ ) -> pd.DataFrame:
1004
+ access_token = self._get_access_token()
1005
+
1006
+ res = requests.request(
1007
+ "GET",
1008
+ f"{self._api_domain}/accountability/v3/saldos/{agencia}-{conta_corrente}/conta-corrente",
1009
+ headers=common.get_headers(access_token),
1010
+ params={
1011
+ "gw-dev-app-key": self._app_key,
1012
+ },
1013
+ )
1014
+
1015
+ if res.status_code != 200:
1016
+ raise Exception(
1017
+ "Não foi possível listar as categorias do programa de governo."
1018
+ )
1019
+
1020
+ res = common.parse_json_object(res)
1021
+
1022
+ return common.handle_results(
1023
+ res,
1024
+ rename_dict={
1025
+ "dataSaldo": "Data Saldo",
1026
+ "valorDisponibilidade": "Valor Disponibilidade",
1027
+ },
1028
+ )
1029
+
1030
+ def post_categoria_despesa_lancamento_credito(
1031
+ self,
1032
+ ordem_bancaria: int,
1033
+ item: int,
1034
+ agencia: int,
1035
+ conta_corrente: int,
1036
+ codigo_contrato: int,
1037
+ codigo_unidade_gestora: str,
1038
+ codigo_categoria_despesa: int,
1039
+ codigo_listagem_cliente: str,
1040
+ ) -> pd.DataFrame:
1041
+ access_token = self._get_access_token()
1042
+
1043
+ res = requests.request(
1044
+ "POST",
1045
+ f"{self._api_domain}/accountability/v3/orgaos-repasse/lancamentos-credito/{ordem_bancaria}-{item}/categorias-despesa",
1046
+ headers={
1047
+ "Content-Type": "application/json",
1048
+ **common.get_headers(access_token),
1049
+ },
1050
+ params={
1051
+ "gw-dev-app-key": self._app_key,
1052
+ },
1053
+ data={
1054
+ "agencia": agencia,
1055
+ "contaCorrente": conta_corrente,
1056
+ "codigoContrato": codigo_contrato,
1057
+ "codigoUnidadeGestora": codigo_unidade_gestora,
1058
+ "codigoCategoriaDespesa": codigo_categoria_despesa,
1059
+ "codigoListagemCliente": codigo_listagem_cliente,
1060
+ },
1061
+ )
1062
+
1063
+ if res.status_code not in [200, 201]:
1064
+ raise Exception(
1065
+ "Não foi possível listar as categorias do programa de governo."
1066
+ )
1067
+
1068
+ res = common.parse_json_object(res)
1069
+ return common.handle_results(
1070
+ res,
1071
+ rename_dict={
1072
+ "timestampInclusaoCategoriaDespesa": "Momento Inclusão Categoria Despesa",
1073
+ },
1074
+ )
1075
+
1076
+ def post_identificacao_lancamento_credito(
1077
+ self,
1078
+ agencia: str,
1079
+ conta_corrente: str,
1080
+ numero_bancario: int,
1081
+ numero_sequencial_ordem_bancaria: int,
1082
+ data_lancamento: common.DateLike,
1083
+ numero_companhia: int,
1084
+ valor_fracionado: int,
1085
+ tipo_identificacao: int,
1086
+ codigo_identificacao: str,
1087
+ ) -> pd.DataFrame:
1088
+ access_token = self._get_access_token()
1089
+ data_lancamento = common.handle_dates(data_lancamento)
1090
+
1091
+ res = requests.request(
1092
+ "POST",
1093
+ f"{self._api_domain}/accountability/v3/orgaos-repasse/{agencia}-{conta_corrente}/lancamentos-credito",
1094
+ headers={
1095
+ "Content-Type": "application/json",
1096
+ **common.get_headers(access_token),
1097
+ },
1098
+ params={
1099
+ "gw-dev-app-key": self._app_key,
1100
+ },
1101
+ data={
1102
+ "numeroBancario": numero_bancario,
1103
+ "numeroSequencialOrdemBancaria": numero_sequencial_ordem_bancaria,
1104
+ "dataLancamento": data_lancamento,
1105
+ "numeroCompanhia": numero_companhia,
1106
+ "valorFracionado": valor_fracionado,
1107
+ "tipoIdentificacao": tipo_identificacao,
1108
+ "codigoIdentificacao": codigo_identificacao,
1109
+ },
1110
+ )
1111
+
1112
+ if res.status_code not in [200, 201]:
1113
+ raise Exception(
1114
+ "Não foi possível listar as categorias do programa de governo."
1115
+ )
1116
+
1117
+ res = common.parse_json_object(res)
1118
+ return common.handle_results(
1119
+ res,
1120
+ rename_dict={
1121
+ "numeroSequencialLancamentoContaCorrente": "Número Sequencial Lançamento Conta Corrente",
1122
+ "numeroSequencialIdentificacaoLancamento": "Número Sequencial Identificação Lançamento",
1123
+ "timestampInclusaoIdentificacaoLancamento": "Momento Inclusão Identificação Lançamento",
1124
+ },
1125
+ )
1126
+
1127
+ def delete_identificacao_lancamento_credito(
1128
+ self,
1129
+ agencia: str,
1130
+ conta_corrente: str,
1131
+ sequencial_lancamento: str,
1132
+ sequencial_identificacao: str,
1133
+ ) -> pd.DataFrame:
1134
+ access_token = self._get_access_token()
1135
+
1136
+ res = requests.request(
1137
+ "DELETE",
1138
+ f"{self._api_domain}/accountability/v3/orgaos-repasse/{agencia}-{conta_corrente}/lancamentos-credito/{sequencial_lancamento}-{sequencial_identificacao}",
1139
+ headers=common.get_headers(access_token),
1140
+ params={
1141
+ "gw-dev-app-key": self._app_key,
1142
+ },
1143
+ )
1144
+
1145
+ if res.status_code not in [200, 201]:
1146
+ raise Exception(
1147
+ "Não foi possível listar as categorias do programa de governo."
1148
+ )
1149
+
1150
+ res = common.parse_json_object(res)
1151
+ return common.handle_results(
1152
+ res,
1153
+ rename_dict={
1154
+ "timestampExclusaoIdentificacaoLancamento": "Momento Exclusão Identificação Lançamento",
1155
+ },
1156
+ )
1157
+
1158
+ def get_identificacao_lancamento_debito(
1159
+ self,
1160
+ agencia: str,
1161
+ conta_corrente: str,
1162
+ numero_pagina: int = 1,
1163
+ ) -> pd.DataFrame:
1164
+ access_token = self._get_access_token()
1165
+
1166
+ res = requests.request(
1167
+ "GET",
1168
+ f"{self._api_domain}/accountability/v3/orgaos-repasse/{agencia}-{conta_corrente}/lancamentos-debito",
1169
+ headers=common.get_headers(access_token),
1170
+ params={
1171
+ "gw-dev-app-key": self._app_key,
1172
+ "numeroPagina": numero_pagina,
1173
+ },
1174
+ )
1175
+
1176
+ if res.status_code != 200:
1177
+ raise Exception(
1178
+ "Não foi possível listar as categorias do programa de governo."
1179
+ )
1180
+
1181
+ res = common.parse_json_object(res)
1182
+ return common.handle_results(
1183
+ res,
1184
+ main_list="listaLancamento",
1185
+ insertables=[
1186
+ "numeroPaginaTotal",
1187
+ "quantidadeIdentificacaoLancamento",
1188
+ ],
1189
+ rename_dict={
1190
+ "numeroPaginaTotal": "Número Página Total",
1191
+ "quantidadeIdentificacaoLancamento": "Quantidade Identificação Lançamento",
1192
+ "numeroSequencialLancamentoContaCorrente": "Número Sequencial Lançamento Conta Corrente",
1193
+ "numeroSequencialIdentificacaoLancamento": "Número Sequencial Identificação Lançamento",
1194
+ "tipoIdentificacao": "Tipo Identificação",
1195
+ "tipoIdentificacaoTexto": "Tipo Identificação Texto",
1196
+ "codigoIdentificacao": "Código Identificação",
1197
+ "numeroCompanhia": "Número Companhia",
1198
+ "valorFracionado": "Valor Fracionado",
1199
+ },
1200
+ )
1201
+
1202
+
1203
+ class AccountabilityV3ControleAPI(_AccountabilityV3BaseAPI):
1204
+ """Representa um encapsulador da API Accountability V3 do Banco do Brasil
1205
+ para os órgaos de controle.
1206
+
1207
+ Esse encapsulador já reutiliza o token de acesso por 10 minutos e gera um
1208
+ novo sempre que o atual estiver expirado.
1209
+ """
1210
+
1211
+ def __init__(
1212
+ self,
1213
+ ambiente: common.Ambiente = common.Ambiente.HOMOLOGACAO,
1214
+ app_key: str | None = None,
1215
+ client_id: str | None = None,
1216
+ client_secret: str | None = None,
1217
+ ):
1218
+ super().__init__(
1219
+ ambiente,
1220
+ app_key,
1221
+ client_id,
1222
+ client_secret,
1223
+ )
1224
+
1225
+ def get_extrato_programa_governo(
1226
+ self,
1227
+ branch_code: int,
1228
+ account_number: int,
1229
+ start_date: common.DateLike,
1230
+ end_date: common.DateLike,
1231
+ ) -> pd.DataFrame:
1232
+ access_token = self._get_access_token()
1233
+ start_date = common.handle_dates(start_date)
1234
+ end_date = common.handle_dates(end_date)
1235
+
1236
+ res = requests.request(
1237
+ "GET",
1238
+ f"{self._api_domain}/accountability/v3/statements/{branch_code}-{account_number}/control-agencies",
1239
+ headers=common.get_headers(access_token),
1240
+ params={
1241
+ "gw-dev-app-key": self._app_key,
1242
+ "startDate": start_date,
1243
+ "endDate": end_date,
1244
+ },
1245
+ )
1246
+
1247
+ if res.status_code != 200:
1248
+ raise Exception(
1249
+ "Não foi possível reaver o extrato do órgão repassador."
1250
+ )
1251
+
1252
+ res = common.parse_json_object(res)
1253
+
1254
+ return common.handle_results(
1255
+ res,
1256
+ main_list="transactions",
1257
+ insertables=[
1258
+ "governmentProgramCode",
1259
+ "governmentProgramName",
1260
+ "governmentSubProgramCode",
1261
+ "governmentSubProgramName",
1262
+ ],
1263
+ explodeables=[
1264
+ "expensesDocuments",
1265
+ ],
1266
+ rename_dict={
1267
+ "governmentProgramCode": "Código Programa Governo",
1268
+ "governmentProgramName": "Nome Programa Governo",
1269
+ "governmentSubProgramCode": "Código SubPrograma Governo",
1270
+ "governmentSubProgramName": "Nome SubPrograma Governo",
1271
+ "id": "ID Transação",
1272
+ "bookingDate": "Data Agendamento",
1273
+ "orderIndex": "Índice Ordem",
1274
+ "valueDate": "Data Valor",
1275
+ "referenceNumber": "Número Referência",
1276
+ "value": "Valor",
1277
+ "accountBalance": "Saldo Conta",
1278
+ "descriptionCode": "Código Descrição",
1279
+ "descriptionName": "Nome Descrição",
1280
+ "descriptionBatchNumber": "Número Lote Descrição",
1281
+ "creditDebitIndicator": "Indicador Crédito Débito",
1282
+ "beneficiaryBankIdentifierCode": "Código Identificador Banco Beneficiário",
1283
+ "beneficiaryBranchCode": "Código Agência Beneficiário",
1284
+ "beneficiaryAccountNumber": "Número Conta Beneficiário",
1285
+ "beneficiaryPersonType": "Tipo Pessoa Beneficiário",
1286
+ "beneficiaryDocumentId": "ID Documento Beneficiário",
1287
+ "beneficiaryName": "Nome Beneficiário",
1288
+ "pendingExpenseConciliation": "Conciliação Despesa Pendente",
1289
+ "attachedExpenseDocumentIndicator": "Indicador Anexo Documento Despesa",
1290
+ "expenseCategoryCode": "Código Categoria Despesa",
1291
+ "expenseIdentificationStatus": "Status Identificação Despesa",
1292
+ "subTransactionQuantity": "Quantidade Subtransações",
1293
+ "bankOrderRuleCode": "Código Ordem Pagamento Banco",
1294
+ "bankOrderPurposeCode": "Código Finalidade Ordem Banco",
1295
+ "bankOrderPurposeDescription": "Descrição Finalidade Ordem Banco",
1296
+ "expenseSequentialNumber": "Número Sequencial Despesa",
1297
+ "expensesCategory": "Categoria Despesa",
1298
+ "expensesDocuments": "ID Documento Despesa",
1299
+ },
1300
+ )
1301
+
1302
+ def get_documento_despesas_programa_governo(
1303
+ self,
1304
+ branch_code: int,
1305
+ account_number: int,
1306
+ transaction_id: int,
1307
+ document_id: int,
1308
+ booking_date: common.DateLike,
1309
+ ) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:
1310
+ access_token = self._get_access_token()
1311
+ booking_date = common.handle_dates(booking_date)
1312
+
1313
+ res = requests.request(
1314
+ "GET",
1315
+ f"{self._api_domain}/accountability/v3/expenses/{branch_code}-{account_number}/transactions/{transaction_id}/documents/{document_id}",
1316
+ headers=common.get_headers(access_token),
1317
+ params={
1318
+ "gw-dev-app-key": self._app_key,
1319
+ "bookingDate": booking_date,
1320
+ },
1321
+ )
1322
+
1323
+ if res.status_code != 200:
1324
+ raise Exception(
1325
+ "Não foi possível reaver o extrato do órgão repassador."
1326
+ )
1327
+
1328
+ res = common.parse_json_object(res)
1329
+
1330
+ df_issuer = common.handle_results(
1331
+ res["issuer"],
1332
+ rename_dict={
1333
+ "corporateTaxPayerRegistry": "CNPJ",
1334
+ "individualTaxPayerRegistry": "CPF",
1335
+ "stateRegistrationNumber": "RG",
1336
+ "legalName": "Nome Legal",
1337
+ "tradeName": "Nome Social",
1338
+ "countryName": "Nacionalidade",
1339
+ "stateAbbreviation": "UF",
1340
+ "cityName": "Cidade",
1341
+ "districtName": "Bairro",
1342
+ "additionalAddressInformation": "Endereço",
1343
+ "postalCode": "CEP",
1344
+ "phoneNumber": "Telefone",
1345
+ },
1346
+ )
1347
+
1348
+ df_recipient = common.handle_results(
1349
+ res["recipient"],
1350
+ rename_dict={
1351
+ "corporateTaxPayerRegistry": "CNPJ",
1352
+ "individualTaxPayerRegistry": "CPF",
1353
+ "stateRegistrationNumber": "RG",
1354
+ "legalName": "Nome Legal",
1355
+ "tradeName": "Nome Social",
1356
+ "countryName": "Nacionalidade",
1357
+ "stateAbbreviation": "UF",
1358
+ "cityName": "Cidade",
1359
+ "districtName": "Bairro",
1360
+ "additionalAddressInformation": "Endereço",
1361
+ "postalCode": "CEP",
1362
+ "phoneNumber": "Telefone",
1363
+ "presenceTypeCode": "Código Tipo Presença",
1364
+ "typeConsumerCode": "Código Tipo Consumidor",
1365
+ },
1366
+ )
1367
+
1368
+ df_document = common.handle_results(
1369
+ res["expenseDocument"],
1370
+ main_list="items",
1371
+ insertables=[
1372
+ "accessKey",
1373
+ "receiptTypeCode",
1374
+ "typeCode",
1375
+ "serialCode",
1376
+ "number",
1377
+ "issueDate",
1378
+ "movementDate",
1379
+ "itemDeliveryDate",
1380
+ "value",
1381
+ "operationTypeName",
1382
+ "operation",
1383
+ "paymentMethod",
1384
+ "digitalSignatureCode",
1385
+ "pronafAbilityRegistration",
1386
+ "timestamp",
1387
+ "userId",
1388
+ "discountValue",
1389
+ "totalDiscountValue",
1390
+ "realeaseInstrumentCode",
1391
+ "realeaseInstrumentName",
1392
+ "realeaseInstrumentDate",
1393
+ "additionalInformation",
1394
+ ],
1395
+ rename_dict={
1396
+ "accessKey": "Chave Acesso",
1397
+ "receiptTypeCode": "Código Tipo Recibo",
1398
+ "typeCode": "Código Tipo",
1399
+ "serialCode": "Código Série",
1400
+ "number": "Número",
1401
+ "issueDate": "Data Emissão",
1402
+ "movementDate": "Data Movimentação",
1403
+ "itemDeliveryDate": "Data Entrega",
1404
+ "value": "Valor",
1405
+ "operationTypeName": "Nome Tipo Operação",
1406
+ "operation": "Operação",
1407
+ "paymentMethod": "Método Pagamento",
1408
+ "digitalSignatureCode": "Código Assinatura Digital",
1409
+ "pronafAbilityRegistration": "Registro Habilidade Pronaf",
1410
+ "timestamp": "Momento",
1411
+ "userId": "ID Usuário",
1412
+ "discountValue": "Valor Desconto",
1413
+ "totalDiscountValue": "Valor Total Desconto",
1414
+ "realeaseInstrumentCode": "Código Liberação de Instrumento",
1415
+ "realeaseInstrumentName": "Nome Liberação Instrumento",
1416
+ "realeaseInstrumentDate": "Data Liberação Instrumento",
1417
+ "additionalInformation": "Informação Adicional",
1418
+ "description": "Descrição Item",
1419
+ "quantity": "Quantidade Item",
1420
+ "metric": "Métrica Item",
1421
+ "unitValue": "Valor Unitário Item",
1422
+ "totalValue": "Valor Total Item",
1423
+ "mercosurCommonNameId": "ID Nome Comum Mercosul",
1424
+ "itemDiscountValue": "Valor Desconto Item",
1425
+ },
1426
+ )
1427
+
1428
+ return (
1429
+ df_issuer,
1430
+ df_recipient,
1431
+ df_document,
1432
+ )
1433
+
1434
+ def get_documento_despesas_prestacao_contas(
1435
+ self,
1436
+ branch_code: int,
1437
+ account_number: int,
1438
+ transaction_id: int,
1439
+ subtransaction_id: int,
1440
+ document_id: int,
1441
+ booking_date: common.DateLike,
1442
+ ) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame]:
1443
+ access_token = self._get_access_token()
1444
+ booking_date = common.handle_dates(booking_date)
1445
+
1446
+ res = requests.request(
1447
+ "GET",
1448
+ f"{self._api_domain}/accountability/v3/expenses/{branch_code}-{account_number}/transactions/{transaction_id}/subTransactions/{subtransaction_id}/documents/{document_id}",
1449
+ headers=common.get_headers(access_token),
1450
+ params={
1451
+ "gw-dev-app-key": self._app_key,
1452
+ "bookingDate": booking_date,
1453
+ },
1454
+ )
1455
+
1456
+ if res.status_code != 200:
1457
+ raise Exception(
1458
+ "Não foi possível reaver o extrato do órgão repassador."
1459
+ )
1460
+
1461
+ res = common.parse_json_object(res)
1462
+
1463
+ df_issuer = common.handle_results(
1464
+ res["issuer"],
1465
+ rename_dict={
1466
+ "corporateTaxPayerRegistry": "CNPJ",
1467
+ "individualTaxPayerRegistry": "CPF",
1468
+ "stateRegistrationNumber": "RG",
1469
+ "legalName": "Nome Legal",
1470
+ "tradeName": "Nome Social",
1471
+ "countryName": "Nacionalidade",
1472
+ "stateAbbreviation": "UF",
1473
+ "cityName": "Cidade",
1474
+ "districtName": "Bairro",
1475
+ "additionalAddressInformation": "Endereço",
1476
+ "postalCode": "CEP",
1477
+ "phoneNumber": "Telefone",
1478
+ },
1479
+ )
1480
+
1481
+ df_recipient = common.handle_results(
1482
+ res["recipient"],
1483
+ rename_dict={
1484
+ "corporateTaxPayerRegistry": "CNPJ",
1485
+ "individualTaxPayerRegistry": "CPF",
1486
+ "stateRegistrationNumber": "RG",
1487
+ "legalName": "Nome Legal",
1488
+ "tradeName": "Nome Social",
1489
+ "countryName": "Nacionalidade",
1490
+ "stateAbbreviation": "UF",
1491
+ "cityName": "Cidade",
1492
+ "districtName": "Bairro",
1493
+ "additionalAddressInformation": "Endereço",
1494
+ "postalCode": "CEP",
1495
+ "phoneNumber": "Telefone",
1496
+ "presenceTypeCode": "Código Tipo Presença",
1497
+ "typeConsumerCode": "Código Tipo Consumidor",
1498
+ },
1499
+ )
1500
+
1501
+ df_document = common.handle_results(
1502
+ res["expenseDocument"],
1503
+ main_list="items",
1504
+ insertables=[
1505
+ "accessKey",
1506
+ "receiptTypeCode",
1507
+ "typeCode",
1508
+ "serialCode",
1509
+ "number",
1510
+ "issueDate",
1511
+ "movementDate",
1512
+ "itemDeliveryDate",
1513
+ "value",
1514
+ "operationTypeName",
1515
+ "operation",
1516
+ "paymentMethod",
1517
+ "digitalSignatureCode",
1518
+ "pronafAbilityRegistration",
1519
+ "timestamp",
1520
+ "userId",
1521
+ "discountValue",
1522
+ "totalDiscountValue",
1523
+ "realeaseInstrumentCode",
1524
+ "realeaseInstrumentName",
1525
+ "realeaseInstrumentDate",
1526
+ "additionalInformation",
1527
+ ],
1528
+ rename_dict={
1529
+ "accessKey": "Chave Acesso",
1530
+ "receiptTypeCode": "Código Tipo Recibo",
1531
+ "typeCode": "Código Tipo",
1532
+ "serialCode": "Código Série",
1533
+ "number": "Número",
1534
+ "issueDate": "Data Emissão",
1535
+ "movementDate": "Data Movimentação",
1536
+ "itemDeliveryDate": "Data Entrega",
1537
+ "value": "Valor",
1538
+ "operationTypeName": "Nome Tipo Operação",
1539
+ "operation": "Operação",
1540
+ "paymentMethod": "Método Pagamento",
1541
+ "digitalSignatureCode": "Código Assinatura Digital",
1542
+ "pronafAbilityRegistration": "Registro Habilidade Pronaf",
1543
+ "timestamp": "Momento",
1544
+ "userId": "ID Usuário",
1545
+ "discountValue": "Valor Desconto",
1546
+ "totalDiscountValue": "Valor Total Desconto",
1547
+ "realeaseInstrumentCode": "Código Liberação de Instrumento",
1548
+ "realeaseInstrumentName": "Nome Liberação Instrumento",
1549
+ "realeaseInstrumentDate": "Data Liberação Instrumento",
1550
+ "additionalInformation": "Informação Adicional",
1551
+ "description": "Descrição Item",
1552
+ "quantity": "Quantidade Item",
1553
+ "metric": "Métrica Item",
1554
+ "unitValue": "Valor Unitário Item",
1555
+ "totalValue": "Valor Total Item",
1556
+ "mercosurCommonNameId": "ID Nome Comum Mercosul",
1557
+ "itemDiscountValue": "Valor Desconto Item",
1558
+ },
1559
+ )
1560
+
1561
+ return (
1562
+ df_issuer,
1563
+ df_recipient,
1564
+ df_document,
1565
+ )
1566
+
1567
+ def get_extrato_subtransacoes_programa_governo(
1568
+ self,
1569
+ branch_code: int,
1570
+ account_number: int,
1571
+ id: int,
1572
+ ) -> pd.DataFrame:
1573
+ access_token = self._get_access_token()
1574
+
1575
+ res = requests.request(
1576
+ "GET",
1577
+ f"{self._api_domain}/accountability/v3/statements/{branch_code}-{account_number}/debits/{id}/control-agencies/subtransactions",
1578
+ headers=common.get_headers(access_token),
1579
+ params={
1580
+ "gw-dev-app-key": self._app_key,
1581
+ },
1582
+ )
1583
+
1584
+ if res.status_code != 200:
1585
+ raise Exception(
1586
+ "Não foi possível listar as categorias do programa de governo."
1587
+ )
1588
+
1589
+ res = common.parse_json_object(res)
1590
+ return common.handle_results(
1591
+ res,
1592
+ main_list="subtransactions",
1593
+ insertables=[
1594
+ "governmentProgramCode",
1595
+ "governmentProgramName",
1596
+ "governmentSubProgramCode",
1597
+ "governmentSubProgramName",
1598
+ ],
1599
+ explodeables=[
1600
+ "expensesCategory",
1601
+ "expensesDocuments",
1602
+ ],
1603
+ rename_dict={
1604
+ "governmentProgramCode": "Código Programa Governo",
1605
+ "governmentProgramName": "Nome Programa Governo",
1606
+ "governmentSubProgramCode": "Código SubPrograma Governo",
1607
+ "governmentSubProgramName": "Nome SubPrograma Governo",
1608
+ "id": "ID",
1609
+ "codeSubtransactionState": "Estado Código Subtransação",
1610
+ "paymentState": "Estado Pagamento",
1611
+ "paymentDate": "Data Pagamento",
1612
+ "value": "Valor",
1613
+ "beneficiaryBankIdentifierCode": "Código Identificador Banco Beneficiário",
1614
+ "beneficiaryBranchCode": "Código Agência Beneficiário",
1615
+ "beneficiaryAccountNumber": "Número Conta Beneficiário",
1616
+ "beneficiaryPersonType": "Tipo Pessoa Beneficiário",
1617
+ "beneficiaryDocumentId": "ID Documento Beneficiário",
1618
+ "beneficiaryName": "Nome Beneficiário",
1619
+ "attachedExpenseDocumentIndicator": "Indicador Anexo Documento Despesa",
1620
+ "expenseCategoryCode": "Código Categoria Despesa",
1621
+ "subtransactionAccountabilityIndicator": "Indicador Contabilidade Subtransação",
1622
+ "subtransactionAccountabilityName": "Nome Contabilidade Subtransação",
1623
+ "bankOrderPurposeCode": "Código Finalidade Ordem Banco",
1624
+ "bankOrderRuleCode": "Código Ordem Pagamento Banco",
1625
+ "bankOrderPurposeDescription": "Descrição Finalidade Ordem Banco",
1626
+ "expenseSequentialNumber": "Número Sequencial Despesa",
1627
+ "code": "Código Categoria Despesa",
1628
+ "parentCode": "Código Pai Categoria Despesa",
1629
+ "name": "Nome Categoria Despesa",
1630
+ "expensesDocuments": "Documentos Despesa",
1631
+ },
1632
+ )
1633
+
1634
+ def get_extrato_fundos_investimento(
1635
+ self,
1636
+ agencia: str,
1637
+ conta_corrente: str,
1638
+ fundo_investimento_id: str,
1639
+ mes: int,
1640
+ ano: int,
1641
+ ) -> pd.DataFrame:
1642
+ access_token = self._get_access_token()
1643
+
1644
+ res = requests.request(
1645
+ "GET",
1646
+ f"{self._api_domain}/accountability/v3/extratos/{agencia}-{conta_corrente}/fundos-investimentos/{fundo_investimento_id}/control-agencies",
1647
+ headers=common.get_headers(access_token),
1648
+ params={
1649
+ "mes": mes,
1650
+ "ano": ano,
1651
+ "gw-dev-app-key": self._app_key,
1652
+ },
1653
+ )
1654
+
1655
+ if res.status_code != 200:
1656
+ raise Exception(
1657
+ "Não foi possível listar as categorias do programa de governo."
1658
+ )
1659
+
1660
+ res = common.parse_json_object(res)
1661
+ extrato = cast("dict[str, object]", res["extrato"])
1662
+ extrato["valorCotaExtrato"] = extrato.pop("valorCota")
1663
+ df = common.handle_results(
1664
+ extrato,
1665
+ main_list="listaLancamentosExtrato",
1666
+ insertables=[
1667
+ "numeroAgenciaRecebedora",
1668
+ "digitoVerificadorContaRecebedora",
1669
+ "numeroContaCorrenteRecebedora",
1670
+ "numeroDigitoVerificadorContaCorrenteRecebedora",
1671
+ "nomeClienteRecebedor",
1672
+ "nomeFundoInvestimento",
1673
+ "CNPJFundoInvestimento",
1674
+ "valorCotaExtrato",
1675
+ "dataAfericaoValorCota",
1676
+ "ultimaCotacaoCota",
1677
+ "dataUltimaCotacaoCota",
1678
+ "sinalRentabilidadeMes",
1679
+ "valorRentabilidadeMes",
1680
+ "sinalRentabilidadeAno",
1681
+ "valorRentabilidadeAno",
1682
+ "sinalRentabilidadeResgateTotal",
1683
+ "valorRentabilidadeResgateTotal",
1684
+ "valorDisponivelResgate",
1685
+ "valorCarenciaResgate",
1686
+ "valorIRPrevisto",
1687
+ "percentualIRPrevisto",
1688
+ "valorIRComplementarPrevisto",
1689
+ "valorIOFPrevisto",
1690
+ "valorTaxaSaida",
1691
+ "valorBonusDesempenho",
1692
+ "valorBloqueado",
1693
+ "valorAplicado",
1694
+ "valorResgate",
1695
+ "valorSaldoAnterior",
1696
+ "quantidadeCotaAnterior",
1697
+ "dataSaldoAnterior",
1698
+ "valorTotalAplicadoPeriodo",
1699
+ "valorTotalResgatadoPeriodo",
1700
+ "sinalRendimentoBrutoPeriodo",
1701
+ "valorRendimentoBrutoPeriodo",
1702
+ "valorTotalIRPeriodo",
1703
+ "valorTotalIOFPeriodo",
1704
+ "valorTotalTaxaSaidaPeriodo",
1705
+ "valorTotalBonusDesempenhoPeriodo",
1706
+ "sinalRendimentoLiquido",
1707
+ "valorRendimentoLiquido",
1708
+ "valorSaldoMesAnterior",
1709
+ "quantidadeCotaMesAnterior",
1710
+ "dataSaldoMesAnterior",
1711
+ "numeroLancamento",
1712
+ ],
1713
+ rename_dict={
1714
+ "numeroAgenciaRecebedora": "Número Agência Recebedora",
1715
+ "digitoVerificadorContaRecebedora": "Dígito Verificador Conta Recebedora",
1716
+ "numeroContaCorrenteRecebedora": "Número Conta Corrente Recebedora",
1717
+ "numeroDigitoVerificadorContaCorrenteRecebedora": "Número Dígito Verificador Conta Corrente Recebedora",
1718
+ "nomeClienteRecebedor": "Nome Cliente Recebedor",
1719
+ "nomeFundoInvestimento": "Nome Fundo Investimento",
1720
+ "CNPJFundoInvestimento": " CNPJ Fundo Investimento",
1721
+ "valorCotaExtrato": "Valor Cota Extrato",
1722
+ "dataAfericaoValorCota": "Data Afericão Valor Cota",
1723
+ "ultimaCotacaoCota": "Última Cotação Cota",
1724
+ "dataUltimaCotacaoCota": "Data Última Cotação Cota",
1725
+ "sinalRentabilidadeMes": "Sinal Rentabilidade Mês",
1726
+ "valorRentabilidadeMes": "Valor Rentabilidade Mês",
1727
+ "sinalRentabilidadeAno": "Sinal Rentabilidade Ano",
1728
+ "valorRentabilidadeAno": "Valor Rentabilidade Ano",
1729
+ "sinalRentabilidadeResgateTotal": "Sinal Rentabilidade Resgate Total",
1730
+ "valorRentabilidadeResgateTotal": "Valor Rentabilidade Resgate Total",
1731
+ "valorDisponivelResgate": "Valor Disponível Resgate",
1732
+ "valorCarenciaResgate": "Valor Carência Resgate",
1733
+ "valorIRPrevisto": "Valor IR Previsto",
1734
+ "percentualIRPrevisto": "Percentual IR Previsto",
1735
+ "valorIRComplementarPrevisto": "Valor IR Complementar Previsto",
1736
+ "valorIOFPrevisto": "Valor IOF Previsto",
1737
+ "valorTaxaSaida": "Valor Taxa Saída",
1738
+ "valorBonusDesempenho": "Valor Bônus Desempenho",
1739
+ "valorBloqueado": "Valor Bloqueado",
1740
+ "valorAplicado": "Valor Aplicado",
1741
+ "valorResgate": "Valor Resgate",
1742
+ "valorSaldoAnterior": "Valor Saldo Anterior",
1743
+ "quantidadeCotaAnterior": "Quantidade Cota Anterior",
1744
+ "dataSaldoAnterior": "Data Saldo Anterior",
1745
+ "valorTotalAplicadoPeriodo": "Valor Total Aplicado Período",
1746
+ "valorTotalResgatadoPeriodo": "Valor Total Resgatado Período",
1747
+ "sinalRendimentoBrutoPeriodo": "Sinal Rendimento Bruto Período",
1748
+ "valorRendimentoBrutoPeriodo": "Valor Rendimento Bruto Período",
1749
+ "valorTotalIRPeriodo": "Valor Total IR Período",
1750
+ "valorTotalIOFPeriodo": "Valor Total IOF Período",
1751
+ "valorTotalTaxaSaidaPeriodo": "Valor Total Taxa Saída Período",
1752
+ "valorTotalBonusDesempenhoPeriodo": "Valor Total Bônus Desempenho Período",
1753
+ "sinalRendimentoLiquido": "Sinal Rendimento Líquido",
1754
+ "valorRendimentoLiquido": "Valor Rendimento Líquido",
1755
+ "valorSaldoMesAnterior": "Valor Saldo Mês Anterior",
1756
+ "quantidadeCotaMesAnterior": "Quantidade Cota Mês Anterior",
1757
+ "dataSaldoMesAnterior": "Data Saldo Mês Anterior",
1758
+ "numeroLancamento": "Número Lançamento",
1759
+ "dataLancamento": "Data Lançamento",
1760
+ "descricao": "Descrição",
1761
+ "valorLancamento": "Valor Lançamento",
1762
+ "valorIR": "Valor IR",
1763
+ "valorPrejuizo": "Valor Prejuízo",
1764
+ "valorIOF": "Valor IOF",
1765
+ "quantidadeCota": "Quantidade Cota",
1766
+ "valorCota": "Valor Cota Lançamento",
1767
+ "saldoCotas": "Saldo Cotas",
1768
+ "valorBaseCalculoIR": "Valor Base Cálculo IR",
1769
+ "numeroDocumentoLancamento": "Número Documento Lançamento",
1770
+ },
1771
+ )
1772
+
1773
+ df["Código Programa Governo"] = cast("common.Scalar", res["codigoProgramaGoverno"])
1774
+ df["Nome Programa Governo"] = cast("common.Scalar", res["nomeProgramaGoverno"])
1775
+ df["Código SubPrograma Governo"] = cast(
1776
+ "common.Scalar", res["codigoSubProgramaGoverno"]
1777
+ )
1778
+ df["Nome SubPrograma Governo"] = cast(
1779
+ "common.Scalar", res["nomeSubProgramaGoverno"]
1780
+ )
1781
+
1782
+ return df
1783
+
1784
+ def get_extrato_poupanca(
1785
+ self,
1786
+ agencia: str,
1787
+ conta_corrente: str,
1788
+ variacao_poupanca: str,
1789
+ codigo_variacao: int,
1790
+ ) -> pd.DataFrame:
1791
+ access_token = self._get_access_token()
1792
+
1793
+ res = requests.request(
1794
+ "GET",
1795
+ f"{self._api_domain}/accountability/v3/extratos/{agencia}-{conta_corrente}/poupanca/{variacao_poupanca}/orgao-controle",
1796
+ headers=common.get_headers(access_token),
1797
+ params={
1798
+ "gw-dev-app-key": self._app_key,
1799
+ "codigoVariacao": codigo_variacao,
1800
+ },
1801
+ )
1802
+
1803
+ if res.status_code != 200:
1804
+ raise Exception(
1805
+ "Não foi possível listar as categorias do programa de governo."
1806
+ )
1807
+
1808
+ res = common.parse_json_object(res)
1809
+ return common.handle_results(
1810
+ res,
1811
+ main_list="listaLancamentos",
1812
+ insertables=[
1813
+ "codigoProgramaGoverno",
1814
+ "nomeProgramaGoverno",
1815
+ "codigoSubProgramaGoverno",
1816
+ "nomeSubProgramaGoverno",
1817
+ "nomeCliente",
1818
+ "identificadorCliente",
1819
+ "saldoAnterior",
1820
+ "saldoAtual",
1821
+ "saldoBloqueado",
1822
+ "saldoDisponivel",
1823
+ ],
1824
+ rename_dict={
1825
+ "codigoProgramaGoverno": "Código Programa Governo",
1826
+ "nomeProgramaGoverno": "Nome Programa Governo",
1827
+ "codigoSubProgramaGoverno": "Código SubPrograma Governo",
1828
+ "nomeSubProgramaGoverno": "Nome SubPrograma Governo",
1829
+ "nomeCliente": "Nome Cliente",
1830
+ "identificadorCliente": "Identificador Cliente",
1831
+ "saldoAnterior": "Saldo Anterior",
1832
+ "saldoAtual": "Saldo Atual",
1833
+ "saldoBloqueado": "Saldo Bloqueado",
1834
+ "saldoDisponivel": "Saldo Disponível",
1835
+ "dataLancamento": "Data Lançamento",
1836
+ "dataMovimento": "Data Movimento",
1837
+ "diaLancamento": "Dia Lançamento",
1838
+ "codigoHistorico": "Código Histórico",
1839
+ "descricaoHistorico": "Descrição Histórico",
1840
+ "indicadorDebitoCredito": "Indicador Débito Crédito",
1841
+ "agenciaOrigem": "Agência Origem",
1842
+ "numeroDocumento": "Número Documento",
1843
+ "valorLancamento": "Valor Lançamento",
1844
+ },
1845
+ )
1846
+
1847
+ def get_contas_correntes(
1848
+ self,
1849
+ numero_registro: str,
1850
+ ) -> pd.DataFrame:
1851
+ access_token = self._get_access_token()
1852
+
1853
+ res = requests.request(
1854
+ "GET",
1855
+ f"{self._api_domain}/accountability/v3/conta-corrente/orgaos-controle",
1856
+ headers=common.get_headers(access_token),
1857
+ params={
1858
+ "gw-dev-app-key": self._app_key,
1859
+ "numeroRegistro": numero_registro,
1860
+ },
1861
+ )
1862
+
1863
+ if res.status_code != 200:
1864
+ raise Exception(
1865
+ "Não foi possível listar as categorias do programa de governo."
1866
+ )
1867
+
1868
+ res = common.parse_json_object(res)
1869
+ return common.handle_results(
1870
+ res,
1871
+ main_list="listaContaCorrente",
1872
+ insertables=[
1873
+ "numeroRegistroConsultar",
1874
+ "quantidadeContaCorrente",
1875
+ ],
1876
+ rename_dict={
1877
+ "numeroRegistroConsultar": "Número Registro Consultar",
1878
+ "quantidadeContaCorrente": "Quantidade Conta Corrente",
1879
+ "codigoProgramaGoverno": "Código Programa Governo",
1880
+ "nomeProgramaGoverno": "Nome Programa Governo",
1881
+ "cnpj": "CNPJ",
1882
+ "agencia": "Agência",
1883
+ "nomeAgencia": "Nome Agência",
1884
+ "contaCorrente": "Conta Corrente",
1885
+ },
1886
+ )