mirror of
https://github.com/pretix/pretix.git
synced 2026-05-03 14:54:04 +00:00
New concept for fee handling (#610)
* New concept for fee handling * More usages * Remove all usages, make all tests pass * API changes * Small fixes * Fix order of invoice lines * Rebase migration
This commit is contained in:
@@ -12,6 +12,7 @@ from pretix.base.models import (
|
||||
Event, Invoice, InvoiceAddress, Item, ItemVariation, Order, OrderPosition,
|
||||
Organizer,
|
||||
)
|
||||
from pretix.base.models.orders import OrderFee
|
||||
from pretix.base.services.invoices import (
|
||||
build_preview_invoice_pdf, generate_cancellation, generate_invoice,
|
||||
invoice_pdf_task, regenerate_invoice,
|
||||
@@ -27,15 +28,15 @@ def env():
|
||||
organizer=o, name='Dummy', slug='dummy',
|
||||
date_from=now(), plugins='pretix.plugins.banktransfer'
|
||||
)
|
||||
tr = event.tax_rules.create(rate=Decimal('19.00'))
|
||||
o = Order.objects.create(
|
||||
code='FOO', event=event, email='dummy@dummy.test',
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, payment_provider='banktransfer',
|
||||
payment_fee=Decimal('0.25'), payment_fee_tax_rate=Decimal('19.00'),
|
||||
payment_fee_tax_value=Decimal('0.04'), locale='en', payment_fee_tax_rule=tr
|
||||
total=0, payment_provider='banktransfer', locale='en'
|
||||
)
|
||||
tr = event.tax_rules.create(rate=Decimal('19.00'))
|
||||
o.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('19.00'),
|
||||
tax_value=Decimal('0.05'), tax_rule=tr)
|
||||
ticket = Item.objects.create(event=event, name='Early-bird ticket',
|
||||
category=None, default_price=23, tax_rule=tr,
|
||||
admission=True)
|
||||
@@ -206,9 +207,10 @@ def test_positions(env):
|
||||
|
||||
last = inv.lines.last()
|
||||
assert 'Payment' in last.description
|
||||
assert last.gross_value == order.payment_fee
|
||||
assert last.tax_rate == order.payment_fee_tax_rate
|
||||
assert last.tax_value == order.payment_fee_tax_value
|
||||
fee = order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert last.gross_value == fee.value
|
||||
assert last.tax_rate == fee.tax_rate
|
||||
assert last.tax_value == fee.tax_value
|
||||
assert inv.invoice_to == ""
|
||||
|
||||
|
||||
@@ -274,9 +276,10 @@ def test_invoice_numbers(env):
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, payment_provider='banktransfer',
|
||||
payment_fee=Decimal('0.25'), payment_fee_tax_rate=0,
|
||||
payment_fee_tax_value=0, locale='en'
|
||||
locale='en'
|
||||
)
|
||||
order2.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('0.00'),
|
||||
tax_value=Decimal('0.00'))
|
||||
inv1 = generate_invoice(order)
|
||||
inv2 = generate_invoice(order)
|
||||
|
||||
@@ -320,9 +323,10 @@ def test_invoice_number_prefixes(env):
|
||||
status=Order.STATUS_PENDING,
|
||||
datetime=now(), expires=now() + timedelta(days=10),
|
||||
total=0, payment_provider='banktransfer',
|
||||
payment_fee=Decimal('0.25'), payment_fee_tax_rate=0,
|
||||
payment_fee_tax_value=0, locale='en'
|
||||
locale='en'
|
||||
)
|
||||
order2.fees.create(fee_type=OrderFee.FEE_TYPE_PAYMENT, value=Decimal('0.25'), tax_rate=Decimal('0.00'),
|
||||
tax_value=Decimal('0.00'))
|
||||
event.settings.set('invoice_numbers_consecutive', False)
|
||||
event2.settings.set('invoice_numbers_consecutive', False)
|
||||
assert generate_invoice(order).number == 'DUMMY-{}-1'.format(order.code)
|
||||
|
||||
@@ -13,6 +13,7 @@ from pretix.base.models import (
|
||||
CartPosition, Event, InvoiceAddress, Item, Order, OrderPosition, Organizer,
|
||||
)
|
||||
from pretix.base.models.items import SubEventItem
|
||||
from pretix.base.models.orders import OrderFee
|
||||
from pretix.base.payment import FreeOrderProvider
|
||||
from pretix.base.reldate import RelativeDate, RelativeDateWrapper
|
||||
from pretix.base.services.invoices import generate_invoice
|
||||
@@ -539,10 +540,10 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.ocm.commit()
|
||||
self.order.refresh_from_db()
|
||||
assert self.order.total == Decimal('47.30')
|
||||
assert self.order.payment_fee == prov.calculate_fee(self.order.total)
|
||||
assert self.order.payment_fee_tax_rate == Decimal('19.00')
|
||||
assert round_decimal(self.order.payment_fee * (
|
||||
1 - 100 / (100 + self.order.payment_fee_tax_rate))) == self.order.payment_fee_tax_value
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == prov.calculate_fee(self.order.total)
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert round_decimal(fee.value * (1 - 100 / (100 + fee.tax_rate))) == fee.tax_value
|
||||
|
||||
def test_require_pending(self):
|
||||
self.order.status = Order.STATUS_PAID
|
||||
@@ -725,9 +726,10 @@ class OrderChangeManagerTests(TestCase):
|
||||
self.ocm._recalculate_total_and_payment_fee()
|
||||
|
||||
assert self.order.total == Decimal('46.30')
|
||||
assert self.order.payment_fee == prov.calculate_fee(self.order.total)
|
||||
assert self.order.payment_fee_tax_rate == Decimal('19.00')
|
||||
assert self.order.payment_fee_tax_value == Decimal('0.05')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == prov.calculate_fee(self.order.total)
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert fee.tax_value == Decimal('0.05')
|
||||
|
||||
ia = self._enable_reverse_charge()
|
||||
self.ocm.recalculate_taxes()
|
||||
@@ -739,9 +741,10 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert op.tax_rate == Decimal('0.00')
|
||||
|
||||
assert self.order.total == Decimal('43.30')
|
||||
assert self.order.payment_fee == prov.calculate_fee(self.order.total)
|
||||
assert self.order.payment_fee_tax_rate == Decimal('0.00')
|
||||
assert self.order.payment_fee_tax_value == Decimal('0.00')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == prov.calculate_fee(self.order.total)
|
||||
assert fee.tax_rate == Decimal('0.00')
|
||||
assert fee.tax_value == Decimal('0.00')
|
||||
|
||||
ia.vat_id_validated = False
|
||||
ia.save()
|
||||
@@ -755,6 +758,7 @@ class OrderChangeManagerTests(TestCase):
|
||||
assert op.tax_rate == Decimal('7.00')
|
||||
|
||||
assert self.order.total == Decimal('46.32')
|
||||
assert self.order.payment_fee == prov.calculate_fee(self.order.total)
|
||||
assert self.order.payment_fee_tax_rate == Decimal('19.00')
|
||||
assert self.order.payment_fee_tax_value == Decimal('0.05')
|
||||
fee = self.order.fees.get(fee_type=OrderFee.FEE_TYPE_PAYMENT)
|
||||
assert fee.value == prov.calculate_fee(self.order.total)
|
||||
assert fee.tax_rate == Decimal('19.00')
|
||||
assert fee.tax_value == Decimal('0.05')
|
||||
|
||||
Reference in New Issue
Block a user