From ee285201024f58dc3bf2ec77a150fe9adf89776b Mon Sep 17 00:00:00 2001 From: romatallinn Date: Sat, 20 Jan 2024 16:06:53 -0300 Subject: [PATCH 01/12] Add description to project config --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 976dae9..435d660 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.poetry] name = "braspag-sdk" version = "0.0.2" -description = "" +description = "An unofficial Python SDK for Braspag" authors = [ "Roman Sirokov ", ] From 6ab75340c763e6dabf48ff57ae747f992b46b6ab Mon Sep 17 00:00:00 2001 From: romatallinn Date: Sat, 20 Jan 2024 16:07:24 -0300 Subject: [PATCH 02/12] Bump version to v0.0.3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 435d660..cf668cb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "braspag-sdk" -version = "0.0.2" +version = "0.0.3" description = "An unofficial Python SDK for Braspag" authors = [ "Roman Sirokov ", From d63000537ebed29481655b08453f1eff22c4f58a Mon Sep 17 00:00:00 2001 From: romatallinn Date: Sat, 20 Jan 2024 16:09:01 -0300 Subject: [PATCH 03/12] Bump project development status classifier to 4 - Beta --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cf668cb..d011e4f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ readme = "README.md" keywords = ["braspag", "sdk", "python", "cielo", "api", "ecommerce", "brazil", "payments"] packages = [{include = "braspag_sdk"}] classifiers = [ - 'Development Status :: 3 - Alpha', + 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'Natural Language :: English', 'License :: OSI Approved :: MIT License', From bd8531bcd9ddae4715170f267b4dc4c82685ec86 Mon Sep 17 00:00:00 2001 From: romatallinn Date: Wed, 24 Jan 2024 14:54:03 -0300 Subject: [PATCH 04/12] Add District property for Sale Address model --- braspag_sdk/apps/payments/data/address.py | 1 + 1 file changed, 1 insertion(+) diff --git a/braspag_sdk/apps/payments/data/address.py b/braspag_sdk/apps/payments/data/address.py index 47292e0..aea404a 100644 --- a/braspag_sdk/apps/payments/data/address.py +++ b/braspag_sdk/apps/payments/data/address.py @@ -6,6 +6,7 @@ def __init__(self): self.street = None self.number = None self.complement = None + self.district = None self.zip_code = None self.city = None self.state = None From 9503839d5e215620ffdfd5f582f1a086a6920c1f Mon Sep 17 00:00:00 2001 From: romatallinn Date: Wed, 24 Jan 2024 14:57:32 -0300 Subject: [PATCH 05/12] Fix base request response handler --- braspag_sdk/utils/base_request.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/braspag_sdk/utils/base_request.py b/braspag_sdk/utils/base_request.py index 35d2352..3d9d34b 100644 --- a/braspag_sdk/utils/base_request.py +++ b/braspag_sdk/utils/base_request.py @@ -39,7 +39,7 @@ def send_request(self, method, uri, data=None, params=None): response = s.send(prep) - if 'json' in response.headers['Content-Type'].lower(): + if 'json' in response.headers.get('Content-Type', '').lower(): answers = response.json() else: answers = [{ From 04854ceb1d850ee1faa97b7c0bf9b075c6731eea Mon Sep 17 00:00:00 2001 From: romatallinn Date: Wed, 24 Jan 2024 15:41:38 -0300 Subject: [PATCH 06/12] Fix API endpoints in Payments module --- braspag_sdk/apps/payments/requests/create_sale.py | 2 +- braspag_sdk/apps/payments/requests/query_sale.py | 2 +- braspag_sdk/apps/payments/requests/update_sale.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/braspag_sdk/apps/payments/requests/create_sale.py b/braspag_sdk/apps/payments/requests/create_sale.py index a77a86f..35b3c77 100644 --- a/braspag_sdk/apps/payments/requests/create_sale.py +++ b/braspag_sdk/apps/payments/requests/create_sale.py @@ -11,7 +11,7 @@ def __init__(self, merchant_credentials: MerchantCredentials, environment: Payme self.environment = environment def execute(self, sale): - uri = '%s/sales' % self.environment.api + uri = '%s/v2/sales' % self.environment.api response = self.send_request("POST", uri, sale) sale.update_return(response) return response diff --git a/braspag_sdk/apps/payments/requests/query_sale.py b/braspag_sdk/apps/payments/requests/query_sale.py index ec97b33..6c58a13 100644 --- a/braspag_sdk/apps/payments/requests/query_sale.py +++ b/braspag_sdk/apps/payments/requests/query_sale.py @@ -11,5 +11,5 @@ def __init__(self, merchant_credentials: MerchantCredentials, environment: Payme self.environment = environment def execute(self, payment_id): - uri = '%s/sales/%s' % (self.environment.query_api, payment_id) + uri = '%s/v2/sales/%s' % (self.environment.query_api, payment_id) return self.send_request("GET", uri) diff --git a/braspag_sdk/apps/payments/requests/update_sale.py b/braspag_sdk/apps/payments/requests/update_sale.py index bcf5335..d511053 100644 --- a/braspag_sdk/apps/payments/requests/update_sale.py +++ b/braspag_sdk/apps/payments/requests/update_sale.py @@ -17,7 +17,7 @@ def __init__(self, type: str, merchant_credentials: MerchantCredentials, environ def execute(self, payment_id): - uri = '%s/sales/%s/%s' % (self.environment.api, payment_id, self.type) + uri = '%s/v2/sales/%s/%s' % (self.environment.api, payment_id, self.type) params = {} From 135100a7ec3616f216a7e1a2aa81a7e59b0018c8 Mon Sep 17 00:00:00 2001 From: romatallinn Date: Wed, 24 Jan 2024 16:30:47 -0300 Subject: [PATCH 07/12] Fix formatting of lists in ObjectJSON --- braspag_sdk/utils/object_json.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/braspag_sdk/utils/object_json.py b/braspag_sdk/utils/object_json.py index 0b25751..1302941 100644 --- a/braspag_sdk/utils/object_json.py +++ b/braspag_sdk/utils/object_json.py @@ -24,14 +24,22 @@ def __getattribute__(self, attribute): def process_name_key(dictionary): + + # If it's a list, process each item. + if isinstance(dictionary, list): + new_list = [] + for item in dictionary: + new_list.append(process_name_key(item)) + return new_list + + # If it's not a dictionary (and not list), just return it as is. if not isinstance(dictionary, dict): return dictionary + # If it's a dictionary, process each key/value. new_dictionary = {} - for key in dictionary: new_dictionary[capitalize_key(key)] = process_name_key(dictionary[key]) - return new_dictionary From dff4875417f7502f898df8f6b2685a4f7f8fc9fb Mon Sep 17 00:00:00 2001 From: romatallinn Date: Wed, 24 Jan 2024 16:39:48 -0300 Subject: [PATCH 08/12] Fix typo in SplitPayment's property name --- braspag_sdk/apps/split/data/split_payment.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/braspag_sdk/apps/split/data/split_payment.py b/braspag_sdk/apps/split/data/split_payment.py index 6a667fd..1da3d15 100644 --- a/braspag_sdk/apps/split/data/split_payment.py +++ b/braspag_sdk/apps/split/data/split_payment.py @@ -10,7 +10,7 @@ def __init__(self, mdr=None, fee=None): class SplitPayment(ObjectJSON): - def __init__(self, subordinadate_merchant_id, amount, mdr=None, fee=None): - self.subordinadate_merchant_id = subordinadate_merchant_id + def __init__(self, subordinate_merchant_id, amount, mdr=None, fee=None): + self.subordinate_merchant_id = subordinate_merchant_id self.amount = amount self.fares = SplitPaymentFares(mdr, fee) From 7a2e4d884c147ee3c3fa00574227f73abb139bf1 Mon Sep 17 00:00:00 2001 From: romatallinn Date: Wed, 24 Jan 2024 17:34:45 -0300 Subject: [PATCH 09/12] Add birthday and business activity id to SplitMerchant as required for CPF --- braspag_sdk/apps/split/data/split_merchant.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/braspag_sdk/apps/split/data/split_merchant.py b/braspag_sdk/apps/split/data/split_merchant.py index ad649db..87e3e57 100644 --- a/braspag_sdk/apps/split/data/split_merchant.py +++ b/braspag_sdk/apps/split/data/split_merchant.py @@ -45,6 +45,8 @@ def __init__(self, *, master_merchant_id): self.corporate_name = None self.document_number = None self.document_type = None + self.birthday_date = None + self.business_activity_id = None self.address = None self.bank_account = None self.agreements = None From 7d5ec54730e8662d42c310ac001df5589e8e832b Mon Sep 17 00:00:00 2001 From: romatallinn Date: Thu, 25 Jan 2024 11:42:40 -0300 Subject: [PATCH 10/12] Allow payment capture with split_payments config --- braspag_sdk/apps/payments/requests/update_sale.py | 5 +++++ braspag_sdk/apps/payments/services.py | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/braspag_sdk/apps/payments/requests/update_sale.py b/braspag_sdk/apps/payments/requests/update_sale.py index d511053..c44ae07 100644 --- a/braspag_sdk/apps/payments/requests/update_sale.py +++ b/braspag_sdk/apps/payments/requests/update_sale.py @@ -14,12 +14,14 @@ def __init__(self, type: str, merchant_credentials: MerchantCredentials, environ self.type = type self.service_tax_amount = None self.amount = None + self.split_payments = None def execute(self, payment_id): uri = '%s/v2/sales/%s/%s' % (self.environment.api, payment_id, self.type) params = {} + data = {} if self.amount: params['amount'] = self.amount @@ -27,4 +29,7 @@ def execute(self, payment_id): if self.service_tax_amount: params['serviceTaxAmount'] = self.service_tax_amount + if self.split_payments: + data['SplitPayments'] = [split.toJSON() for split in self.split_payments] + return self.send_request('PUT', uri, params=params) diff --git a/braspag_sdk/apps/payments/services.py b/braspag_sdk/apps/payments/services.py index e708941..bb26f14 100644 --- a/braspag_sdk/apps/payments/services.py +++ b/braspag_sdk/apps/payments/services.py @@ -16,10 +16,11 @@ def create_sale(self, sale: Sale): request = CreateSale(self.merchant_credentials, self._environment) return request.execute(sale) - def capture_sale(self, payment_id: str, amount=None, service_tax_amount=None): + def capture_sale(self, payment_id: str, amount=None, service_tax_amount=None, split_payments=None): request = UpdateSale('capture', self.merchant_credentials, self._environment) request.amount = amount request.service_tax_amount = service_tax_amount + request.split_payments = split_payments return request.execute(payment_id) def cancel_sale(self, payment_id: str, amount=None): From 763f0b47d6e176b168a9521d60bb31f17fb8ccbe Mon Sep 17 00:00:00 2001 From: romatallinn Date: Mon, 29 Jan 2024 11:48:55 -0300 Subject: [PATCH 11/12] Accept data via kwargs in payment's capture request --- braspag_sdk/apps/payments/requests/update_sale.py | 12 +++++++----- braspag_sdk/apps/payments/services.py | 9 +++++++-- braspag_sdk/utils/base_request.py | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/braspag_sdk/apps/payments/requests/update_sale.py b/braspag_sdk/apps/payments/requests/update_sale.py index c44ae07..8429509 100644 --- a/braspag_sdk/apps/payments/requests/update_sale.py +++ b/braspag_sdk/apps/payments/requests/update_sale.py @@ -1,3 +1,5 @@ +import json + from braspag_sdk.utils import ApiBase from braspag_sdk.apps.payments.environment import PaymentsEnvironment @@ -14,14 +16,14 @@ def __init__(self, type: str, merchant_credentials: MerchantCredentials, environ self.type = type self.service_tax_amount = None self.amount = None - self.split_payments = None + self.data = None def execute(self, payment_id): uri = '%s/v2/sales/%s/%s' % (self.environment.api, payment_id, self.type) - params = {} data = {} + params = {} if self.amount: params['amount'] = self.amount @@ -29,7 +31,7 @@ def execute(self, payment_id): if self.service_tax_amount: params['serviceTaxAmount'] = self.service_tax_amount - if self.split_payments: - data['SplitPayments'] = [split.toJSON() for split in self.split_payments] + if self.data: + data = self.data - return self.send_request('PUT', uri, params=params) + return self.send_request('PUT', uri, params=params, data=data) diff --git a/braspag_sdk/apps/payments/services.py b/braspag_sdk/apps/payments/services.py index bb26f14..3fe97b4 100644 --- a/braspag_sdk/apps/payments/services.py +++ b/braspag_sdk/apps/payments/services.py @@ -16,11 +16,16 @@ def create_sale(self, sale: Sale): request = CreateSale(self.merchant_credentials, self._environment) return request.execute(sale) - def capture_sale(self, payment_id: str, amount=None, service_tax_amount=None, split_payments=None): + def capture_sale(self, payment_id: str, amount=None, service_tax_amount=None, **kwargs): request = UpdateSale('capture', self.merchant_credentials, self._environment) request.amount = amount request.service_tax_amount = service_tax_amount - request.split_payments = split_payments + + data = None + if kwargs: + data = json.dumps(kwargs) + request.data = data + return request.execute(payment_id) def cancel_sale(self, payment_id: str, amount=None): diff --git a/braspag_sdk/utils/base_request.py b/braspag_sdk/utils/base_request.py index 3d9d34b..daf9d35 100644 --- a/braspag_sdk/utils/base_request.py +++ b/braspag_sdk/utils/base_request.py @@ -27,7 +27,7 @@ def send_request(self, method, uri, data=None, params=None): if not body: headers['Content-Length'] = '0' - elif not isinstance(data, dict): + elif not isinstance(data, str): body = body.toJSON() if 'Content-Type' not in headers: From ed29c0fd8badb0c77addf8c0ae914541835b925a Mon Sep 17 00:00:00 2001 From: romatallinn Date: Mon, 29 Jan 2024 11:52:03 -0300 Subject: [PATCH 12/12] Add v0.0.3 to CHANGELOG --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d4502..4c9aede 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +## 0.0.3 + +The release contains multiple critical bug fixes and improvements. + +- Bump project development status classifier to 4 - Beta +- Add description to project config +- Add `Address.district` +- Fix base request's response handler +- Fix API endpoints in Payments module +- Fix API formatting of lists in `ObjectJSON` +- Fix typo in `SplitPayment.subordinate_merchant_id` +- Add `SplitMerchant.birthday_date` and `SplitMerchant.business_activity_id` as required for merchants registered by CPF document +- Accept data via kwargs in payment's capture request (e.g., for split payment details) + ## 0.0.2 The release mostly meant to improve project & code quality.