Add management command to change ch vat #15
1 changed files with 93 additions and 0 deletions
93
hosting/management/commands/change_ch_vatrate_2023.py
Normal file
93
hosting/management/commands/change_ch_vatrate_2023.py
Normal file
|
@ -0,0 +1,93 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
import datetime
|
||||
import csv
|
||||
import stripe
|
||||
from hosting.models import VATRates
|
||||
from utils.hosting_utils import get_vat_rate_for_country
|
||||
from django.conf import settings
|
||||
|
||||
stripe.api_key = settings.STRIPE_API_PRIVATE_KEY
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = '''CH vat rate changes on 2024-01-01 from 7.7% to 8.1%. This commands makes the necessary changes'''
|
||||
|
||||
def handle(self, *args, **options):
|
||||
MAKE_MODIFS=False
|
||||
try:
|
||||
country_to_change = 'CH'
|
||||
currency_to_change = 'CHF'
|
||||
new_rate = 0.081
|
||||
user_country_vat_rate = get_vat_rate_for_country(country_to_change)
|
||||
logger.debug("Existing VATRate for %s %s " % (country_to_change, user_country_vat_rate))
|
||||
vat_rate = VATRates.objects.get(
|
||||
territory_codes=country_to_change, start_date__isnull=False, stop_date=None
|
||||
)
|
||||
logger.debug("VAT rate for %s is %s" % (country, vat_rate.rate))
|
||||
logger.debug("vat_rate object = %s" % vat_rate)
|
||||
logger.debug("Create end date for the VATRate %s" % vat_rate.id)
|
||||
if MAKE_MODIFS:
|
||||
vat_rate.stop_date = datetime.date(2023, 12, 31)
|
||||
vat_rate.save()
|
||||
print("Creating a new VATRate for CH")
|
||||
obj, created = VATRates.objects.get_or_create(
|
||||
start_date=datetime.date(2024, 1, 1),
|
||||
stop_date=None,
|
||||
territory_codes=country_to_change,
|
||||
currency_code=currency_to_change,
|
||||
rate=new_rate,
|
||||
rate_type="standard",
|
||||
description="Switzerland standard VAT (added manually on %s)" % datetime.datetime.now()
|
||||
)
|
||||
if created:
|
||||
logger.debug("Created new VAT Rate for %s with the new rate %s" % (country_to_change, new_rate))
|
||||
logger.debug(obj)
|
||||
else:
|
||||
logger.debug("VAT Rate for %s already exists with the rate %s" % (country_to_change, new_rate))
|
||||
|
||||
logger.debug("Getting all subscriptions of %s that need a VAT Rate change")
|
||||
subscriptions = stripe.Subscription.list(limit=100) # Increase the limit to 100 per page (maximum)
|
||||
ch_subs = []
|
||||
|
||||
while subscriptions:
|
||||
for subscription in subscriptions:
|
||||
if len(subscription.default_tax_rates) > 0 and subscription.default_tax_rates[0].jurisdiction and subscription.default_tax_rates[0].jurisdiction.lower() == 'ch':
|
||||
ch_subs.append(subscription)
|
||||
elif len(subscription.default_tax_rates) > 0:
|
||||
print("subscription %s belongs to %s" % (subscription.id, subscription.default_tax_rates[0].jurisdiction))
|
||||
else:
|
||||
print("subscription %s does not have a tax rate" % subscription.id)
|
||||
if subscriptions.has_more:
|
||||
print("FETCHING MORE")
|
||||
subscriptions = stripe.Subscription.list(limit=100, starting_after=subscriptions.data[-1])
|
||||
else:
|
||||
break
|
||||
logger.debug("There are %s ch subscription that need VAT rate update" % len(ch_subs))
|
||||
|
||||
if MAKE_MODIFS:
|
||||
print("Making modifications now")
|
||||
tax_rate_obj = stripe.TaxRate.create(
|
||||
display_name="VAT",
|
||||
description="VAT for %s" % country_to_change,
|
||||
jurisdiction=country_to_change,
|
||||
percentage=new_rate,
|
||||
inclusive=False,
|
||||
)
|
||||
stripe_tax_rate = StripeTaxRate.objects.create(
|
||||
display_name=tax_rate_obj.display_name,
|
||||
description=tax_rate_obj.description,
|
||||
jurisdiction=tax_rate_obj.jurisdiction,
|
||||
percentage=tax_rate_obj.percentage,
|
||||
inclusive=False,
|
||||
tax_rate_id=tax_rate_obj.id
|
||||
)
|
||||
|
||||
for ch_sub in ch_subs:
|
||||
ch_sub.default_tax_rates = [stripe_tax_rate.tax_rate_id]
|
||||
ch_sub.save()
|
||||
logger.debug("Default tax rate updated for %s" % ch_sub.id)
|
||||
else:
|
||||
print("Not making any modifications because MAKE_MODIFS=False")
|
||||
|
||||
except Exception as e:
|
||||
print(" *** Error occurred. Details {}".format(str(e)))
|
Loading…
Reference in a new issue