PayPal: Show payment ID on paid invoices (#1471)

* Always call render_invoice_text - even if order is already paid

* Print PayPal payment ID on invoice if available and invoice is paid

* Also display Sale ID on invoice

* try/except for paymentId/SaleId
This commit is contained in:
Martin Gross
2019-10-30 10:48:15 +01:00
committed by Raphael Michel
parent 038533ad63
commit 2a9c105e51
2 changed files with 29 additions and 13 deletions

View File

@@ -20,9 +20,7 @@ from django_scopes import scope, scopes_disabled
from i18nfield.strings import LazyI18nString from i18nfield.strings import LazyI18nString
from pretix.base.i18n import language from pretix.base.i18n import language
from pretix.base.models import ( from pretix.base.models import Invoice, InvoiceAddress, InvoiceLine, Order
Invoice, InvoiceAddress, InvoiceLine, Order, OrderPayment,
)
from pretix.base.models.tax import EU_CURRENCIES from pretix.base.models.tax import EU_CURRENCIES
from pretix.base.services.tasks import TransactionAwareTask from pretix.base.services.tasks import TransactionAwareTask
from pretix.base.settings import GlobalSettingsObject from pretix.base.settings import GlobalSettingsObject
@@ -37,9 +35,6 @@ logger = logging.getLogger(__name__)
@transaction.atomic @transaction.atomic
def build_invoice(invoice: Invoice) -> Invoice: def build_invoice(invoice: Invoice) -> Invoice:
lp = invoice.order.payments.last() lp = invoice.order.payments.last()
open_payment = None
if lp and lp.state not in (OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED):
open_payment = lp
with language(invoice.locale): with language(invoice.locale):
invoice.invoice_from = invoice.event.settings.get('invoice_address_from') invoice.invoice_from = invoice.event.settings.get('invoice_address_from')
@@ -53,13 +48,11 @@ def build_invoice(invoice: Invoice) -> Invoice:
introductory = invoice.event.settings.get('invoice_introductory_text', as_type=LazyI18nString) introductory = invoice.event.settings.get('invoice_introductory_text', as_type=LazyI18nString)
additional = invoice.event.settings.get('invoice_additional_text', as_type=LazyI18nString) additional = invoice.event.settings.get('invoice_additional_text', as_type=LazyI18nString)
footer = invoice.event.settings.get('invoice_footer_text', as_type=LazyI18nString) footer = invoice.event.settings.get('invoice_footer_text', as_type=LazyI18nString)
if open_payment and open_payment.payment_provider: if lp and lp.payment_provider:
if 'payment' in inspect.signature(open_payment.payment_provider.render_invoice_text).parameters: if 'payment' in inspect.signature(lp.payment_provider.render_invoice_text).parameters:
payment = open_payment.payment_provider.render_invoice_text(invoice.order, open_payment) payment = lp.payment_provider.render_invoice_text(invoice.order, lp)
else: else:
payment = open_payment.payment_provider.render_invoice_text(invoice.order) payment = lp.payment_provider.render_invoice_text(invoice.order)
elif invoice.order.status == Order.STATUS_PAID:
payment = pgettext('invoice', 'The payment for this invoice has already been received.')
else: else:
payment = "" payment = ""

View File

@@ -12,11 +12,12 @@ from django.template.loader import get_template
from django.urls import reverse from django.urls import reverse
from django.utils.http import urlquote from django.utils.http import urlquote
from django.utils.translation import ugettext as __, ugettext_lazy as _ from django.utils.translation import ugettext as __, ugettext_lazy as _
from i18nfield.strings import LazyI18nString
from paypalrestsdk.exceptions import BadRequest from paypalrestsdk.exceptions import BadRequest
from paypalrestsdk.openid_connect import Tokeninfo from paypalrestsdk.openid_connect import Tokeninfo
from pretix.base.decimal import round_decimal from pretix.base.decimal import round_decimal
from pretix.base.models import Event, OrderPayment, OrderRefund, Quota from pretix.base.models import Event, Order, OrderPayment, OrderRefund, Quota
from pretix.base.payment import BasePaymentProvider, PaymentException from pretix.base.payment import BasePaymentProvider, PaymentException
from pretix.base.services.mail import SendMailException from pretix.base.services.mail import SendMailException
from pretix.base.settings import SettingsSandbox from pretix.base.settings import SettingsSandbox
@@ -531,3 +532,25 @@ class Paypal(BasePaymentProvider):
le.data = json.dumps(d) le.data = json.dumps(d)
le.shredded = True le.shredded = True
le.save(update_fields=['data', 'shredded']) le.save(update_fields=['data', 'shredded'])
def render_invoice_text(self, order: Order, payment: OrderPayment) -> str:
if order.status == Order.STATUS_PAID:
if payment.info_data.get('id', None):
try:
return '{}\r\n{}: {}\r\n{}: {}'.format(
_('The payment for this invoice has already been received.'),
_('PayPal payment ID'),
payment.info_data['id'],
_('PayPal sale ID'),
payment.info_data['transactions'][0]['related_resources'][0]['sale']['id']
)
except (KeyError, IndexError):
return '{}\r\n{}: {}'.format(
_('The payment for this invoice has already been received.'),
_('PayPal payment ID'),
payment.info_data['id']
)
else:
return super().render_invoice_text(order, payment)
return self.settings.get('_invoice_text', as_type=LazyI18nString, default='')