pyEscoAPI 0.0.38__tar.gz → 0.0.40__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyEscoAPI
3
- Version: 0.0.38
3
+ Version: 0.0.40
4
4
  Summary: Python client for Esco API (Esco bolsa)
5
5
  Author-email: Codetria <hola@codetria.com>
6
6
  License: MIT License
@@ -191,3 +191,61 @@ class Instrucciones:
191
191
  @dataclass
192
192
  class EntMailing:
193
193
  codEntMailing: int
194
+
195
+
196
+ @dataclass
197
+ class MovimientoMoneda:
198
+ importe: float
199
+ moneda: str
200
+ tpCambioMovPais: float
201
+ codCtaContable: int
202
+ codCentroCost: int
203
+ esCredito: bool
204
+
205
+
206
+ @dataclass
207
+ class MovimientoTitulo:
208
+ instrumento: str
209
+ codTpInstrumento: str
210
+ codAgenteDepo: int
211
+ cantidad: float
212
+ precio: float
213
+ esCredito: bool
214
+
215
+
216
+ @dataclass
217
+ class MovimientoArancel:
218
+ importe: float
219
+ moneda: str
220
+ tpCambioArPais: float
221
+ codTpIVABase: str
222
+ codTpIVASTasa: str
223
+
224
+
225
+ @dataclass
226
+ class MovimientoDerecho:
227
+ tipoDerecho: str
228
+ importe: float
229
+ moneda: str
230
+ tpCambioDerPais: float
231
+ ivaDerecho: str
232
+ sobreTasa: str
233
+
234
+
235
+ @dataclass
236
+ class MovimientoRetencionIIBB:
237
+ importe: float
238
+ moneda: str
239
+ tpCambioRetPais: float
240
+ codProvincia: int
241
+ codPais: int
242
+
243
+
244
+ @dataclass
245
+ class MovimientoComision:
246
+ codAgenteDepo: int
247
+ importe: float
248
+ moneda: str
249
+ tpCambioComPais: float
250
+ codTpIVABaseCom: str
251
+ codCtaContable: int
@@ -9,7 +9,16 @@ from typing import TypedDict
9
9
  import requests
10
10
  from requests import Response
11
11
 
12
- from pyEscoAPI.dataclasses import Persona, ComitenteData
12
+ from pyEscoAPI.dataclasses import (
13
+ ComitenteData,
14
+ MovimientoArancel,
15
+ MovimientoComision,
16
+ MovimientoDerecho,
17
+ MovimientoMoneda,
18
+ MovimientoRetencionIIBB,
19
+ MovimientoTitulo,
20
+ Persona,
21
+ )
13
22
  from pyEscoAPI.exception import PyEscoAPIError
14
23
 
15
24
  logger = logging.getLogger(f"app.{__name__}")
@@ -306,7 +315,8 @@ class EscoAPI:
306
315
  incluir_futuros: bool = False,
307
316
  incluir_fondos: bool = False,
308
317
  valuar_posicion: bool = True,
309
- utiliza_cotizaciones_online: bool = True
318
+ utiliza_cotizaciones_online: bool = True,
319
+ incluir_cauciones: bool = False,
310
320
  ):
311
321
  """
312
322
  Esta consulta devuelve la tenencia valorizada de una cuenta a una determinada fecha.
@@ -342,7 +352,8 @@ class EscoAPI:
342
352
  "incluirFuturos": incluir_futuros,
343
353
  "incluirFondos": incluir_fondos,
344
354
  "valuarPosicion": valuar_posicion,
345
- "utilizaCotizacionesOnLine": utiliza_cotizaciones_online
355
+ "utilizaCotizacionesOnLine": utiliza_cotizaciones_online,
356
+ "incluirCauciones": incluir_cauciones
346
357
  }
347
358
  self.__pre_connection()
348
359
  return self.__make_request(
@@ -2068,6 +2079,80 @@ class EscoAPI:
2068
2079
  request_method=HTTPMethod.POST,
2069
2080
  )
2070
2081
 
2082
+ def insert_movimiento_manual(
2083
+ self,
2084
+ cuenta: int,
2085
+ fecha_concertacion: date,
2086
+ fecha_liquidacion: date,
2087
+ descripcion: str,
2088
+ cod_tp_movimiento_manual: str,
2089
+ observaciones: str | None = None,
2090
+ num_referencia: int | None = None,
2091
+ mercado: str | None = None,
2092
+ se_informa: bool = True,
2093
+ permite_movimiento_feriado: bool = True,
2094
+ permite_descubierto: bool = True,
2095
+ controla_duplicidad: bool = False,
2096
+ movimientos_moneda: list[MovimientoMoneda] | None = None,
2097
+ movimientos_titulo: list[MovimientoTitulo] | None = None,
2098
+ movimientos_arancel: list[MovimientoArancel] | None = None,
2099
+ movimientos_derecho: list[MovimientoDerecho] | None = None,
2100
+ movimientos_retenciones_iibb: list[MovimientoRetencionIIBB] | None = None,
2101
+ movimientos_comisiones: list[MovimientoComision] | None = None,
2102
+ ):
2103
+ """
2104
+ Ingresa un movimiento manual en la cuenta corriente del comitente.
2105
+ :param cuenta: Número de cuenta comitente.
2106
+ :param fecha_concertacion: Fecha de concertación del movimiento.
2107
+ :param fecha_liquidacion: Fecha de liquidación del movimiento.
2108
+ :param descripcion: Descripción del movimiento.
2109
+ :param cod_tp_movimiento_manual: Código del tipo de movimiento manual.
2110
+ :param observaciones: Observaciones del movimiento.
2111
+ :param num_referencia: Número de referencia del movimiento.
2112
+ :param mercado: Código del mercado.
2113
+ :param se_informa: Indica si el movimiento se informa.
2114
+ :param permite_movimiento_feriado: Indica si se permite cargar el movimiento en un feriado.
2115
+ :param permite_descubierto: Indica si se permite dejar la cuenta en descubierto.
2116
+ :param controla_duplicidad: Indica si se debe controlar duplicidad del movimiento.
2117
+ :param movimientos_moneda: Movimientos de moneda asociados.
2118
+ :param movimientos_titulo: Movimientos de títulos asociados.
2119
+ :param movimientos_arancel: Aranceles asociados.
2120
+ :param movimientos_derecho: Derechos asociados.
2121
+ :param movimientos_retenciones_iibb: Retenciones de ingresos brutos asociadas.
2122
+ :param movimientos_comisiones: Comisiones asociadas.
2123
+ """
2124
+ if fecha_concertacion is None:
2125
+ fecha_concertacion = date.today()
2126
+ if fecha_liquidacion is None:
2127
+ fecha_liquidacion = date.today()
2128
+
2129
+ req_body = {
2130
+ "cuenta": cuenta,
2131
+ "fechaConcertacion": fecha_concertacion.isoformat(),
2132
+ "fechaLiquidacion": fecha_liquidacion.isoformat(),
2133
+ "descripcion": descripcion,
2134
+ "codTpMovimientoManual": cod_tp_movimiento_manual,
2135
+ "observaciones": observaciones,
2136
+ "numReferencia": num_referencia,
2137
+ "mercado": mercado,
2138
+ "seInforma": se_informa,
2139
+ "permiteMovimientoFeriado": permite_movimiento_feriado,
2140
+ "permiteDescubierto": permite_descubierto,
2141
+ "controlaDuplicidad": controla_duplicidad,
2142
+ "movimientosMoneda": [asdict(item) for item in (movimientos_moneda or [])],
2143
+ "movimientosTitulo": [asdict(item) for item in (movimientos_titulo or [])],
2144
+ "movimientosArancel": [asdict(item) for item in (movimientos_arancel or [])],
2145
+ "movimientosDerecho": [asdict(item) for item in (movimientos_derecho or [])],
2146
+ "movimientosRetencionesIIBB": [asdict(item) for item in (movimientos_retenciones_iibb or [])],
2147
+ "movimientosComisiones": [asdict(item) for item in (movimientos_comisiones or [])],
2148
+ }
2149
+ self.__pre_connection()
2150
+ return self.__make_request(
2151
+ request_endpoint="/insert-movimiento-manual",
2152
+ request_body=req_body,
2153
+ request_method=HTTPMethod.POST,
2154
+ )
2155
+
2071
2156
  def get_domicilio_cuenta_comitente(self, cuenta: str, cod_tp_domicilio: str):
2072
2157
  """
2073
2158
  Devuelve el domicilio de una cuenta comitente.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyEscoAPI
3
- Version: 0.0.38
3
+ Version: 0.0.40
4
4
  Summary: Python client for Esco API (Esco bolsa)
5
5
  Author-email: Codetria <hola@codetria.com>
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = 'pyEscoAPI'
7
- version = "0.0.38"
7
+ version = "0.0.40"
8
8
  license = {text = "MIT License"}
9
9
  authors = [
10
10
  { name="Codetria", email="hola@codetria.com" },
@@ -1,10 +1,19 @@
1
1
  import os
2
- from datetime import date, datetime, timedelta
2
+ from datetime import date, datetime, timedelta, timezone
3
+ from http import HTTPMethod
3
4
 
4
5
  import pytest
5
6
  from unittest.mock import patch
6
7
 
7
8
  from pyEscoAPI import EscoAPI
9
+ from pyEscoAPI.dataclasses import (
10
+ MovimientoArancel,
11
+ MovimientoComision,
12
+ MovimientoDerecho,
13
+ MovimientoMoneda,
14
+ MovimientoRetencionIIBB,
15
+ MovimientoTitulo,
16
+ )
8
17
  from pyEscoAPI.esco_api import APIVersion
9
18
 
10
19
 
@@ -360,4 +369,151 @@ def test_insert_solicitud_comprobante_pago(api_client):
360
369
  fecha_liquidacion=date.today(),
361
370
  controla_saldo_monetario=True,
362
371
  )
363
- assert result == mock_response
372
+ assert result == mock_response
373
+
374
+
375
+ @patch("pyEscoAPI.esco_api.EscoAPI._EscoAPI__esco_login")
376
+ def test_insert_movimiento_manual(mock_login, api_client):
377
+ mock_response = {"codOperacion": 1}
378
+ fecha = datetime(2026, 11, 4, 13, 56, 41, 701000, tzinfo=timezone.utc)
379
+ with patch.object(api_client, "_EscoAPI__pre_connection"), patch.object(
380
+ api_client, "_EscoAPI__make_request", return_value=mock_response
381
+ ) as mock_request:
382
+ result = api_client.insert_movimiento_manual(
383
+ cuenta=123,
384
+ fecha_concertacion=fecha,
385
+ fecha_liquidacion=fecha,
386
+ descripcion="Ajuste manual",
387
+ cod_tp_movimiento_manual="AJ",
388
+ observaciones="obs",
389
+ num_referencia=10,
390
+ mercado="ME",
391
+ se_informa=True,
392
+ permite_movimiento_feriado=True,
393
+ permite_descubierto=True,
394
+ controla_duplicidad=False,
395
+ movimientos_moneda=[
396
+ MovimientoMoneda(
397
+ importe=100.5,
398
+ moneda="ARS",
399
+ tpCambioMovPais=1,
400
+ codCtaContable=401,
401
+ codCentroCost=0,
402
+ esCredito=True,
403
+ )
404
+ ],
405
+ movimientos_titulo=[
406
+ MovimientoTitulo(
407
+ instrumento="GGAL",
408
+ codTpInstrumento="ES",
409
+ codAgenteDepo=1,
410
+ cantidad=10,
411
+ precio=1500,
412
+ esCredito=False,
413
+ )
414
+ ],
415
+ movimientos_arancel=[
416
+ MovimientoArancel(
417
+ importe=10,
418
+ moneda="ARS",
419
+ tpCambioArPais=1,
420
+ codTpIVABase="IB",
421
+ codTpIVASTasa="ST",
422
+ )
423
+ ],
424
+ movimientos_derecho=[
425
+ MovimientoDerecho(
426
+ tipoDerecho="ME",
427
+ importe=5,
428
+ moneda="ARS",
429
+ tpCambioDerPais=1,
430
+ ivaDerecho="IB",
431
+ sobreTasa="ST",
432
+ )
433
+ ],
434
+ movimientos_retenciones_iibb=[
435
+ MovimientoRetencionIIBB(
436
+ importe=2,
437
+ moneda="ARS",
438
+ tpCambioRetPais=1,
439
+ codProvincia=1,
440
+ codPais=1,
441
+ )
442
+ ],
443
+ movimientos_comisiones=[
444
+ MovimientoComision(
445
+ codAgenteDepo=1,
446
+ importe=3,
447
+ moneda="ARS",
448
+ tpCambioComPais=1,
449
+ codTpIVABaseCom="IB",
450
+ codCtaContable=500,
451
+ )
452
+ ],
453
+ )
454
+
455
+ assert result == mock_response
456
+ mock_request.assert_called_once_with(
457
+ request_endpoint="/insert-movimiento-manual",
458
+ request_body={
459
+ "cuenta": 123,
460
+ "fechaConcertacion": "2026-11-04T13:56:41.701Z",
461
+ "fechaLiquidacion": "2026-11-04T13:56:41.701Z",
462
+ "descripcion": "Ajuste manual",
463
+ "codTpMovimientoManual": "AJ",
464
+ "observaciones": "obs",
465
+ "numReferencia": 10,
466
+ "mercado": "ME",
467
+ "seInforma": True,
468
+ "permiteMovimientoFeriado": True,
469
+ "permiteDescubierto": True,
470
+ "controlaDuplicidad": False,
471
+ "movimientosMoneda": [{
472
+ "importe": 100.5,
473
+ "moneda": "ARS",
474
+ "tpCambioMovPais": 1,
475
+ "codCtaContable": 401,
476
+ "codCentroCost": 0,
477
+ "esCredito": True,
478
+ }],
479
+ "movimientosTitulo": [{
480
+ "instrumento": "GGAL",
481
+ "codTpInstrumento": "ES",
482
+ "codAgenteDepo": 1,
483
+ "cantidad": 10,
484
+ "precio": 1500,
485
+ "esCredito": False,
486
+ }],
487
+ "movimientosArancel": [{
488
+ "importe": 10,
489
+ "moneda": "ARS",
490
+ "tpCambioArPais": 1,
491
+ "codTpIVABase": "IB",
492
+ "codTpIVASTasa": "ST",
493
+ }],
494
+ "movimientosDerecho": [{
495
+ "tipoDerecho": "ME",
496
+ "importe": 5,
497
+ "moneda": "ARS",
498
+ "tpCambioDerPais": 1,
499
+ "ivaDerecho": "IB",
500
+ "sobreTasa": "ST",
501
+ }],
502
+ "movimientosRetencionesIIBB": [{
503
+ "importe": 2,
504
+ "moneda": "ARS",
505
+ "tpCambioRetPais": 1,
506
+ "codProvincia": 1,
507
+ "codPais": 1,
508
+ }],
509
+ "movimientosComisiones": [{
510
+ "codAgenteDepo": 1,
511
+ "importe": 3,
512
+ "moneda": "ARS",
513
+ "tpCambioComPais": 1,
514
+ "codTpIVABaseCom": "IB",
515
+ "codCtaContable": 500,
516
+ }],
517
+ },
518
+ request_method=HTTPMethod.POST,
519
+ )
File without changes
File without changes