Skip to content

Commit 031861b

Browse files
committed
feat: Implement authorize and charge speratly (configurable) @wip
1 parent 540bf76 commit 031861b

File tree

1 file changed

+37
-9
lines changed

1 file changed

+37
-9
lines changed

src/viur/shop/payment_providers/unzer_paylater_invoice.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import enum
12
import functools
23
import typing as t # noqa
34

45
import unzer
5-
from viur.core import current, db, errors, exposed
6-
from viur.core.skeleton import SkeletonInstance
6+
from unzer import PaymentResponse
77

88
from viur import toolkit
9+
from viur.core import current, db, errors, exposed
10+
from viur.core.skeleton import SkeletonInstance
911
from viur.shop.skeletons import OrderSkel
1012
from viur.shop.types import *
1113
from .unzer_abstract import UnzerAbstract, log_unzer_error
@@ -14,6 +16,11 @@
1416
logger = SHOP_LOGGER.getChild(__name__)
1517

1618

19+
class ChargeMode(enum.IntEnum):
20+
CHARGE_DIRECTLY = enum.auto()
21+
CHARGE_MANUAL = enum.auto()
22+
23+
1724
class UnzerPaylaterInvoice(UnzerAbstract):
1825
"""
1926
Unzer Paylater Invoice payment method integration for the ViUR Shop.
@@ -23,6 +30,15 @@ class UnzerPaylaterInvoice(UnzerAbstract):
2330

2431
name: t.Final[str] = "unzer-paylater_invoice"
2532

33+
def __init__(
34+
self,
35+
*args: t.Any,
36+
charge_mode: ChargeMode = ChargeMode.CHARGE_DIRECTLY,
37+
**kwargs: t.Any,
38+
) -> None:
39+
super().__init__(*args, **kwargs)
40+
self.charge_mode = charge_mode
41+
2642
def can_order(
2743
self,
2844
order_skel: SkeletonInstance_T[OrderSkel],
@@ -56,16 +72,11 @@ def checkout(
5672
logger.debug(f"{payment=} [authorize response]")
5773
unzer_session["paymentId"] = payment.paymentId
5874
unzer_session["redirectUrl"] = payment.redirectUrl
59-
processing_data = payment.processing.asDict()
60-
61-
payment = payment.charge(
62-
amount=order_skel["total"]
63-
)
64-
logger.debug(f"{payment=} [charge response]")
65-
6675
logger.debug(f"{unzer_session=}")
6776
current.session.get().markChanged()
6877

78+
processing_data = payment.processing.asDict()
79+
6980
def set_payment(skel: SkeletonInstance):
7081
skel["payment"]["payments"][-1]["payment_id"] = payment.paymentId
7182
skel["payment"]["payments"][-1]["processing_data"] = processing_data
@@ -76,8 +87,25 @@ def set_payment(skel: SkeletonInstance):
7687
skel=order_skel,
7788
)
7889

90+
if self.charge_mode == ChargeMode.CHARGE_DIRECTLY:
91+
order_skel, payment = self.charge(order_skel=order_skel, payment=payment)
92+
7993
return unzer_session
8094

95+
def charge(
96+
self,
97+
order_skel: SkeletonInstance_T[OrderSkel],
98+
payment: PaymentResponse | None = None,
99+
) -> tuple[SkeletonInstance_T[OrderSkel], PaymentResponse]:
100+
if payment is None:
101+
payment = self.client.getPayment(order_skel["payments"][-1]["payment_id"])
102+
103+
payment = payment.charge(
104+
amount=order_skel["total"]
105+
)
106+
logger.debug(f"{payment=} [charge response]")
107+
return order_skel, payment
108+
81109
def get_customer(self, order_skel: SkeletonInstance) -> unzer.Customer:
82110
customer = self.customer_from_order_skel(order_skel)
83111
logger.debug(f"{customer=}")

0 commit comments

Comments
 (0)