wallet with category

This commit is contained in:
Sayyid Hamid Mahdavi 2025-09-18 12:33:45 +03:30
parent a491adbd81
commit 82bd4f9c34
3 changed files with 22 additions and 30 deletions

View file

@ -26,6 +26,14 @@ class Wallet(BaseModel):
objects = WalletQuerySet.as_manager() objects = WalletQuerySet.as_manager()
def get_owner(self):
if self.owner_type == TypeChoices.APPLICATION:
owner: Application = Application.objects.get(pk=self.owner_uuid)
else:
owner: User = User.objects.get(pk=self.owner_uuid)
return owner
class CategoryQuerySet(models.QuerySet): class CategoryQuerySet(models.QuerySet):
pass pass
@ -69,15 +77,7 @@ class Category(BaseModel):
class TransactionQuerySet(models.QuerySet): class TransactionQuerySet(models.QuerySet):
def migrate(self): pass
for transaction in self:
payer = transaction.get_payer()
payee = transaction.get_payee()
payer_wallet, created = Wallet.objects.get_or_create(owner_uuid=transaction.payer_id, owner_type=transaction.payer_type, defaults={'balance': payer.balance})
payee_wallet, created = Wallet.objects.get_or_create(owner_uuid=transaction.payee_id, owner_type=transaction.payee_type, defaults={'balance': payee.balance})
transaction.payer_wallet = payer_wallet
transaction.payee_wallet = payee_wallet
transaction.save()
class Transaction(BaseModel): class Transaction(BaseModel):
@ -114,19 +114,11 @@ class Transaction(BaseModel):
# unique_together = ('application', 'detail_id',) # unique_together = ('application', 'detail_id',)
def get_pay_entity(self, entity_id, entity_type):
if entity_type == TypeChoices.APPLICATION:
entity: Application = Application.objects.get(pk=entity_id)
else:
entity: User = User.objects.get(pk=entity_id)
return entity
def get_payer(self): def get_payer(self):
return self.get_pay_entity(self.payer_id, self.payer_type) return self.payer_wallet.get_owner()
def get_payee(self): def get_payee(self):
return self.get_pay_entity(self.payee_id, self.payee_type) return self.payee_wallet.get_owner()
def change_state(self, from_state, to_state, error_message=None, **data): def change_state(self, from_state, to_state, error_message=None, **data):
if self.state == from_state: if self.state == from_state:
@ -191,9 +183,9 @@ class Transaction(BaseModel):
payer_id=payer_id, payer_id=payer_id,
payer_type=payer_type payer_type=payer_type
) )
self.deposit_to_payee_balance() self.category_deposit_to_payee_balance()
self.withdraw_from_payer_balance() self.category_withdraw_from_payer_balance()
return self return self
def receipt(self): def receipt(self):
@ -206,7 +198,7 @@ class Transaction(BaseModel):
StateChoices.SUCCESS, StateChoices.SUCCESS,
error_message='this transaction is not delayed' error_message='this transaction is not delayed'
) )
self.deposit_to_payee_balance() self.category_deposit_to_payee_balance()
return self return self
def category_submit(self): def category_submit(self):
@ -241,7 +233,7 @@ class Transaction(BaseModel):
) )
return self return self
def category_get_role(self, entity): def get_role(self, entity):
if self.payer_wallet.owner_uuid == entity.uuid: if self.payer_wallet.owner_uuid == entity.uuid:
return 1 return 1
elif self.payee_wallet.owner_uuid == entity.uuid: elif self.payee_wallet.owner_uuid == entity.uuid:
@ -249,7 +241,7 @@ class Transaction(BaseModel):
else: else:
return 0 return 0
def category_update_details(self, force_update=False): def update_details(self, force_update=False):
if not isinstance(self.details, dict): if not isinstance(self.details, dict):
self.details = {} self.details = {}
self.save() self.save()

View file

@ -71,7 +71,7 @@ class DepositSerializer(serializers.ModelSerializer):
with atomic(): with atomic():
try: try:
transaction = Transaction.objects.create_transaction(**validated_data) transaction = Transaction.objects.create_transaction(**validated_data)
transaction.submit() transaction.category_submit()
except IntegrityError as e: except IntegrityError as e:
raise APIException('duplicate uuid') raise APIException('duplicate uuid')
@ -101,7 +101,7 @@ class WithdrawSerializer(serializers.ModelSerializer):
with atomic(): with atomic():
try: try:
transaction = Transaction.objects.create_transaction(**validated_data) transaction = Transaction.objects.create_transaction(**validated_data)
transaction.submit() transaction.category_submit()
except IntegrityError as e: except IntegrityError as e:
raise APIException('duplicate uuid') raise APIException('duplicate uuid')

View file

@ -102,7 +102,7 @@ class DepositSubmitAPIView(generics.CreateAPIView):
payer_type=TypeChoices.APPLICATION.value, payer_type=TypeChoices.APPLICATION.value,
application=application) application=application)
try: try:
instance.submit() instance.category_submit()
except Exception as e: except Exception as e:
print(e) print(e)
APIException('Failed to submit deposit') APIException('Failed to submit deposit')
@ -123,7 +123,7 @@ class DepositVerifyAPIView(generics.RetrieveAPIView):
def retrieve(self, request, *args, **kwargs): def retrieve(self, request, *args, **kwargs):
instance = self.get_object() instance = self.get_object()
if instance.state == StateChoices.PENDING: if instance.state == StateChoices.PENDING:
instance.verify() instance.category_verify()
serializer = self.get_serializer(instance) serializer = self.get_serializer(instance)
return Response(serializer.data) return Response(serializer.data)
@ -149,7 +149,7 @@ class WithdrawSubmitAPIView(generics.CreateAPIView):
payee_type=TypeChoices.APPLICATION.value, payee_type=TypeChoices.APPLICATION.value,
application=application) application=application)
instance.submit() instance.category_submit()
class WithdrawVerifyAPIView(generics.RetrieveAPIView): class WithdrawVerifyAPIView(generics.RetrieveAPIView):
@ -167,7 +167,7 @@ class WithdrawVerifyAPIView(generics.RetrieveAPIView):
def retrieve(self, request, *args, **kwargs): def retrieve(self, request, *args, **kwargs):
instance = self.get_object() instance = self.get_object()
if instance.state == StateChoices.PENDING: if instance.state == StateChoices.PENDING:
instance.verify() instance.category_verify()
serializer = self.get_serializer(instance) serializer = self.get_serializer(instance)
return Response(serializer.data) return Response(serializer.data)