diff --git a/server/vbv_lernwelt/core/models.py b/server/vbv_lernwelt/core/models.py index f1ee630d..71d4a3db 100644 --- a/server/vbv_lernwelt/core/models.py +++ b/server/vbv_lernwelt/core/models.py @@ -118,7 +118,7 @@ class User(AbstractUser): # is only set by abacus invoice export code abacus_debitor_number = models.BigIntegerField(unique=True, null=True, blank=True) - def set_increment_abacus_debitor_number(self): + def set_increment_abacus_debitor_number(self, disable_save=False): if self.abacus_debitor_number: return self @@ -130,7 +130,8 @@ class User(AbstractUser): current_max if current_max is not None else 60_000_000 ) + 1 self.abacus_debitor_number = new_debitor_number - self.save() + if not disable_save: + self.save() return self def create_avatar_url(self, size=400): diff --git a/server/vbv_lernwelt/shop/migrations/0015_cembra_fields.py b/server/vbv_lernwelt/shop/migrations/0015_cembra_fields.py index 67061756..b714a6cd 100644 --- a/server/vbv_lernwelt/shop/migrations/0015_cembra_fields.py +++ b/server/vbv_lernwelt/shop/migrations/0015_cembra_fields.py @@ -39,4 +39,9 @@ class Migration(migrations.Migration): name="phone_number", field=models.CharField(blank=True, default="", max_length=255), ), + migrations.AddField( + model_name="checkoutinformation", + name="refno2", + field=models.CharField(blank=True, default="", max_length=255), + ), ] diff --git a/server/vbv_lernwelt/shop/models.py b/server/vbv_lernwelt/shop/models.py index 1272d881..8373bc4d 100644 --- a/server/vbv_lernwelt/shop/models.py +++ b/server/vbv_lernwelt/shop/models.py @@ -62,6 +62,7 @@ class CheckoutInformation(models.Model): invoice_transmitted_at = models.DateTimeField(blank=True, null=True) transaction_id = models.CharField(max_length=255) + refno2 = models.CharField(max_length=255) # end user (required) first_name = models.CharField(max_length=255) diff --git a/server/vbv_lernwelt/shop/services.py b/server/vbv_lernwelt/shop/services.py index b83091c9..f5998d38 100644 --- a/server/vbv_lernwelt/shop/services.py +++ b/server/vbv_lernwelt/shop/services.py @@ -7,6 +7,7 @@ import structlog from django.conf import settings from vbv_lernwelt.core.admin import User +from vbv_lernwelt.shop.const import VV_PRODUCT_NUMBER from vbv_lernwelt.shop.datatrans.datatrans_api_client import DatatransApiClient from vbv_lernwelt.shop.models import CheckoutState @@ -77,6 +78,7 @@ def init_datatrans_transaction( redirect_url_error: str, redirect_url_cancel: str, webhook_url: str, + refno2: str, datatrans_customer_data: dict = None, datatrans_int_data: dict = None, context_data: dict = None, @@ -90,6 +92,7 @@ def init_datatrans_transaction( "currency": "CHF", "language": user.language, "refno": str(uuid.uuid4()), + "refno2": refno2, "webhook": {"url": webhook_url}, "redirect": { "successUrl": redirect_url_success, diff --git a/server/vbv_lernwelt/shop/views.py b/server/vbv_lernwelt/shop/views.py index 67b8db4d..3d0cbad5 100644 --- a/server/vbv_lernwelt/shop/views.py +++ b/server/vbv_lernwelt/shop/views.py @@ -13,6 +13,7 @@ from vbv_lernwelt.shop.const import ( VV_DE_PRODUCT_SKU, VV_FR_PRODUCT_SKU, VV_IT_PRODUCT_SKU, + VV_PRODUCT_NUMBER, ) from vbv_lernwelt.shop.models import CheckoutInformation, CheckoutState, Product from vbv_lernwelt.shop.services import ( @@ -115,13 +116,16 @@ def checkout_vv(request): ip_address = request.META.get("REMOTE_ADDR") email = request.user.email + request.user.set_increment_abacus_debitor_number( + disable_save="fakeapi" in settings.DATATRANS_API_ENDPOINT + ) + + refno2 = f"{request.user.abacus_debitor_number}_{VV_PRODUCT_NUMBER}" + try: datatrans_customer_data = None datatrans_int_data = None if with_cembra_byjuno_invoice: - if "fakeapi" not in settings.DATATRANS_API_ENDPOINT: - request.user.set_increment_abacus_debitor_number() - # see https://api-reference.datatrans.ch/#tag/v1transactions as reference datatrans_customer_data = { "firstName": request.user.first_name, @@ -155,6 +159,7 @@ def checkout_vv(request): ), redirect_url_cancel=checkout_cancel_url(base_redirect_url), webhook_url=webhook_url(base_redirect_url), + refno2=refno2, datatrans_customer_data=datatrans_customer_data, datatrans_int_data=datatrans_int_data, context_data=context_data,