mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
Add codification of tax rates (#4372)
* draft * . * Rebase migration * Update src/pretix/base/models/tax.py Co-authored-by: Mira <weller@rami.io> * Test, isort, flake, migration rebase * carry data & API * Fix failing tests * docs fixes * Improve validation * Tests * More fixes --------- Co-authored-by: Mira <weller@rami.io>
This commit is contained in:
@@ -46,63 +46,82 @@ def event():
|
||||
def test_from_gross_price(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=True
|
||||
rate=Decimal('10.00'),
|
||||
code='S/standard',
|
||||
price_includes_tax=True
|
||||
)
|
||||
tp = tr.tax(Decimal('100.00'))
|
||||
assert tp.gross == Decimal('100')
|
||||
assert tp.net == Decimal('90.91')
|
||||
assert tp.tax == Decimal('100.00') - Decimal('90.91')
|
||||
assert tp.rate == Decimal('10.00')
|
||||
assert tp.code == 'S/standard'
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_from_net_price(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
rate=Decimal('10.00'),
|
||||
code=None,
|
||||
price_includes_tax=False,
|
||||
)
|
||||
tp = tr.tax(Decimal('100.00'))
|
||||
assert tp.gross == Decimal('110.00')
|
||||
assert tp.net == Decimal('100.00')
|
||||
assert tp.tax == Decimal('10.00')
|
||||
assert tp.rate == Decimal('10.00')
|
||||
assert tp.code is None
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_no_address(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True,
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False,
|
||||
)
|
||||
assert not tr.is_reverse_charge(None)
|
||||
assert tr._tax_applicable(None)
|
||||
assert tr.tax_code_for(None) == "S/standard"
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_no_country(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True,
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
code="S/standard",
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
)
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_individual_same_country(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False,
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=False,
|
||||
@@ -111,20 +130,26 @@ def test_reverse_charge_individual_same_country(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_individual_eu(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=False,
|
||||
@@ -133,20 +158,26 @@ def test_reverse_charge_individual_eu(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_individual_3rdc(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=False,
|
||||
@@ -155,20 +186,26 @@ def test_reverse_charge_individual_3rdc(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "O"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('100.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code='O',
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_business_same_country(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -177,20 +214,26 @@ def test_reverse_charge_business_same_country(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_business_eu(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -199,20 +242,26 @@ def test_reverse_charge_business_eu(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_business_3rdc(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -221,20 +270,26 @@ def test_reverse_charge_business_3rdc(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "O"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('100.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code='O',
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_valid_vat_id_business_same_country(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -245,20 +300,26 @@ def test_reverse_charge_valid_vat_id_business_same_country(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_valid_vat_id_business_eu(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -269,20 +330,26 @@ def test_reverse_charge_valid_vat_id_business_eu(event):
|
||||
assert tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "AE"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('100.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code='AE',
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_valid_vat_id_business_3rdc(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -293,20 +360,26 @@ def test_reverse_charge_valid_vat_id_business_3rdc(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "O"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('100.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code='O',
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_reverse_charge_disabled(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=False, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False
|
||||
event=event,
|
||||
eu_reverse_charge=False,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -317,20 +390,26 @@ def test_reverse_charge_disabled(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_custom_rules_override(event):
|
||||
tr = TaxRule(
|
||||
event=event, eu_reverse_charge=True, home_country=Country('DE'),
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
event=event,
|
||||
eu_reverse_charge=True,
|
||||
home_country=Country('DE'),
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'ZZ', 'address_type': '', 'action': 'vat'}
|
||||
])
|
||||
@@ -344,12 +423,14 @@ def test_custom_rules_override(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@@ -357,9 +438,11 @@ def test_custom_rules_override(event):
|
||||
def test_custom_rules_in_order(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'ZZ', 'address_type': '', 'action': 'vat'},
|
||||
{'country': 'ZZ', 'address_type': '', 'action': 'vat', 'code': 'S/reduced'},
|
||||
{'country': 'ZZ', 'address_type': '', 'action': 'reverse'}
|
||||
])
|
||||
)
|
||||
@@ -372,12 +455,14 @@ def test_custom_rules_in_order(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/reduced"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/reduced",
|
||||
)
|
||||
|
||||
|
||||
@@ -385,9 +470,11 @@ def test_custom_rules_in_order(event):
|
||||
def test_custom_rules_any_country(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'ZZ', 'address_type': '', 'action': 'no'},
|
||||
{'country': 'ZZ', 'address_type': '', 'action': 'no', 'code': 'O'},
|
||||
])
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
@@ -397,12 +484,14 @@ def test_custom_rules_any_country(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "O"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('100.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code="O",
|
||||
)
|
||||
|
||||
|
||||
@@ -410,9 +499,11 @@ def test_custom_rules_any_country(event):
|
||||
def test_custom_rules_eu_country(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'EU', 'address_type': '', 'action': 'no'},
|
||||
{'country': 'EU', 'address_type': '', 'action': 'no', 'code': 'Z'},
|
||||
])
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
@@ -422,18 +513,21 @@ def test_custom_rules_eu_country(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "Z"
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
country=Country('US')
|
||||
)
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@@ -441,9 +535,11 @@ def test_custom_rules_eu_country(event):
|
||||
def test_custom_rules_specific_country(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
code="S/standard",
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'AT', 'address_type': '', 'action': 'no'},
|
||||
{'country': 'AT', 'address_type': '', 'action': 'no', 'code': 'Z'},
|
||||
])
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
@@ -453,12 +549,14 @@ def test_custom_rules_specific_country(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "Z"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('100.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code="Z",
|
||||
)
|
||||
|
||||
ia = InvoiceAddress(
|
||||
@@ -474,6 +572,7 @@ def test_custom_rules_specific_country(event):
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
|
||||
@@ -481,7 +580,8 @@ def test_custom_rules_specific_country(event):
|
||||
def test_custom_rules_specific_state(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'US-NY', 'address_type': '', 'action': 'vat', 'rate': '20.00'},
|
||||
{'country': 'US-DE', 'address_type': '', 'action': 'no'},
|
||||
@@ -501,6 +601,7 @@ def test_custom_rules_specific_state(event):
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
ia = InvoiceAddress(
|
||||
@@ -517,6 +618,7 @@ def test_custom_rules_specific_state(event):
|
||||
tax=Decimal('30.00'),
|
||||
rate=Decimal('30.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
ia = InvoiceAddress(
|
||||
@@ -533,6 +635,7 @@ def test_custom_rules_specific_state(event):
|
||||
tax=Decimal('20.00'),
|
||||
rate=Decimal('20.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
ia = InvoiceAddress(
|
||||
@@ -549,6 +652,7 @@ def test_custom_rules_specific_state(event):
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -556,7 +660,8 @@ def test_custom_rules_specific_state(event):
|
||||
def test_custom_rules_individual(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'ZZ', 'address_type': 'individual', 'action': 'no'},
|
||||
])
|
||||
@@ -574,6 +679,7 @@ def test_custom_rules_individual(event):
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
ia = InvoiceAddress(
|
||||
@@ -589,6 +695,7 @@ def test_custom_rules_individual(event):
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -596,7 +703,8 @@ def test_custom_rules_individual(event):
|
||||
def test_custom_rules_business(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'ZZ', 'address_type': 'business', 'action': 'no'},
|
||||
])
|
||||
@@ -614,6 +722,7 @@ def test_custom_rules_business(event):
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
ia = InvoiceAddress(
|
||||
@@ -629,6 +738,7 @@ def test_custom_rules_business(event):
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -636,7 +746,9 @@ def test_custom_rules_business(event):
|
||||
def test_custom_rules_vat_id(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
code="S/standard",
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'EU', 'address_type': 'business_vat_id', 'action': 'reverse'},
|
||||
])
|
||||
@@ -648,12 +760,14 @@ def test_custom_rules_vat_id(event):
|
||||
assert not tr.is_reverse_charge(ia)
|
||||
assert tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('10.00')
|
||||
assert tr.tax_code_for(ia) == "S/standard"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('110.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code="S/standard",
|
||||
)
|
||||
|
||||
ia = InvoiceAddress(
|
||||
@@ -665,12 +779,14 @@ def test_custom_rules_vat_id(event):
|
||||
assert tr.is_reverse_charge(ia)
|
||||
assert not tr._tax_applicable(ia)
|
||||
assert tr.tax_rate_for(ia) == Decimal('0.00')
|
||||
assert tr.tax_code_for(ia) == "AE"
|
||||
assert tr.tax(Decimal('100.00'), invoice_address=ia) == TaxedPrice(
|
||||
gross=Decimal('100.00'),
|
||||
net=Decimal('100.00'),
|
||||
tax=Decimal('0.00'),
|
||||
rate=Decimal('0.00'),
|
||||
name='',
|
||||
code='AE',
|
||||
)
|
||||
|
||||
|
||||
@@ -678,7 +794,8 @@ def test_custom_rules_vat_id(event):
|
||||
def test_custom_rules_country_rate(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'EU', 'address_type': 'business_vat_id', 'action': 'vat', 'rate': '100.00'},
|
||||
])
|
||||
@@ -696,6 +813,7 @@ def test_custom_rules_country_rate(event):
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -712,6 +830,7 @@ def test_custom_rules_country_rate(event):
|
||||
tax=Decimal('100.00'),
|
||||
rate=Decimal('100.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -719,7 +838,8 @@ def test_custom_rules_country_rate(event):
|
||||
def test_custom_rules_country_rate_keep_gross_if_rate_changes(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
keep_gross_if_rate_changes=True,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'EU', 'address_type': 'business_vat_id', 'action': 'vat', 'rate': '100.00'},
|
||||
@@ -738,6 +858,7 @@ def test_custom_rules_country_rate_keep_gross_if_rate_changes(event):
|
||||
tax=Decimal('10.00'),
|
||||
rate=Decimal('10.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
ia = InvoiceAddress(
|
||||
is_business=True,
|
||||
@@ -754,6 +875,7 @@ def test_custom_rules_country_rate_keep_gross_if_rate_changes(event):
|
||||
tax=Decimal('55.00'),
|
||||
rate=Decimal('100.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -761,7 +883,8 @@ def test_custom_rules_country_rate_keep_gross_if_rate_changes(event):
|
||||
def test_custom_rules_country_rate_subtract_from_gross(event):
|
||||
tr = TaxRule(
|
||||
event=event,
|
||||
rate=Decimal('10.00'), price_includes_tax=False,
|
||||
rate=Decimal('10.00'),
|
||||
price_includes_tax=False,
|
||||
custom_rules=json.dumps([
|
||||
{'country': 'EU', 'address_type': 'business_vat_id', 'action': 'vat', 'rate': '100.00'},
|
||||
])
|
||||
@@ -781,6 +904,7 @@ def test_custom_rules_country_rate_subtract_from_gross(event):
|
||||
tax=Decimal('81.82'),
|
||||
rate=Decimal('100.00'),
|
||||
name='',
|
||||
code=None,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user