pyEscoAPI 0.0.11__tar.gz → 0.0.16__tar.gz
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.
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/PKG-INFO +1 -1
- pyescoapi-0.0.16/pyEscoAPI/dataclasses.py +193 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI/esco_api.py +142 -27
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI.egg-info/PKG-INFO +1 -1
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyproject.toml +1 -1
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/tests/test_client.py +43 -0
- pyescoapi-0.0.11/pyEscoAPI/dataclasses.py +0 -193
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/README.md +0 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI/__init__.py +0 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI/exception.py +0 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI.egg-info/SOURCES.txt +0 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI.egg-info/dependency_links.txt +0 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI.egg-info/requires.txt +0 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/pyEscoAPI.egg-info/top_level.txt +0 -0
- {pyescoapi-0.0.11 → pyescoapi-0.0.16}/setup.cfg +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import List
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class ComitenteData:
|
|
9
|
+
fechaApertura: datetime
|
|
10
|
+
denominacion: str
|
|
11
|
+
esFisico: bool
|
|
12
|
+
esInversorCalificado: bool
|
|
13
|
+
expBrokerCta: bool
|
|
14
|
+
expInversion: bool
|
|
15
|
+
especulativoOportunista: int
|
|
16
|
+
fechaDesdeCodTpContribIVA: datetime
|
|
17
|
+
codTpContribIVA: str
|
|
18
|
+
requiereFirmaConjunta: bool
|
|
19
|
+
noPresencial: bool
|
|
20
|
+
terceroNoIntermediario: bool
|
|
21
|
+
intermediario: bool
|
|
22
|
+
titulares: List[Persona]
|
|
23
|
+
entMailing: List[EntMailing]
|
|
24
|
+
numComitente: int | None = None
|
|
25
|
+
emailsInfo: str | None = None
|
|
26
|
+
patrimonioEstim: int | None = None
|
|
27
|
+
patrimonioEstimMoneda: str | None = None
|
|
28
|
+
actividad: int | None = None
|
|
29
|
+
expBrokerCtaNombre: str | None = None
|
|
30
|
+
experienciaEnInversiones: str | None = None
|
|
31
|
+
montoEstimCta: int | None = None
|
|
32
|
+
montoEstimCtaMoneda: str | None = None
|
|
33
|
+
tpRiesgoCmt: str | None = None
|
|
34
|
+
tpManejoCart: str | None = None
|
|
35
|
+
tpCmtTrading: int | None = None
|
|
36
|
+
codCuotapartista: str | None = None
|
|
37
|
+
referenciaFirmaConjunta: str | None = None
|
|
38
|
+
codGrupoArOperBurs: int | None = None
|
|
39
|
+
codTpComitente: int | None = None
|
|
40
|
+
codCategoriaUIF: int | None = None
|
|
41
|
+
codGrupoArAcreencias: int | None = None
|
|
42
|
+
codGrupoArCustodia: int | None = None
|
|
43
|
+
firmoCondFechaDesde: datetime | None = None
|
|
44
|
+
oficialCuenta: int | None = None
|
|
45
|
+
administrador: int | None = None
|
|
46
|
+
productor: int | None = None
|
|
47
|
+
codTpBilleteraVirtual: str | None = None
|
|
48
|
+
pmtComsinCustodia: bool | None = None
|
|
49
|
+
pmtComRecepdeInf: bool | None = None
|
|
50
|
+
pmtDerechoenMonOpe: bool | None = None
|
|
51
|
+
pmtEsClienteEspecial: bool | None = None
|
|
52
|
+
pmtEsComPromotor: bool | None = None
|
|
53
|
+
pmtGeneraAvisosAlertasUIF: bool | None = None
|
|
54
|
+
pmtivAenMondeOpeMov: bool | None = None
|
|
55
|
+
pmtOperabajoAcuerdoLibreAdm: bool | None = None
|
|
56
|
+
pmtPermiteSuscribirCtaBancariaEnVBHome: bool | None = None
|
|
57
|
+
pmtRecibeMailCambioEstadoOrdenes: bool | None = None
|
|
58
|
+
pmtExcluyeCalculoRetencionPercepcionIVABoletosCheques: bool | None = None
|
|
59
|
+
pmtExcluyeCalculoResultadoOpContinuo: bool | None = None
|
|
60
|
+
pmtIncluyeGenracionCreditosParaOperar: bool | None = None
|
|
61
|
+
pmtInformaInterfazGTR: bool | None = None
|
|
62
|
+
pmtBonificaGastoCustodiaCV: bool | None = None
|
|
63
|
+
pmtSeCobraCustodia: bool | None = None
|
|
64
|
+
pmtSeCobranArancelesGestionBancaria: bool | None = None
|
|
65
|
+
pmtSeCobranCargosPorDescubierto: bool | None = None
|
|
66
|
+
pmtSeEnviaValuacion: bool | None = None
|
|
67
|
+
pmtSeFacturanCargosPorDescubierto: bool | None = None
|
|
68
|
+
pmtSeleimimenboletos: bool | None = None
|
|
69
|
+
pmtSeleImimenetiquetas: bool | None = None
|
|
70
|
+
juridicos: Juridicos | None = None
|
|
71
|
+
instrucciones: List[Instrucciones] | None = None
|
|
72
|
+
codTpRiesgo: str | None = None
|
|
73
|
+
fechaVencimientoPerfil: datetime | None = None
|
|
74
|
+
tpContribRetencion: str | None = None
|
|
75
|
+
codCanalVta: int | None = None
|
|
76
|
+
codCategoria: int | None = None
|
|
77
|
+
codPRI: int | None = None
|
|
78
|
+
codPerfilCmt: int | None = None
|
|
79
|
+
numSucursal: str | None = None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@dataclass
|
|
83
|
+
class Juridicos:
|
|
84
|
+
numInscripcion: str
|
|
85
|
+
lugarConstitucion: str
|
|
86
|
+
folio: str
|
|
87
|
+
libro: str
|
|
88
|
+
tomo: str
|
|
89
|
+
codPais: int
|
|
90
|
+
tpContribIngBrutos: str
|
|
91
|
+
cuit: str
|
|
92
|
+
ruc: str
|
|
93
|
+
rut: str
|
|
94
|
+
esSociedadHecho: bool
|
|
95
|
+
tpRegisJuridica: int
|
|
96
|
+
esExtranjero: bool
|
|
97
|
+
actividad: int
|
|
98
|
+
numInscripcionIIBB: str
|
|
99
|
+
codTpIdFatca: int
|
|
100
|
+
idFatca: str
|
|
101
|
+
actividadUIF: int
|
|
102
|
+
giin: str
|
|
103
|
+
esInversorCalificado: bool
|
|
104
|
+
obsFatca: str
|
|
105
|
+
cie: str
|
|
106
|
+
fechaConstitucion: datetime
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@dataclass
|
|
110
|
+
class Persona:
|
|
111
|
+
apellido: str | None = None
|
|
112
|
+
nombre: str | None = None
|
|
113
|
+
tpDoc: int | None = None
|
|
114
|
+
numDoc: str | None = None
|
|
115
|
+
nacionalidad: int | None = None
|
|
116
|
+
fechaNacimiento: datetime | None = None
|
|
117
|
+
lugarNacimiento: str | None = None
|
|
118
|
+
sexo: int | None = None
|
|
119
|
+
estadoCivil: int | None = None
|
|
120
|
+
esPEP: bool | None = None
|
|
121
|
+
esSujetoObligado: bool | None = None
|
|
122
|
+
cuit: str | None = None
|
|
123
|
+
cuil: str | None = None
|
|
124
|
+
cdi: str | None = None
|
|
125
|
+
emailsInfo: str | None = None
|
|
126
|
+
noPresencial: bool | None = None
|
|
127
|
+
esInversorCalificado: bool | None = None
|
|
128
|
+
esBeneficiario: bool | None = None
|
|
129
|
+
esCliente: bool | None = None
|
|
130
|
+
esClienteEspecial: bool | None = None
|
|
131
|
+
esExtranjero: bool | None = None
|
|
132
|
+
codInterfaz: str | None = None
|
|
133
|
+
perteneceLUT: bool | None = None
|
|
134
|
+
giin: str | None = None
|
|
135
|
+
ruc: str | None = None
|
|
136
|
+
rut: str | None = None
|
|
137
|
+
idFatca: str | None = None
|
|
138
|
+
obsFatca: str | None = None
|
|
139
|
+
codTpIdFatca: int | None = None
|
|
140
|
+
codActividad: int | None = None
|
|
141
|
+
codActividadUIF: int | None = None
|
|
142
|
+
codTpContribIVA: str | None = None
|
|
143
|
+
tpPersona: bool | None = None
|
|
144
|
+
numImpositivo: str | None = None
|
|
145
|
+
persEmpresa: str | None = None
|
|
146
|
+
persCargo: str | None = None
|
|
147
|
+
persTpContribRetencion: str | None = None
|
|
148
|
+
persAgRecaudador: bool | None = None
|
|
149
|
+
persAgNroInscrip: str | None = None
|
|
150
|
+
persSSN: str | None = None
|
|
151
|
+
posicionCondominio: int | None = None
|
|
152
|
+
condTpCondominio: str | None = None
|
|
153
|
+
requiereFirma: bool | None = None
|
|
154
|
+
condEsAccionista: bool | None = None
|
|
155
|
+
condPorcParticipacion: int | None = None
|
|
156
|
+
condBeneficiario: int | None = None
|
|
157
|
+
patrimonioEstim: int | None = None
|
|
158
|
+
patrimonioEstimMoneda: str | None = None
|
|
159
|
+
tpRiesgoTitular: str | None = None
|
|
160
|
+
domicilioParticular: Domicilio | None = None
|
|
161
|
+
domicilioComercial: Domicilio | None = None
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
@dataclass
|
|
165
|
+
class Domicilio:
|
|
166
|
+
codProvincia: int
|
|
167
|
+
codPais: int | None = None
|
|
168
|
+
altura: str | None = None
|
|
169
|
+
calle: str | None = None
|
|
170
|
+
piso: str | None = None
|
|
171
|
+
departamento: str | None = None
|
|
172
|
+
localidad: str | None = None
|
|
173
|
+
codigoPostal: str | None = None
|
|
174
|
+
telefono: str | None = None
|
|
175
|
+
fax: str | None = None
|
|
176
|
+
recibeInfoFax: bool | None = None
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
@dataclass
|
|
180
|
+
class Instrucciones:
|
|
181
|
+
moneda: str
|
|
182
|
+
banco: int | None = None
|
|
183
|
+
tpCuenta: int | None = None
|
|
184
|
+
numSucursal: int | None = None
|
|
185
|
+
numeroCuenta: str | None = None
|
|
186
|
+
cbu: str | None = None
|
|
187
|
+
cuit: str | None = None
|
|
188
|
+
ctaAlias: str | None = None
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@dataclass
|
|
192
|
+
class EntMailing:
|
|
193
|
+
codEntMailing: int
|
|
@@ -4,7 +4,7 @@ from dataclasses import asdict
|
|
|
4
4
|
from datetime import datetime, timedelta, date
|
|
5
5
|
from enum import Enum
|
|
6
6
|
from http import HTTPMethod
|
|
7
|
-
from typing import TypedDict
|
|
7
|
+
from typing import TypedDict
|
|
8
8
|
|
|
9
9
|
import requests
|
|
10
10
|
from requests import Response
|
|
@@ -12,21 +12,21 @@ from requests import Response
|
|
|
12
12
|
from pyEscoAPI.dataclasses import Persona, ComitenteData
|
|
13
13
|
from pyEscoAPI.exception import PyEscoAPIError
|
|
14
14
|
|
|
15
|
-
logger = logging.getLogger(f"{__name__}")
|
|
15
|
+
logger = logging.getLogger(f"app.{__name__}")
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
class DomicilioDict(TypedDict):
|
|
19
19
|
cod_pais: int
|
|
20
20
|
cod_provincia: int
|
|
21
|
-
altura: Optional[str]
|
|
22
|
-
calle: Optional[str]
|
|
23
|
-
piso: Optional[str]
|
|
24
|
-
departamento: Optional[str]
|
|
25
|
-
localidad: Optional[str]
|
|
26
|
-
cod_postal: Optional[str]
|
|
27
|
-
telefono: Optional[str]
|
|
28
|
-
fax: Optional[str]
|
|
29
21
|
recibe_info_fax: bool
|
|
22
|
+
altura: str | None = None
|
|
23
|
+
calle: str | None = None
|
|
24
|
+
piso: str | None = None
|
|
25
|
+
departamento: str | None = None
|
|
26
|
+
localidad: str | None = None
|
|
27
|
+
cod_postal: str | None = None
|
|
28
|
+
telefono: str | None = None
|
|
29
|
+
fax: str | None = None
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class APIVersion(Enum):
|
|
@@ -34,6 +34,8 @@ class APIVersion(Enum):
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class EscoAPI:
|
|
37
|
+
_instance = None
|
|
38
|
+
|
|
37
39
|
base_url: str
|
|
38
40
|
username: str
|
|
39
41
|
password: str
|
|
@@ -64,10 +66,28 @@ class EscoAPI:
|
|
|
64
66
|
}
|
|
65
67
|
result: Response = req_call(**params)
|
|
66
68
|
if 200 <= result.status_code <= 299:
|
|
69
|
+
result_body = result.json()
|
|
70
|
+
logger.info("EscoAPI: Successful response", extra={
|
|
71
|
+
"request_body": request_body,
|
|
72
|
+
"url": f"{self.base_url}{request_endpoint}",
|
|
73
|
+
"response_body": result_body if request_endpoint != "/login" else None,
|
|
74
|
+
"status_code": result.status_code
|
|
75
|
+
})
|
|
67
76
|
return result.json()
|
|
68
77
|
else:
|
|
69
|
-
|
|
78
|
+
try:
|
|
79
|
+
result_body = result.json()
|
|
80
|
+
error_message = result_body["error"]["Msj"]
|
|
81
|
+
except:
|
|
82
|
+
error_message = ""
|
|
83
|
+
if not error_message or error_message == "":
|
|
70
84
|
error_message = f"Error during endpoint call: {request_endpoint}. Code: {result.status_code}"
|
|
85
|
+
logger.error("EscoAPI: Failed response", extra={
|
|
86
|
+
"request_body": request_body,
|
|
87
|
+
"url": f"{self.base_url}{request_endpoint}",
|
|
88
|
+
"response_body": result.json(),
|
|
89
|
+
"status_code": result.status_code
|
|
90
|
+
})
|
|
71
91
|
raise PyEscoAPIError(endpoint=request_endpoint, status_code=result.status_code, error_message=error_message)
|
|
72
92
|
|
|
73
93
|
def __esco_login(self):
|
|
@@ -93,18 +113,18 @@ class EscoAPI:
|
|
|
93
113
|
self.__esco_login()
|
|
94
114
|
|
|
95
115
|
def __new__(cls, base_url: str, username: str, password: str, client_id: str, version: APIVersion):
|
|
96
|
-
if
|
|
97
|
-
cls.
|
|
98
|
-
|
|
99
|
-
return cls.
|
|
116
|
+
if cls._instance is None:
|
|
117
|
+
cls._initialized = False
|
|
118
|
+
cls._instance = super(EscoAPI, cls).__new__(cls)
|
|
119
|
+
return cls._instance
|
|
100
120
|
|
|
101
121
|
def __init__(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
122
|
+
self,
|
|
123
|
+
base_url: str,
|
|
124
|
+
username: str,
|
|
125
|
+
password: str,
|
|
126
|
+
client_id: str = "",
|
|
127
|
+
version: APIVersion = APIVersion.VERSION_9
|
|
108
128
|
):
|
|
109
129
|
"""
|
|
110
130
|
Initializes the EscoAPI client, starting a login to the platform.
|
|
@@ -116,13 +136,15 @@ class EscoAPI:
|
|
|
116
136
|
:param client_id: Optional. Include if you want to specify a client_id.
|
|
117
137
|
:param version: Optional. The EscoAPI version that you want to use. Default: Version 9.
|
|
118
138
|
"""
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
139
|
+
if not self._initialized:
|
|
140
|
+
self.base_url = f"{base_url}/api/v{version.value}"
|
|
141
|
+
self.username = username
|
|
142
|
+
self.password = password
|
|
143
|
+
self.client_id = client_id
|
|
144
|
+
self.version = version
|
|
124
145
|
|
|
125
|
-
|
|
146
|
+
self.__esco_login()
|
|
147
|
+
self._initialized = True
|
|
126
148
|
|
|
127
149
|
def get_posiciones(
|
|
128
150
|
self,
|
|
@@ -1091,6 +1113,99 @@ class EscoAPI:
|
|
|
1091
1113
|
request_body=req_body,
|
|
1092
1114
|
request_method=HTTPMethod.POST
|
|
1093
1115
|
)
|
|
1116
|
+
|
|
1117
|
+
def get_ctaCorriente_monetaria(
|
|
1118
|
+
self,
|
|
1119
|
+
cuenta: str = None,
|
|
1120
|
+
por_concertacion: bool = False,
|
|
1121
|
+
moneda: str = None,
|
|
1122
|
+
fecha_desde: datetime = datetime.now() - timedelta(days=15),
|
|
1123
|
+
fecha_hasta: datetime = datetime.now(),
|
|
1124
|
+
):
|
|
1125
|
+
"""
|
|
1126
|
+
Obtiene movimientos y operaciones ya confirmadas de monedas que impactaron en la cuenta corriente en un período
|
|
1127
|
+
determinado en las cuentas comitente solicitadas.
|
|
1128
|
+
:param cuenta: Número de Cuenta Comitente.
|
|
1129
|
+
:param por_concertacion: Indica si los movimientos de la Cte Cte se buscan por Fecha de Concertación o no.
|
|
1130
|
+
:param moneda: Código ISO de Moneda (ARS, USD, USD-C, etc).
|
|
1131
|
+
:param fecha_desde: Fecha Inicial para la búsqueda de movimientos de la Cta Cte.
|
|
1132
|
+
:param fecha_hasta: Fecha Final para la búsqueda de movimientos de la Cta Cte.
|
|
1133
|
+
"""
|
|
1134
|
+
req_body = {
|
|
1135
|
+
"cuenta": cuenta,
|
|
1136
|
+
"porConcertacion": por_concertacion,
|
|
1137
|
+
"moneda": moneda,
|
|
1138
|
+
"fechaDesde": fecha_desde.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
|
|
1139
|
+
"fechaHasta": fecha_hasta.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
|
|
1140
|
+
}
|
|
1141
|
+
self.__pre_connection()
|
|
1142
|
+
return self.__make_request(
|
|
1143
|
+
request_endpoint="/get-ctaCorriente-monetaria",
|
|
1144
|
+
request_body=req_body,
|
|
1145
|
+
request_method=HTTPMethod.POST
|
|
1146
|
+
)
|
|
1147
|
+
|
|
1148
|
+
def get_ctaCorriente_instrumentos(
|
|
1149
|
+
self,
|
|
1150
|
+
cuenta: str = None,
|
|
1151
|
+
por_concertacion: bool = False,
|
|
1152
|
+
instrumento: str = None,
|
|
1153
|
+
fecha_desde: datetime = datetime.now() - timedelta(days=15),
|
|
1154
|
+
fecha_hasta: datetime = datetime.now(),
|
|
1155
|
+
):
|
|
1156
|
+
"""
|
|
1157
|
+
Obtiene movimientos y operaciones ya confirmadas de instrumentos que impactaron en la cuenta corriente en un período
|
|
1158
|
+
determinado en las cuentas comitente solicitadas. En esta consulta se pueden ver movimientos de títulos, futuros,
|
|
1159
|
+
series, índices, cheques, etc.
|
|
1160
|
+
:param cuenta: Número de Cuenta Comitente.
|
|
1161
|
+
:param por_concertacion: Indica si los movimientos de la Cte Cte se buscan por Fecha de Concertación o no.
|
|
1162
|
+
:param instrumento: Se debe ingresar un código que se compone de la siguiente manera: Letra que identifica el Tipo de Especie + Código interno de la Especie.
|
|
1163
|
+
:param fecha_desde: Fecha Inicial para la búsqueda de movimientos de la Cta Cte.
|
|
1164
|
+
:param fecha_hasta: Fecha Final para la búsqueda de movimientos de la Cta Cte.
|
|
1165
|
+
"""
|
|
1166
|
+
req_body = {
|
|
1167
|
+
"cuenta": cuenta,
|
|
1168
|
+
"porConcertacion": por_concertacion,
|
|
1169
|
+
"instrumento": instrumento,
|
|
1170
|
+
"fechaDesde": fecha_desde.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
|
|
1171
|
+
"fechaHasta": fecha_hasta.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
|
|
1172
|
+
}
|
|
1173
|
+
self.__pre_connection()
|
|
1174
|
+
return self.__make_request(
|
|
1175
|
+
request_endpoint="/get-ctaCorriente-instrumentos",
|
|
1176
|
+
request_body=req_body,
|
|
1177
|
+
request_method=HTTPMethod.POST
|
|
1178
|
+
)
|
|
1179
|
+
def get_ctaCorriente_consolidada(
|
|
1180
|
+
self,
|
|
1181
|
+
cuenta: str = None,
|
|
1182
|
+
por_concertacion: bool = False,
|
|
1183
|
+
incluir_saldos_anteriores: bool = False,
|
|
1184
|
+
fecha_desde: datetime = datetime.now() - timedelta(days=15),
|
|
1185
|
+
fecha_hasta: datetime = datetime.now(),
|
|
1186
|
+
):
|
|
1187
|
+
"""
|
|
1188
|
+
Obtiene movimientos y operaciones ya confirmadas de monedas e instrumentos que impactaron en la cuenta corriente en un período
|
|
1189
|
+
determinado en las cuentas comitente solicitadas.
|
|
1190
|
+
:param cuenta: Número de Cuenta Comitente.
|
|
1191
|
+
:param por_concertacion: Indica si los movimientos de la Cte Cte se buscan por Fecha de Concertación o no.
|
|
1192
|
+
:param incluir_saldos_anteriores: Indica si se informan saldos inicialeso no.
|
|
1193
|
+
:param fecha_desde: Fecha Inicial para la búsqueda de movimientos de la Cta Cte.
|
|
1194
|
+
:param fecha_hasta: Fecha Final para la búsqueda de movimientos de la Cta Cte.
|
|
1195
|
+
"""
|
|
1196
|
+
req_body = {
|
|
1197
|
+
"cuenta": cuenta,
|
|
1198
|
+
"porConcertacion": por_concertacion,
|
|
1199
|
+
"incluirSaldosAnteriores": incluir_saldos_anteriores,
|
|
1200
|
+
"fechaDesde": fecha_desde.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
|
|
1201
|
+
"fechaHasta": fecha_hasta.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
|
|
1202
|
+
}
|
|
1203
|
+
self.__pre_connection()
|
|
1204
|
+
return self.__make_request(
|
|
1205
|
+
request_endpoint="/get-ctaCorriente-consolidada",
|
|
1206
|
+
request_body=req_body,
|
|
1207
|
+
request_method=HTTPMethod.POST
|
|
1208
|
+
)
|
|
1094
1209
|
|
|
1095
1210
|
def get_liquidaciones_fondos(
|
|
1096
1211
|
self,
|
|
@@ -2,6 +2,7 @@ import os
|
|
|
2
2
|
from datetime import datetime, timedelta
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
+
from unittest.mock import patch
|
|
5
6
|
|
|
6
7
|
from pyEscoAPI import EscoAPI
|
|
7
8
|
from pyEscoAPI.esco_api import APIVersion
|
|
@@ -18,6 +19,27 @@ def api_client():
|
|
|
18
19
|
)
|
|
19
20
|
|
|
20
21
|
|
|
22
|
+
@patch("pyEscoAPI.esco_api.EscoAPI._EscoAPI__esco_login")
|
|
23
|
+
def test_singleton_should_login_just_once(mock_login):
|
|
24
|
+
client = EscoAPI(
|
|
25
|
+
base_url=os.getenv("base_url"),
|
|
26
|
+
username=os.getenv("user_name"),
|
|
27
|
+
password=os.getenv("password"),
|
|
28
|
+
client_id=os.getenv("client_id"),
|
|
29
|
+
version=APIVersion.VERSION_9
|
|
30
|
+
)
|
|
31
|
+
other_client = EscoAPI(
|
|
32
|
+
base_url=os.getenv("base_url"),
|
|
33
|
+
username=os.getenv("user_name"),
|
|
34
|
+
password=os.getenv("password"),
|
|
35
|
+
client_id=os.getenv("client_id"),
|
|
36
|
+
version=APIVersion.VERSION_9
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
assert client is other_client
|
|
40
|
+
mock_login.assert_called_once()
|
|
41
|
+
|
|
42
|
+
|
|
21
43
|
def test_get_posiciones(api_client):
|
|
22
44
|
cuenta = "351008539"
|
|
23
45
|
result = api_client.get_posiciones(cuenta=cuenta)
|
|
@@ -220,6 +242,27 @@ def test_get_ordenes(api_client):
|
|
|
220
242
|
result = api_client.get_ordenes()
|
|
221
243
|
assert "codOrden" in result[0]
|
|
222
244
|
|
|
245
|
+
def test_get_ctaCorriente_monetaria(api_client):
|
|
246
|
+
cuenta="77105"
|
|
247
|
+
result = api_client.get_ctaCorriente_monetaria(cuenta=cuenta)
|
|
248
|
+
assert "codMoneda" in result[0]
|
|
249
|
+
assert result[0]["codMoneda"] is not None
|
|
250
|
+
|
|
251
|
+
def test_get_ctaCorriente_instrumentos(api_client):
|
|
252
|
+
cuenta="77105"
|
|
253
|
+
fecha_desde=datetime.fromisoformat("2024-03-02")
|
|
254
|
+
fecha_hasta=datetime.fromisoformat("2024-03-17")
|
|
255
|
+
result = api_client.get_ctaCorriente_instrumentos(cuenta=cuenta, fecha_desde=fecha_desde, fecha_hasta=fecha_hasta)
|
|
256
|
+
assert "codigoEspecie" in result[0]
|
|
257
|
+
assert result[0]["codigoEspecie"] is not None
|
|
258
|
+
|
|
259
|
+
def test_get_ctaCorriente_consolidada(api_client):
|
|
260
|
+
cuenta="77105"
|
|
261
|
+
fecha_desde=datetime.fromisoformat("2024-03-02")
|
|
262
|
+
fecha_hasta=datetime.fromisoformat("2024-03-17")
|
|
263
|
+
result = api_client.get_ctaCorriente_consolidada(cuenta=cuenta, fecha_desde=fecha_desde, fecha_hasta=fecha_hasta)
|
|
264
|
+
assert "tipoItem" in result[0]
|
|
265
|
+
assert result[0]["tipoItem"] in ["Instrumentos","Monedas"]
|
|
223
266
|
|
|
224
267
|
def test_get_liquidaciones(api_client):
|
|
225
268
|
result = api_client.get_liquidaciones_fondos()
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
from dataclasses import dataclass
|
|
3
|
-
from typing import List, Optional
|
|
4
|
-
from datetime import datetime
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
@dataclass
|
|
8
|
-
class ComitenteData:
|
|
9
|
-
numComitente: Optional[int]
|
|
10
|
-
fechaApertura: datetime
|
|
11
|
-
denominacion: str
|
|
12
|
-
emailsInfo: Optional[str]
|
|
13
|
-
esFisico: bool
|
|
14
|
-
patrimonioEstim: Optional[int]
|
|
15
|
-
patrimonioEstimMoneda: Optional[str]
|
|
16
|
-
esInversorCalificado: bool
|
|
17
|
-
actividad: Optional[int]
|
|
18
|
-
expBrokerCta: bool
|
|
19
|
-
expBrokerCtaNombre: Optional[str]
|
|
20
|
-
expInversion: bool
|
|
21
|
-
experienciaEnInversiones: Optional[str]
|
|
22
|
-
especulativoOportunista: int
|
|
23
|
-
montoEstimCta: Optional[int]
|
|
24
|
-
montoEstimCtaMoneda: Optional[str]
|
|
25
|
-
fechaDesdeCodTpContribIVA: datetime
|
|
26
|
-
codTpContribIVA: str
|
|
27
|
-
tpRiesgoCmt: Optional[str]
|
|
28
|
-
tpManejoCart: Optional[str]
|
|
29
|
-
tpCmtTrading: Optional[int]
|
|
30
|
-
codCuotapartista: Optional[str]
|
|
31
|
-
requiereFirmaConjunta: bool
|
|
32
|
-
referenciaFirmaConjunta: Optional[str]
|
|
33
|
-
codGrupoArOperBurs: Optional[int]
|
|
34
|
-
codTpComitente: Optional[int]
|
|
35
|
-
codCategoriaUIF: Optional[int]
|
|
36
|
-
codGrupoArAcreencias: Optional[int]
|
|
37
|
-
codGrupoArCustodia: Optional[int]
|
|
38
|
-
noPresencial: bool
|
|
39
|
-
firmoCondFechaDesde: Optional[datetime]
|
|
40
|
-
terceroNoIntermediario: bool
|
|
41
|
-
intermediario: bool
|
|
42
|
-
oficialCuenta: Optional[int]
|
|
43
|
-
administrador: Optional[int]
|
|
44
|
-
productor: Optional[int]
|
|
45
|
-
codTpBilleteraVirtual: Optional[str]
|
|
46
|
-
pmtComsinCustodia: Optional[bool]
|
|
47
|
-
pmtComRecepdeInf: Optional[bool]
|
|
48
|
-
pmtDerechoenMonOpe: Optional[bool]
|
|
49
|
-
pmtEsClienteEspecial: Optional[bool]
|
|
50
|
-
pmtEsComPromotor: Optional[bool]
|
|
51
|
-
pmtGeneraAvisosAlertasUIF: Optional[bool]
|
|
52
|
-
pmtivAenMondeOpeMov: Optional[bool]
|
|
53
|
-
pmtOperabajoAcuerdoLibreAdm: Optional[bool]
|
|
54
|
-
pmtPermiteSuscribirCtaBancariaEnVBHome: Optional[bool]
|
|
55
|
-
pmtRecibeMailCambioEstadoOrdenes: Optional[bool]
|
|
56
|
-
pmtExcluyeCalculoRetencionPercepcionIVABoletosCheques: Optional[bool]
|
|
57
|
-
pmtExcluyeCalculoResultadoOpContinuo: Optional[bool]
|
|
58
|
-
pmtIncluyeGenracionCreditosParaOperar: Optional[bool]
|
|
59
|
-
pmtInformaInterfazGTR: Optional[bool]
|
|
60
|
-
pmtBonificaGastoCustodiaCV: Optional[bool]
|
|
61
|
-
pmtSeCobraCustodia: Optional[bool]
|
|
62
|
-
pmtSeCobranArancelesGestionBancaria: Optional[bool]
|
|
63
|
-
pmtSeCobranCargosPorDescubierto: Optional[bool]
|
|
64
|
-
pmtSeEnviaValuacion: Optional[bool]
|
|
65
|
-
pmtSeFacturanCargosPorDescubierto: Optional[bool]
|
|
66
|
-
pmtSeleimimenboletos: Optional[bool]
|
|
67
|
-
pmtSeleImimenetiquetas: Optional[bool]
|
|
68
|
-
juridicos: Optional[Juridicos]
|
|
69
|
-
titulares: List[Persona]
|
|
70
|
-
instrucciones: Optional[List[Instrucciones]]
|
|
71
|
-
entMailing: List[EntMailing]
|
|
72
|
-
codTpRiesgo: Optional[str]
|
|
73
|
-
fechaVencimientoPerfil: Optional[datetime]
|
|
74
|
-
tpContribRetencion: Optional[str]
|
|
75
|
-
codCanalVta: Optional[int]
|
|
76
|
-
codCategoria: Optional[int]
|
|
77
|
-
codPRI: Optional[int]
|
|
78
|
-
codPerfilCmt: Optional[int]
|
|
79
|
-
numSucursal: Optional[str]
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
@dataclass
|
|
83
|
-
class Juridicos:
|
|
84
|
-
numInscripcion: str
|
|
85
|
-
lugarConstitucion: str
|
|
86
|
-
folio: str
|
|
87
|
-
libro: str
|
|
88
|
-
tomo: str
|
|
89
|
-
codPais: int
|
|
90
|
-
tpContribIngBrutos: str
|
|
91
|
-
cuit: str
|
|
92
|
-
ruc: str
|
|
93
|
-
rut: str
|
|
94
|
-
esSociedadHecho: bool
|
|
95
|
-
tpRegisJuridica: int
|
|
96
|
-
esExtranjero: bool
|
|
97
|
-
actividad: int
|
|
98
|
-
numInscripcionIIBB: str
|
|
99
|
-
codTpIdFatca: int
|
|
100
|
-
idFatca: str
|
|
101
|
-
actividadUIF: int
|
|
102
|
-
giin: str
|
|
103
|
-
esInversorCalificado: bool
|
|
104
|
-
obsFatca: str
|
|
105
|
-
cie: str
|
|
106
|
-
fechaConstitucion: datetime
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
@dataclass
|
|
110
|
-
class Persona:
|
|
111
|
-
apellido: Optional[str]
|
|
112
|
-
nombre: Optional[str]
|
|
113
|
-
tpDoc: Optional[int]
|
|
114
|
-
numDoc: Optional[str]
|
|
115
|
-
nacionalidad: Optional[int]
|
|
116
|
-
fechaNacimiento: Optional[datetime]
|
|
117
|
-
lugarNacimiento: Optional[str]
|
|
118
|
-
sexo: Optional[int]
|
|
119
|
-
estadoCivil: Optional[int]
|
|
120
|
-
esPEP: Optional[bool]
|
|
121
|
-
esSujetoObligado: Optional[bool]
|
|
122
|
-
cuit: Optional[str]
|
|
123
|
-
cuil: Optional[str]
|
|
124
|
-
cdi: Optional[str]
|
|
125
|
-
emailsInfo: Optional[str]
|
|
126
|
-
noPresencial: Optional[bool]
|
|
127
|
-
esInversorCalificado: Optional[bool]
|
|
128
|
-
esBeneficiario: Optional[bool]
|
|
129
|
-
esCliente: Optional[bool]
|
|
130
|
-
esClienteEspecial: Optional[bool]
|
|
131
|
-
esExtranjero: Optional[bool]
|
|
132
|
-
codInterfaz: Optional[str]
|
|
133
|
-
perteneceLUT: Optional[bool]
|
|
134
|
-
giin: Optional[str]
|
|
135
|
-
ruc: Optional[str]
|
|
136
|
-
rut: Optional[str]
|
|
137
|
-
idFatca: Optional[str]
|
|
138
|
-
obsFatca: Optional[str]
|
|
139
|
-
codTpIdFatca: Optional[int]
|
|
140
|
-
codActividad: Optional[int]
|
|
141
|
-
codActividadUIF: Optional[int]
|
|
142
|
-
codTpContribIVA: Optional[str]
|
|
143
|
-
tpPersona: Optional[bool]
|
|
144
|
-
numImpositivo: Optional[str]
|
|
145
|
-
persEmpresa: Optional[str]
|
|
146
|
-
persCargo: Optional[str]
|
|
147
|
-
persTpContribRetencion: Optional[str]
|
|
148
|
-
persAgRecaudador: Optional[bool]
|
|
149
|
-
persAgNroInscrip: Optional[str]
|
|
150
|
-
persSSN: Optional[str]
|
|
151
|
-
posicionCondominio: Optional[int]
|
|
152
|
-
condTpCondominio: Optional[str]
|
|
153
|
-
requiereFirma: Optional[bool]
|
|
154
|
-
condEsAccionista: Optional[bool]
|
|
155
|
-
condPorcParticipacion: Optional[int]
|
|
156
|
-
condBeneficiario: Optional[int]
|
|
157
|
-
patrimonioEstim: Optional[int]
|
|
158
|
-
patrimonioEstimMoneda: Optional[str]
|
|
159
|
-
tpRiesgoTitular: Optional[str]
|
|
160
|
-
domicilioParticular: Optional[Domicilio]
|
|
161
|
-
domicilioComercial: Optional[Domicilio]
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
@dataclass
|
|
165
|
-
class Domicilio:
|
|
166
|
-
codPais: Optional[int]
|
|
167
|
-
codProvincia: int
|
|
168
|
-
altura: Optional[str]
|
|
169
|
-
calle: Optional[str]
|
|
170
|
-
piso: Optional[str]
|
|
171
|
-
departamento: Optional[str]
|
|
172
|
-
localidad: Optional[str]
|
|
173
|
-
codigoPostal: Optional[str]
|
|
174
|
-
telefono: Optional[str]
|
|
175
|
-
fax: Optional[str]
|
|
176
|
-
recibeInfoFax: Optional[bool]
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
@dataclass
|
|
180
|
-
class Instrucciones:
|
|
181
|
-
banco: Optional[int]
|
|
182
|
-
tpCuenta: Optional[int]
|
|
183
|
-
moneda: str
|
|
184
|
-
numSucursal: Optional[int]
|
|
185
|
-
numeroCuenta: Optional[str]
|
|
186
|
-
cbu: Optional[str]
|
|
187
|
-
cuit: Optional[str]
|
|
188
|
-
ctaAlias: Optional[str]
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
@dataclass
|
|
192
|
-
class EntMailing:
|
|
193
|
-
codEntMailing: int
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|