mirror of
https://github.com/pretix/pretix.git
synced 2026-05-03 14:54:04 +00:00
* Fix #339 -- Allow to split orders * Add tests for split orders * Add notificatiosn to both users * Improve logdisplay
This commit is contained in:
@@ -762,3 +762,307 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert fee.value == prov.calculate_fee(self.order.total)
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert fee.tax_value == Decimal('0.05')
|
||||
|
||||
def test_split_simple(self):
|
||||
old_secret = self.op2.secret
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
assert self.order.total == Decimal('23.00')
|
||||
assert self.order.positions.count() == 1
|
||||
assert self.op2.order != self.order
|
||||
o2 = self.op2.order
|
||||
assert o2.total == Decimal('23.00')
|
||||
assert o2.positions.count() == 1
|
||||
assert o2.code != self.order.code
|
||||
assert o2.secret != self.order.secret
|
||||
assert o2.datetime > self.order.datetime
|
||||
assert self.op2.secret != old_secret
|
||||
assert not self.order.invoices.exists()
|
||||
assert not o2.invoices.exists()
|
||||
|
||||
def test_split_pending_payment_fees(self):
|
||||
# Set payment fees
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
prov = self.ocm._get_payment_provider()
|
||||
prov.settings.set('_fee_percent', Decimal('2.00'))
|
||||
prov.settings.set('_fee_abs', Decimal('1.00'))
|
||||
prov.settings.set('_fee_reverse_calc', False)
|
||||
self.ocm.change_price(self.op1, Decimal('23.00'))
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.total == Decimal('47.92')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('1.92')
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
|
||||
# Split
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
# First order
|
||||
assert self.order.total == Decimal('24.46')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('1.46')
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert self.order.positions.count() == 1
|
||||
assert self.order.fees.count() == 1
|
||||
|
||||
# New order
|
||||
assert self.op2.order != self.order
|
||||
o2 = self.op2.order
|
||||
assert o2.total == Decimal('24.46')
|
||||
fee = o2.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('1.46')
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert o2.positions.count() == 1
|
||||
assert o2.fees.count() == 1
|
||||
|
||||
def test_split_paid_no_payment_fees(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
|
||||
# Split
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
# First order
|
||||
assert self.order.total == Decimal('23.00')
|
||||
assert not self.order.fees.exists()
|
||||
|
||||
# New order
|
||||
assert self.op2.order != self.order
|
||||
o2 = self.op2.order
|
||||
assert o2.total == Decimal('23.00')
|
||||
assert o2.status == Order.STATUS_PAID
|
||||
assert o2.positions.count() == 1
|
||||
assert o2.fees.count() == 0
|
||||
|
||||
def test_split_invoice_address(self):
|
||||
ia = InvoiceAddress.objects.create(
|
||||
order=self.order, is_business=True, vat_id='ATU1234567', vat_id_validated=True,
|
||||
country=Country('AT'), company='Sample'
|
||||
)
|
||||
|
||||
# Split
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
# First order
|
||||
assert self.order.total == Decimal('23.00')
|
||||
assert self.order.invoice_address == ia
|
||||
|
||||
# New order
|
||||
assert self.op2.order != self.order
|
||||
o2 = self.op2.order
|
||||
o2.refresh_from_db()
|
||||
ia = InvoiceAddress.objects.get(pk=ia.pk)
|
||||
assert o2.total == Decimal('23.00')
|
||||
assert o2.positions.count() == 1
|
||||
assert o2.invoice_address != ia
|
||||
assert o2.invoice_address.company == 'Sample'
|
||||
|
||||
def test_split_reverse_charge(self):
|
||||
ia = self._enable_reverse_charge()
|
||||
|
||||
# Set payment fees
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
prov = self.ocm._get_payment_provider()
|
||||
prov.settings.set('_fee_percent', Decimal('2.00'))
|
||||
prov.settings.set('_fee_reverse_calc', False)
|
||||
self.ocm.recalculate_taxes()
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
|
||||
# Check if reverse charge is active
|
||||
assert self.order.total == Decimal('43.86')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('0.86')
|
||||
assert fee.tax_rate == Decimal('0.00')
|
||||
self.op1.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
assert self.op1.price == Decimal('21.50')
|
||||
assert self.op2.price == Decimal('21.50')
|
||||
|
||||
# Split
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
# First order
|
||||
assert self.order.total == Decimal('21.93')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('0.43')
|
||||
assert fee.tax_rate == Decimal('0.00')
|
||||
assert fee.tax_value == Decimal('0.00')
|
||||
assert self.order.positions.count() == 1
|
||||
assert self.order.fees.count() == 1
|
||||
assert self.order.positions.first().price == Decimal('21.50')
|
||||
assert self.order.positions.first().tax_value == Decimal('0.00')
|
||||
|
||||
# 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')
|
||||
assert fee.tax_rate == Decimal('0.00')
|
||||
assert fee.tax_value == Decimal('0.00')
|
||||
assert o2.positions.count() == 1
|
||||
assert o2.positions.first().price == Decimal('21.50')
|
||||
assert o2.positions.first().tax_value == Decimal('0.00')
|
||||
assert o2.fees.count() == 1
|
||||
ia = InvoiceAddress.objects.get(pk=ia.pk)
|
||||
assert o2.invoice_address != ia
|
||||
assert o2.invoice_address.vat_id_validated is True
|
||||
|
||||
def test_split_other_fees(self):
|
||||
# Check if reverse charge is active
|
||||
self.order.fees.create(fee_type=OrderFee.FEE_TYPE_SHIPPING, tax_rule=self.tr19, value=Decimal('2.50'))
|
||||
self.order.total += Decimal('2.50')
|
||||
self.order.save()
|
||||
|
||||
# Split
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
# First order
|
||||
assert self.order.total == Decimal('25.50')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_SHIPPING)
|
||||
assert fee.value == Decimal('2.50')
|
||||
assert fee.tax_value == Decimal('0.40')
|
||||
assert self.order.positions.count() == 1
|
||||
assert self.order.fees.count() == 1
|
||||
|
||||
# New order
|
||||
assert self.op2.order != self.order
|
||||
o2 = self.op2.order
|
||||
assert o2.total == Decimal('25.50')
|
||||
fee = o2.fees.get(fee_type=OrderFee.FEE_TYPE_SHIPPING)
|
||||
assert fee.value == Decimal('2.50')
|
||||
assert fee.tax_value == Decimal('0.40')
|
||||
assert o2.positions.count() == 1
|
||||
assert o2.positions.first().price == Decimal('23.00')
|
||||
assert o2.fees.count() == 1
|
||||
|
||||
def test_split_to_empty(self):
|
||||
self.ocm.split(self.op1)
|
||||
self.ocm.split(self.op2)
|
||||
with self.assertRaises(OrderError):
|
||||
self.ocm.commit()
|
||||
|
||||
def test_split_paid_payment_fees(self):
|
||||
# Set payment fees
|
||||
self.event.settings.set('tax_rate_default', self.tr19.pk)
|
||||
prov = self.ocm._get_payment_provider()
|
||||
prov.settings.set('_fee_percent', Decimal('2.00'))
|
||||
prov.settings.set('_fee_abs', Decimal('1.00'))
|
||||
prov.settings.set('_fee_reverse_calc', False)
|
||||
self.ocm.change_price(self.op1, Decimal('23.00'))
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.total == Decimal('47.92')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('1.92')
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
|
||||
self.order.status = Order.STATUS_PAID
|
||||
self.order.save()
|
||||
|
||||
# Split
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
# First order
|
||||
assert self.order.total == Decimal('24.92')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == Decimal('1.92')
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert self.order.positions.count() == 1
|
||||
assert self.order.fees.count() == 1
|
||||
|
||||
# New order
|
||||
assert self.op2.order != self.order
|
||||
o2 = self.op2.order
|
||||
assert o2.total == Decimal('23.00')
|
||||
assert o2.fees.count() == 0
|
||||
|
||||
def test_split_invoice(self):
|
||||
generate_invoice(self.order)
|
||||
assert self.order.invoices.count() == 1
|
||||
assert self.order.invoices.last().lines.count() == 2
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
o2 = self.op2.order
|
||||
|
||||
assert self.order.invoices.count() == 3
|
||||
assert self.order.invoices.last().lines.count() == 1
|
||||
assert o2.invoices.count() == 1
|
||||
assert o2.invoices.last().lines.count() == 1
|
||||
|
||||
def test_split_to_free_invoice(self):
|
||||
self.event.settings.invoice_include_free = False
|
||||
self.ocm.change_price(self.op2, Decimal('0.00'))
|
||||
self.ocm.commit()
|
||||
self.op2.refresh_from_db()
|
||||
self.ocm._invoice_dirty = False
|
||||
|
||||
generate_invoice(self.order)
|
||||
assert self.order.invoices.count() == 1
|
||||
assert self.order.invoices.last().lines.count() == 1
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
o2 = self.op2.order
|
||||
|
||||
assert self.order.invoices.count() == 1
|
||||
assert self.order.invoices.last().lines.count() == 1
|
||||
assert o2.invoices.count() == 0
|
||||
|
||||
def test_split_to_original_free(self):
|
||||
self.ocm.change_price(self.op2, Decimal('0.00'))
|
||||
self.ocm.commit()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
self.ocm.split(self.op1)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
o2 = self.op1.order
|
||||
|
||||
assert self.order.total == Decimal('0.00')
|
||||
assert self.order.status == Order.STATUS_PAID
|
||||
assert o2.total == Decimal('23.00')
|
||||
assert o2.status == Order.STATUS_PENDING
|
||||
|
||||
def test_split_to_new_free(self):
|
||||
self.ocm.change_price(self.op2, Decimal('0.00'))
|
||||
self.ocm.commit()
|
||||
self.op2.refresh_from_db()
|
||||
|
||||
self.ocm.split(self.op2)
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
self.op2.refresh_from_db()
|
||||
o2 = self.op2.order
|
||||
|
||||
assert self.order.total == Decimal('23.00')
|
||||
assert self.order.status == Order.STATUS_PENDING
|
||||
assert o2.total == Decimal('0.00')
|
||||
assert o2.status == Order.STATUS_PAID
|
||||
|
||||
Reference in New Issue
Block a user