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