Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewards + Bug Fixes #127

Open
wants to merge 158 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
158 commits
Select commit Hold shift + click to select a range
a9dd9dc
bug patches
Feb 3, 2022
a07b7a4
fixed inheritence and changed pdf response to content
Feb 10, 2022
ef2c0d6
add auth user to sol prop
Feb 14, 2022
8994d13
added payment rejected event
Feb 17, 2022
d5c15b2
added auth users to individual customer dto
Feb 18, 2022
a20ad05
added nsf to ach return reasons
Feb 23, 2022
4bf5ad3
fixed transaction dto
Mar 3, 2022
28d0004
update
Mar 10, 2022
eabb243
bug patches
Feb 3, 2022
4a6771a
fixed inheritence and changed pdf response to content
Feb 10, 2022
86914a3
add auth user to sol prop
Feb 14, 2022
e1293d7
added payment rejected event
Feb 17, 2022
addd9bd
added auth users to individual customer dto
Feb 18, 2022
3652df2
added nsf to ach return reasons
Feb 23, 2022
1649093
fixed transaction dto
Mar 3, 2022
6d1dd08
update
Mar 10, 2022
ec014b3
merge conflicts
Mar 10, 2022
a82b783
added coded
Mar 10, 2022
517fb30
added codecs
Mar 10, 2022
2a8cfd1
coded update
Mar 10, 2022
4b89d13
adds support for /sandbox/applications/application_id/approve
Mar 18, 2022
e3b8a83
ApproveApplicationSBRequest
Mar 18, 2022
00de5d5
Merge pull request #1 from dragonprevost/application-approval-sim
avesk Mar 18, 2022
e4fd4c3
update to authorization requests
Mar 23, 2022
37dc174
card dto update
Mar 24, 2022
d047997
fix bug
Apr 1, 2022
6d99a25
added authorization canceled event
Apr 6, 2022
09d9aae
Adds support for simulating incoming ACH
Apr 6, 2022
a2ddb79
Merge pull request #2 from dragonprevost/simulate-incoming-ach
avesk Apr 6, 2022
32ca1a7
added limits to card create card request
Apr 7, 2022
ecfa4fe
Merge branch 'master' of github.com:dragonprevost/unit-python-sdk
Apr 7, 2022
8fdcc9a
card limits
Apr 8, 2022
b51dc56
patch card payload
Apr 11, 2022
ceb8c42
fix unit bug
Apr 12, 2022
7bca682
fix payment rejected type
Apr 22, 2022
8f90e12
PaymentCreated event returning Payment clearing event
Apr 22, 2022
a45ecfe
Merge pull request #3 from dragonprevost/fix-payment-rejected-event
avesk Apr 22, 2022
cf574d9
fix benificial owner bug
May 3, 2022
3513c59
Removes deprecated SSN field from card api
May 5, 2022
174b4eb
Merge pull request #4 from dragonprevost/remove-ssn-from-cards
avesk May 5, 2022
6dd43fc
bug patches
Feb 3, 2022
7604c3a
fixed inheritence and changed pdf response to content
Feb 10, 2022
f82564e
add auth user to sol prop
Feb 14, 2022
4b6f09c
added payment rejected event
Feb 17, 2022
1f8895d
added auth users to individual customer dto
Feb 18, 2022
86bb420
added nsf to ach return reasons
Feb 23, 2022
669d152
fixed transaction dto
Mar 3, 2022
b57a1ac
update
Mar 10, 2022
46f8605
added coded
Mar 10, 2022
4c1b769
added codecs
Mar 10, 2022
1a5fdbc
coded update
Mar 10, 2022
723e89a
adds support for /sandbox/applications/application_id/approve
Mar 18, 2022
93768ff
ApproveApplicationSBRequest
Mar 18, 2022
0b67831
update to authorization requests
Mar 23, 2022
5f115cd
card dto update
Mar 24, 2022
5c77ebb
fix bug
Apr 1, 2022
1c78ee1
added authorization canceled event
Apr 6, 2022
fd64f5d
added limits to card create card request
Apr 7, 2022
b394e8c
Adds support for simulating incoming ACH
Apr 6, 2022
6d87d0c
card limits
Apr 8, 2022
b160a0e
patch card payload
Apr 11, 2022
82f41cc
fix unit bug
Apr 12, 2022
129a913
fix payment rejected type
Apr 22, 2022
3d562a7
PaymentCreated event returning Payment clearing event
Apr 22, 2022
c913912
fix benificial owner bug
May 3, 2022
6670d91
created authorization declined event
May 10, 2022
dfddb0f
remove duplicate decoder
May 10, 2022
b2a008d
fix package
May 10, 2022
2e4a95d
fix func signature
May 10, 2022
62f6318
card authorization patches
May 30, 2022
cd2378f
fix merchant type bug
Jun 7, 2022
d363d96
added authorization canceled to coded
Jun 7, 2022
38c8208
fix coordinate bug
Jun 9, 2022
37da55f
added rewards to sdk
Jun 14, 2022
7246c06
reward patches
Jun 15, 2022
85af67b
reward bug fix
Jun 28, 2022
29feabe
fixed payment rejected bug
Jul 27, 2022
ce9b05a
fix customer updated codec bug
Jul 29, 2022
915e4d0
Patch CreateCounterpartyRequest to inherit UnitRequest
Sep 17, 2022
2ee62da
Merge pull request #5 from dragonprevost/patch-create-counterparty-re…
avesk Sep 17, 2022
cc30baa
Simulate transmitting and clearing ach payments
Jan 12, 2023
a4c63c2
Merge pull request #7 from MazumaGo/simulate-ach-payment-actions
avesk Jan 19, 2023
a3c64d0
Update CreateBusinessApplicationRequest with new required compliance …
Jun 13, 2023
4324dd4
Merge pull request #8 from MazumaGo/compliance-updates
eric-truss Jun 21, 2023
064660f
Add relevant models and operations for charge cards and repayments
Jul 7, 2023
dfbe4f7
Remove build/ folder and add to gitignore
Jul 11, 2023
a27740c
Minor fixes to charge cards
Jul 20, 2023
c997b22
simulate purchases
Jul 20, 2023
2862234
Update objects with unit dto
Aug 3, 2023
a363368
Merge pull request #9 from MazumaGo/charge-cards
eric-truss Aug 3, 2023
88ad935
Add same day flag for ACH payments
Aug 4, 2023
fe3576c
Fix ordering of function parameters
Aug 5, 2023
c38cefa
Fix book payments
Aug 8, 2023
b0be3ff
Use keyword arg for same day to avoid errors
Aug 9, 2023
70cfa13
Merge remote-tracking branch 'origin/master' into simulate-purchasees
Aug 11, 2023
8c7219e
replace sb_ with sandbox_ prefix
Aug 16, 2023
330d08c
use merchant name
Aug 16, 2023
784a526
Merge pull request #10 from MazumaGo/simulate-purchasees
avesk Aug 16, 2023
c13b1e7
Fix typo
Aug 17, 2023
d25d2dc
Add batch releases to Unit object
Aug 17, 2023
47333ce
rename
Aug 17, 2023
658772b
Fix purchaseTransactionDTO cardLast4Digits key error
Aug 17, 2023
fde95ea
Merge pull request #11 from MazumaGo/fix-purchase-txn-dto
avesk Aug 17, 2023
dbe0074
Updates DTOs to accomodate purchase simulation responses
Aug 17, 2023
eeb66c4
Merge pull request #12 from MazumaGo/fix-purchase-simulations
avesk Aug 17, 2023
5ce5391
fix error
Aug 21, 2023
0a1ce8a
Adds CheckDepositPendingReviewEvent and CheckDepositPendingEvent events
Aug 22, 2023
ad4e0ae
Merge pull request #13 from MazumaGo/check-deposit-webhooks
avesk Aug 22, 2023
b734e22
fix issues
julia-truss Aug 23, 2023
aa59e84
Merge remote-tracking branch 'origin/master' into add-batch-release
julia-truss Aug 23, 2023
dbce57b
Merge pull request #14 from MazumaGo/add-batch-release
julia-truss Aug 24, 2023
bed432b
Check deposits
Aug 28, 2023
9a018f1
Merge branch 'master' into check-deposits
avesk Aug 28, 2023
941f05d
Merge pull request #15 from MazumaGo/check-deposits
avesk Aug 28, 2023
40aa08f
Check deposit webhook updates
Aug 29, 2023
6fd187d
updates
Sep 8, 2023
79e2914
Merge pull request #16 from MazumaGo/check-deposit-webhook-updates
avesk Sep 8, 2023
671f7b4
Update codecs for Check Deposit Webhooks
Sep 8, 2023
8b54bd6
Merge pull request #17 from MazumaGo/check-deposit-wh-codecs
avesk Sep 8, 2023
284716b
Fix previous status typo
Sep 14, 2023
586cb04
Add get_image
julia-truss Sep 20, 2023
767ecac
Merge pull request #18 from MazumaGo/get-check-deposit-image
mazumanick Sep 20, 2023
e24074d
Add account and routing numbers to ListCounterpartyParams
julia-truss Oct 30, 2023
5ee3a2b
Merge pull request #19 from MazumaGo/list-counterparty-ach-numbers
julia-truss Oct 31, 2023
ff57889
Category optional
Nov 13, 2023
bcfb024
Update purchase and merchant DTOs (#20)
julia-truss Feb 1, 2024
df9cb60
Fix KeyError when converting from json (#21)
julia-truss Feb 2, 2024
8dc3d7c
Account for incorrect merchant fields for simulations (#22)
julia-truss Feb 2, 2024
f3b7775
Response should output bytes (#23)
julia-truss Mar 1, 2024
6120e8d
astra pushToCard payment
Mar 7, 2024
465e84f
revert inadvertant changes
Mar 7, 2024
5ce31e0
Update title literal and individual application (#25)
julia-truss Mar 14, 2024
58aa3a2
pushToCardPayment on dto
Mar 20, 2024
4e9899b
Fix payment dto
Mar 20, 2024
aadbe7d
Merge pull request #24 from MazumaGo/astra-push-to-card
avesk Mar 21, 2024
eaef877
Update push to card request #26
julia-truss Mar 25, 2024
2a8470e
Add check payment resources
Mar 26, 2024
2dbfd38
Rename
Mar 26, 2024
5e752e1
Rename2
Mar 26, 2024
b12c980
Add check payments to client
Mar 26, 2024
915563f
Fix enums and add get endpoint for check payments
Mar 26, 2024
b716cc2
Add check payment transactions
Apr 8, 2024
ac8bc05
Add check payments to other references
Apr 8, 2024
8b9a8c0
Add create check payment
Apr 10, 2024
276b244
Include memo
Apr 10, 2024
0da1b2c
Remove item assignment
Apr 11, 2024
815e018
Add check payment counterparty to json encoder
Apr 12, 2024
04fda05
Remove counterpartyMoved param
Apr 12, 2024
4cad693
Add events (#27)
julia-truss Apr 18, 2024
190adab
Check payment codecs
Apr 23, 2024
1531493
Cancel check payment and check stop payments (#28)
julia-truss Apr 23, 2024
bf7760d
Fix check payment event bugs (#29)
julia-truss Apr 24, 2024
0ac8f97
Fix key error on check payment processed event (#30)
julia-truss Apr 25, 2024
3effb89
Make check_number optional (#31)
julia-truss May 2, 2024
699e266
Add timeout handling to payment create
May 22, 2024
edf6072
Update application form version to V2024_06
Jul 23, 2024
f8cda6f
Add patch check payment
Jul 23, 2024
78ecd3b
Remove version from application form create resource
Jul 25, 2024
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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ venv/*
dist/

.DS_Store

build/
14 changes: 14 additions & 0 deletions unit/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
from unit.api.application_resource import ApplicationResource
from unit.api.check_deposit_resource import CheckDepositResource
from unit.api.batch_release_resource import BatchReleaseResource
from unit.api.check_payment_resource import CheckPaymentResource
from unit.api.check_stop_payment_resource import CheckStopPaymentResource
from unit.api.customer_resource import CustomerResource
from unit.api.account_resource import AccountResource
from unit.api.card_resource import CardResource
from unit.api.transaction_resource import TransactionResource
from unit.api.payment_resource import PaymentResource
from unit.api.repayment_resource import RepaymentResource
from unit.api.ach_resource import AchResource
from unit.api.statement_resource import StatementResource
from unit.api.customerToken_resource import CustomerTokenResource
from unit.api.counterparty_resource import CounterpartyResource
Expand All @@ -19,6 +25,7 @@
from unit.api.authorization_resource import AuthorizationResource
from unit.api.authorization_request_resource import AuthorizationRequestResource
from unit.api.account_end_of_day_resource import AccountEndOfDayResource
from unit.api.reward_resource import RewardResource

__all__ = ["api", "models", "utils"]

Expand All @@ -31,6 +38,9 @@ def __init__(self, api_url, token):
self.cards = CardResource(api_url, token)
self.transactions = TransactionResource(api_url, token)
self.payments = PaymentResource(api_url, token)
self.check_deposits = CheckDepositResource(api_url, token)
self.repayments = RepaymentResource(api_url, token)
self.ach = AchResource(api_url, token)
self.statements = StatementResource(api_url, token)
self.customerTokens = CustomerTokenResource(api_url, token)
self.counterparty = CounterpartyResource(api_url, token)
Expand All @@ -46,3 +56,7 @@ def __init__(self, api_url, token):
self.authorizations = AuthorizationResource(api_url, token)
self.authorization_requests = AuthorizationRequestResource(api_url, token)
self.account_end_of_day = AccountEndOfDayResource(api_url, token)
self.rewards = RewardResource(api_url, token)
self.batchRelease = BatchReleaseResource(api_url, token)
self.check_payments = CheckPaymentResource(api_url, token)
self.check_stop_payments = CheckStopPaymentResource(api_url, token)
4 changes: 2 additions & 2 deletions unit/api/account_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = "accounts"

def create(self, request: CreateDepositAccountRequest) -> Union[UnitResponse[AccountDTO], UnitError]:
def create(self, request: CreateAccountRequest) -> Union[UnitResponse[AccountDTO], UnitError]:
payload = request.to_json_api()
response = super().post(self.resource, payload)
if super().is_20x(response.status_code):
Expand Down Expand Up @@ -52,7 +52,7 @@ def list(self, params: ListAccountParams = None) -> Union[UnitResponse[List[Acco
else:
return UnitError.from_json_api(response.json())

def update(self, request: PatchDepositAccountRequest) -> Union[UnitResponse[AccountDTO], UnitError]:
def update(self, request: PatchAccountRequest) -> Union[UnitResponse[AccountDTO], UnitError]:
payload = request.to_json_api()
response = super().patch(f"{self.resource}/{request.account_id}", payload)
if super().is_20x(response.status_code):
Expand Down
34 changes: 34 additions & 0 deletions unit/api/ach_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from unit.api.base_resource import BaseResource
from unit.models.payment import *
from unit.models.codecs import DtoDecoder, split_json_api_single_response


class AchResource(BaseResource):
def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = "ach"

def simulate_transmit(self, request: SimulateTransmitAchRequest) -> Union[UnitResponse[PaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(f"sandbox/{self.resource}/transmit", payload)
if super().is_20x(response.status_code):
data = response.json().get("data")
# TODO Fix dto
_id, _type, attributes, relationships = split_json_api_single_response(data)
print("simulate_transmit")
print("data", data)
print("_id, _type, attributes, relationships", _id, _type, attributes, relationships)
return UnitResponse[SimulateAchPaymentDTO](SimulateAchPaymentDTO.from_json_api(_id, _type, attributes, relationships), None)
else:
return UnitError.from_json_api(response.json())

def simulate_clear(self, request: SimulateClearAchRequest) -> Union[UnitResponse[PaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(f"sandbox/{self.resource}/clear", payload)
if super().is_20x(response.status_code):
data = response.json().get("data")
# TODO Fix dto
_id, _type, attributes, relationships = split_json_api_single_response(data)
return UnitResponse[SimulateAchPaymentDTO](SimulateAchPaymentDTO.from_json_api(_id, _type, attributes, relationships), None)
else:
return UnitError.from_json_api(response.json())
5 changes: 4 additions & 1 deletion unit/api/applicationForm_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ def __init__(self, api_url, token):

def create(self, request: CreateApplicationFormRequest) -> Union[UnitResponse[ApplicationFormDTO], UnitError]:
payload = request.to_json_api()
response = super().post(self.resource, payload)
response = super().post(
self.resource,
payload
)
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[ApplicationFormDTO](DtoDecoder.decode(data), None)
Expand Down
17 changes: 17 additions & 0 deletions unit/api/application_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,20 @@ def update(self, request: PatchApplicationRequest) -> Union[UnitResponse[Applica
else:
return UnitError.from_json_api(response.json())

def approve_sb(self, request: ApproveApplicationSBRequest):
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function is fairly specific to our testing suite. I would not worry about pulling this into your master branch

url = f"sandbox/{self.resource}/{request.application_id}/approve"

payload = request.to_json_api()
response = super().post(url, payload)

if response.ok:
data = response.json().get("data")
included = response.json().get("included")
return UnitResponse(data, included)
# TODO need DTOs for this response
# if data["type"] == "individualApplication":
# return UnitResponse[IndividualApplicationDTO](DtoDecoder.decode(data), DtoDecoder.decode(included))
# else:
# return UnitResponse[BusinessApplicationDTO](DtoDecoder.decode(data), DtoDecoder.decode(included))
else:
return UnitError.from_json_api(response.json())
8 changes: 8 additions & 0 deletions unit/api/authorization_request_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,11 @@ def decline(self, request: DeclineAuthorizationRequest) -> Union[UnitResponse[Pu
else:
return UnitError.from_json_api(response.json())

def sandbox_simulate(self, request: SimulateAuthorizationRequest) -> Union[UnitResponse[PurchaseAuthorizationRequestDTO], UnitError]:
payload = request.to_json_api()
response = super().post(f"sandbox/{self.resource}/purchase", payload)
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[PurchaseAuthorizationRequestDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())
2 changes: 1 addition & 1 deletion unit/api/authorization_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ def list(self, params: ListAuthorizationParams = None) -> Union[UnitResponse[Lis
data = response.json().get("data")
return UnitResponse[AuthorizationDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())
return UnitError.from_json_api(response.json())
20 changes: 10 additions & 10 deletions unit/api/base_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,22 @@ def __init__(self, api_url, token):
"user-agent": "unit-python-sdk"
}

def get(self, resource: str, params: Dict = None, headers: Optional[Dict[str, str]] = None):
return requests.get(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers))
def get(self, resource: str, params: Dict = None, headers: Optional[Dict[str, str]] = None, timeout: float = None):
return requests.get(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers), timeout=timeout)

def post(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None):
def post(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None, timeout: float = None):
data = json.dumps(data, cls=UnitEncoder) if data is not None else None
return requests.post(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))
return requests.post(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers), timeout=timeout)

def patch(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None):
def patch(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None, timeout: float = None):
data = json.dumps(data, cls=UnitEncoder) if data is not None else None
return requests.patch(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))
return requests.patch(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers), timeout=timeout)

def delete(self, resource: str, params: Dict = None, headers: Optional[Dict[str, str]] = None):
return requests.delete(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers))
def delete(self, resource: str, params: Dict = None, headers: Optional[Dict[str, str]] = None, timeout: float = None):
return requests.delete(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers), timeout=timeout)

def put(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None):
return requests.put(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))
def put(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None, timeout: float = None):
return requests.put(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers), timeout=timeout)

def __merge_headers(self, headers: Optional[Dict[str, str]] = None):
if not headers:
Expand Down
17 changes: 17 additions & 0 deletions unit/api/batch_release_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from unit.api.base_resource import BaseResource
from unit.models.batch_release import *
from unit.models.codecs import DtoDecoder


class BatchReleaseResource(BaseResource):
def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = 'batch-releases'

def create(self, batch_releases: List[BatchReleaseDTO]) -> Union[UnitResponse[List[BatchReleaseDTO]], UnitError]:
response = super().post(self.resource, {"data": batch_releases})
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[List[BatchReleaseDTO]](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())
31 changes: 31 additions & 0 deletions unit/api/check_deposit_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from unit.api.base_resource import BaseResource
from unit.models.check_deposit import *
from unit.models.codecs import DtoDecoder
from unit.models.transaction import *


class CheckDepositResource(BaseResource):
def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = "check-deposits"

def get(self, check_deposit_id: str) -> Union[UnitResponse[CheckDepositDTO], UnitError]:
params = {}
response = super().get(f"{self.resource}/{check_deposit_id}", params)
if response.status_code == 200:
data = response.json().get("data")
included = response.json().get("included")
return UnitResponse[TransactionDTO](DtoDecoder.decode(data), DtoDecoder.decode(included))
else:
return UnitError.from_json_api(response.json())

def list(self, params: ListTransactionParams = None) -> Union[UnitResponse[List[CheckDepositDTO]], UnitError]:
raise NotImplementedError()

def get_image(self, check_deposit_id: str, is_back_side: Optional[bool] = False) -> Union[UnitResponse[bytes], UnitError]:
params = {}
response = super().get(f"{self.resource}/{check_deposit_id}/{'back' if is_back_side else 'front'}", params)
if response.status_code == 200:
return UnitResponse[bytes](response.content, None)
else:
return UnitError.from_json_api(response.json())
45 changes: 45 additions & 0 deletions unit/api/check_payment_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from unit.api.base_resource import BaseResource
from unit.models.authorization_request import *
from unit.models.check_payment import ApproveCheckPaymentRequest, CheckPaymentDTO
from unit.models.codecs import DtoDecoder
from unit.models.payment import CreateCheckPaymentRequest


class CheckPaymentResource(BaseResource):
def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = "check-payments"

def get(self, check_payment_id: str) -> Union[UnitResponse[CheckPaymentDTO], UnitError]:
response = super().get(f"{self.resource}/{check_payment_id}")
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[check_payment_id](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())

def approve(self, request: ApproveCheckPaymentRequest) -> Union[UnitResponse[CheckPaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(f"{self.resource}/{request.check_payment_id}/approve", payload)
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[CheckPaymentDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())

def create(self, request: CreateCheckPaymentRequest, timeout: float = None) -> Union[UnitResponse[CheckPaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(f"{self.resource}", payload, timeout=timeout)
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[CheckPaymentDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())

def cancel(self, check_payment_id: str) -> Union[UnitResponse[CheckPaymentDTO], UnitError]:
response = super().post(f"{self.resource}/{check_payment_id}/cancel")
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[CheckPaymentDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())
20 changes: 20 additions & 0 deletions unit/api/check_stop_payment_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from unit.api.base_resource import BaseResource
from unit.models.authorization_request import *
from unit.models.check_stop_payment import CheckStopPaymentDTO
from unit.models.codecs import DtoDecoder
from unit.models.payment import CreateCheckStopPaymentRequest


class CheckStopPaymentResource(BaseResource):
def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = "stop-payments"

def create(self, request: CreateCheckStopPaymentRequest) -> Union[UnitResponse[CheckStopPaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(f"{self.resource}", payload)
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[CheckStopPaymentDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())
16 changes: 13 additions & 3 deletions unit/api/payment_resource.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
from unit.api.base_resource import BaseResource
from unit.models.payment import *
from unit.models.codecs import DtoDecoder
from unit.models.codecs import DtoDecoder, split_json_api_single_response


class PaymentResource(BaseResource):
def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = "payments"

def create(self, request: CreatePaymentRequest) -> Union[UnitResponse[PaymentDTO], UnitError]:
def create(self, request: CreatePaymentRequest, timeout: float = None) -> Union[UnitResponse[PaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(self.resource, payload)
response = super().post(self.resource, payload, timeout=timeout)
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[PaymentDTO](DtoDecoder.decode(data), None)
Expand Down Expand Up @@ -45,3 +45,13 @@ def list(self, params: ListPaymentParams = None) -> Union[UnitResponse[List[Paym
else:
return UnitError.from_json_api(response.json())

def simulate_incoming_ach(self, request: SimulateIncomingAchRequest) -> Union[UnitResponse[PaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(f"sandbox/{self.resource}", payload)
if super().is_20x(response.status_code):
data = response.json().get("data")
# TODO Fix dto
_id, _type, attributes, relationships = split_json_api_single_response(data)
return UnitResponse[SimulateIncomingAchPaymentDTO](SimulateIncomingAchPaymentDTO.from_json_api(_id, _type, attributes, relationships), None)
else:
return UnitError.from_json_api(response.json())
46 changes: 46 additions & 0 deletions unit/api/repayment_resource.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from typing import Union, List, Optional

from unit.api.base_resource import BaseResource
from unit.models import UnitResponse, UnitError
from unit.models.codecs import DtoDecoder
from unit.models.repayment import (
RepaymentDTO,
CreateRepaymentRequest,
ListRepaymentParams,
)


class RepaymentResource(BaseResource):
def __init__(self, api_url, token):
super().__init__(api_url, token)
self.resource = "repayments"

def create(
self, request: CreateRepaymentRequest
) -> Union[UnitResponse[RepaymentDTO], UnitError]:
payload = request.to_json_api()
response = super().post(self.resource, payload)
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[RepaymentDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())

def get(self, repayment_id: str) -> Union[UnitResponse[RepaymentDTO], UnitError]:
response = super().get(f"{self.resource}/{repayment_id}")
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[RepaymentDTO](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())

def list(
self, params: Optional[ListRepaymentParams] = None
) -> Union[UnitResponse[List[RepaymentDTO]], UnitError]:
params = params or ListRepaymentParams()
response = super().get(self.resource, params.to_dict())
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[List[RepaymentDTO]](DtoDecoder.decode(data), None)
else:
return UnitError.from_json_api(response.json())
Loading