diff --git a/apps/wallet/serializers.py b/apps/wallet/serializers.py index b40a43f..b2fa24c 100755 --- a/apps/wallet/serializers.py +++ b/apps/wallet/serializers.py @@ -203,8 +203,10 @@ class ApplicationDepositSerializer(serializers.ModelSerializer): class ApplicationWithdrawSerializer(serializers.ModelSerializer): + uuid = serializers.UUIDField(required=False, allow_null=None) payer_id = serializers.UUIDField(required=True) payer_type = serializers.IntegerField(required=True) + payer_wallet_category = serializers.UUIDField(required=True) amount = serializers.IntegerField(required=True, validators=[MinValueValidator(1)]) class Meta: @@ -213,8 +215,10 @@ class ApplicationWithdrawSerializer(serializers.ModelSerializer): 'uuid', 'payer_id', 'payer_type', + 'payer_wallet_category', 'payee_id', 'payee_type', + 'payee_wallet_category', "created_at", "state", 'amount', @@ -223,4 +227,4 @@ class ApplicationWithdrawSerializer(serializers.ModelSerializer): 'details', ) - read_only_fields = ['updated_at', 'state', 'created_at', 'payee_id', 'payee_type'] + read_only_fields = ['updated_at', 'state', 'created_at', 'payee_id', 'payee_type', 'payee_wallet_category'] diff --git a/apps/wallet/views/application.py b/apps/wallet/views/application.py index a81cc39..3bf6835 100755 --- a/apps/wallet/views/application.py +++ b/apps/wallet/views/application.py @@ -349,16 +349,25 @@ class CategoryWithdrawSubmitAPIView(generics.CreateAPIView): # TODO: get_or_create instead of create if uuid given # TODO: it is possible to merage create and submit in one step for improve performance application = get_application(self.request) - category_uuid = self.kwargs.get('category_uuid') - if category_uuid: - category = get_object_or_404(Category.objects.all(), uuid=category_uuid) + payer_wallet_category_uuid = serializer.validated_data.pop('payer_wallet_category') + payer_wallet_category_uuid = payer_wallet_category_uuid and str(payer_wallet_category_uuid) + + payee_wallet_category_uuid = self.kwargs.get('category_uuid') + if payee_wallet_category_uuid: + payee_wallet_category = get_object_or_404(Category.objects.all(), uuid=payee_wallet_category_uuid) else: - category = None + payee_wallet_category = None + + payer_wallet_category = get_object_or_404(Category.objects.all(), uuid=payer_wallet_category_uuid) + + if not(payer_wallet_category and payer_wallet_category.currency == payee_wallet_category.currency): + raise UnprocessableEntity('payer and payee wallet currency not equal') + payer_id = serializer.validated_data.pop('payer_id') payer_type = serializer.validated_data.pop('payer_type') payee_wallet, _ = Wallet.objects.get_or_create(owner_uuid=application.uuid, owner_type=TypeChoices.APPLICATION, - category=category) - payer_wallet, _ = Wallet.objects.get_or_create(owner_uuid=payer_id, owner_type=payer_type, category=category) + category=payee_wallet_category) + payer_wallet, _ = Wallet.objects.get_or_create(owner_uuid=payer_id, owner_type=payer_type, category=payer_wallet_category) instance = serializer.save(payer_wallet=payer_wallet, application=application, payee_wallet=payee_wallet) instance.category_submit()