diff --git a/server/vbv_lernwelt/shop/migrations/0004_auto_20231116_1336.py b/server/vbv_lernwelt/shop/migrations/0004_auto_20231116_1336.py new file mode 100644 index 00000000..c6aecd54 --- /dev/null +++ b/server/vbv_lernwelt/shop/migrations/0004_auto_20231116_1336.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.20 on 2023-11-16 12:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('shop', '0003_auto_20231114_2036'), + ] + + operations = [ + migrations.RenameField( + model_name='checkoutinformation', + old_name='street_address', + new_name='street', + ), + migrations.RenameField( + model_name='checkoutinformation', + old_name='street_number_address', + new_name='street_number', + ), + ] diff --git a/server/vbv_lernwelt/shop/migrations/0005_auto_20231116_1338.py b/server/vbv_lernwelt/shop/migrations/0005_auto_20231116_1338.py new file mode 100644 index 00000000..832e85b0 --- /dev/null +++ b/server/vbv_lernwelt/shop/migrations/0005_auto_20231116_1338.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.20 on 2023-11-16 12:38 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('shop', '0004_auto_20231116_1336'), + ] + + operations = [ + migrations.RenameField( + model_name='checkoutinformation', + old_name='company_street_address', + new_name='company_street', + ), + migrations.RenameField( + model_name='checkoutinformation', + old_name='company_street_number_address', + new_name='company_street_number', + ), + ] diff --git a/server/vbv_lernwelt/shop/migrations/0006_alter_checkoutinformation_state.py b/server/vbv_lernwelt/shop/migrations/0006_alter_checkoutinformation_state.py new file mode 100644 index 00000000..b2eeedaf --- /dev/null +++ b/server/vbv_lernwelt/shop/migrations/0006_alter_checkoutinformation_state.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.20 on 2023-11-16 17:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('shop', '0005_auto_20231116_1338'), + ] + + operations = [ + migrations.AlterField( + model_name='checkoutinformation', + name='state', + field=models.CharField(choices=[('initialized', 'Initialized'), ('settled', 'Settled'), ('transmitted', 'Transmitted'), ('canceled', 'Canceled'), ('failed', 'Failed')], max_length=50), + ), + ] diff --git a/server/vbv_lernwelt/shop/migrations/0007_checkoutinformation_webhook_history.py b/server/vbv_lernwelt/shop/migrations/0007_checkoutinformation_webhook_history.py new file mode 100644 index 00000000..f05498d1 --- /dev/null +++ b/server/vbv_lernwelt/shop/migrations/0007_checkoutinformation_webhook_history.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.20 on 2023-11-16 23:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('shop', '0006_alter_checkoutinformation_state'), + ] + + operations = [ + migrations.AddField( + model_name='checkoutinformation', + name='webhook_history', + field=models.JSONField(default=list), + ), + ] diff --git a/server/vbv_lernwelt/shop/models.py b/server/vbv_lernwelt/shop/models.py index eb520ca0..879af2b2 100644 --- a/server/vbv_lernwelt/shop/models.py +++ b/server/vbv_lernwelt/shop/models.py @@ -1,5 +1,7 @@ from django.db import models +VV_PRODUCT_SKU = "VV" + class Country(models.Model): country_id = models.IntegerField(primary_key=True) @@ -48,11 +50,28 @@ class Product(models.Model): description = models.CharField(max_length=255) -class CheckoutInformation(models.Model): +class CheckoutState(models.TextChoices): """ - Immutable checkout information for a purchase from the shop. + The state of a checkout process transaction. + + 1) We use the `autoSettle` feature of DataTrans! Therefore, there are less possible states: + -> https://docs.datatrans.ch/docs/after-the-payment + -> https://api-reference.datatrans.ch/#tag/v1transactions/operation/status + + 2) Difference between `settled` and `transmitted`: + - https://www.datatrans.ch/en/know-how/faq/#what-does-the-status-transaction-settled-or-settledtransmitted-mean + + 3) Related relevant code:init_transaction and get_transaction_state in shop/services.py """ + INITIALIZED = "initialized" + SETTLED = "settled" + TRANSMITTED = "transmitted" + CANCELED = "canceled" + FAILED = "failed" + + +class CheckoutInformation(models.Model): user = models.ForeignKey("core.User", on_delete=models.PROTECT) # immutable product information at time of purchase @@ -65,13 +84,8 @@ class CheckoutInformation(models.Model): updated_at = models.DateTimeField(auto_now=True) state = models.CharField( - max_length=255, - choices=[ - ("initialized", "initialized"), - ("settled", "settled"), - ("canceled", "canceled"), - ("failed", "failed"), - ], + max_length=50, + choices=CheckoutState.choices, ) invoice_transmitted_at = models.DateTimeField(blank=True, null=True) @@ -80,16 +94,19 @@ class CheckoutInformation(models.Model): # end user (required) first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) - street_address = models.CharField(max_length=255) - street_number_address = models.CharField(max_length=255) + street = models.CharField(max_length=255) + street_number = models.CharField(max_length=255) postal_code = models.CharField(max_length=255) city = models.CharField(max_length=255) country = models.CharField(max_length=255) # company (optional) company_name = models.CharField(max_length=255, blank=True) - company_street_address = models.CharField(max_length=255, blank=True) - company_street_number_address = models.CharField(max_length=255, blank=True) + company_street = models.CharField(max_length=255, blank=True) + company_street_number = models.CharField(max_length=255, blank=True) company_postal_code = models.CharField(max_length=255, blank=True) company_city = models.CharField(max_length=255, blank=True) company_country = models.CharField(max_length=255, blank=True) + + # webhook metadata + webhook_history = models.JSONField(default=list)