forked from CGM_Public/pretix_original
Allow to round taxes on order-level (#5019)
* Allow to round taxes on order-level * Rename get_cart_total * Persist rounding mode with order * Add general docs * Order creation API * Update fee algorithm * Rounding on payment method change * Round when splitting order * Fix failing tests * Add settings page * Add tests * Replace algorithm * Add test case for currency rounding * Improve order change * Update flowchart * Update discount logic (more hypothetical, we don't store rounding on cart positions atm) * Rename internal method * Fix typo * Update help text * Apply suggestions from code review Co-authored-by: luelista <weller@rami.io> * Order rounding refactor (#5571) * Add RoundingCorrectionMixin providing before-rounding-values as properties * Use gross_price_before_rounding in more places * Update doc/development/algorithms/pricing.rst Co-authored-by: Martin Gross <gross@rami.io> * Allow to override on perform_order * Rebase migration * Fix event cancellation --------- Co-authored-by: luelista <weller@rami.io> Co-authored-by: Martin Gross <gross@rami.io>
This commit is contained in:
@@ -420,6 +420,7 @@ def test_order_create_simulate(token_client, organizer, event, item, quota, ques
|
||||
}
|
||||
],
|
||||
'total': '21.75',
|
||||
'tax_rounding_mode': 'line',
|
||||
'comment': '',
|
||||
'api_meta': {},
|
||||
"custom_followup_at": None,
|
||||
@@ -3259,3 +3260,79 @@ def test_order_create_auto_pricing_explicit_discount_not_allowed(token_client, o
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_rounding_mode(token_client, organizer, event, item, quota, question, taxrule):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res["tax_rounding_mode"] = "sum_by_net"
|
||||
res['fees'][0]['_split_taxes_like_products'] = True
|
||||
res['fees'][0]['value'] = Decimal("100.00")
|
||||
res['positions'] = [
|
||||
{
|
||||
"item": item.pk,
|
||||
"price": "100.00",
|
||||
}
|
||||
] * 4
|
||||
|
||||
for simulate in (True, False):
|
||||
res["simulate"] = simulate
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert resp.data["total"] == "499.98"
|
||||
assert resp.data["positions"][0]["price"] == "99.99"
|
||||
assert resp.data["positions"][-1]["price"] == "100.00"
|
||||
|
||||
res["tax_rounding_mode"] = "sum_by_net_keep_gross"
|
||||
for simulate in (True, False):
|
||||
res["simulate"] = simulate
|
||||
resp = token_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert resp.data["total"] == "500.00"
|
||||
assert resp.data["positions"][0]["tax_value"] == "15.96"
|
||||
assert resp.data["positions"][-1]["tax_value"] == "15.97"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_order_create_rounding_default_pretixpos_fallback(device, device_client, organizer, event, item, quota, question, taxrule):
|
||||
res = copy.deepcopy(ORDER_CREATE_PAYLOAD)
|
||||
res['fees'][0]['_split_taxes_like_products'] = True
|
||||
res['fees'][0]['value'] = Decimal("100.00")
|
||||
res['positions'] = [
|
||||
{
|
||||
"item": item.pk,
|
||||
"price": "100.00",
|
||||
}
|
||||
] * 4
|
||||
|
||||
event.settings.tax_rounding = "sum_by_net"
|
||||
|
||||
resp = device_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert resp.data["total"] == "499.98"
|
||||
assert resp.data["positions"][0]["price"] == "99.99"
|
||||
assert resp.data["positions"][-1]["price"] == "100.00"
|
||||
|
||||
device.software_brand = "pretixPOS Android"
|
||||
device.save()
|
||||
resp = device_client.post(
|
||||
'/api/v1/organizers/{}/events/{}/orders/'.format(
|
||||
organizer.slug, event.slug
|
||||
), format='json', data=res
|
||||
)
|
||||
assert resp.status_code == 201
|
||||
assert resp.data["total"] == "500.00"
|
||||
assert resp.data["positions"][0]["price"] == "100.00"
|
||||
assert resp.data["positions"][-1]["price"] == "100.00"
|
||||
|
||||
@@ -306,6 +306,7 @@ TEST_ORDER_RES = {
|
||||
"url": "http://example.com/dummy/dummy/order/FOO/k24fiuwvu8kxz3y1/",
|
||||
"payment_provider": "banktransfer",
|
||||
"total": "23.00",
|
||||
"tax_rounding_mode": "line",
|
||||
"comment": "",
|
||||
"api_meta": {},
|
||||
"custom_followup_at": None,
|
||||
|
||||
Reference in New Issue
Block a user