diff --git a/method/resources/Payment.py b/method/resources/Payment.py index cb751bc..1998642 100644 --- a/method/resources/Payment.py +++ b/method/resources/Payment.py @@ -3,6 +3,7 @@ from method.resource import Resource, RequestOpts from method.configuration import Configuration from method.errors import ResourceError +from method.resources.Reversal import ReversalResource PaymentStatusesLiterals = Literal[ @@ -11,7 +12,9 @@ 'processing', 'failed', 'sent', - 'reversed' + 'reversed', + 'reversal_required', + 'reversal_processing' ] @@ -33,6 +36,9 @@ class Payment(TypedDict): id: str + reversal_id: Optional[str] + source_trace_id: Optional[str] + destination_trace_id: Optional[str] source: str destination: str amount: int @@ -55,10 +61,20 @@ class PaymentCreateOpts(TypedDict): metadata: Optional[Dict[str, Any]] +class PaymentSubResources: + reversals: ReversalResource + + def __init__(self, _id: str, config: Configuration): + self.reversals = ReversalResource(config.add_path(_id)) + + class PaymentResource(Resource): def __init__(self, config: Configuration): super(PaymentResource, self).__init__(config.add_path('payments')) + def __call__(self, _id: str) -> PaymentSubResources: + return PaymentSubResources(_id, self.config) + def get(self, _id: str) -> Payment: return super(PaymentResource, self)._get_with_id(_id) diff --git a/method/resources/Reversal.py b/method/resources/Reversal.py new file mode 100644 index 0000000..561a63a --- /dev/null +++ b/method/resources/Reversal.py @@ -0,0 +1,53 @@ +from typing import TypedDict, List, Literal, Dict, Any, Optional + +from method.resource import Resource +from method.configuration import Configuration +from method.errors import ResourceError + + +ReversalStatusesLiterals = Literal[ + 'pending_approval', + 'pending', + 'processing', + 'sent', + 'failed' +] + + +ReversalDirectionsLiterals = Literal[ + 'debit', + 'credit' +] + + +class Reversal(TypedDict): + id: str + pmt_id: str + target_account: str + trace_id: Optional[str] + direction: ReversalDirectionsLiterals + description: str + amount: int + status: ReversalStatusesLiterals + error: Optional[ResourceError] + created_at: str + updated_at: str + + +class ReversalUpdateOpts(TypedDict): + status: ReversalStatusesLiterals + description: Optional[str] + + +class ReversalResource(Resource): + def __init__(self, config: Configuration): + super(ReversalResource, self).__init__(config.add_path('reversals')) + + def get(self, _id: str) -> Reversal: + return super(ReversalResource, self)._get_with_id(_id) + + def update(self, _id: str, opts: ReversalUpdateOpts) -> Reversal: + return super(ReversalResource, self)._update_with_id(_id, opts) + + def list(self) -> List[Reversal]: + return super(ReversalResource, self)._list(None) diff --git a/setup.py b/setup.py index 326508e..1d55d26 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ setup( name='method-python', - version='0.0.14', + version='0.0.15', description='Python library for the Method API', author='Marco del Carmen', author_email='marco@mdelcarmen.me',