From a68c1b24e67b86afa3bd2d1f1eec52541a610c29 Mon Sep 17 00:00:00 2001 From: qasim Date: Fri, 29 Aug 2025 16:35:50 +0500 Subject: [PATCH] fix: show payment method surcharges --- apps/checkout/applicator.py | 31 +++++++++++++++++++ apps/checkout/apps.py | 5 ++- apps/checkout/surcharges.py | 8 +++++ apps/checkout/views.py | 6 ++-- .../checkout/partials/order_summery.html | 6 ++++ 5 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 apps/checkout/applicator.py create mode 100644 apps/checkout/surcharges.py diff --git a/apps/checkout/applicator.py b/apps/checkout/applicator.py new file mode 100644 index 0000000..6257d3e --- /dev/null +++ b/apps/checkout/applicator.py @@ -0,0 +1,31 @@ +from decimal import Decimal as D + +from oscar.apps.checkout import applicator + +from apps.checkout.surcharges import FlatCharge + + +class SurchargeApplicator(applicator.SurchargeApplicator): + def __init__(self, request=None, context=None): + super().__init__(request=request, context=context) + + def get_payment_method(self): + return self.request.POST.get('payment_method') + + def get_surcharges(self, basket, **kwargs): + from apps.payment.models import PaymentMethod + + try: + payment_method = PaymentMethod.objects.get(pk=self.get_payment_method()) + except PaymentMethod.DoesNotExist: + return () + if not payment_method or payment_method.charges <= 0: + return () + return ( + FlatCharge( + name=payment_method.title, + code=payment_method.payment_gateway.slug, + excl_tax=D(payment_method.charges * payment_method.currency_factory), + incl_tax=D(payment_method.charges * payment_method.currency_factory) + ), + ) diff --git a/apps/checkout/apps.py b/apps/checkout/apps.py index 4676258..785d8dc 100644 --- a/apps/checkout/apps.py +++ b/apps/checkout/apps.py @@ -1,10 +1,13 @@ import oscar.apps.checkout.apps as apps from oscar.core.loading import get_class +from apps.checkout.applicator import SurchargeApplicator + class CheckoutConfig(apps.CheckoutConfig): name = 'apps.checkout' + surcharge_applicator_class = SurchargeApplicator def ready(self): - super(CheckoutConfig,self).ready() + super(CheckoutConfig, self).ready() self.payment_details_view = get_class('checkout.views', 'PaymentDetailsView') diff --git a/apps/checkout/surcharges.py b/apps/checkout/surcharges.py new file mode 100644 index 0000000..28f7af6 --- /dev/null +++ b/apps/checkout/surcharges.py @@ -0,0 +1,8 @@ +from oscar.apps.checkout.surcharges import FlatCharge + + +class FlatCharge(FlatCharge): + def __init__(self, name, code, excl_tax=None, incl_tax=None): + super().__init__(excl_tax=excl_tax, incl_tax=incl_tax) + self.name = name + self.code = code diff --git a/apps/checkout/views.py b/apps/checkout/views.py index fdc4d10..84109f0 100644 --- a/apps/checkout/views.py +++ b/apps/checkout/views.py @@ -8,6 +8,7 @@ from django_tenants.utils import get_model from oscar.core.loading import get_class +from apps.checkout.applicator import SurchargeApplicator from apps.payment.models import PaymentMethod BillingAddress = get_model("order", "BillingAddress") @@ -43,7 +44,6 @@ def handle_payment(self, order_number, total, **kwargs): currency=total.currency, amount_allocated=total.incl_tax, amount_debited=total.incl_tax - ) self.add_payment_source(source) @@ -63,8 +63,10 @@ def render_preview(self, request, **kwargs): paypal_object_str = self.is_paypal_payment(request) try: payment_method_object = PaymentMethod.objects.get(pk=payment_method) + basket_surcharges = SurchargeApplicator(request=request).get_surcharges(basket=request.basket) + kwargs.update(dict(payment_method=payment_method_object, stripe_token=stripe_token, - paypal_object_str=paypal_object_str)) + paypal_object_str=paypal_object_str, basket_surcharges=basket_surcharges)) except ValueError as e: messages.error( self.request, diff --git a/templates/eggs/templates/oscar/checkout/partials/order_summery.html b/templates/eggs/templates/oscar/checkout/partials/order_summery.html index 815fb96..9c9f27c 100644 --- a/templates/eggs/templates/oscar/checkout/partials/order_summery.html +++ b/templates/eggs/templates/oscar/checkout/partials/order_summery.html @@ -67,6 +67,12 @@
{% endif %} + {% for surcharge in basket_surcharges %} +
  • + {{ surcharge.name }}: + {{ surcharge.excl_tax|currency:basket.currency }} +
  • + {% endfor %}
  • Taxes: {{ basket.total_tax|currency:basket.currency }}