You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

processing.py 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from datacash import models, facade, gateway
  2. from oscar.apps.order import processing
  3. from oscar.apps.payment import exceptions
  4. from .models import PaymentEventType
  5. class EventHandler(processing.EventHandler):
  6. def handle_shipping_event(self, order, event_type, lines,
  7. line_quantities, **kwargs):
  8. self.validate_shipping_event(
  9. order, event_type, lines, line_quantities, **kwargs)
  10. payment_event = None
  11. if event_type.name == 'Shipped':
  12. # Take payment for order lines
  13. self.take_payment_for_lines(
  14. order, lines, line_quantities)
  15. self.consume_stock_allocations(
  16. order, lines, line_quantities)
  17. shipping_event = self.create_shipping_event(
  18. order, event_type, lines, line_quantities,
  19. reference=kwargs.get('reference', None))
  20. if payment_event:
  21. shipping_event.payment_events.add(payment_event)
  22. def take_payment_for_lines(self, order, lines, line_quantities):
  23. settle, __ = PaymentEventType.objects.get_or_create(
  24. name="Settle")
  25. amount = self.calculate_amount_to_settle(
  26. settle, order, lines, line_quantities)
  27. # Take payment with Datacash (using pre-auth txn)
  28. txn = self.get_datacash_preauth(order)
  29. f = facade.Facade()
  30. try:
  31. datacash_ref = f.fulfill_transaction(
  32. order.number, amount, txn.datacash_reference,
  33. txn.auth_code)
  34. except exceptions.PaymentError, e:
  35. self.create_note(order, "Attempt to settle %.2f failed: %s" % (
  36. amount, e))
  37. raise
  38. # Record message
  39. msg = "Payment of %.2f settled using reference '%s' from initial transaction"
  40. msg = msg % (amount, txn.datacash_reference)
  41. self.create_note(order, msg)
  42. # Update order source
  43. source = order.sources.get(source_type__name='Datacash')
  44. source.debit(amount, reference=datacash_ref)
  45. # Create payment event
  46. return self.create_payment_event(
  47. order, settle, amount, lines, line_quantities,
  48. reference=datacash_ref)
  49. def calculate_amount_to_settle(
  50. self, event_type, order, lines, line_quantities):
  51. amt = self.calculate_payment_event_subtotal(
  52. event_type, lines, line_quantities)
  53. num_payments = order.payment_events.filter(
  54. event_type=event_type).count()
  55. if num_payments == 0:
  56. # Include shipping charge in first payment
  57. amt += order.shipping_incl_tax
  58. return amt
  59. def get_datacash_preauth(self, order):
  60. """
  61. Return the (successful) pre-auth Datacash transaction for
  62. the passed order.
  63. """
  64. transactions = models.OrderTransaction.objects.filter(
  65. order_number=order.number, method=gateway.PRE, status=1)
  66. if transactions.count() == 0:
  67. raise exceptions.PaymentError(
  68. "Unable to take payment as no PRE-AUTH "
  69. "transaction found for this order")
  70. return transactions[0]