Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
hemanth0808 committed Dec 8, 2023
1 parent c3a2285 commit 3195469
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 0 deletions.
Empty file added Vendor_App/__init__.py
Empty file.
7 changes: 7 additions & 0 deletions Vendor_App/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.contrib import admin
from .models import *

# Register your models here.
admin.site.register(Vendor)
admin.site.register(PurchaseOrder)
admin.site.register(HistoricalPerformance)
6 changes: 6 additions & 0 deletions Vendor_App/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class Vendormanagement2Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'VendorApp'
76 changes: 76 additions & 0 deletions Vendor_App/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db.models import Count, Avg
# vendor_app/models.py
from django.db import models

class Vendor(models.Model):
name = models.CharField(max_length=255)
contact_details = models.TextField()
address = models.TextField()
vendor_code = models.CharField(max_length=50, unique=True, primary_key=True)
on_time_delivery_rate = models.FloatField(default=0)
quality_rating_avg = models.FloatField(default=0)
average_response_time = models.FloatField(default=0)
fulfillment_rate = models.FloatField(default=0)

def __str__(self):
return self.name

class PurchaseOrder(models.Model):
po_number = models.CharField(max_length=50, unique=True, primary_key=True)
vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
order_date = models.DateTimeField()
delivery_date = models.DateTimeField(null=True, blank=True)
items = models.JSONField()
# quantity = models.PositiveIntegerField()
status = models.CharField(max_length=20)
quality_rating = models.FloatField(null=True, blank=True)
issue_date = models.DateTimeField()
acknowledgment_date = models.DateTimeField(null=True, blank=True)

def __str__(self):
return self.po_number

class HistoricalPerformance(models.Model):
vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
date = models.DateTimeField()
on_time_delivery_rate = models.FloatField()
quality_rating_avg = models.FloatField()
average_response_time = models.FloatField()
fulfillment_rate = models.FloatField()

@receiver(post_save, sender=PurchaseOrder)
def update_vendor_performance(sender, instance, **kwargs):
if instance.status == 'completed':
# Update On-Time Delivery Rate
completed_orders = PurchaseOrder.objects.filter(vendor=instance.vendor, status='completed')
on_time_delivery_rate = completed_orders.filter(delivery_date__lte=instance.delivery_date).count() / completed_orders.count()
instance.vendor.on_time_delivery_rate = on_time_delivery_rate if on_time_delivery_rate else 0

# Update Quality Rating Average
completed_orders_with_rating = completed_orders.exclude(quality_rating__isnull=True)
quality_rating_avg = completed_orders_with_rating.aggregate(Avg('quality_rating'))['quality_rating__avg'] or 0
instance.vendor.quality_rating_avg = quality_rating_avg if quality_rating_avg else 0

instance.vendor.save()

@receiver(post_save, sender=PurchaseOrder)
def update_response_time(sender, instance, **kwargs):
if instance.acknowledgment_date:
# Update Average Response Time
response_times = PurchaseOrder.objects.filter(vendor=instance.vendor, acknowledgment_date__isnull=False).values_list('acknowledgment_date', 'issue_date')
average_response_time = sum((ack_date - issue_date).total_seconds() for ack_date, issue_date in response_times) / len(response_times)
instance.vendor.average_response_time = average_response_time
instance.vendor.save()

@receiver(post_save, sender=PurchaseOrder)
def update_fulfillment_rate(sender, instance, **kwargs):
# Update Fulfillment Rate
fulfilled_orders = PurchaseOrder.objects.filter(vendor=instance.vendor, status='completed', quality_rating__isnull=False)
fulfillment_rate = fulfilled_orders.count() / PurchaseOrder.objects.filter(vendor=instance.vendor).count()
instance.vendor.fulfillment_rate = fulfillment_rate
instance.vendor.save()


13 changes: 13 additions & 0 deletions Vendor_App/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# vendor_app/serializers.py
from rest_framework import serializers
from .models import Vendor, PurchaseOrder

class VendorSerializer(serializers.ModelSerializer):
class Meta:
model = Vendor
fields = '__all__'

class PurchaseOrderSerializer(serializers.ModelSerializer):
class Meta:
model = PurchaseOrder
fields = '__all__'
3 changes: 3 additions & 0 deletions Vendor_App/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
14 changes: 14 additions & 0 deletions Vendor_App/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# vendor_app/urls.py
from django.urls import path
from .views import *

urlpatterns = [
path('vendors/', VendorListCreateView.as_view(), name='vendor-list-create'),
path('vendors/<int:pk>/', VendorRetrieveUpdateDeleteView.as_view(), name='vendor-retrieve-update-delete'),
path('purchase_orders/', PurchaseOrderListCreateView.as_view(), name='purchase-order-list-create'),
path('purchase_orders/<int:pk>/', PurchaseOrderRetrieveUpdateDeleteView.as_view(), name='purchase-order-retrieve-update-delete'),
path('vendors/<int:pk>/performance/', VendorPerformanceView.as_view(), name='vendor-performance'),
path('purchase_orders/<int:pk>/acknowledge/', AcknowledgePurchaseOrderView.as_view(), name='acknowledge-purchase-order'),
# path('login/', obtain_auth_token_view, name='api_token_auth'),

]
67 changes: 67 additions & 0 deletions Vendor_App/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from django.shortcuts import render
from rest_framework import generics
from rest_framework.generics import GenericAPIView
from rest_framework.mixins import *
from .models import *
from .serializers import *
from rest_framework.response import Response
from django.utils import timezone
from django.db.models import Avg
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated


class VendorListCreateView(generics.ListCreateAPIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = Vendor.objects.all()
serializer_class = VendorSerializer

class VendorRetrieveUpdateDeleteView(generics.RetrieveUpdateDestroyAPIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = Vendor.objects.all()
serializer_class = VendorSerializer

class PurchaseOrderListCreateView(generics.ListCreateAPIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = PurchaseOrder.objects.all()
serializer_class = PurchaseOrderSerializer

class PurchaseOrderRetrieveUpdateDeleteView(generics.RetrieveUpdateDestroyAPIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = PurchaseOrder.objects.all()
serializer_class = PurchaseOrderSerializer

class VendorPerformanceView(generics.RetrieveAPIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = Vendor.objects.all()
serializer_class = VendorSerializer

def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response({'on_time_delivery_rate': serializer.data['on_time_delivery_rate'],
'quality_rating_avg': serializer.data['quality_rating_avg'],
'average_response_time': serializer.data['average_response_time'],
'fulfillment_rate': serializer.data['fulfillment_rate']})
# return Response(serializer.data['on_time_delivery_rate', 'quality_rating_avg', 'average_response_time', 'fulfillment_rate'])

class AcknowledgePurchaseOrderView(generics.CreateAPIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
queryset = PurchaseOrder.objects.all()
serializer_class = PurchaseOrderSerializer

def create(self, request, *args, **kwargs):
instance = self.get_object()
instance.acknowledgment_date = request.data.get('acknowledgment_date') #timezone.now()
instance.save()
response_times = PurchaseOrder.objects.filter(vendor=instance.vendor, acknowledgment_date__isnull=False).values_list('acknowledgment_date', 'issue_date')
average_response_time = sum((ack_date - issue_date).total_seconds() for ack_date, issue_date in response_times) / len(response_times)
instance.vendor.average_response_time = average_response_time
instance.vendor.save()
return Response({'acknowledgment_date': instance.acknowledgment_date})

0 comments on commit 3195469

Please sign in to comment.