1+ import enum
12import functools
23import typing as t # noqa
34
45import unzer
5- from viur .core import current , db , errors , exposed
6- from viur .core .skeleton import SkeletonInstance
6+ from unzer import PaymentResponse
77
88from viur import toolkit
9+ from viur .core import current , db , errors , exposed
10+ from viur .core .skeleton import SkeletonInstance
911from viur .shop .skeletons import OrderSkel
1012from viur .shop .types import *
1113from .unzer_abstract import UnzerAbstract , log_unzer_error
1416logger = SHOP_LOGGER .getChild (__name__ )
1517
1618
19+ class ChargeMode (enum .IntEnum ):
20+ CHARGE_DIRECTLY = enum .auto ()
21+ CHARGE_MANUAL = enum .auto ()
22+
23+
1724class 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