From 7e92e79ec288eae9f4ab4f2650a2e1e6d3226796 Mon Sep 17 00:00:00 2001 From: Fatima Salah Date: Mon, 1 Aug 2022 12:23:57 +0300 Subject: [PATCH 1/7] first try for Task 3 --- accounting/api/account.py | 33 ++++--------------- accounting/models.py | 4 ++- accounting/services.py | 68 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/accounting/api/account.py b/accounting/api/account.py index e843e61..a9c0257 100644 --- a/accounting/api/account.py +++ b/accounting/api/account.py @@ -1,6 +1,7 @@ from ninja import Router from ninja.security import django_auth from django.shortcuts import get_object_or_404 +from accounting import services from accounting.models import Account, AccountTypeChoices from accounting.schemas import AccountOut, FourOFourOut, GeneralLedgerOut from typing import List @@ -56,32 +57,10 @@ def get_account_balances(request): return status.HTTP_200_OK, result +@account_router.get('/account-balances/') +def get_account_balances(request,account_id:int): + account=Account.objects.get(id=account_id) + final=services.account_balances(account) + return status.HTTP_200_OK,{'account':account.name ,'balance':final} - -class Balance: - def __init__(self, balances): - balance1 = balances[0] - balance2 = balances[1] - - if balance1['currency'] == 'USD': - balanceUSD = balance1['sum'] - balanceIQD = balance2['sum'] - else: - balanceIQD = balance1['sum'] - balanceUSD = balance2['sum'] - - self.balanceUSD = balanceUSD - self.balanceIQD = balanceIQD - - def __add__(self, other): - self.balanceIQD += other.balanceIQD - self.balanceUSD += other.balanceUSD - return [{ - 'currency': 'USD', - 'sum': self.balanceUSD - }, { - 'currency': 'IQD', - 'sum': self.balanceIQD - }] - diff --git a/accounting/models.py b/accounting/models.py index a7d49b7..ed1292e 100644 --- a/accounting/models.py +++ b/accounting/models.py @@ -49,7 +49,7 @@ class CurrencyChoices(models.TextChoices): class Account(models.Model): - parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL) + parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL,related_name='children_account') type = models.CharField(max_length=255, choices=AccountTypeChoices.choices) name = models.CharField(max_length=255) code = models.CharField(max_length=20, null=True, blank=True) @@ -99,6 +99,8 @@ def validate_accounting_equation(self): if transaction_sum != 0: raise AccountingEquationError + def __str__(self): + return f'{self.type} - {self.description}' class JournalEntry(models.Model): class Meta: diff --git a/accounting/services.py b/accounting/services.py index 7ecff81..f9ff15d 100644 --- a/accounting/services.py +++ b/accounting/services.py @@ -32,4 +32,72 @@ def account_transfer(data): # t.delete() # return status.HTTP_400_BAD_REQUEST, {'detail': 'transaction is not valid'} return t +class Balance: + def __init__(self, balances): + balance1 = balances[0] + balance2 = balances[1] + + if balance1['currency'] == 'USD': + balanceUSD = balance1['sum'] + balanceIQD = balance2['sum'] + else: + balanceIQD = balance1['sum'] + balanceUSD = balance2['sum'] + + self.balanceUSD = balanceUSD + self.balanceIQD = balanceIQD + + def __add__(self, other): + self.balanceIQD += other.balanceIQD + self.balanceUSD += other.balanceUSD + return [{ + 'currency': 'USD', + 'sum': self.balanceUSD + }, { + 'currency': 'IQD', + 'sum': self.balanceIQD + }] +def account_balances(account): + child=account.children_account.all() + balances=[] + child_balance=[] + account_balance=account.balance() + + for a in child: + balance=a.balance() + child_balance.append(list(balance)) + + + for j in child_balance: + for n in j: + balances.append(n) + + for f in list(account_balance): + balances.append(f) + + if child==[]: + balances.append(account_balance) + final=GiveFinalBalance(balances) + else: + final= GiveFinalBalance(balances) + + print(balances) + return final + +def GiveFinalBalance(balancs): + balanceUSD=0 + balanceIQD=0 + + for balance in balancs: + if balance["currency"]=="USD": + balanceUSD += balance["sum"] + else: + balanceIQD += balance["sum"] + + final=[{ + 'currency': 'USD', + 'sum': balanceUSD}, { + 'currency': 'IQD', + 'sum': balanceIQD}] + return final From f3aa2e6dcc49804a6d446e337e32de4007666939 Mon Sep 17 00:00:00 2001 From: Fatima Salah Date: Tue, 2 Aug 2022 02:28:24 +0300 Subject: [PATCH 2/7] last try for Task 3(Inshallah) --- accounting/api/account.py | 28 +++++++--------------------- accounting/services.py | 37 +++++-------------------------------- db.sqlite3 | Bin 159744 -> 159744 bytes 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/accounting/api/account.py b/accounting/api/account.py index a9c0257..96d9851 100644 --- a/accounting/api/account.py +++ b/accounting/api/account.py @@ -1,14 +1,10 @@ from ninja import Router -from ninja.security import django_auth -from django.shortcuts import get_object_or_404 from accounting import services from accounting.models import Account, AccountTypeChoices from accounting.schemas import AccountOut, FourOFourOut, GeneralLedgerOut from typing import List -from django.db.models import Sum, Avg from rest_framework import status -from restauth.authorization import AuthBearer account_router = Router(tags=['account']) @@ -37,30 +33,20 @@ def get_account_types(request): @account_router.get('/account-balance/{account_id}', response=GeneralLedgerOut) def get_account_balance(request, account_id: int): - account = get_object_or_404(Account, id=account_id) - - balance = account.balance() - - journal_entries = account.journal_entries.all() - - return 200, {'account': account.name, 'balance': list(balance), 'jes': list(journal_entries)} + account=Account.objects.get(id=account_id) + final=services.account_balance(account) + return status.HTTP_200_OK,{'account':account.name ,'balance':final} @account_router.get('/account-balances/', response=List[GeneralLedgerOut]) def get_account_balances(request): accounts = Account.objects.all() - result = [] + result=[] for a in accounts: + final=services.GiveFinalBalance(a.balance()) result.append({ - 'account': a.name, 'balance': list(a.balance()) + 'account':a.name ,'balance':final }) - - return status.HTTP_200_OK, result - -@account_router.get('/account-balances/') -def get_account_balances(request,account_id:int): - account=Account.objects.get(id=account_id) - final=services.account_balances(account) - return status.HTTP_200_OK,{'account':account.name ,'balance':final} + return status.HTTP_200_OK,result diff --git a/accounting/services.py b/accounting/services.py index f9ff15d..5fc0cf7 100644 --- a/accounting/services.py +++ b/accounting/services.py @@ -1,6 +1,5 @@ from django.db import transaction as db_transaction from rest_framework import status -from accounting.exceptions import AtomicAccountTransferException, ZeroAmountError, AccountingEquationError from accounting.models import Transaction, JournalEntry @@ -32,37 +31,12 @@ def account_transfer(data): # t.delete() # return status.HTTP_400_BAD_REQUEST, {'detail': 'transaction is not valid'} return t -class Balance: - def __init__(self, balances): - balance1 = balances[0] - balance2 = balances[1] - - if balance1['currency'] == 'USD': - balanceUSD = balance1['sum'] - balanceIQD = balance2['sum'] - else: - balanceIQD = balance1['sum'] - balanceUSD = balance2['sum'] - - self.balanceUSD = balanceUSD - self.balanceIQD = balanceIQD - - def __add__(self, other): - self.balanceIQD += other.balanceIQD - self.balanceUSD += other.balanceUSD - return [{ - 'currency': 'USD', - 'sum': self.balanceUSD - }, { - 'currency': 'IQD', - 'sum': self.balanceIQD - }] -def account_balances(account): + +def account_balance(account): child=account.children_account.all() balances=[] child_balance=[] - account_balance=account.balance() - + account_balance=account.balance() for a in child: balance=a.balance() child_balance.append(list(balance)) @@ -73,7 +47,7 @@ def account_balances(account): balances.append(n) for f in list(account_balance): - balances.append(f) + balances.append(f) if child==[]: balances.append(account_balance) @@ -87,7 +61,7 @@ def account_balances(account): def GiveFinalBalance(balancs): balanceUSD=0 balanceIQD=0 - + for balance in balancs: if balance["currency"]=="USD": balanceUSD += balance["sum"] @@ -100,4 +74,3 @@ def GiveFinalBalance(balancs): 'currency': 'IQD', 'sum': balanceIQD}] return final - diff --git a/db.sqlite3 b/db.sqlite3 index 3cb73d59be6da4a2a0517a8aae2d66cff6d9bafd..4e57bc660ee5923b9beb49af391e22dae6c77d08 100644 GIT binary patch delta 1823 zcmah}ZERCz6uuu_+uQqb#$arWAzd~!gtWaMZSQS$hP$pSuyw3#9fO3Fey#1w+O-{Q zYfK8l5B;ZmPw>u5meE zh6$QmSBsMtZtWwug==_-hX=b!id*v#M>#<~!*WK9K>jzZT5e+5<l44+^}AY zM57kTb^3a(zHZRhYxKzJ6;_XoUZE`*hB0sfLr$85=5`DDEg;7$@Bv&vUax9ihGC{z zV=%fKt-H~>n?-lC=x&tmM(J)Q-OZ%C8Fe=!%_27=ynw+y_yXy_4X@ADAB;eCpuVZn zz!BMy*matx_|ttZDy=0)Ec)=AWC*1a}UDVeZ^q zoAoWOa%>C1VaGaEie)KEZO5>QST->#MoQ_Z=yG>RB9A^Dss7=#Cn(DPo{(~QT9l9M z;fF^1ItqmyVknbv2T~44VaDf^;(L6d_--*C7gIi8tZUmuK0Q6aClWoWPLUTy8?V@S z!76yX68b83r+cfD_qZQ}6tBx;S6qVI$&YT2CdM;4JG!Xq@F(ZY1T12(1dDTP7H&d4 zknMQQ4&wOI;{4Jg-e_&1;W7rl!>?%XckngbhR@*!T!X7{88!Q~-s~1Ltu@b<|4TWB_b z!TazWJk8zb-s28%PqItw1@;&lKwa3%Rur1TRB*63j@MjEW4jws)$mhSJG^Tu_~XzF087 zf3Q2}_wDXa`)Bq}6?==>zEZ9$o!DiQCFux1GZ;$>69H*>SIJc<$CEKWD&%^LL$b6l zdT2}Lq!E!AMq6N<-mrkE%>|6>MRDtS7v`xUXw`pBfLVa&LBU z?^HN4(w|E09LeuVd-79bGWSRm*f9Ow&=%KL+(V;PlC1rCSC3Ipo+ zl&34?&&B$9f2c3Rr)*AJs5P5?Feiem=6R9@*)7gr?nNXRqX3gp1RSO z)+v@avHR(n+x^>e%r-TKf~nye25}UZ@CiHM#Rpy)x0Z- z_i8M%sO`qhR=1E$bL-iFifsvFn&CU%V-YVfgZsFJX~In4iiucEZsz>k-1E_6!%7>w zt#NROwA4=6VuJGDW5>sam2yID8G1}oD#vQe#z-rbj&92hvm}LdRA(w2*_jFl_n7wd zsV1miiD4CAso)zlu!1F&sNO6_wB%exT2tD=9uD?Uuv@Jubg-*nml4L;8m&RR6(TMX zvrQXnozVeJchFQolL1WzG_gi=h^A0rsN*eOqd=V=Aq}lqPxSQog~{B-^SO!19MpP4 zt~bR0hS$8KV-`n-Aw$r^a5D=}!W?z_6mz`pN)=b@%YJ>C_r$s^lo|fuC$;#9D#~7W z=_T@Ih+Py_8UErIe&7rJY?W> Date: Tue, 2 Aug 2022 12:48:31 +0300 Subject: [PATCH 3/7] last and half try for Task 3(Inshallah) --- accounting/api/account.py | 2 +- db.sqlite3 | Bin 159744 -> 385024 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/accounting/api/account.py b/accounting/api/account.py index 96d9851..a56db1a 100644 --- a/accounting/api/account.py +++ b/accounting/api/account.py @@ -43,7 +43,7 @@ def get_account_balances(request): accounts = Account.objects.all() result=[] for a in accounts: - final=services.GiveFinalBalance(a.balance()) + final=services.account_balance(a) result.append({ 'account':a.name ,'balance':final }) diff --git a/db.sqlite3 b/db.sqlite3 index 4e57bc660ee5923b9beb49af391e22dae6c77d08..bf20b407ccadce393566346ff16594733eaabba3 100644 GIT binary patch literal 385024 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 EA5x1(i2wiq delta 909 zcmZXSO=ufe5XbketgKe7cT!SGwM%Ool!ido+SSTg$;6FUwW2!K%Da)2$ZlaH*|NT@ zRrFyCt5ApJ(2qk&*~4otfhM$RDQRsBDiTcTC6~sxq?8s6Z83!gYIUF;!F2Yw-J;D4oJsv|5p|dCa8JLRw6QiHrY6zV zKIVY@sQca|YQT`Cis{=T>~HsN!5n*^y~f;P($0PQb%#c+9@@aeD#E1w0N+*76uzUQ zVf=!IA}D|tG;{+0sUio)8u}C;PoOZKIEQ}imJ=w7x`K?JqVDE-^oaw%JBe;ny(N2{ zeoS3NJ(WMxU4IEZy6@Z~*kAg0m@Q(&qBj}pipOSGu1?^OPmwRJueHlFt+uQca#5)! z2cog8Qk_ps8If0Jt-X-T@)^OH zsV60IF0)(`)BMRyq@6AV+v1w|YM>_76um428_87aj2vu+Yg{UlJ(HTR&xI><^7=wb zmS)O{3$2u%j_32!>FT*csM;!3bS)y3rj+EkP@T?3mGOicOD#$B%2KH)^ZDqCR;sCT zr4ff&;AlV+q?7(D9X<#}ktFoiY%`Nx&KbFuuK(xv zEm!k@L%gn`A^Sh+4Go3xm_lMq$H}{RMtI5kUt*1f19)&8YQZVtKs UC)W0&O-6X Date: Fri, 5 Aug 2022 17:00:03 +0300 Subject: [PATCH 4/7] 'Task4' --- accounting/Task4.py | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 accounting/Task4.py diff --git a/accounting/Task4.py b/accounting/Task4.py new file mode 100644 index 0000000..ff896b1 --- /dev/null +++ b/accounting/Task4.py @@ -0,0 +1,81 @@ +class Balance: + def __init__(self, balances): + balance1 = balances[0] + balance2 = balances[1] + + if balance1['currency'] == 'USD': + balanceUSD = balance1['sum'] + balanceIQD = balance2['sum'] + else: + balanceIQD = balance1['sum'] + balanceUSD = balance2['sum'] + + self.balanceUSD = balanceUSD + self.balanceIQD = balanceIQD + + def __add__(self, other): + self.balanceIQD += other.balanceIQD + self.balanceUSD += other.balanceUSD + return [{ + 'currency': 'USD', + 'sum': self.balanceUSD + }, { + 'currency': 'IQD', + 'sum': self.balanceIQD + }] + def __gt__(self, other): + + if self.balanceUSD > other.balanceUSD : + StaUSD = True + else: + StaUSD = False + if self.balanceIQD > other.balanceIQD : + StaIQD = True + else: + StaIQD = False + return {'USD':StaUSD},{'IQD':StaIQD} + + + def __lt__(self,other): + + if self.balanceUSD < other.balanceUSD : + StaUSD = True + else: + StaUSD = False + if self.balanceIQD < other.balanceIQD : + StaIQD = True + else: + StaIQD = False + return {'USD':StaUSD},{'IQD':StaIQD} + + def is_zero(self): + if self.balanceIQD == 0 and self.balanceUSD == 0 : + return True + else: + return False + #Here Is The Test <: +list1= [{ + 'currency': 'USD', + 'sum': 200 + }, { + 'currency': 'IQD', + 'sum': 2000000 + }] +list2=[{'currency': 'USD', + 'sum': 400 + }, { + 'currency': 'IQD', + 'sum': 2000020 + }] +Obj1 = Balance(list1) +Obj2 = Balance(list2) + +result = Obj1.__gt__(Obj2) +print(result) +result2 = Obj1.__lt__(Obj2) +print(result2) +result3 = Obj1.is_zero() +print(result3) +result4 = Obj2.is_zero() +print(result4) + From 2bc108f4743046fc7d3cb09adc63c179addc438e Mon Sep 17 00:00:00 2001 From: Fatima Salah Date: Fri, 5 Aug 2022 17:08:07 +0300 Subject: [PATCH 5/7] First And The Last Try In BackEnd --- accounting/Task4.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accounting/Task4.py b/accounting/Task4.py index ff896b1..f65a818 100644 --- a/accounting/Task4.py +++ b/accounting/Task4.py @@ -1,3 +1,4 @@ + class Balance: def __init__(self, balances): balance1 = balances[0] @@ -78,4 +79,3 @@ def is_zero(self): print(result3) result4 = Obj2.is_zero() print(result4) - From e93d4d95f47533d9a01c31b59adf9bae3a7b3fbc Mon Sep 17 00:00:00 2001 From: Fatima Salah Date: Mon, 8 Aug 2022 23:27:11 +0300 Subject: [PATCH 6/7] some changes in Task4 ); --- accounting/Task4.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/accounting/Task4.py b/accounting/Task4.py index f65a818..01c5e72 100644 --- a/accounting/Task4.py +++ b/accounting/Task4.py @@ -57,10 +57,10 @@ def is_zero(self): #Here Is The Test <: list1= [{ 'currency': 'USD', - 'sum': 200 + 'sum': 0 }, { 'currency': 'IQD', - 'sum': 2000000 + 'sum': 0 }] list2=[{'currency': 'USD', 'sum': 400 @@ -71,11 +71,11 @@ def is_zero(self): Obj1 = Balance(list1) Obj2 = Balance(list2) -result = Obj1.__gt__(Obj2) +result = (Obj1 > Obj2) print(result) -result2 = Obj1.__lt__(Obj2) +result2 = (Obj1 < Obj2) print(result2) -result3 = Obj1.is_zero() +result3 = (Obj1 == 0) print(result3) -result4 = Obj2.is_zero() +result4 = (Obj2 == 0) print(result4) From ec20543578fb41093674091e28920c555c80b44d Mon Sep 17 00:00:00 2001 From: Fatima Salah Date: Tue, 9 Aug 2022 00:34:14 +0300 Subject: [PATCH 7/7] Last changes in Task4 ); --- accounting/Task4.py | 74 +++++++++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/accounting/Task4.py b/accounting/Task4.py index 01c5e72..906b01a 100644 --- a/accounting/Task4.py +++ b/accounting/Task4.py @@ -24,6 +24,7 @@ def __add__(self, other): 'currency': 'IQD', 'sum': self.balanceIQD }] + def __gt__(self, other): if self.balanceUSD > other.balanceUSD : @@ -54,28 +55,57 @@ def is_zero(self): return True else: return False - #Here Is The Test <: -list1= [{ - 'currency': 'USD', - 'sum': 0 - }, { - 'currency': 'IQD', - 'sum': 0 - }] -list2=[{'currency': 'USD', - 'sum': 400 - }, { - 'currency': 'IQD', - 'sum': 2000020 - }] + + def is_zero(self): + if self.balanceIQD == 0 and self.balanceUSD == 0 : + return True + else: + return False + #Here Is The Test <: + +list1=[{ + 'currency': 'USD', + 'sum': 500 + }, { + 'currency': 'IQD', + 'sum': 0 + }] +list2=[{ + 'currency': 'USD', + 'sum': 400 + },{ + 'currency': 'IQD', + 'sum': 2000020 + }] Obj1 = Balance(list1) Obj2 = Balance(list2) -result = (Obj1 > Obj2) -print(result) -result2 = (Obj1 < Obj2) -print(result2) -result3 = (Obj1 == 0) -print(result3) -result4 = (Obj2 == 0) -print(result4) +print('Obj1 > Obj2 =>',Obj1 > Obj2) #OUTPUT:Obj1 > Obj2 => ({'USD': True}, {'IQD': False}) +print('Obj2 > Obj1 =>',Obj2 > Obj1) #OUTPUT:Obj2 > Obj1 => ({'USD': False}, {'IQD': True}) + +print('Obj1 < Obj2 =>',Obj1 < Obj2) #OUTPUT:Obj1 < Obj2 => ({'USD': False}, {'IQD': True}) +print('Obj2 < Obj1 =>',Obj2 < Obj1) #OUTPUT:Obj2 < Obj1 => ({'USD': True}, {'IQD': False}) + +print('Obj1 ==0 =>',Obj1.is_zero()) #OUTPUT:Obj1 ==0 => False +print('Obj2 ==0 =>',Obj2.is_zero()) #OUTPUT:Obj2 ==0 => False + +'''''''''' + #Another Sol For Task4,From Internet + def __gt__(self, other): + if (isinstance(other,Balance)): + StaUSD = self.balanceUSD > other.balanceIQD + StaIQD = self.balanceIQD > other.balanceUSD + return {'USD':StaUSD},{'IQD':StaIQD} + + + + def __lt__(self, other): + if (isinstance(other,Balance)): + StaUSD = self.balanceUSD < other.balanceIQD + StaIQD = self.balanceIQD < other.balanceUSD + return {'USD':StaUSD},{'IQD':StaIQD} + + def is_zero(self): + return self.balanceIQD == 0 and self.balanceUSD == 0 + + '''''''''