-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c3a2285
commit 3195469
Showing
8 changed files
with
186 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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__' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
from django.test import TestCase | ||
|
||
# Create your tests here. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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'), | ||
|
||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}) |