Skip to content

Commit 1dddf83

Browse files
committed
Added Create Purchase Order
1 parent 9379fcb commit 1dddf83

21 files changed

+816
-52
lines changed

Backend/EcommerceInventory/EcommerceInventory/Helpers.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ def checkisFileField(field):
3333
def getExludeFields():
3434
return ['id','created_at','updated_at','domain_user_id','added_by_user_id','created_by_user_id','updated_by_user_id','is_staff','is_superuser','is_active','plan_type','last_login','last_device','date_joined','last_ip','domain_name']
3535

36-
def getDynamicFormFields(model_instance,domain_user_id):
36+
def getDynamicFormFields(model_instance,domain_user_id,skip_related=[],skip_fields=[]):
3737
fields={'text':[],'select':[],'checkbox':[],'radio':[],'textarea':[],'json':[],'file':[]}
3838
for field in model_instance._meta.fields:
39-
if field.name in getExludeFields():
39+
if field.name in getExludeFields() or field.name in skip_fields:
4040
continue
4141

4242
label=field.name.replace('_',' ').title()
@@ -60,9 +60,19 @@ def getDynamicFormFields(model_instance,domain_user_id):
6060
fielddata['type']='text'
6161
elif field.get_internal_type()=='BooleanField' or field.get_internal_type()=='NullBooleanField':
6262
fielddata['type']='checkbox'
63+
elif field.get_internal_type()=='DateField':
64+
fielddata['type']='text'
65+
fielddata['isDate']=True
66+
elif field.get_internal_type()=='DateTimeField':
67+
fielddata['type']='text'
68+
fielddata['isDateTime']=True
6369
else:
6470
fielddata['type']='text'
6571
if isinstance(field,ForeignKey):
72+
if field.name in skip_related:
73+
fields['text'].append(fielddata)
74+
continue
75+
6676
related_model=field.related_model
6777
related_key=field.name
6878
related_key_name=''
Binary file not shown.
Binary file not shown.

Backend/EcommerceInventory/EcommerceInventory/urls.py

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
path('api/getMenus/',ModuleView.as_view(),name='sidebarmenu'),
3636
path('api/products/',include('ProductServices.urls')),
3737
path('api/inventory/',include('InventoryServices.urls')),
38+
path('api/orders/',include('OrderService.urls')),
3839
path('api/uploads/',FileUploadViewInS3.as_view(),name='fileupload')
3940
]
4041

Binary file not shown.
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from OrderService.models import PurchaseOrder, PurchaseOrderItems, PurchaseOrderLogs
2+
from EcommerceInventory.Helpers import getDynamicFormFields, renderResponse
3+
from rest_framework import generics
4+
from rest_framework.permissions import IsAuthenticated
5+
from rest_framework_simplejwt.authentication import JWTAuthentication
6+
from rest_framework import serializers
7+
8+
9+
class PurchaseOrderItemSerializer(serializers.ModelSerializer):
10+
class Meta:
11+
model=PurchaseOrderItems
12+
fields="__all__"
13+
14+
class PurchaseOrderSerializer(serializers.ModelSerializer):
15+
items=PurchaseOrderItemSerializer(many=True,source='po_id_purchase_order_items')
16+
class Meta:
17+
model=PurchaseOrder
18+
fields="__all__"
19+
20+
def create(self,validated_data):
21+
items_data=validated_data.pop('po_id_purchase_order_items')
22+
purchaseOrder=PurchaseOrder.objects.create(**validated_data)
23+
for item_data in items_data:
24+
item_data.update({'created_by_user_id':validated_data.get('created_by_user_id')})
25+
item_data.update({'domain_user_id':validated_data.get('domain_user_id')})
26+
PurchaseOrderItems.objects.create(po_id=purchaseOrder,**item_data)
27+
28+
purchaseOrderLog=PurchaseOrderLogs(po_id=purchaseOrder,additional_details=[{"key":"STATUS","value":validated_data.get("status")}],comment='Purchase Order Created with Status '+validated_data.get('status'),created_by_user_id=validated_data.get('created_by_user_id'),domain_user_id=validated_data.get('domain_user_id'))
29+
purchaseOrderLog.save()
30+
return purchaseOrder
31+
32+
class CreatePurchaseOrderView(generics.CreateAPIView):
33+
authentication_classes = [JWTAuthentication]
34+
permission_classes = [IsAuthenticated]
35+
36+
def get(self,request):
37+
poFields=getDynamicFormFields(PurchaseOrder(),request.user.domain_user_id.id,skip_related=['supplier_id'],skip_fields=['shipping_cancelled_amount','shipping_cancelled_tax_amount','approved_at','cancelled_at','received_at','returned_at','last_updated_by_user_id','status','approved_by_user_id','cancelled_by_user_id','received_by_user_id','returned_by_user_id','cancelled_reason'])
38+
poItemFields=getDynamicFormFields(PurchaseOrderItems(),request.user.domain_user_id.id,skip_related=['product_id'],skip_fields=['quantity_received','quantity_cancelled','quantity_returned','amount_returned','amount_cancelled','shipping_cancelled_amount','shipping_cancelled_tax_amount','approved_at','cancelled_at','received_at','returned_at','po_id','status','approved_by_user_id','cancelled_by_user_id','received_by_user_id','returned_by_user_id','cancelled_reason'])
39+
return renderResponse(data={'poFields':poFields,'poItemFields':poItemFields},message='Purchase Order Fields',status=200)
40+
41+
def post(self,request):
42+
data=request.data
43+
data.update({'created_by_user_id':request.user.id})
44+
data.update({'domain_user_id':request.user.domain_user_id.id})
45+
data.update({'last_updated_by_user_id':request.user.id})
46+
serializer=PurchaseOrderSerializer(data=data)
47+
if serializer.is_valid():
48+
serializer.save()
49+
return renderResponse(data=serializer.data,message='Purchase Order Created',status=201)
50+
return renderResponse(data=serializer.errors,message='Error Creating Purchase Order',status=400)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
# Generated by Django 5.0.6 on 2024-08-17 10:27
2+
3+
import django.db.models.deletion
4+
from django.conf import settings
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('InventoryServices', '0002_initial'),
12+
('OrderService', '0002_initial'),
13+
('ProductServices', '0005_alter_categories_image'),
14+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15+
]
16+
17+
operations = [
18+
migrations.AlterField(
19+
model_name='purchaseorder',
20+
name='approved_at',
21+
field=models.DateTimeField(blank=True, null=True),
22+
),
23+
migrations.AlterField(
24+
model_name='purchaseorder',
25+
name='cancelled_at',
26+
field=models.DateTimeField(blank=True, null=True),
27+
),
28+
migrations.AlterField(
29+
model_name='purchaseorder',
30+
name='cancelled_reason',
31+
field=models.TextField(blank=True, null=True),
32+
),
33+
migrations.AlterField(
34+
model_name='purchaseorder',
35+
name='discount_amount',
36+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
37+
),
38+
migrations.AlterField(
39+
model_name='purchaseorder',
40+
name='discount_type',
41+
field=models.CharField(choices=[('PERCENTAGE', 'PERCENTAGE'), ('AMOUNT', 'AMOUNT'), ('NO DISCOUNT', 'NO DISCOUNT')], default='NO DISCOUNT', max_length=255),
42+
),
43+
migrations.AlterField(
44+
model_name='purchaseorder',
45+
name='due_amount',
46+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
47+
),
48+
migrations.AlterField(
49+
model_name='purchaseorder',
50+
name='received_at',
51+
field=models.DateTimeField(blank=True, null=True),
52+
),
53+
migrations.AlterField(
54+
model_name='purchaseorder',
55+
name='returned_at',
56+
field=models.DateTimeField(blank=True, null=True),
57+
),
58+
migrations.AlterField(
59+
model_name='purchaseorder',
60+
name='shipping_amount',
61+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
62+
),
63+
migrations.AlterField(
64+
model_name='purchaseorder',
65+
name='shipping_cancelled_amount',
66+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
67+
),
68+
migrations.AlterField(
69+
model_name='purchaseorder',
70+
name='shipping_cancelled_tax_amount',
71+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
72+
),
73+
migrations.AlterField(
74+
model_name='purchaseorder',
75+
name='shipping_tax_percentage',
76+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
77+
),
78+
migrations.AlterField(
79+
model_name='purchaseorder',
80+
name='status',
81+
field=models.CharField(choices=[('DRAFT', 'DRAFT'), ('APPROVED', 'APPROVED'), ('SENT', 'SENT'), ('RECEIVED', 'RECEIVED'), ('PARTIAL RECEIVED', 'PARTIAL RECEIVED'), ('CANCELLED', 'CANCELLED'), ('RETURNED', 'RETURNED')], default='DRAFT', max_length=255),
82+
),
83+
migrations.AlterField(
84+
model_name='purchaseorder',
85+
name='supplier_id',
86+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='supplier_id', to=settings.AUTH_USER_MODEL),
87+
),
88+
migrations.AlterField(
89+
model_name='purchaseorder',
90+
name='warehouse_id',
91+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='warehouse_id', to='InventoryServices.warehouse'),
92+
),
93+
migrations.AlterField(
94+
model_name='purchaseorderitems',
95+
name='amount_cancelled',
96+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
97+
),
98+
migrations.AlterField(
99+
model_name='purchaseorderitems',
100+
name='amount_ordered',
101+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
102+
),
103+
migrations.AlterField(
104+
model_name='purchaseorderitems',
105+
name='amount_paid',
106+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
107+
),
108+
migrations.AlterField(
109+
model_name='purchaseorderitems',
110+
name='amount_returned',
111+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
112+
),
113+
migrations.AlterField(
114+
model_name='purchaseorderitems',
115+
name='approved_at',
116+
field=models.DateTimeField(blank=True, null=True),
117+
),
118+
migrations.AlterField(
119+
model_name='purchaseorderitems',
120+
name='buying_price',
121+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
122+
),
123+
migrations.AlterField(
124+
model_name='purchaseorderitems',
125+
name='cancelled_at',
126+
field=models.DateTimeField(blank=True, null=True),
127+
),
128+
migrations.AlterField(
129+
model_name='purchaseorderitems',
130+
name='cancelled_reason',
131+
field=models.TextField(blank=True, null=True),
132+
),
133+
migrations.AlterField(
134+
model_name='purchaseorderitems',
135+
name='discount_amount',
136+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
137+
),
138+
migrations.AlterField(
139+
model_name='purchaseorderitems',
140+
name='discount_type',
141+
field=models.CharField(choices=[('PERCENTAGE', 'PERCENTAGE'), ('AMOUNT', 'AMOUNT'), ('NO DISCOUNT', 'NO DISCOUNT')], default='PERCENTAGE', max_length=255),
142+
),
143+
migrations.AlterField(
144+
model_name='purchaseorderitems',
145+
name='po_id',
146+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='po_id_purchase_order_items', to='OrderService.purchaseorder'),
147+
),
148+
migrations.AlterField(
149+
model_name='purchaseorderitems',
150+
name='product_id',
151+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='product_id_purchase_order_items', to='ProductServices.products'),
152+
),
153+
migrations.AlterField(
154+
model_name='purchaseorderitems',
155+
name='quantity_cancelled',
156+
field=models.IntegerField(default=0),
157+
),
158+
migrations.AlterField(
159+
model_name='purchaseorderitems',
160+
name='quantity_ordered',
161+
field=models.IntegerField(default=0),
162+
),
163+
migrations.AlterField(
164+
model_name='purchaseorderitems',
165+
name='quantity_received',
166+
field=models.IntegerField(default=0),
167+
),
168+
migrations.AlterField(
169+
model_name='purchaseorderitems',
170+
name='quantity_returned',
171+
field=models.IntegerField(default=0),
172+
),
173+
migrations.AlterField(
174+
model_name='purchaseorderitems',
175+
name='received_at',
176+
field=models.DateTimeField(blank=True, null=True),
177+
),
178+
migrations.AlterField(
179+
model_name='purchaseorderitems',
180+
name='returned_at',
181+
field=models.DateTimeField(blank=True, null=True),
182+
),
183+
migrations.AlterField(
184+
model_name='purchaseorderitems',
185+
name='selling_price',
186+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
187+
),
188+
migrations.AlterField(
189+
model_name='purchaseorderitems',
190+
name='shipping_amount',
191+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
192+
),
193+
migrations.AlterField(
194+
model_name='purchaseorderitems',
195+
name='shipping_cancelled_amount',
196+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
197+
),
198+
migrations.AlterField(
199+
model_name='purchaseorderitems',
200+
name='shipping_cancelled_tax_amount',
201+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
202+
),
203+
migrations.AlterField(
204+
model_name='purchaseorderitems',
205+
name='shipping_tax_amount',
206+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
207+
),
208+
migrations.AlterField(
209+
model_name='purchaseorderitems',
210+
name='status',
211+
field=models.CharField(choices=[('DRAFT', 'DRAFT'), ('APPROVED', 'APPROVED'), ('SENT', 'SENT'), ('RECEIVED', 'RECEIVED'), ('PARTIAL RECEIVED', 'PARTIAL RECEIVED'), ('CANCELLED', 'CANCELLED'), ('RETURNED', 'RETURNED'), ('PARITAL RETURNED', 'PARITAL RETURNED')], default='DRAFT', max_length=255),
212+
),
213+
migrations.AlterField(
214+
model_name='purchaseorderitems',
215+
name='tax_amount',
216+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
217+
),
218+
migrations.AlterField(
219+
model_name='purchaseorderitems',
220+
name='tax_percentage',
221+
field=models.DecimalField(decimal_places=2, default=0, max_digits=10),
222+
),
223+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Generated by Django 5.0.6 on 2024-08-17 10:44
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('OrderService', '0003_alter_purchaseorder_approved_at_and_more'),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name='purchaseorderitems',
16+
name='po_id',
17+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='po_id_purchase_order_items', to='OrderService.purchaseorder'),
18+
),
19+
]

0 commit comments

Comments
 (0)