From 1f8cca7973dd88208988d9c891423ca247ced9a1 Mon Sep 17 00:00:00 2001 From: Mojtaba-z Date: Wed, 6 Aug 2025 16:08:07 +0330 Subject: [PATCH] create bank account for organization --- apps/authentication/api/v1/api.py | 15 ++++++++++++++ .../api/v1/serializers/serializer.py | 6 ++++++ apps/authentication/api/v1/urls.py | 4 +++- ...028_bankaccountinformation_account_type.py | 18 +++++++++++++++++ ...029_bankaccountinformation_organization.py | 19 ++++++++++++++++++ .../0030_alter_bankaccountinformation_user.py | 20 +++++++++++++++++++ apps/authentication/models.py | 14 ++++++++++++- ...1_alter_deviceactivationcode_expires_at.py | 19 ++++++++++++++++++ ...2_alter_deviceactivationcode_expires_at.py | 19 ++++++++++++++++++ ...3_alter_deviceactivationcode_expires_at.py | 19 ++++++++++++++++++ ...4_alter_deviceactivationcode_expires_at.py | 19 ++++++++++++++++++ 11 files changed, 170 insertions(+), 2 deletions(-) create mode 100644 apps/authentication/migrations/0028_bankaccountinformation_account_type.py create mode 100644 apps/authentication/migrations/0029_bankaccountinformation_organization.py create mode 100644 apps/authentication/migrations/0030_alter_bankaccountinformation_user.py create mode 100644 apps/pos_device/migrations/0041_alter_deviceactivationcode_expires_at.py create mode 100644 apps/pos_device/migrations/0042_alter_deviceactivationcode_expires_at.py create mode 100644 apps/pos_device/migrations/0043_alter_deviceactivationcode_expires_at.py create mode 100644 apps/pos_device/migrations/0044_alter_deviceactivationcode_expires_at.py diff --git a/apps/authentication/api/v1/api.py b/apps/authentication/api/v1/api.py index 3fdf9da..78b85bc 100644 --- a/apps/authentication/api/v1/api.py +++ b/apps/authentication/api/v1/api.py @@ -321,6 +321,21 @@ class BankAccountViewSet(ModelViewSet): queryset = BankAccountInformation.objects.all() serializer_class = BankAccountSerializer + @transaction.atomic + def create(self, request, *args, **kwargs): + """ add bank account for each organization """ + + if 'organization' not in request.data.keys(): + organization = get_organization_by_user(request.user) + request.data.update({'organization': organization.id}) + + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(raise_exception=True): + serializer.save() + + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + class GeneralOTPViewSet(ModelViewSet): """ general OTP user authorization """ diff --git a/apps/authentication/api/v1/serializers/serializer.py b/apps/authentication/api/v1/serializers/serializer.py index 4589779..7afb5e6 100644 --- a/apps/authentication/api/v1/serializers/serializer.py +++ b/apps/authentication/api/v1/serializers/serializer.py @@ -48,6 +48,8 @@ class BankAccountSerializer(serializers.ModelSerializer): fields = [ 'id', 'user', + 'organization', + 'account_type', 'account', 'name', 'card', @@ -55,6 +57,8 @@ class BankAccountSerializer(serializers.ModelSerializer): ] extra_kwargs = { 'user': {'required': False}, + 'organization': {'required': False}, + 'account_type': {'required': False}, 'account': {'required': False}, 'card': {'required': False}, 'sheba': {'required': False} @@ -64,6 +68,8 @@ class BankAccountSerializer(serializers.ModelSerializer): """ update user bank account information """ instance.name = validated_data.get('name', instance.name) instance.account = validated_data.get('account', instance.account) + instance.organization = validated_data.get('organization', instance.organization) + instance.account_type = validated_data.get('account_type', instance.account_type) instance.card = validated_data.get('card', instance.card) instance.sheba = validated_data.get('sheba', instance.sheba) instance.save() diff --git a/apps/authentication/api/v1/urls.py b/apps/authentication/api/v1/urls.py index cb8d41c..a2516b3 100644 --- a/apps/authentication/api/v1/urls.py +++ b/apps/authentication/api/v1/urls.py @@ -13,6 +13,7 @@ from .api import ( ProvinceViewSet, OrganizationViewSet, OrganizationTypeViewSet, + BankAccountViewSet, GeneralOTPViewSet, LogoutView ) @@ -23,11 +24,12 @@ router.register(r'city', CityViewSet, basename='city') router.register(r'province', ProvinceViewSet, basename='province') router.register(r'organization', OrganizationViewSet, basename='organization') router.register(r'organization-type', OrganizationTypeViewSet, basename='organization_type') +router.register(r'bank_account', BankAccountViewSet, basename='bank_account') router.register(r'otp', GeneralOTPViewSet, basename='otp') urlpatterns = [ path('login/', CustomizedTokenObtainPairView.as_view(), name='token_obtain_pair'), - path('logout/', LogoutView.as_view(), name='logut'), + path('logout/', LogoutView.as_view(), name='logout'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('token/verify/', TokenVerifyView.as_view(), name='token_verify'), path('token/revoke/', TokenBlacklistView.as_view(), name='revoke_token'), diff --git a/apps/authentication/migrations/0028_bankaccountinformation_account_type.py b/apps/authentication/migrations/0028_bankaccountinformation_account_type.py new file mode 100644 index 0000000..3c0c0d2 --- /dev/null +++ b/apps/authentication/migrations/0028_bankaccountinformation_account_type.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0 on 2025-08-06 11:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0027_remove_organizationstats_total_buyers_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='bankaccountinformation', + name='account_type', + field=models.CharField(default='USR', max_length=10), + ), + ] diff --git a/apps/authentication/migrations/0029_bankaccountinformation_organization.py b/apps/authentication/migrations/0029_bankaccountinformation_organization.py new file mode 100644 index 0000000..c67b96e --- /dev/null +++ b/apps/authentication/migrations/0029_bankaccountinformation_organization.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0 on 2025-08-06 12:31 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0028_bankaccountinformation_account_type'), + ] + + operations = [ + migrations.AddField( + model_name='bankaccountinformation', + name='organization', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bank_information', to='authentication.organization'), + ), + ] diff --git a/apps/authentication/migrations/0030_alter_bankaccountinformation_user.py b/apps/authentication/migrations/0030_alter_bankaccountinformation_user.py new file mode 100644 index 0000000..aa9732e --- /dev/null +++ b/apps/authentication/migrations/0030_alter_bankaccountinformation_user.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0 on 2025-08-06 12:32 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0029_bankaccountinformation_organization'), + ] + + operations = [ + migrations.AlterField( + model_name='bankaccountinformation', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='bank_information', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/apps/authentication/models.py b/apps/authentication/models.py index 6c00f8b..c63e907 100644 --- a/apps/authentication/models.py +++ b/apps/authentication/models.py @@ -161,8 +161,20 @@ class BankAccountInformation(BaseModel): user = models.ForeignKey( User, on_delete=models.CASCADE, - related_name="bank_information" + related_name="bank_information", + null=True ) + organization = models.ForeignKey( + Organization, + on_delete=models.CASCADE, + related_name='bank_information', + null=True + ) + type_choices = ( + ('ORG', 'organization'), + ('USR', 'user'), + ) + account_type = models.CharField(max_length=10, default='USR') name = models.CharField(max_length=150) card = models.CharField(max_length=25, unique=True) account = models.CharField(max_length=25, unique=True) diff --git a/apps/pos_device/migrations/0041_alter_deviceactivationcode_expires_at.py b/apps/pos_device/migrations/0041_alter_deviceactivationcode_expires_at.py new file mode 100644 index 0000000..e0c5ba3 --- /dev/null +++ b/apps/pos_device/migrations/0041_alter_deviceactivationcode_expires_at.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0 on 2025-08-06 11:48 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pos_device', '0040_alter_deviceactivationcode_expires_at'), + ] + + operations = [ + migrations.AlterField( + model_name='deviceactivationcode', + name='expires_at', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 15, 18, 11, 325715)), + ), + ] diff --git a/apps/pos_device/migrations/0042_alter_deviceactivationcode_expires_at.py b/apps/pos_device/migrations/0042_alter_deviceactivationcode_expires_at.py new file mode 100644 index 0000000..1ed5bae --- /dev/null +++ b/apps/pos_device/migrations/0042_alter_deviceactivationcode_expires_at.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0 on 2025-08-06 12:31 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pos_device', '0041_alter_deviceactivationcode_expires_at'), + ] + + operations = [ + migrations.AlterField( + model_name='deviceactivationcode', + name='expires_at', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 16, 1, 24, 371720)), + ), + ] diff --git a/apps/pos_device/migrations/0043_alter_deviceactivationcode_expires_at.py b/apps/pos_device/migrations/0043_alter_deviceactivationcode_expires_at.py new file mode 100644 index 0000000..1ee5f9b --- /dev/null +++ b/apps/pos_device/migrations/0043_alter_deviceactivationcode_expires_at.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0 on 2025-08-06 12:32 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pos_device', '0042_alter_deviceactivationcode_expires_at'), + ] + + operations = [ + migrations.AlterField( + model_name='deviceactivationcode', + name='expires_at', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 16, 2, 15, 965402)), + ), + ] diff --git a/apps/pos_device/migrations/0044_alter_deviceactivationcode_expires_at.py b/apps/pos_device/migrations/0044_alter_deviceactivationcode_expires_at.py new file mode 100644 index 0000000..cbcc7e4 --- /dev/null +++ b/apps/pos_device/migrations/0044_alter_deviceactivationcode_expires_at.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0 on 2025-08-06 12:33 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pos_device', '0043_alter_deviceactivationcode_expires_at'), + ] + + operations = [ + migrations.AlterField( + model_name='deviceactivationcode', + name='expires_at', + field=models.DateTimeField(default=datetime.datetime(2025, 8, 6, 16, 3, 12, 730390)), + ), + ]