add: add expence type crud and model

This commit is contained in:
behruz-dev
2025-09-08 17:57:31 +05:00
parent ffe9215892
commit 0d5fcf6ee7
8 changed files with 171 additions and 3 deletions

View File

@@ -2,3 +2,5 @@ from .cash_transaction import *
from .payment_type import *
from .type_income import *
from .income import *
from .expence_type import *

View File

@@ -0,0 +1,8 @@
from django.contrib import admin
from core.apps.finance.models import ExpenceType
@admin.register(ExpenceType)
class ExpenceTypeAdmin(admin.ModelAdmin):
list_display = ['id', 'name']

View File

@@ -0,0 +1,31 @@
# Generated by Django 5.2.4 on 2025-09-08 17:40
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('finance', '0008_alter_income_audit_alter_income_counterparty_and_more'),
]
operations = [
migrations.CreateModel(
name='ExpenceType',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=200)),
('category', models.CharField(choices=[('OTHERS', 'boshqalar'), ('FIXED_COST', 'doimiy xarajat')], max_length=20)),
('activity', models.CharField(choices=[('FINANCIAL', 'moliyaviy'), ('CAPITAL', 'sarmoya')], max_length=20)),
('comment', models.CharField(max_length=200)),
('status', models.BooleanField(default=True)),
],
options={
'verbose_name': 'xarajat turi',
'verbose_name_plural': 'xarajat turlari',
},
),
]

View File

@@ -2,3 +2,4 @@ from .cash_transaction import *
from .payment_type import *
from .type_income import *
from .income import *
from .expence_type import *

View File

@@ -0,0 +1,22 @@
from django.db import models
from core.apps.shared.models import BaseModel
class ExpenceType(BaseModel):
name = models.CharField(max_length=200)
category = models.CharField(
choices=[('OTHERS', 'boshqalar'), ('FIXED_COST', 'doimiy xarajat')], max_length=20
)
activity = models.CharField(
max_length=20, choices=[('FINANCIAL', 'moliyaviy'), ('CAPITAL', 'sarmoya')]
)
comment = models.CharField(max_length=200)
status = models.BooleanField(default=True)
def __str__(self):
return self.name
class Meta:
verbose_name = 'xarajat turi'
verbose_name_plural = 'xarajat turlari'

View File

@@ -0,0 +1,11 @@
from rest_framework import serializers
from core.apps.finance.models import ExpenceType
class ExpenceTypeSerializer(serializers.ModelSerializer):
class Meta:
model = ExpenceType
fields = [
'id', 'name'
]

View File

@@ -5,6 +5,7 @@ from core.apps.finance.views import cash_transaction_folder as folder_views
from core.apps.finance.views import payment_type as pt_views
from core.apps.finance.views import type_income as ti_views
from core.apps.finance.views import income as income_views
from core.apps.finance.views import expence_type as ex_views
urlpatterns = [
@@ -45,5 +46,13 @@ urlpatterns = [
path('list/', income_views.IncomeListApiView.as_view()),
path('create/', income_views.IncomeCreateApiView.as_view()),
]
))
)),
path('expence_type/', include(
[
path('list/', ex_views.ExpenceTypeListApiView.as_view()),
path('create/', ex_views.ExpenceTypeCreateApiView.as_view()),
path('<uuid:id>/update/', ex_views.ExpenceTypeUpdateApiView.as_view()),
path('<uuid:id/delete/', ex_views.ExpenceTypeDeleteApiView.as_view()),
]
)),
]

View File

@@ -0,0 +1,84 @@
from django.shortcuts import get_object_or_404
from rest_framework import generics, views
from rest_framework.response import Response
from core.apps.accounts.permissions.permissions import HasRolePermission
from core.apps.finance.models import ExpenceType
from core.apps.finance.serializers.expence_type import ExpenceTypeSerializer
class ExpenceTypeCreateApiView(generics.GenericAPIView):
permission_classes = [HasRolePermission]
serializer_class = ExpenceTypeSerializer
queryset = ExpenceType.objects.all()
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(
{
'success': True,
'message': 'expence type created'
},
status=201
)
return Response(
{
'success': False,
'message': 'expence type create failed',
'error': serializer.errors,
},
status=400
)
class ExpenceTypeListApiView(generics.GenericAPIView):
serializer_class = ExpenceTypeSerializer
queryset = ExpenceType.objects.all()
permission_classes = [HasRolePermission]
def get(self, request):
page = self.paginate_queryset(self.queryset)
if page is not None:
serializer = self.serializer_class(page, many=True)
return self.get_paginated_response(serializer.data)
class ExpenceTypeUpdateApiView(generics.GenericAPIView):
serializer_class = ExpenceTypeSerializer
queryset = ExpenceType.objects.all()
permission_classes = [HasRolePermission]
def patch(self, request, id):
obj = get_object_or_404(ExpenceType, id=id)
serializer = self.serializer_class(data=request.data, instance=obj, partial=True)
if serializer.is_valid():
serializer.save()
return Response(
{
'success': True,
'message': 'expence type updated'
},
status=200
)
return Response(
{
'success': False,
'message': 'expence type update failed',
'error': serializer.errors
},
status=400
)
class ExpenceTypeDeleteApiView(views.APIView):
permission_classes = [HasRolePermission]
def delete(self, request, id):
obj = get_object_or_404(ExpenceType, id=id)
obj.delete()
return Response(
{'success': True, 'message': 'deleted'}, status=204
)