Skip to content

Commit 278770e

Browse files
committed
added invoice reference, fixed tests
Signed-off-by: Trey <73353716+TreyWW@users.noreply.github.com>
1 parent 849ed79 commit 278770e

File tree

20 files changed

+91
-38
lines changed

20 files changed

+91
-38
lines changed

backend/core/api/public/endpoints/Invoices/edit.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ def edit_invoice_endpoint(request: APIRequest):
5252
"self_county": request.POST.get("from_county"),
5353
"self_country": request.POST.get("from_country"),
5454
"notes": request.POST.get("notes"),
55-
"invoice_number": request.POST.get("invoice_number"),
5655
"vat_number": request.POST.get("vat_number"),
5756
"reference": request.POST.get("reference"),
5857
"sort_code": request.POST.get("sort_code"),

backend/core/service/invoices/common/create/create.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ def create_invoice_items(request: WebRequest):
1818

1919

2020
def save_invoice_common(request: WebRequest, invoice_items, invoice: Invoice | InvoiceRecurringProfile):
21-
2221
if request.user.logged_in_as_team:
2322
invoice.organization = request.user.logged_in_as_team
2423
else:
@@ -49,7 +48,6 @@ def save_invoice_common(request: WebRequest, invoice_items, invoice: Invoice | I
4948
invoice.self_county = request.POST.get("from_county")
5049
invoice.self_country = request.POST.get("from_country")
5150
invoice.notes = request.POST.get("notes")
52-
invoice.invoice_number = request.POST.get("invoice_number")
5351
invoice.vat_number = request.POST.get("vat_number")
5452
if request.FILES.get("logo") is not None:
5553
invoice.logo = request.FILES.get("logo")
@@ -60,7 +58,6 @@ def save_invoice_common(request: WebRequest, invoice_items, invoice: Invoice | I
6058
defaults: DefaultValues = get_account_defaults(request.actor)
6159
if defaults:
6260
invoice.logo = defaults.default_invoice_logo
63-
invoice.reference = request.POST.get("reference")
6461
invoice.sort_code = request.POST.get("sort_code")
6562
invoice.account_number = request.POST.get("account_number")
6663
invoice.account_holder_name = request.POST.get("account_holder_name")

backend/core/service/invoices/common/emails/on_create.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def on_create_invoice_email_service(users_email: str, invoice: Invoice) -> OnCre
3535
user_data = {
3636
"first_name": invoice.client_to.name.split(" ")[0] if invoice.client_to else invoice.client_name,
3737
"invoice_id": invoice.id,
38-
"invoice_ref": invoice.reference or invoice.invoice_number or invoice.id,
38+
"invoice_ref": invoice.reference or invoice.id,
3939
"due_date": invoice.date_due.strftime("%A, %B %d, %Y"),
4040
"amount_due": invoice.get_total_price(),
4141
"currency": invoice.currency,

backend/core/service/invoices/single/create/create.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def save_invoice(request: WebRequest, invoice_items):
8383
date_due=datetime.strptime(date_due, "%Y-%m-%d").date(),
8484
date_issued=request.POST.get("date_issued"),
8585
currency=currency,
86+
reference=request.POST.get("reference"),
8687
)
8788

8889
save_invoice_common(request, invoice_items, invoice)

backend/core/service/reports/generate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def generate_report(
2323
for invoice in all_invoices:
2424
row = MonthlyReportRow(
2525
date=invoice.date_issued or invoice.date_created,
26-
reference_number=invoice.invoice_number or invoice.id,
26+
reference_number=invoice.reference or invoice.id,
2727
item_type="invoice",
2828
paid_in=invoice.get_total_price(),
2929
)

backend/finance/api/invoices/edit.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ def edit_invoice(request: HtmxHttpRequest):
4747
"self_county": request.POST.get("from_county"),
4848
"self_country": request.POST.get("from_country"),
4949
"notes": request.POST.get("notes"),
50-
"invoice_number": request.POST.get("invoice_number"),
5150
"vat_number": request.POST.get("vat_number"),
5251
"reference": request.POST.get("reference"),
5352
"sort_code": request.POST.get("sort_code"),

backend/finance/api/invoices/recurring/edit.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ def edit_invoice_recurring_profile_endpoint(request: WebRequest, invoice_profile
5353
"self_county": request.POST.get("from_county"),
5454
"self_country": request.POST.get("from_country"),
5555
"notes": request.POST.get("notes"),
56-
"invoice_number": request.POST.get("invoice_number"),
5756
"vat_number": request.POST.get("vat_number"),
5857
"reference": request.POST.get("reference"),
5958
"sort_code": request.POST.get("sort_code"),

backend/finance/models.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ class InvoiceBase(OwnerBase):
9797
sort_code = models.CharField(max_length=8, blank=True, null=True) # 12-34-56
9898
account_holder_name = models.CharField(max_length=100, blank=True, null=True)
9999
account_number = models.CharField(max_length=100, blank=True, null=True)
100-
reference = models.CharField(max_length=100, blank=True, null=True)
101-
invoice_number = models.CharField(max_length=100, blank=True, null=True)
102100
vat_number = models.CharField(max_length=100, blank=True, null=True)
103101
logo = models.ImageField(
104102
upload_to="invoice_logos",
@@ -150,7 +148,7 @@ class Invoice(InvoiceBase):
150148
("paid", "Paid"),
151149
)
152150

153-
invoice_id = models.IntegerField(unique=True, blank=True, null=True) # todo: add
151+
reference = models.CharField(max_length=16, blank=True, null=True)
154152
date_due = models.DateField()
155153
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="draft")
156154
status_updated_at = models.DateTimeField(auto_now_add=True)
@@ -159,15 +157,14 @@ class Invoice(InvoiceBase):
159157
)
160158

161159
def __str__(self):
162-
invoice_id = self.invoice_id or self.id
163160
if self.client_name:
164161
client = self.client_name
165162
elif self.client_to:
166163
client = self.client_to.name
167164
else:
168165
client = "Unknown Client"
169166

170-
return f"Invoice #{invoice_id} for {client}"
167+
return f"Invoice #{self.id} for {client}"
171168

172169
def set_status(self, status: str, save=True):
173170
if status not in ["draft", "pending", "paid"]:

backend/finance/views/invoices/single/edit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ def invoice_get_existing_data(invoice_obj):
3333
"account_holder_name": invoice_obj.account_holder_name,
3434
"sort_code": invoice_obj.sort_code,
3535
"account_number": invoice_obj.account_number,
36+
"reference": invoice_obj.reference,
3637
"logo": invoice_obj.logo,
3738
}
3839
if invoice_obj.client_to:
@@ -101,7 +102,6 @@ def edit_invoice(request: WebRequest, invoice_id):
101102
"self_county": request.POST.get("from_county"),
102103
"self_country": request.POST.get("from_country"),
103104
"notes": request.POST.get("notes"),
104-
"invoice_number": request.POST.get("invoice_number"),
105105
"vat_number": request.POST.get("vat_number"),
106106
"reference": request.POST.get("reference"),
107107
"sort_code": request.POST.get("sort_code"),
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Generated by Django 5.1.1 on 2024-11-17 15:06
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("backend", "0069_alter_auditlog_action"),
10+
]
11+
12+
operations = [
13+
migrations.RemoveField(
14+
model_name="invoice",
15+
name="invoice_id",
16+
),
17+
migrations.RemoveField(
18+
model_name="invoice",
19+
name="invoice_number",
20+
),
21+
migrations.RemoveField(
22+
model_name="invoicerecurringprofile",
23+
name="invoice_number",
24+
),
25+
migrations.RemoveField(
26+
model_name="invoicerecurringprofile",
27+
name="reference",
28+
),
29+
migrations.AlterField(
30+
model_name="invoice",
31+
name="reference",
32+
field=models.CharField(blank=True, max_length=16, null=True),
33+
),
34+
]

frontend/templates/pages/invoices/create/create_recurring.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ <h3 class="text-sm text-natural font-semibold hidden lg:block text-end me-6">To<
5151
STEP 5 - CUSTOM DESIGNS
5252
<i class="text-neutral-content">[OPTIONAL]</i>
5353
</div>
54-
{% include "pages/invoices/create/custom_designs/logo.html" %}
54+
<div class="my-4 flex w-full flex-row">{% include "pages/invoices/create/custom_designs/logo.html" %}</div>
5555
{# <div class="divider my-4">STEP 5 - NOTES [OPTIONAL]</div>#}
5656
{# {% include "pages/invoices/create/notes/notes.html" %}#}
5757
<div class="group-invalid:tooltip"

frontend/templates/pages/invoices/create/create_single.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ <h3 class="text-sm text-natural font-semibold hidden lg:block text-end me-6">To<
5050
STEP 5 - CUSTOM DESIGNS
5151
<i class="text-neutral-content">[OPTIONAL]</i>
5252
</div>
53-
{% include "pages/invoices/create/custom_designs/logo.html" %}
53+
<div class="my-4 flex w-full flex-row">
54+
{% include "pages/invoices/create/custom_designs/logo.html" %}
55+
{% include "pages/invoices/create/custom_designs/reference.html" %}
56+
</div>
5457
{# <div class="divider my-4">STEP 5 - NOTES [OPTIONAL]</div>#}
5558
{# {% include "pages/invoices/create/notes/notes.html" %}#}
5659
<div class="group-invalid:tooltip"
Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
{# TODO: show the logo preview on the left #}
2-
<div class="my-4 flex w-full flex-col">
3-
<div class="w-full gap-4 grid grid-cols-1 lg:grid-cols-2">
4-
<div class="input_card">
5-
<div class="card-body">
6-
<div class="form-control w-full">
7-
<label class="label justify-start">Use custom logo</label>
8-
<input type="file"
9-
name="logo"
10-
value="{% if logo %}{{ logo.url }}{% endif %}" {# doesn't auto-fill #}
11-
class="file-input file-input-bordered max-w-full"
12-
accept="image/jpeg,image/png,image/jpg">
13-
</div>
14-
</div>
2+
<div class="input_card">
3+
<div class="card-body">
4+
<div class="form-control w-full">
5+
<label class="label justify-start">Use custom logo</label>
6+
<input type="file"
7+
name="logo"
8+
value="{% if logo %}{{ logo.url }}{% endif %}" {# doesn't auto-fill #}
9+
class="file-input file-input-bordered max-w-full"
10+
accept="image/jpeg,image/png,image/jpg">
1511
</div>
1612
</div>
1713
</div>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<div class="input_card">
2+
<div class="card-body">
3+
<div class="form-control w-full">
4+
<label class="label justify-start">
5+
Invoice Reference
6+
<span class="tooltip tooltip-secondary"
7+
data-tip="This is a custom reference to use instead of our auto-generated invoice ID. This will be shown on the invoice too.">
8+
<i class="fa fa-info-circle ms-2"></i>
9+
</span>
10+
</label>
11+
<input type="text"
12+
name="reference"
13+
value="{{ reference }}"
14+
placeholder="INV0012"
15+
class="input input-bordered max-w-full">
16+
</div>
17+
</div>
18+
</div>

frontend/templates/pages/invoices/create/destinations/_to_destination.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,5 @@ <h3 class="text-sm text-natural font-semibold block lg:hidden ms-3">To</h3>
5252
<input type="hidden" name="selected_client" value="{{ existing_client.id }}">
5353
<input type="hidden"
5454
name="is_representative"
55-
value="{{ is_representative | default:to_is_representative }}">
55+
value="{% if to_is_representative %}{{ is_representative | default:to_is_representative }}{% else %}{{ is_representative }}{% endif %}">
5656
{% if not swapping %}</button>{% endif %}

frontend/templates/pages/invoices/dashboard/_fetch_body.html

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,17 @@
1313
hx-push-url="{% url "finance:invoices:single:overview" invoice_id=invoice.id %}"
1414
hx-get="{% url "finance:invoices:single:overview" invoice_id=invoice.id %}">
1515
<td class="link link-primary no-underline" td-value="{{ invoice.id }}">
16-
<a href="{% url "finance:invoices:single:overview" invoice_id=invoice.id %}">{{ invoice.id }}</a>
16+
<a href="{% url "finance:invoices:single:overview" invoice_id=invoice.id %}">
17+
{% if invoice.reference %}
18+
{{ invoice.reference }}
19+
<span class="tooltip text-neutral-content"
20+
data-tip="This is the actual invoice ID">({{ invoice.id }})</span>
21+
{% else %}
22+
{{ invoice.id }}
23+
{% endif %}
24+
</a>
1725
</td>
26+
<td></td>
1827
<td>{{ invoice.date_due | date:"d/m/Y" }}</td>
1928
{% with cli_name=invoice.client_to.name|default:invoice.client_name %}
2029
<td td-value="{{ cli_name|default_if_none:"No Client" }}">

frontend/templates/pages/invoices/recurring/edit/edit_recurring.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ <h3 class="text-sm text-natural font-semibold hidden lg:block text-end me-6">To<
6262
STEP 5 - CUSTOM DESIGNS
6363
<i class="text-neutral-content">[OPTIONAL]</i>
6464
</div>
65-
{% include "pages/invoices/create/custom_designs/logo.html" %}
65+
<div class="my-4 flex w-full flex-row">{% include "pages/invoices/create/custom_designs/logo.html" %}</div>
6666
{# <div class="divider my-4">STEP 5 - NOTES [OPTIONAL]</div>#}
6767
{# {% include "pages/invoices/create/notes/notes.html" %}#}
6868
<div class="group-invalid:tooltip"

frontend/templates/pages/invoices/single/edit/edit.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ <h3 class="text-sm text-natural font-semibold hidden lg:block text-end me-6">To<
8585
STEP 5 - CUSTOM DESIGNS
8686
<i class="text-neutral-content">[OPTIONAL]</i>
8787
</div>
88-
{% include "pages/invoices/create/custom_designs/logo.html" %}
88+
<div class="my-4 flex w-full flex-row">
89+
{% include "pages/invoices/create/custom_designs/logo.html" %}
90+
{% include "pages/invoices/create/custom_designs/reference.html" %}
91+
</div>
8992
<div class="group-invalid:tooltip mt-4"
9093
data-tip="Fill out all required details to save the invoice.">
9194
<button class="btn btn-primary group-invalid:btn-disabled btn-block">Save Invoice</button>

frontend/templates/pages/invoices/single/view/invoice_page.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ <h1 class="text-2xl font-semibold">{{ invoice.self_company|default_if_none:invoi
3939
<section class="text-right space-y-4 invoice-details">
4040
<div>
4141
<p class="text-sm text-gray-500 uppercase tracking-wide">Invoice Ref</p>
42-
<p>{{ invoice.invoice_id|default:invoice.id }}</p>
42+
<p>{{ invoice.reference|default:invoice.id }}</p>
4343
</div>
4444
<div>
4545
<p class="text-sm text-gray-500 uppercase tracking-wide">Date Sent</p>

tests/views/test_invoices.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,8 @@ def setUp(self):
6161
"from_county": "Self County",
6262
"from_country": "Self Country",
6363
"notes": "Invoice Notes",
64-
"invoice_number": "INV-001",
6564
"vat_number": "VAT-001",
66-
"reference": "Reference",
65+
"reference": "INV-001",
6766
"sort_code": "123456",
6867
"account_number": "12345678",
6968
"account_holder_name": "Account Holder Name",
@@ -117,9 +116,8 @@ def test_invoices_create_invoice_from_post_data(self):
117116
self.assertEqual(invoice.self_county, "Self County")
118117
self.assertEqual(invoice.self_country, "Self Country")
119118
self.assertEqual(invoice.notes, "Invoice Notes")
120-
self.assertEqual(invoice.invoice_number, "INV-001")
121119
self.assertEqual(invoice.vat_number, "VAT-001")
122-
self.assertEqual(invoice.reference, "Reference")
120+
self.assertEqual(invoice.reference, "INV-001")
123121
self.assertEqual(invoice.sort_code, "123456")
124122
self.assertEqual(invoice.account_number, "12345678")
125123
self.assertEqual(invoice.account_holder_name, "Account Holder Name")

0 commit comments

Comments
 (0)