add: add new api for expence
This commit is contained in:
@@ -5,5 +5,5 @@ from core.apps.finance.models import Expence
|
|||||||
|
|
||||||
@admin.register(Expence)
|
@admin.register(Expence)
|
||||||
class ExpenceAdmin(admin.ModelAdmin):
|
class ExpenceAdmin(admin.ModelAdmin):
|
||||||
list_display = ['id', 'price', 'cash_transaction']
|
list_display = ['id', 'price', 'cash_transaction', 'status']
|
||||||
|
|
||||||
18
core/apps/finance/migrations/0024_expence_status.py
Normal file
18
core/apps/finance/migrations/0024_expence_status.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.2.4 on 2025-09-24 18:44
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('finance', '0023_alter_expencecontract_project_folder'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='expence',
|
||||||
|
name='status',
|
||||||
|
field=models.CharField(blank=True, choices=[('CANCELLED', 'rad etildi'), ('PENDING', 'kutilmoqda'), ('CONFIRMED', 'tasdiqlangan')], default='PENDING', max_length=20, null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -7,6 +7,11 @@ from core.apps.accounts.models import User
|
|||||||
|
|
||||||
|
|
||||||
class Expence(BaseModel):
|
class Expence(BaseModel):
|
||||||
|
STATUS = (
|
||||||
|
('CANCELLED', 'rad etildi'),
|
||||||
|
('PENDING', 'kutilmoqda'),
|
||||||
|
('CONFIRMED', 'tasdiqlangan'),
|
||||||
|
)
|
||||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='expences', null=True)
|
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='expences', null=True)
|
||||||
cash_transaction = models.ForeignKey(CashTransaction, on_delete=models.CASCADE, related_name='expences')
|
cash_transaction = models.ForeignKey(CashTransaction, on_delete=models.CASCADE, related_name='expences')
|
||||||
payment_type = models.ForeignKey(PaymentType, on_delete=models.CASCADE, related_name='expences')
|
payment_type = models.ForeignKey(PaymentType, on_delete=models.CASCADE, related_name='expences')
|
||||||
@@ -35,6 +40,7 @@ class Expence(BaseModel):
|
|||||||
comment = models.TextField(null=True, blank=True)
|
comment = models.TextField(null=True, blank=True)
|
||||||
audit = models.CharField(max_length=200, null=True, blank=True)
|
audit = models.CharField(max_length=200, null=True, blank=True)
|
||||||
file = models.FileField(null=True, blank=True, upload_to='finance/expence/files/')
|
file = models.FileField(null=True, blank=True, upload_to='finance/expence/files/')
|
||||||
|
status = models.CharField(max_length=20, choices=STATUS, default='PENDING', null=True, blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'{self.cash_transaction} kassa uchun chiqim {self.price}'
|
return f'{self.cash_transaction} kassa uchun chiqim {self.price}'
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ urlpatterns = [
|
|||||||
path('list/', expence_views.ExpenceListApiView.as_view()),
|
path('list/', expence_views.ExpenceListApiView.as_view()),
|
||||||
path('create/', expence_views.ExpenceCreateApiView.as_view()),
|
path('create/', expence_views.ExpenceCreateApiView.as_view()),
|
||||||
path('<uuid:counterparty_id>/list/', expence_views.CounterpartyExpenceListApiView.as_view()),
|
path('<uuid:counterparty_id>/list/', expence_views.CounterpartyExpenceListApiView.as_view()),
|
||||||
|
path('<uuid:id>/change-status/', expence_views.ChangeExpenceStatusApiView.as_view()),
|
||||||
]
|
]
|
||||||
)),
|
)),
|
||||||
path('income_contract/', include(
|
path('income_contract/', include(
|
||||||
|
|||||||
@@ -57,8 +57,11 @@ class ExpenceListApiView(generics.GenericAPIView):
|
|||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
cash_transaction_ids = request.query_params.getlist('cash_transaction')
|
cash_transaction_ids = request.query_params.getlist('cash_transaction')
|
||||||
|
status = request.query_params.get('status')
|
||||||
if cash_transaction_ids:
|
if cash_transaction_ids:
|
||||||
self.queryset = self.queryset.filter(cash_transaction__in=cash_transaction_ids)
|
self.queryset = self.queryset.filter(cash_transaction__in=cash_transaction_ids).distinct()
|
||||||
|
if status:
|
||||||
|
self.queryset = self.queryset.filter(status=status).distinct()
|
||||||
page = self.paginate_queryset(self.filter_queryset(self.queryset))
|
page = self.paginate_queryset(self.filter_queryset(self.queryset))
|
||||||
if page is not None:
|
if page is not None:
|
||||||
serializer = self.serializer_class(page, many=True)
|
serializer = self.serializer_class(page, many=True)
|
||||||
@@ -81,3 +84,27 @@ class CounterpartyExpenceListApiView(generics.GenericAPIView):
|
|||||||
ser = self.serializer_class(page, many=True)
|
ser = self.serializer_class(page, many=True)
|
||||||
return self.get_paginated_response(ser.data)
|
return self.get_paginated_response(ser.data)
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeExpenceStatusApiView(views.APIView):
|
||||||
|
permission_classes = [HasRolePermission]
|
||||||
|
|
||||||
|
def post(self, request, id):
|
||||||
|
expence = get_object_or_404(Expence, id=id)
|
||||||
|
status = request.data.get('status', None)
|
||||||
|
if status is None:
|
||||||
|
return Response(
|
||||||
|
{
|
||||||
|
'success': False,
|
||||||
|
'message': 'status field is required, choices PENDING, CANCELLED, CONFIRMED'
|
||||||
|
},
|
||||||
|
status=400
|
||||||
|
)
|
||||||
|
expence.status = status
|
||||||
|
expence.save()
|
||||||
|
return Response(
|
||||||
|
{
|
||||||
|
'success': True,
|
||||||
|
'message': 'expence status successfully updated',
|
||||||
|
},
|
||||||
|
status=200
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user