Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
- [Payouts](#payouts)
- [Organizations](#organizations)
- [Payment methods](#payment-methods)
- [Account certificates](#account-certificates)
- [Crossborder](#crossborder)
- [Transfer batches](#transfer-batches)
- [Webhook Signature Validation](#webhook-signature-validation)
- [Idempotency Keys](#idempotency-keys)
Expand Down Expand Up @@ -361,6 +363,44 @@ payment_method = client.v2.payment_methods.create(
)
```

#### Account certificates

Mexican accounts and account numbers have a certificate (constancia de cuenta) with a
temporary `download_url` for its PDF:

```python
certificate = client.v2.accounts.certificate("acc_31yYL7h9LVPg121AgFtCyJPDsgM")
certificate = client.v2.account_numbers.certificate("acno_31yYL5uOb39vzvRIszPhoXYMjt4")
print(certificate.download_url, certificate.expires_at)
```

#### Crossborder

Crossborder quotes, beneficiaries and transfers are under the `v2.crossborder` namespace.
Create a quote to lock the exchange rate, and accept it with a transfer to a beneficiary:

```python
beneficiary = client.v2.crossborder.beneficiaries.create(
holder_type="business",
business_name="Acme LLC",
account_identifier="123456789",
routing_number="021000021",
bank_name="JPMorgan Chase Bank, N.A.",
address={
"street_line1": "100 Main St",
"city": "New York",
"state": "NY",
"postal_code": "10001",
"country": "US",
},
)
quote = client.v2.crossborder.quotes.create(direction="mx_to_usd", source_amount=200001)
transfer = client.v2.crossborder.transfers.create(
quote_id=quote.id, beneficiary_id=beneficiary.id, reference="Factura 123"
)
print(transfer.funding_instructions.clabe)
```

#### Transfer batches

Transfer batches let you send several transfers in a single request. Creating one
Expand Down
21 changes: 20 additions & 1 deletion fintoc/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,14 @@
from fintoc.managers.v2 import AccountsManager as AccountsManagerV2
from fintoc.managers.v2 import AccountVerificationsManager
from fintoc.managers.v2 import CheckoutSessionsManager as CheckoutSessionsManagerV2
from fintoc.managers.v2 import CustomersManager, EntitiesManager, EventsManager
from fintoc.managers.v2 import (
CrossborderBeneficiariesManager,
CrossborderQuotesManager,
CrossborderTransfersManager,
CustomersManager,
EntitiesManager,
EventsManager,
)
from fintoc.managers.v2 import InvoicesManager as InvoicesManagerV2
from fintoc.managers.v2 import PaymentIntentsManager as PaymentIntentsManagerV2
from fintoc.managers.v2 import (
Expand Down Expand Up @@ -99,6 +106,7 @@ def __init__(self, client):
self.account_verifications = AccountVerificationsManager(
"/v2/account_verifications", client
)
self.crossborder = _FintocV2Crossborder(client)
self.customers = CustomersManager("/v2/customers", client)
self.entities = EntitiesManager("/v2/entities", client)
self.events = EventsManager("/v2/events", client)
Expand All @@ -113,3 +121,14 @@ def __init__(self, client):
self.products = ProductsManager("/v2/products", client)
self.setup_intents = SetupIntentsManager("/v2/setup_intents", client)
self.subscriptions = SubscriptionsManagerV2("/v2/subscriptions", client)


class _FintocV2Crossborder:
def __init__(self, client):
self.quotes = CrossborderQuotesManager("/v2/crossborder/quotes", client)
self.beneficiaries = CrossborderBeneficiariesManager(
"/v2/crossborder/beneficiaries", client
)
self.transfers = CrossborderTransfersManager(
"/v2/crossborder/transfers", client
)
3 changes: 3 additions & 0 deletions fintoc/managers/v2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
from .account_verifications_manager import AccountVerificationsManager
from .accounts_manager import AccountsManager
from .checkout_sessions_manager import CheckoutSessionsManager
from .crossborder_beneficiaries_manager import CrossborderBeneficiariesManager
from .crossborder_quotes_manager import CrossborderQuotesManager
from .crossborder_transfers_manager import CrossborderTransfersManager
from .customers_manager import CustomersManager
from .entities_manager import EntitiesManager
from .events_manager import EventsManager
Expand Down
9 changes: 8 additions & 1 deletion fintoc/managers/v2/account_numbers_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,11 @@ class AccountNumbersManager(ManagerMixin):
"""Represents an account numbers manager."""

resource = "account_number"
methods = ["list", "get", "update", "create", "delete"]
methods = ["list", "get", "update", "create", "delete", "certificate"]

def _certificate(self, identifier, **kwargs):
"""Get a signed link to download the PDF certificate of an account number."""
path = f"{self._build_path(**kwargs)}/{identifier}/certificate"
return self._request_resource(
"get", path, resource="account_certificate", **kwargs
)
9 changes: 8 additions & 1 deletion fintoc/managers/v2/accounts_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,20 @@ class AccountsManager(ManagerMixin):
"""Represents an accounts manager."""

resource = "account"
methods = ["list", "get", "create", "update"]
methods = ["list", "get", "create", "update", "certificate"]

def __init__(self, path, client):
super().__init__(path, client)
self.__account_statements_manager = None
self.__movements_manager = None

def _certificate(self, identifier, **kwargs):
"""Get a signed link to download the PDF certificate of an account."""
path = f"{self._build_path(**kwargs)}/{identifier}/certificate"
return self._request_resource(
"get", path, resource="account_certificate", **kwargs
)

@property
def account_statements(self):
"""Proxies the account statements manager."""
Expand Down
10 changes: 10 additions & 0 deletions fintoc/managers/v2/crossborder_beneficiaries_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""Module to hold the crossborder beneficiaries manager."""

from fintoc.mixins import ManagerMixin


class CrossborderBeneficiariesManager(ManagerMixin):
"""Represents a crossborder beneficiaries manager."""

resource = "crossborder_beneficiary"
methods = ["list", "get", "create", "delete"]
10 changes: 10 additions & 0 deletions fintoc/managers/v2/crossborder_quotes_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""Module to hold the crossborder quotes manager."""

from fintoc.mixins import ManagerMixin


class CrossborderQuotesManager(ManagerMixin):
"""Represents a crossborder quotes manager."""

resource = "crossborder_quote"
methods = ["get", "create"]
10 changes: 10 additions & 0 deletions fintoc/managers/v2/crossborder_transfers_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""Module to hold the crossborder transfers manager."""

from fintoc.mixins import ManagerMixin


class CrossborderTransfersManager(ManagerMixin):
"""Represents a crossborder transfers manager."""

resource = "crossborder_transfer"
methods = ["list", "get", "create"]
4 changes: 4 additions & 0 deletions fintoc/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,12 @@
from .tobacco_taxes import TobaccoTaxes
from .transfer_account import TransferAccount
from .v2.account import Account as AccountV2
from .v2.account_certificate import AccountCertificate
from .v2.account_number import AccountNumber
from .v2.account_verification import AccountVerification
from .v2.crossborder_beneficiary import CrossborderBeneficiary
from .v2.crossborder_quote import CrossborderQuote
from .v2.crossborder_transfer import CrossborderTransfer
from .v2.customer import Customer
from .v2.entity import Entity
from .v2.event import Event
Expand Down
4 changes: 4 additions & 0 deletions fintoc/resources/v2/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
"""Init file for the v2 resources module of the SDK."""

from .account import Account
from .account_certificate import AccountCertificate
from .account_number import AccountNumber
from .account_statement import AccountStatement
from .account_verification import AccountVerification
from .crossborder_beneficiary import CrossborderBeneficiary
from .crossborder_quote import CrossborderQuote
from .crossborder_transfer import CrossborderTransfer
from .entity import Entity
from .event import Event
from .invoice import Invoice
Expand Down
7 changes: 7 additions & 0 deletions fintoc/resources/v2/account_certificate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"""Module to hold the Account Certificate resource."""

from fintoc.mixins import ResourceMixin


class AccountCertificate(ResourceMixin):
"""Represents a Fintoc Account Certificate."""
7 changes: 7 additions & 0 deletions fintoc/resources/v2/crossborder_beneficiary.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"""Module to hold the Crossborder Beneficiary resource."""

from fintoc.mixins import ResourceMixin


class CrossborderBeneficiary(ResourceMixin):
"""Represents a Fintoc Crossborder Beneficiary."""
7 changes: 7 additions & 0 deletions fintoc/resources/v2/crossborder_quote.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
"""Module to hold the Crossborder Quote resource."""

from fintoc.mixins import ResourceMixin


class CrossborderQuote(ResourceMixin):
"""Represents a Fintoc Crossborder Quote."""
9 changes: 9 additions & 0 deletions fintoc/resources/v2/crossborder_transfer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"""Module to hold the Crossborder Transfer resource."""

from fintoc.mixins import ResourceMixin


class CrossborderTransfer(ResourceMixin):
"""Represents a Fintoc Crossborder Transfer."""

mappings = {"beneficiary": "crossborder_beneficiary"}
Loading
Loading