Fix #751 -- calculate payment fees in OrderChangeManager (#752)

* check for payment method instead of order total

* incorporate payment fee diff in totaldiff at oder change

* use fee from model and the correct order total

* add error handling

* do not change paid orders

* OrderChangedManager can only be committed once

* remove prints of stripe secrets

* add tests

* an OrderChangeManager must not be committed multiple times
* A pending free order stays pending after being changed

* comments on paid_to_free logic
This commit is contained in:
Felix Rindt
2018-01-22 12:53:46 +01:00
committed by Raphael Michel
parent 817038563f
commit 78b31149b5
3 changed files with 56 additions and 6 deletions

View File

@@ -278,6 +278,13 @@ class OrderChangeManagerTests(TestCase):
country=Country('AT')
)
def test_multiple_commits_forbidden(self):
self.ocm.change_price(self.op1, Decimal('10.00'))
self.ocm.commit()
self.ocm.change_price(self.op1, Decimal('42.00'))
with self.assertRaises(OrderError):
self.ocm.commit()
def test_change_subevent_quota_required(self):
self.event.has_subevents = True
self.event.save()
@@ -545,6 +552,21 @@ class OrderChangeManagerTests(TestCase):
assert fee.tax_rate == Decimal('19.00')
assert round_decimal(fee.value * (1 - 100 / (100 + fee.tax_rate))) == fee.tax_value
def test_pending_free_order_stays_pending(self):
self.event.settings.set('tax_rate_default', self.tr19.pk)
self.ocm.change_price(self.op1, Decimal('0.00'))
self.ocm.change_price(self.op2, Decimal('0.00'))
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
self.order.refresh_from_db()
assert self.order.total == Decimal('0.00')
assert self.order.status == Order.STATUS_PAID
self.order.status = Order.STATUS_PENDING
self.ocm.cancel(self.op2)
self.ocm.commit()
self.order.refresh_from_db()
assert self.order.status == Order.STATUS_PENDING
def test_require_pending(self):
self.order.status = Order.STATUS_PAID
self.order.save()
@@ -734,6 +756,7 @@ class OrderChangeManagerTests(TestCase):
ia = self._enable_reverse_charge()
self.ocm.recalculate_taxes()
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
ops = list(self.order.positions.all())
for op in ops:
assert op.price == Decimal('21.50')
@@ -791,6 +814,7 @@ class OrderChangeManagerTests(TestCase):
prov.settings.set('_fee_reverse_calc', False)
self.ocm.change_price(self.op1, Decimal('23.00'))
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
self.order.refresh_from_db()
assert self.order.total == Decimal('47.92')
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
@@ -879,6 +903,7 @@ class OrderChangeManagerTests(TestCase):
prov.settings.set('_fee_reverse_calc', False)
self.ocm.recalculate_taxes()
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
self.order.refresh_from_db()
# Check if reverse charge is active
@@ -911,7 +936,6 @@ class OrderChangeManagerTests(TestCase):
# New order
assert self.op2.order != self.order
o2 = self.op2.order
print([p.price for p in o2.positions.all()], [p.value for p in o2.fees.all()])
assert o2.total == Decimal('21.93')
fee = o2.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
assert fee.value == Decimal('0.43')
@@ -971,6 +995,7 @@ class OrderChangeManagerTests(TestCase):
prov.settings.set('_fee_reverse_calc', False)
self.ocm.change_price(self.op1, Decimal('23.00'))
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
self.order.refresh_from_db()
assert self.order.total == Decimal('47.92')
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
@@ -1019,6 +1044,7 @@ class OrderChangeManagerTests(TestCase):
self.event.settings.invoice_include_free = False
self.ocm.change_price(self.op2, Decimal('0.00'))
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
self.op2.refresh_from_db()
self.ocm._invoice_dirty = False
@@ -1038,6 +1064,7 @@ class OrderChangeManagerTests(TestCase):
def test_split_to_original_free(self):
self.ocm.change_price(self.op2, Decimal('0.00'))
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
self.op2.refresh_from_db()
self.ocm.split(self.op1)
@@ -1054,6 +1081,7 @@ class OrderChangeManagerTests(TestCase):
def test_split_to_new_free(self):
self.ocm.change_price(self.op2, Decimal('0.00'))
self.ocm.commit()
self.ocm = OrderChangeManager(self.order, None)
self.op2.refresh_from_db()
self.ocm.split(self.op2)