From a492c3de1bbccab4553ab268a7e8156d1cc51329 Mon Sep 17 00:00:00 2001
From: PCoder <purple.coder@yahoo.co.uk>
Date: Wed, 6 Dec 2023 15:34:23 +0530
Subject: [PATCH] Add management command

---
 .../commands/change_ch_vatrate_2023.py        | 93 +++++++++++++++++++
 1 file changed, 93 insertions(+)
 create mode 100644 hosting/management/commands/change_ch_vatrate_2023.py

diff --git a/hosting/management/commands/change_ch_vatrate_2023.py b/hosting/management/commands/change_ch_vatrate_2023.py
new file mode 100644
index 00000000..568ba78c
--- /dev/null
+++ b/hosting/management/commands/change_ch_vatrate_2023.py
@@ -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)))