application withdraw with currency

This commit is contained in:
Sayyid Hamid Mahdavi 2025-10-11 17:20:46 +03:30
parent ba876e2874
commit b3fc8cc17f
2 changed files with 20 additions and 7 deletions

View file

@ -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']

View file

@ -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()