finance: add user field to expence delete model
This commit is contained in:
@@ -6,7 +6,7 @@ from core.apps.finance.models import Expence, DeletedExpence
|
|||||||
@admin.register(Expence)
|
@admin.register(Expence)
|
||||||
class ExpenceAdmin(admin.ModelAdmin):
|
class ExpenceAdmin(admin.ModelAdmin):
|
||||||
list_display = ['id', 'price', 'cash_transaction', 'status']
|
list_display = ['id', 'price', 'cash_transaction', 'status']
|
||||||
|
search_fields = ['party__number']
|
||||||
|
|
||||||
@admin.register(DeletedExpence)
|
@admin.register(DeletedExpence)
|
||||||
class DeletedExpenceAdmin(admin.ModelAdmin):
|
class DeletedExpenceAdmin(admin.ModelAdmin):
|
||||||
|
|||||||
21
core/apps/finance/migrations/0033_deletedexpence_user.py
Normal file
21
core/apps/finance/migrations/0033_deletedexpence_user.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 5.2.4 on 2025-11-11 15:21
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0032_alter_cashtransaction_expence_balance_usd_and_more'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='deletedexpence',
|
||||||
|
name='user',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deleted_expences', to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -57,6 +57,7 @@ class Expence(BaseModel):
|
|||||||
class DeletedExpence(BaseModel):
|
class DeletedExpence(BaseModel):
|
||||||
expence = models.ForeignKey(Expence, on_delete=models.CASCADE, related_name='deleted_expences')
|
expence = models.ForeignKey(Expence, on_delete=models.CASCADE, related_name='deleted_expences')
|
||||||
comment = models.CharField(max_length=200)
|
comment = models.CharField(max_length=200)
|
||||||
|
user = models.ForeignKey(User, on_delete=models.SET_NULL, related_name='deleted_expences', null=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'{self.expence} is deleted'
|
return f'{self.expence} is deleted'
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ from core.apps.finance.serializers.expence import ExpenceListSerializer
|
|||||||
|
|
||||||
class DeletedExpenceListSerializer(serializers.ModelSerializer):
|
class DeletedExpenceListSerializer(serializers.ModelSerializer):
|
||||||
expence = ExpenceListSerializer()
|
expence = ExpenceListSerializer()
|
||||||
|
user = serializers.SerializerMethodField(method_name='get_user')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = DeletedExpence
|
model = DeletedExpence
|
||||||
fields = [
|
fields = [
|
||||||
@@ -15,4 +16,12 @@ class DeletedExpenceListSerializer(serializers.ModelSerializer):
|
|||||||
'created_at',
|
'created_at',
|
||||||
'comment',
|
'comment',
|
||||||
'expence',
|
'expence',
|
||||||
]
|
'user'
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_user(self, obj):
|
||||||
|
return {
|
||||||
|
"id": obj.user.id,
|
||||||
|
"full_name": obj.user.full_name,
|
||||||
|
"profile_image": obj.user.profile_image
|
||||||
|
} if obj.user else None
|
||||||
@@ -8,7 +8,7 @@ from core.apps.accounts.permissions.permissions import HasRolePermission
|
|||||||
|
|
||||||
class DeletedExpenceListApiView(generics.GenericAPIView):
|
class DeletedExpenceListApiView(generics.GenericAPIView):
|
||||||
serializer_class = DeletedExpenceListSerializer
|
serializer_class = DeletedExpenceListSerializer
|
||||||
queryset = DeletedExpence.objects.select_related('expence').order_by('-created_at')
|
queryset = DeletedExpence.objects.select_related('expence', 'user').order_by('-created_at')
|
||||||
permission_classes = [HasRolePermission]
|
permission_classes = [HasRolePermission]
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
|||||||
@@ -127,7 +127,8 @@ class ExpenceDeleteApiView(generics.GenericAPIView):
|
|||||||
|
|
||||||
DeletedExpence.objects.create(
|
DeletedExpence.objects.create(
|
||||||
expence=expence,
|
expence=expence,
|
||||||
comment=comment
|
comment=comment,
|
||||||
|
user=request.user,
|
||||||
)
|
)
|
||||||
|
|
||||||
cash_transaction = expence.cash_transaction
|
cash_transaction = expence.cash_transaction
|
||||||
|
|||||||
49
core/test.py
Normal file
49
core/test.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
from decimal import Decimal
|
||||||
|
|
||||||
|
from django.db.models import Sum
|
||||||
|
|
||||||
|
from core.apps.finance.models import Expence
|
||||||
|
from core.apps.orders.models import Party
|
||||||
|
from core.apps.counterparty.models import Counterparty
|
||||||
|
|
||||||
|
|
||||||
|
def find_tafavvut():
|
||||||
|
tafavvut = []
|
||||||
|
party_total_price = 0
|
||||||
|
expence_total_price = 0
|
||||||
|
|
||||||
|
counterparty = Counterparty.objects.filter(name__icontains="Сардор карта 7664").first()
|
||||||
|
|
||||||
|
if not counterparty:
|
||||||
|
print("Counterparty topilmadi")
|
||||||
|
return
|
||||||
|
|
||||||
|
for party in Party.objects.filter(orders__counterparty=counterparty):
|
||||||
|
price_result = Expence.objects.filter(party=party, currency='uzs').aggregate(total_price=Sum("price"))
|
||||||
|
expence_total_price_value = price_result['total_price'] or 0
|
||||||
|
|
||||||
|
party_total = party.party_amount.total_price or 0
|
||||||
|
|
||||||
|
if party_total != expence_total_price_value:
|
||||||
|
print(f"Party: {party.id}, Party Total: {party_total}, Expence Total: {expence_total_price_value}")
|
||||||
|
tafavvut.append({
|
||||||
|
'party': party,
|
||||||
|
'party_total': party_total,
|
||||||
|
'expence_total': expence_total_price_value,
|
||||||
|
'tafavvut': party_total - expence_total_price_value
|
||||||
|
})
|
||||||
|
party_total_price += party_total
|
||||||
|
expence_total_price += expence_total_price_value
|
||||||
|
|
||||||
|
print("\n=== NATIJA ===")
|
||||||
|
print(f"Tafavvut topilgan: {len(tafavvut)}")
|
||||||
|
print(f"Party jami: {party_total_price}")
|
||||||
|
print(f"Expence jami: {expence_total_price}")
|
||||||
|
print(f"Farq: {party_total_price - expence_total_price}")
|
||||||
|
|
||||||
|
for item in tafavvut:
|
||||||
|
print(f"Party {item['party'].id}: +{item['tafavvut']}")
|
||||||
|
|
||||||
|
return tafavvut
|
||||||
|
|
||||||
|
find_tafavvut()
|
||||||
Reference in New Issue
Block a user