diff --git a/FusionIIIT/applications/iwdModuleV2/api/urls.py b/FusionIIIT/applications/iwdModuleV2/api/urls.py index 5df0404ae..b873b2c41 100644 --- a/FusionIIIT/applications/iwdModuleV2/api/urls.py +++ b/FusionIIIT/applications/iwdModuleV2/api/urls.py @@ -1,79 +1,49 @@ from django.urls import path +from rest_framework.routers import DefaultRouter from . import views -urlpatterns = [ - - # fully implemented - path('fetch-designations/', views.fetch_designations, name='fetch_designations'), - path('fetch-designations/', views.fetch_designations, name='fetch_designations'), - path('create-request/', views.create_request, name='create_request'), - path('create-proposal/', views.create_proposal, name='create_proposal'), - path('created-requests/', views.created_requests, name='created_requests'), - path('view-file/', views.view_file, name='view_file'), - path('dean-processed-requests/', views.dean_processed_requests, name='dean_processed_requests'), - path('handle-director-approval/', views.handle_director_approval, name='handle_director_approval'), - path('forward-request/', views.forward_request, name='handle_engineer_process_requests'), - path('handle-dean-process-request/', views.handle_dean_process_request, name='handleDeanProcessRequests'), - path('rejected-requests-view/', views.rejected_requests, name='rejectedRequests'), - path('handle-update-requests/', views.handle_update_requests, name='handleUpdateRequests'), - path('director-approved-requests/', views.director_approved_requests, name='issueWorkOrder'), - path('issue-work-order/', views.issue_work_order, name='workOrder'), - path('requests-in-progress/', views.requests_in_progress, name='requestsInProgress'), - path('work-under-progress/', views.work_under_progress, name='workUnderProgress'), - path('work-completed/', views.work_completed, name='workCompleted'), - path('view-budget/', views.view_budget, name='viewBudget'), - path('add-budget/', views.add_budget, name='addBudget'), - path('edit-budget/', views.edit_budget, name='editBudget'), - path('requests-status/', views.requests_status, name='requestsStatus'), - path('audit-document-view/', views.audit_document_view, name='auditDocumentView'), - path('audit-document/', views.handle_audit_document, name='auditDocument'), - path('get-proposals/', views.get_proposals, name='getProposals'), - path('get-items/', views.get_items, name='getItems'), - path('handle-admin-approval/', views.handle_admin_approval, name='handleAdminApproval'), +router = DefaultRouter() - path('issued-work/', views.get_issued_work, name='activeWork'), - path('add-vendor/', views.add_vendor, name="addVendor"), - path('get-work/', views.get_work, name="getWork"), - path('get-vendors/', views.get_vendors, name="getVendors"), +# Main resources +router.register("requests", views.RequestViewSet, basename="requests") +router.register("budgets", views.BudgetViewSet, basename="budgets") +router.register("vendors", views.VendorViewSet, basename="vendors") +router.register("work", views.WorkViewSet, basename="work") - # partially integrated on frontend - path('handle-process-bills/', views.handle_process_bills, name='handleProcessedBills'), +urlpatterns = router.urls + [ - path('engineer-processed-requests/', views.engineer_processed_requests, name='engineerProcessedRequests'), - # path('generate-final-bill/', views.generateFinalBill, name='generateFinalBill'), - path('handle-bill-generated-requests/', views.handleBillGeneratedRequests, name='handleBillGeneratedRequests'), - path('generated-bills-view/', views.generatedBillsView, name='generatedBillsView'), - path('settle-bills-view/', views.settle_bills_view, name='settleBillsView'), - path('handle-settle-bill-request/', views.handle_settle_bill_requests, name='handleSettleBillRequest'), + # Request workflows + path("requests//forward/", views.forward_request, name="forward-request"), + path("requests//director-approval/", views.handle_director_approval, name="director-approval"), + path("requests//admin-approval/", views.handle_admin_approval, name="admin-approval"), + path("requests//dean-process/", views.handle_dean_process_request, name="dean-process"), - # Unsure about use or depricated + # Status endpoints + path("requests-status/", views.requests_status, name="requests-status"), + path("rejected-requests/", views.rejected_requests, name="rejected-requests"), - # path('page1-1/', views.page1_1, name='page1_1'), - # path('aes-form/', views.AESForm, name='AESForm'), - # path('page2-1/', views.page2_1, name='page2_1'), - # path('corrigendum-input/', views.corrigendumInput, name='corrigendumInput'), - # path('addendum-input/', views.addendumInput, name='addendumInput'), - # path('pre-bid-form/', views.PreBidForm, name='PreBidForm'), - # path('no-of-entries-technical-bid/', views.noOfEntriesTechnicalBid, name='noOfEntriesTechnicalBid'), - # path('technical-bid-form/', views.TechnicalBidForm, name='TechnicalBidForm'), - # path('no-of-entries-financial-bid/', views.noOfEntriesFinancialBid, name='noOfEntriesFinancialBid'), - # path('letter-of-intent/', views.letterOfIntent, name='letterOfIntent'), - # path('agreement-input/', views.AgreementInput, name='AgreementInput'), - # path('milestones-form/', views.milestonesForm, name='milestonesForm'), - # path('page3-1/', views.page3_1, name='page3_1'), - # path('extension-of-time-form/', views.ExtensionOfTimeForm, name='ExtensionOfTimeForm'), - # path('page1-view/', views.page1View, name='page1View'), - # path('page2-view/', views.page2View, name='page2View'), - # path('aes-view/', views.AESView, name='AESView'), - # path('financial-bid-view/', views.financialBidView, name='financialBidView'), - # path('technical-bid-view/', views.technicalBidView, name='technicalBidView'), - # path('pre-bid-details-view/', views.preBidDetailsView, name='preBidDetailsView'), - # path('corrigendum-view/', views.corrigendumView, name='corrigendumView'), - # path('addendum-view/', views.addendumView, name='addendumView'), - # path('letter-of-intent-view/', views.letterOfIntentView, name='letterOfIntentView'), - # path('agreement-view/', views.agreementView, name='agreementView'), - # path('milestone-view/', views.milestoneView, name='milestoneView'), - # path('page3-view/', views.page3View, name='page3View'), - # path('extension-form-view/', views.extensionFormView, name='extensionFormView'), -] + # Work progress + path("work/issued/", views.get_issued_work, name="issued-work"), + path("work/progress/", views.work_under_progress, name="work-under-progress"), + path("work/completed/", views.work_completed, name="work-completed"), + # Vendor & proposal endpoints + path("proposals/", views.get_proposals, name="proposals"), + path("items/", views.get_items, name="items"), + + # Budget APIs + path("budget/add/", views.add_budget, name="add-budget"), + path("budget/edit/", views.edit_budget, name="edit-budget"), + path("budget/view/", views.view_budget, name="view-budget"), + + # Audit APIs + path("audit/", views.handle_audit_document, name="audit-document"), + path("audit/view/", views.audit_document_view, name="audit-document-view"), + + # Billing APIs + path("bills/process/", views.handle_process_bills, name="process-bills"), + path("bills/generated/", views.generatedBillsView, name="generated-bills"), + path("bills/settle/", views.settle_bills_view, name="settle-bills"), + path("bills/settle-request/", views.handle_settle_bill_requests, name="settle-bills-request"), + +] \ No newline at end of file diff --git a/FusionIIIT/applications/iwdModuleV2/api/views.py b/FusionIIIT/applications/iwdModuleV2/api/views.py index 03bfeebba..36eae3cab 100644 --- a/FusionIIIT/applications/iwdModuleV2/api/views.py +++ b/FusionIIIT/applications/iwdModuleV2/api/views.py @@ -1173,4 +1173,8 @@ def handle_admin_approval(request): Requests.objects.filter(id=request_id).update(iwdAdminApproval=-1, status="Rejected", activeProposal=None) return Response({'message': 'Request rejected by IWD Admin'}, status=status.HTTP_200_OK) else: +<<<<<<< HEAD return Response({'error': 'Invalid action'}, status=status.HTTP_400_BAD_REQUEST) +======= + return Response({'error': 'Invalid action'}, status=status.HTTP_400_BAD_REQUEST) +>>>>>>> upstream/institute-works-v1 diff --git a/FusionIIIT/applications/iwdModuleV2/models.py b/FusionIIIT/applications/iwdModuleV2/models.py index 9f3348315..d5642960b 100644 --- a/FusionIIIT/applications/iwdModuleV2/models.py +++ b/FusionIIIT/applications/iwdModuleV2/models.py @@ -1,187 +1,57 @@ from django.db import models from datetime import date -#from django.contrib.auth.models import User +from django.contrib.auth.models import User from applications.filetracking.models import File -# Create your models here. - -# class Projects(models.Model): -# id = models.CharField(primary_key=True, max_length=200) - - -# class PageOneDetails(models.Model): -# page_id = models.OneToOneField(Projects, on_delete=models.CASCADE, null=True) -# aESFile = models.FileField(null=True) -# dASA = models.DateField(null=True) -# nitNiqNo = models.IntegerField(null=True) -# proTh = models.CharField(null=True, max_length=200) -# emdDetails = models.CharField(null=True, max_length=200) -# preBidDate = models.DateField(null=True, max_length=200) -# technicalBidDate = models.DateField(null=True) -# financialBidDate = models.DateField(null=True) - - -# class AESDetails(models.Model): -# key = models.ForeignKey(Projects, on_delete=models.CASCADE) -# sNo = models.CharField(max_length=100) -# descOfItems = models.CharField(max_length=200) -# unit = models.CharField(max_length=200) -# quantity = models.IntegerField() -# rate = models.IntegerField() -# amount = models.IntegerField() - - -# class PageTwoDetails(models.Model): -# page_id = models.OneToOneField(Projects, on_delete=models.CASCADE, null=True) -# corrigendum = models.FileField(null=True) -# addendum = models.FileField(null=True) -# preBidMeetingDetails = models.FileField(null=True) -# technicalBidMeetingDetails = models.FileField(null=True) -# technicallyQualifiedAgencies = models.CharField(null=True, max_length=200) -# financialBidMeetingDetails = models.FileField(null=True) -# nameOfLowestAgency = models.CharField(null=True, max_length=200) -# letterOfIntent = models.FileField(null=True) -# workOrder = models.FileField(null=True) -# agreementLetter = models.FileField(null=True) -# milestones = models.FileField(null=True) - - -# class CorrigendumTable(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# issueDate = models.DateField() -# nitNo = models.IntegerField() -# name = models.CharField(max_length=200) -# lastDate = models.DateField(null=True) -# lastTime = models.TimeField() -# env1BidOpeningDate = models.DateField() -# env1BidOpeningTime = models.TimeField() -# env2BidOpeningDate = models.DateField() -# env2BidOpeningTime = models.TimeField() - - -# class Addendum(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# issueDate = models.DateField() -# nitNiqNo = models.IntegerField() -# name = models.CharField(max_length=200) -# openDate = models.DateField() -# openTime = models.TimeField() - - -# class PreBidDetails(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# sNo = models.CharField(max_length=200) -# nameOfParticipants = models.CharField(max_length=200) -# issuesRaised = models.CharField(max_length=200) -# responseDecision = models.CharField(max_length=200) - - -# class TechnicalBidDetails(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# sNo = models.CharField(max_length=200) -# requirements = models.CharField(max_length=200) - - -# class TechnicalBidContractorDetails(models.Model): -# key = models.ForeignKey(TechnicalBidDetails, on_delete=models.CASCADE) -# name = models.CharField(max_length=200) -# description = models.CharField(max_length=200) - - -# class FinancialBidDetails(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# sNo = models.CharField(max_length=200) -# description = models.CharField(max_length=200) - - -# class FinancialContractorDetails(models.Model): -# key = models.ForeignKey(FinancialBidDetails, on_delete=models.CASCADE) -# name = models.CharField(max_length=200) -# estimatedCost = models.IntegerField() -# percentageRelCost = models.IntegerField() -# perFigures = models.IntegerField() -# totalCost = models.IntegerField() - - -# class LetterOfIntentDetails(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# nitNiqNo = models.IntegerField() -# dateOfOpening = models.DateField() -# agency = models.CharField(max_length=200) -# name = models.CharField(max_length=200) -# tenderValue = models.IntegerField() - - -# class WorkOrderForm(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# issueDate = models.DateField() -# nitNiqNo = models.IntegerField() -# agency = models.CharField(max_length=200) -# name = models.CharField(max_length=200) -# amount = models.IntegerField() -# time = models.IntegerField() -# monthDay = models.IntegerField() -# startDate = models.DateField() -# completionDate = models.DateField() -# deposit = models.IntegerField() -# contractDay = models.IntegerField() - - -# class Agreement(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# date = models.DateField() -# agencyName = models.CharField(max_length=200) -# workName = models.CharField(max_length=200) -# fdrSum = models.IntegerField() - - -# class Milestones(models.Model): -# key = models.ForeignKey(Projects, on_delete=models.CASCADE) -# sNo = models.CharField(max_length=200) -# description = models.CharField(max_length=200) -# timeAllowed = models.IntegerField() -# amountWithheld = models.IntegerField() - - -# class PageThreeDetails(models.Model): -# page_id = models.OneToOneField(Projects, on_delete=models.CASCADE, null=True) -# extensionOfTime = models.FileField() -# actualCostOfBuilding = models.IntegerField() - - -# class ExtensionOfTimeDetails(models.Model): -# key = models.ForeignKey(Projects, on_delete=models.CASCADE) -# sNo = models.CharField(max_length=200) -# hindrance = models.CharField(max_length=200) -# periodOfHindrance = models.IntegerField() -# periodOfExtension = models.IntegerField() +class RequestStatus(models.TextChoices): + CREATED = "CREATED", "Created" + ENGINEER_PROCESSED = "ENGINEER_PROCESSED", "Engineer Processed" + ADMIN_APPROVED = "ADMIN_APPROVED", "Admin Approved" + DIRECTOR_APPROVED = "DIRECTOR_APPROVED", "Director Approved" + DEAN_PROCESSED = "DEAN_PROCESSED", "Dean Processed" + WORK_ORDER_ISSUED = "WORK_ORDER_ISSUED", "Work Order Issued" + WORK_COMPLETED = "WORK_COMPLETED", "Work Completed" + BILL_GENERATED = "BILL_GENERATED", "Bill Generated" + BILL_PROCESSED = "BILL_PROCESSED", "Bill Processed" + BILL_SETTLED = "BILL_SETTLED", "Bill Settled" -# class NoOfTechnicalBidTimes(models.Model): -# key = models.OneToOneField(Projects, on_delete=models.CASCADE) -# number = models.IntegerField() +class ProposalStatus(models.TextChoices): + PENDING = "Pending", "Pending" + APPROVED = "Approved", "Approved" + REJECTED = "Rejected", "Rejected" -class Requests(models.Model): + +class BillType(models.IntegerChoices): + PARTIAL = 0, "Partial" + FINAL = 1, "Final" + + +class BaseModel(models.Model): + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + is_active = models.BooleanField(default=True) + + class Meta: + abstract = True + + def delete(self, *args, **kwargs): + self.is_active = False + self.save() + + +class Request(BaseModel): name = models.CharField(max_length=200) description = models.CharField(max_length=1000) area = models.CharField(max_length=200) - requestCreatedBy = models.CharField(max_length=200) - engineerProcessed = models.IntegerField(default=0) - iwdAdminApproval = models.IntegerField(default=0) - directorApproval = models.IntegerField(default=0) - deanProcessed = models.IntegerField(default=0) - status = models.CharField(max_length=200) - issuedWorkOrder = models.IntegerField(default=0) - workCompleted = models.IntegerField(default=0) - billGenerated = models.IntegerField(default=0) - billProcessed = models.IntegerField(default=0) - billSettled = models.IntegerField(default=0) - activeProposal = models.IntegerField(null = True) - creationTime = models.DateTimeField(auto_now_add=True) - -class WorkOrder(models.Model): - request_id = models.ForeignKey(Requests, on_delete=models.CASCADE) + requestCreatedBy = models.ForeignKey(User, on_delete=models.CASCADE, related_name="created_requests", db_index=True) + status = models.CharField(max_length=50, choices=RequestStatus.choices, default=RequestStatus.CREATED) + activeProposal = models.IntegerField(null=True, blank=True) + + +class WorkOrder(BaseModel): + request = models.ForeignKey(Request, on_delete=models.CASCADE, db_index=True) name = models.CharField(max_length=200) date = models.DateField(default=date.today) estimate_budget = models.DecimalField(default=0, max_digits=10, decimal_places=2) @@ -189,13 +59,11 @@ class WorkOrder(models.Model): start_date = models.DateField() completion_date = models.DateField(null=True, blank=True) work_issuer = models.CharField(max_length=200) - amount_spent = models.DecimalField(default = 0, max_digits=10, decimal_places=2) -class Vendor(models.Model): - ''' - heads up, vendor is not supposed to identify a unique vendor - primarily it is for storing a set of items purchased from a particular vendor for a particular request - ''' - work = models.ForeignKey(WorkOrder, on_delete=models.CASCADE) + amount_spent = models.DecimalField(default=0, max_digits=10, decimal_places=2) + + +class Vendor(BaseModel): + work = models.ForeignKey(WorkOrder, on_delete=models.CASCADE, db_index=True) name = models.CharField(max_length=200) itemdata = models.FileField(null=True, blank=True, upload_to='iwd/vendors/') finalbill = models.BooleanField(default=False) @@ -203,43 +71,59 @@ class Vendor(models.Model): contact_number = models.CharField(max_length=20, blank=True, null=True) email_address = models.CharField(null=True, blank=True, max_length=200) -class Bills(models.Model): - vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE) + class Meta: + constraints = [ + models.UniqueConstraint(fields=["work", "name"], name="unique_vendor_per_work") + ] + + +class Bills(BaseModel): + vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE, db_index=True) file = models.FileField(upload_to='iwd/bills/', null=True, blank=True) audit = models.BooleanField(default=False) settle = models.BooleanField(default=False) total_amount = models.DecimalField(default=0, max_digits=10, decimal_places=2) - ''' - two types of bills are there currently - 1st kind is partial bill (billtype == 0) - 2nd kind is final bill (billtype == 1) - - once a final bill is uploaded, no more bill uploads for that particular vendor is permitted - ''' - billtype = models.IntegerField(default=0) -class BillItems(models.Model): - bill = models.ForeignKey(Bills, on_delete=models.CASCADE) + billtype = models.IntegerField(choices=BillType.choices, default=BillType.PARTIAL) + + def clean(self): + if self.billtype == BillType.FINAL: + exists = Bills.objects.filter(vendor=self.vendor, billtype=BillType.FINAL).exclude(id=self.id).exists() + if exists: + raise ValueError("Final bill already exists for this vendor.") + + +class BillItems(BaseModel): + bill = models.ForeignKey(Bills, on_delete=models.CASCADE, db_index=True) name = models.CharField(max_length=100) description = models.CharField(max_length=100) quantity = models.IntegerField(default=0) price = models.DecimalField(default=0, max_digits=10, decimal_places=2) -class Budget(models.Model): + + +class Budget(BaseModel): + request = models.ForeignKey(Request, on_delete=models.CASCADE, db_index=True) name = models.CharField(max_length=200) - budgetIssued = models.IntegerField(default=0) - -class Proposal(models.Model): - request = models.ForeignKey(Requests, on_delete=models.CASCADE, related_name='proposals') - created_by = models.CharField(max_length=200) #models.ForeignKey(User, on_delete=models.CASCADE) + budgetIssued = models.BooleanField(default=False) + + +class Proposal(BaseModel): + request = models.ForeignKey(Request, on_delete=models.CASCADE, related_name='proposals', db_index=True) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) proposal_budget = models.DecimalField(max_digits=15, decimal_places=2, null=True, blank=True) supporting_documents = models.FileField(upload_to='iwd/proposals/', null=True, blank=True) - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - status = models.CharField(max_length=20, choices=[('Pending', 'Pending'), ('Approved', 'Approved'), ('Rejected', 'Rejected')], default='Pending') -class Item(models.Model): - proposal = models.ForeignKey('Proposal', on_delete=models.CASCADE, related_name='items') - name = models.CharField(default = " ", max_length=255) - description = models.TextField(default = " ") - unit = models.CharField(default = " ", max_length=50) - price_per_unit = models.DecimalField(default = 0, max_digits=10, decimal_places=2) - quantity = models.IntegerField(default = 0) - total_price = models.DecimalField(default = 0, max_digits=10, decimal_places=2) + status = models.CharField(max_length=20, choices=ProposalStatus.choices, default=ProposalStatus.PENDING) + + +class Item(BaseModel): + proposal = models.ForeignKey('Proposal', on_delete=models.CASCADE, related_name='items', db_index=True) + name = models.CharField(default=" ", max_length=255) + description = models.TextField(default=" ") + unit = models.CharField(default=" ", max_length=50) + price_per_unit = models.DecimalField(default=0, max_digits=10, decimal_places=2) + quantity = models.IntegerField(default=0) + total_price = models.DecimalField(default=0, max_digits=10, decimal_places=2) docs = models.FileField(upload_to='iwd/items/', null=True, blank=True) + + def save(self, *args, **kwargs): + self.total_price = self.price_per_unit * self.quantity + super().save(*args, **kwargs) \ No newline at end of file diff --git a/FusionIIIT/applications/iwdModuleV2/urls.py b/FusionIIIT/applications/iwdModuleV2/urls.py index afd840cf9..270877b87 100644 --- a/FusionIIIT/applications/iwdModuleV2/urls.py +++ b/FusionIIIT/applications/iwdModuleV2/urls.py @@ -1,73 +1,37 @@ -from django.conf.urls import url, include -from django.urls import path +from django.urls import path, include from . import views -app_name = 'iwdModuleV2' +app_name = "iwdModuleV2" urlpatterns = [ - url(r'^api/', include('applications.iwdModuleV2.api.urls')), - url(r'^$', views.dashboard, name='IWD Dashboard'), - # url(r'^page1_1/$', views.page1_1, name='IWD Page1.1'), - # url(r'page2_1/$', views.page2_1, name='IWD Page2.1'), - # url(r'corrigendumInput/$', views.corrigendumInput, name='Corrigendum Input'), - # url(r'addendumInput/$', views.addendumInput, name='Addendum Input'), - # url(r'milestoneForm/$', views.milestonesForm, name='Milestone Form'), - # url(r'technicalBidForm/$', views.TechnicalBidForm, name='Technical Bid Form'), - # url(r'extensionForm/$', views.ExtensionOfTimeForm, name='Extension Form'), - # url(r'letterOfIntent/$', views.letterOfIntent, name='Letter Of Intent Input'), - # url(r'workOrderForm/$', views.workOrderForm, name='Work Order Form'), - # url(r'agreement/$', views.AgreementInput, name='Agreement Input'), - # url(r'page3_1/$', views.page3_1, name='IWD Page 3.1'), - # url(r'noOfEntriesTechnicalBid/$', views.noOfEntriesTechnicalBid, name='IWD Technical Bid'), - # url(r'noOfEntriesFinancialBid/$', views.noOfEntriesFinancialBid, name='IWD Financial Bid'), - # url(r'page1View/$', views.page1View, name='Page 1 Views'), - # url(r'page2View/$', views.page2View, name='Page 2 View'), - # url(r'page3View/$', views.page3View, name='Page 3 View'), - # url(r'extensionFormView/$', views.extensionFormView, name='Extension Form'), - # url(r'AESView/$', views.AESView, name='AES View'), - # url(r'financialBidView/$', views.financialBidView, name='Financial Bid View'), - # url(r'preBidForm/$', views.PreBidForm, name='Pre Bid Form'), - # url(r'AESForm/$', views.AESForm, name='AESForm'), - # url('workOrderFormView/$', views.workOrderFormView, name='Work Order Form View'), - # url(r'letterOfIntentView', views.letterOfIntentView, name='Letter Of Intent View'), - # url(r'preBidDetailsView/$', views.preBidDetailsView, name='Pre Bid Details View'), - # url(r'technicalBidView/$', views.technicalBidView, name='Technical Bid View'), - # url(r'milestoneView/$', views.milestoneView, name='Milestones'), - # url(r'addendumView/$', views.addendumView, name='Addendum View'), - # url('agreementView/$', views.agreementView, name='Agreement VIew'), - # url(r'corrigendumView/$', views.corrigendumView, name='Corrigendum View'), - url(r'^requestsView/',views.requestsView, name='Requests view'), - url(r'^createdRequestsView/',views.createdRequests, name='Created Requests view'), - url(r'^handleEngineerProcessRequests/', views.handleEngineerProcessRequests, name='Engineer-Process-Requests'), - url(r'^engineerProcessedRequestsView/',views.engineerProcessedRequests, name='Engineer-Processed-Requests view'), - url(r'^handleDeanProcessRequests/', views.handleDeanProcessRequests, name='Dean-Process-Requests'), - url(r'^deanProcessedRequestsView/',views.deanProcessedRequests, name='Dean-Processed-Requests view'), - url(r'^handleDirectorApprovalRequests/', views.handleDirectorApprovalRequests, name='Director-Approval-Requests'), - url(r'^updateRejectedRequests/', views.updateRejectedRequests, name='Update-Rejected-Requests'), - url(r'^handleUpdateRequests/', views.handleUpdateRequests, name='Handle-Update-Requests'), - # url('rejectedRequests/', views.rejectedRequests, name='Rejected-Requests'), - url(r'^rejectedRequestsView/',views.rejectedRequests, name='Rejected Requests view'), - url(r'^requestsStatus/', views.requestsStatus, name='Requests-Status'), - url(r'^fetchDesignations/', views.fetchDesignations, name='Fetch-Designations'), - url(r'^fetchRequest/', views.fetchRequest, name='Fetch-Request'), - url(r'^issueWorkOrder/', views.issueWorkOrder, name='Issue Work Order'), - url(r'^workOrder/', views.workOrder, name='Work Order'), - url(r'^requestsInProgess/', views.requestsInProgess, name='Requests In Progress'), - url(r'^workCompleted/', views.workCompleted, name='Work Completed'), - # url(r'^generateFinalBill/', views.generateFinalBill, name='Generate-Final-Bill'), - # url(r'^handleBillGeneratedRequests/', views.handleBillGeneratedRequests, name='Handle-Bill-Generated-Requests'), - # url(r'^generatedBillsView/', views.generatedBillsView, name='Generated-Bills-View'), - # url(r'^handleProcessedBills/', views.handleProcessedBills, name='Handle-Processed-Bills'), - # url(r'^auditDocumentView/', views.auditDocumentView, name='Audit-Document-View'), - # url(r'^auditDocument/', views.auditDocument, name='Audit-Document'), - # url(r'^settleBillsView/', views.settleBillsView, name='Settle-Bills-View'), - # url(r'^handleSettleBillRequests/', views.handleSettleBillRequests, name='Handle-Settle-Bill-Requests'), - url(r'^viewBudget/', views.viewBudget, name='View-Budget'), - url(r'^budget/', views.budget, name='Budget'), - url(r'^addBudget/', views.addBudget, name='Add-Budget'), - url(r'^editBudgetView/', views.editBudgetView, name='Edit-Budget-View'), - url(r'^editBudget/', views.editBudget, name='Edit-Budget'), - path('view_file//',views.view_file,name="view_file"), + # Dashboard + path("", views.dashboard, name="dashboard"), -] + # API Versioning + path("api/v1/iwd/", include("applications.iwdModuleV2.api.urls")), + + # Web views + path("requests/", views.requestsView, name="requests"), + path("created-requests/", views.createdRequests, name="created-requests"), + + path("engineer-processed-requests/", views.engineerProcessedRequests, name="engineer-processed-requests"), + path("dean-processed-requests/", views.deanProcessedRequests, name="dean-processed-requests"), + + path("rejected-requests/", views.rejectedRequests, name="rejected-requests"), + + path("requests-status/", views.requestsStatus, name="requests-status"), + + path("work-orders/", views.workOrder, name="work-orders"), + path("issue-work-order/", views.issueWorkOrder, name="issue-work-order"), + + path("requests-in-progress/", views.requestsInProgess, name="requests-in-progress"), + path("work-completed/", views.workCompleted, name="work-completed"), + + path("budget/", views.budget, name="budget"), + path("budget/view/", views.viewBudget, name="view-budget"), + path("budget/add/", views.addBudget, name="add-budget"), + path("budget/edit/", views.editBudget, name="edit-budget"), + + path("files///", views.view_file, name="view-file"), +] \ No newline at end of file