From 384d2520461057223db56e81fc055bdf06691c4c Mon Sep 17 00:00:00 2001 From: a272-jones <Aaron8.jones@live.uwe.ac.uk> Date: Tue, 6 May 2025 14:25:56 +0100 Subject: [PATCH] improved billings system --- .../DjangoProject/core/models.py | 1 + ActualProjectCode/DjangoProject/core/views.py | 17 +++ .../DjangoProject/server/urls.py | 2 + .../DjangoProject/templates/index.html | 4 + .../templates/modelForms/approveInvoice.html | 68 +++++++++++ .../templates/modelForms/billingsView.html | 24 +++- .../templates/modelForms/manageInvoice.html | 111 ++++++++++++++++++ .../DjangoProject/templates/profile.html | 11 +- 8 files changed, 227 insertions(+), 11 deletions(-) create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/approveInvoice.html create mode 100644 ActualProjectCode/DjangoProject/templates/modelForms/manageInvoice.html diff --git a/ActualProjectCode/DjangoProject/core/models.py b/ActualProjectCode/DjangoProject/core/models.py index d35b76b..98f15ba 100644 --- a/ActualProjectCode/DjangoProject/core/models.py +++ b/ActualProjectCode/DjangoProject/core/models.py @@ -28,6 +28,7 @@ class Billing(models.Model): amount = models.FloatField() username = models.CharField(max_length=100, default="company") companyName = models.CharField(max_length=100) + approvalStatus = models.CharField(max_length=10, default="unapproved") def __str__(self): return f"{self.companyName} Billing - ID: {self.billingID}" diff --git a/ActualProjectCode/DjangoProject/core/views.py b/ActualProjectCode/DjangoProject/core/views.py index da64530..57566fb 100644 --- a/ActualProjectCode/DjangoProject/core/views.py +++ b/ActualProjectCode/DjangoProject/core/views.py @@ -161,6 +161,23 @@ def billingsView(request): context = {'billings': billings} return render(request, 'modelForms/billingsView.html', context) +@login_required +def manageInvoice(request): + billings = Billing.objects.all() + context = {} + context = {'billings': billings} + return render(request, 'modelForms/manageInvoice.html', context) + +@login_required +def approveInvoice(request, billingID): + invoice = Billing.objects.get(billingID=billingID) + if request.method == 'POST': + invoice.approvalStatus = "approved" + invoice.save() + + return redirect('manageInvoice') + return render(request, 'modelForms/approveInvoice.html', {'invoice': invoice}) + @login_required def viewUploads(request): userUploader = request.user diff --git a/ActualProjectCode/DjangoProject/server/urls.py b/ActualProjectCode/DjangoProject/server/urls.py index c96d2cb..6306a7e 100644 --- a/ActualProjectCode/DjangoProject/server/urls.py +++ b/ActualProjectCode/DjangoProject/server/urls.py @@ -47,6 +47,8 @@ urlpatterns = [ path('modelForms/deleteRecord/<str:recordID>/', views.deleteRecord, name="deleteRecord"), path('modelForms/interactionView/', views.interactionView, name="interactionView"), path('modelForms/billingsView/', views.billingsView, name="billingsView"), + path('modelForms/manageInvoice/', views.manageInvoice, name="manageInvoice"), + path('modelForms/approveInvoice/<str:billingID>', views.approveInvoice, name="approveInvoice"), path('modelForms/deleteBillings/<str:billingID>', views.deleteBillings, name="deleteBillings"), path('modelForms/viewUploads/', views.viewUploads, name="viewUploads"), path('modelForms/manageModels/', views.manageModels, name="manageModels"), diff --git a/ActualProjectCode/DjangoProject/templates/index.html b/ActualProjectCode/DjangoProject/templates/index.html index 642a0c5..e3c9f58 100644 --- a/ActualProjectCode/DjangoProject/templates/index.html +++ b/ActualProjectCode/DjangoProject/templates/index.html @@ -12,6 +12,7 @@ padding: 0; background-color: #f9f9f9; color: #333; + height: 100%; } header { background-color: #004085; @@ -57,6 +58,8 @@ margin: 40px auto; padding: 0 20px; text-align: center; + flex: 1; + height: 100%; } .intro h1 { font-size: 36px; @@ -76,6 +79,7 @@ text-align: center; padding: 10px 0; margin-top: 40px; + bottom: 0; } footer p { margin: 0; diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/approveInvoice.html b/ActualProjectCode/DjangoProject/templates/modelForms/approveInvoice.html new file mode 100644 index 0000000..533a806 --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/approveInvoice.html @@ -0,0 +1,68 @@ +<html> +<head> + <style> + body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + color: #333; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + } + + .container { + background: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); + text-align: center; + width: 300px; + } + + p { + font-size: 16px; + margin-bottom: 20px; + } + + a { + text-decoration: none; + color: #333; + font-weight: bold; + margin-right: 15px; + } + + a:hover { + text-decoration: underline; + } + + input[type="submit"] { + background: #333; + color: white; + border: none; + padding: 10px 20px; + font-size: 16px; + cursor: pointer; + border-radius: 5px; + } + + input[type="submit"]:hover { + background: #555; + } + </style> +</head> +<body> + + <div class="container"> + <p>Are you sure you want to approve this billing?</p> + <form action="{% url 'approveInvoice' invoice.billingID %}" method="POST"> + {% csrf_token %} + <a href="{% url 'manageInvoice' %}">Go Back</a> + <input type="submit" name="confirm" value="Approve"> + </form> + + </div> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html b/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html index 24623cb..1d44a99 100644 --- a/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html +++ b/ActualProjectCode/DjangoProject/templates/modelForms/billingsView.html @@ -48,17 +48,29 @@ margin: 5px 0; } - .delete-btn { + .update-btn, .delete-btn { display: inline-block; - margin-top: 10px; + margin: 5px; padding: 8px 12px; - background: #ff4d4d; - color: white; border-radius: 5px; text-decoration: none; font-weight: bold; } + .update-btn { + background: #4CAF50; + color: white; + } + + .update-btn:hover { + background: #388E3C; + } + + .delete-btn { + background: #ff4d4d; + color: white; + } + .delete-btn:hover { background: #cc0000; } @@ -77,14 +89,16 @@ <p><a href="{% url 'profile' %}">Return to Profile</a></p> {% for record in billings %} + {% if record.approvalStatus == 'approved' %} <div class="record"> <p><strong>Billing ID:</strong> {{ record.billingID }}</p> <p><strong>Amount: </strong>£{{ record.amount }}</p> <p><strong>Generated By: </strong>{{ record.username }}</p> <p><strong>Company Billed: </strong>{{ record.companyName }}</p> + <a href="" class="update-btn">Pay Here</a> <a href="{% url 'deleteBillings' record.billingID %}" class="delete-btn">Delete Billing</a> </div> - <hr> + {% endif %} {% endfor %} </div> diff --git a/ActualProjectCode/DjangoProject/templates/modelForms/manageInvoice.html b/ActualProjectCode/DjangoProject/templates/modelForms/manageInvoice.html new file mode 100644 index 0000000..7edf8b6 --- /dev/null +++ b/ActualProjectCode/DjangoProject/templates/modelForms/manageInvoice.html @@ -0,0 +1,111 @@ +<html> +<head> + <style> + body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + color: #333; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + min-height: 100vh; + margin: 0; + } + + .container { + background: white; + padding: 20px; + border-radius: 8px; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); + width: 60%; + max-width: 600px; + text-align: center; + } + + a { + text-decoration: none; + color: #333; + font-weight: bold; + } + + a:hover { + color: #555; + } + + .record { + background: #fff; + padding: 15px; + margin: 15px 0; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + text-align: left; + } + + .record p { + margin: 5px 0; + } + + .update-btn, .delete-btn { + display: inline-block; + margin: 5px; + padding: 8px 12px; + border-radius: 5px; + text-decoration: none; + font-weight: bold; + } + + .update-btn { + background: #4CAF50; + color: white; + } + + .update-btn:hover { + background: #388E3C; + } + + .action-buttons { + margin-top: 10px; + } + + .delete-btn { + background: #ff4d4d; + color: white; + } + + .delete-btn:hover { + background: #cc0000; + } + + hr { + border: 0; + height: 1px; + background: #ccc; + margin: 15px 0; + } + </style> +</head> +<body> + + <div class="container"> + <p><a href="{% url 'profile' %}">Return to Profile</a></p> + + {% for invoice in billings %} + {% if invoice.approvalStatus == 'unapproved' %} + <div class="record"> + <p><strong>Billing ID:</strong> {{ invoice.billingID }}</p> + <p><strong>Amount: </strong>£{{ invoice.amount }}</p> + <p><strong>Generated By: </strong>{{ invoice.username }}</p> + <p><strong>Company Billed: </strong>{{ invoice.companyName }}</p> + <div class="action-buttons"> + <a href="{% url 'approveInvoice' invoice.billingID %}" class="update-btn">Approve</a> + <a href="{% url 'deleteBillings' invoice.billingID %}" class="delete-btn">Delete Billing</a> + </div> + </div> + {% endif %} + {% endfor %} + + </div> + +</body> +</html> \ No newline at end of file diff --git a/ActualProjectCode/DjangoProject/templates/profile.html b/ActualProjectCode/DjangoProject/templates/profile.html index 7db0d7f..ad63c14 100644 --- a/ActualProjectCode/DjangoProject/templates/profile.html +++ b/ActualProjectCode/DjangoProject/templates/profile.html @@ -192,10 +192,9 @@ <hr> <h1 class="sectionTitle">Finance Section</h1> <!-- Finance Section --> - <h2>Generate Billings</h2> + <h2>Generate Invoice</h2> <h2><a href="{% url 'genBillings' %}">Generate</a></h2> - <h2>View Billings</h2> - <h2><a href="{% url 'billingsView' %}">View</a></h2> + <h2><a href="{% url 'billingsView' %}">View Approved Billings</a></h2> <!-- End of Finance Section --> {% elif user.profile.role == 'admin' %} @@ -221,10 +220,10 @@ <hr> <h1 class="sectionTitle">Finance Section</h1> <!-- Finance Section --> - <h2>Generate Billings</h2> + <h2>Generate Invoice</h2> <h2><a href="{% url 'genBillings' %}">Generate</a></h2> - <h2>View Billings</h2> - <h2><a href="{% url 'billingsView' %}">View</a></h2> + <h2><a href="{% url 'manageInvoice' %}">Approve Invoice</a></h2> + <h2><a href="{% url 'billingsView' %}">View Approved Billings</a></h2> <!-- End of Finance Section --> {% else %} -- GitLab