diff --git a/lowfat/admin.py b/lowfat/admin.py index e80a5442..6a053b52 100644 --- a/lowfat/admin.py +++ b/lowfat/admin.py @@ -140,6 +140,7 @@ class ClaimantAdmin(ExportMixin, SimpleHistoryAdmin): "attended_inaugural_meeting", "attended_collaborations_workshop", "notes_from_admin", + "supplier_number", ], }, ), @@ -161,7 +162,7 @@ class ClaimantAdmin(ExportMixin, SimpleHistoryAdmin): 'affiliation', 'funding', 'funding_notes', - 'work_description' + 'work_description', ] list_filter = [ 'fellow', diff --git a/lowfat/forms.py b/lowfat/forms.py index fabbf879..b7f7c92f 100644 --- a/lowfat/forms.py +++ b/lowfat/forms.py @@ -308,7 +308,7 @@ class Meta: 'budget_request_venue_hire': "Venue hire", 'budget_request_catering': "Catering", 'budget_request_others': "Other costs", - 'direct_invoice': "Will expenses related to this request need to be claimed directly via an invoice from your institution or supplier and the Institute?", + 'direct_invoice': "Will expenses related to this request require a purchase order?", 'justification': "For requests from individual £3000 Fellowship awards, please justify how this activity is in scope of your proposed Fellowship plans or how it furthers your goals for the Fellowship. For requests from the communal pot of funding, please justify how this activity supports the goals of the Institute (https://software.ac.uk/about). For requests relating to a Fellows Inaugural Meeting or Collaborations Workshop, please give a brief justification for the request.", 'success_targeted': "Please specify what outputs (what may be produced) and outcomes (what change it could lead to) are likely to be produced from your participation in this event. These can include learning goals being met, collaborations, reports etc.", 'additional_info': "Please specify details and breakdown of the costs. For example, indicating the mode(s) of travel and its associated cost. You can also add any other additional information here.", @@ -413,6 +413,7 @@ def __init__(self, *args, **kwargs): disabled=True, value=0.00 ), + HTML('

Is a Purchase Order Required?

If the payment is for a third-party organisation or individual, a purchase order (PO) may be required. If a PO is required, this must be raised before the event takes place.

For us to raise a PO, we need to know who we are paying (name/address etc.), what we are buying and how much it is going to cost e.g. Catering for an event on 28th May for 20 people, costing £160 plus VAT, provided by XYZ Catering.

If the supplier already exists on our system, there should be minimal delay in getting the PO issued. If the supplier is a new supplier, the accounts payable team will contact the supplier for additional information, and it can take up to 3 months for the PO to be issued.

If you are paying an individual to reimburse their out-of-pocket expenses, this is done after the event using a simple claim form, but you need to upload the claim form onto lowFAT as it will be offset against your funding request. It can take up to six weeks for these expenses to be reimbursed.

If you are paying an individual for their time e.g. 3 hours at £30 per hour to provide training or a workshop, this is treated by the University of Edinburgh as an appointment or engagement and requires an Employment Status Check to be completed before any work is started. It can take up to 3 months for the Employment Status Check to be completed. Any work undertaken before these checks are completed will not be paid. The way the payment is made depends on the outcome of these checks. The person undertaking this work will be required to have registered with HMRC for self assessment tax and must be able to provide a Unique Tax Reference No (UTR). Again, you should upload the claim form to lowFAT as it will be offset against your funding request.

Please make sure you tick the box below if a purchase order may be required

'), 'direct_invoice', HTML('

Justification for attending or organising the event

When filling in the questions below please consider the following points:

'), HTML('

Justification

'), diff --git a/lowfat/migrations/0160_alter_claimant_application_year_and_more.py b/lowfat/migrations/0160_alter_claimant_application_year_and_more.py new file mode 100644 index 00000000..c6ac1c19 --- /dev/null +++ b/lowfat/migrations/0160_alter_claimant_application_year_and_more.py @@ -0,0 +1,54 @@ +# Generated by Django 4.2 on 2024-07-18 15:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lowfat', '0159_auto_20230824_1428'), + ] + + operations = [ + migrations.AlterField( + model_name='claimant', + name='application_year', + field=models.IntegerField(default=2024), + ), + migrations.AlterField( + model_name='claimant', + name='inauguration_grant_expiration', + field=models.DateField(default=datetime.date(2026, 3, 31)), + ), + migrations.AlterField( + model_name='expense', + name='status', + field=models.CharField(choices=[('S', 'Submitted'), ('C', 'Processing'), ('A', 'Approved'), ('R', 'Rejected'), ('X', 'Removed')], default='S', max_length=1), + ), + migrations.AlterField( + model_name='fund', + name='status', + field=models.CharField(choices=[('U', 'Unprocessed'), ('P', 'Processing'), ('A', 'Approved'), ('M', 'Approved by machine'), ('R', 'Rejected'), ('F', 'Archived'), ('C', 'Cancelled'), ('X', 'Removed')], default='U', max_length=1), + ), + migrations.AlterField( + model_name='historicalclaimant', + name='application_year', + field=models.IntegerField(default=2024), + ), + migrations.AlterField( + model_name='historicalclaimant', + name='inauguration_grant_expiration', + field=models.DateField(default=datetime.date(2026, 3, 31)), + ), + migrations.AlterField( + model_name='historicalexpense', + name='status', + field=models.CharField(choices=[('S', 'Submitted'), ('C', 'Processing'), ('A', 'Approved'), ('R', 'Rejected'), ('X', 'Removed')], default='S', max_length=1), + ), + migrations.AlterField( + model_name='historicalfund', + name='status', + field=models.CharField(choices=[('U', 'Unprocessed'), ('P', 'Processing'), ('A', 'Approved'), ('M', 'Approved by machine'), ('R', 'Rejected'), ('F', 'Archived'), ('C', 'Cancelled'), ('X', 'Removed')], default='U', max_length=1), + ), + ] diff --git a/lowfat/migrations/0161_claimant_supplier_number_and_more.py b/lowfat/migrations/0161_claimant_supplier_number_and_more.py new file mode 100644 index 00000000..338e85a9 --- /dev/null +++ b/lowfat/migrations/0161_claimant_supplier_number_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2 on 2024-08-30 15:25 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('lowfat', '0160_alter_claimant_application_year_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='claimant', + name='supplier_number', + field=models.CharField(blank=True, max_length=120), + ), + migrations.AddField( + model_name='historicalclaimant', + name='supplier_number', + field=models.CharField(blank=True, max_length=120), + ), + ] diff --git a/lowfat/models/claimant.py b/lowfat/models/claimant.py index 186d4569..95c37fef 100644 --- a/lowfat/models/claimant.py +++ b/lowfat/models/claimant.py @@ -303,6 +303,10 @@ class Meta: null=True, blank=True ) + supplier_number = models.CharField( + max_length=MAX_CHAR_LENGTH, + blank=True + ) # Application screencast_url = models.CharField( diff --git a/lowfat/models/expense.py b/lowfat/models/expense.py index a4a34a55..f3ea195d 100644 --- a/lowfat/models/expense.py +++ b/lowfat/models/expense.py @@ -14,7 +14,7 @@ ('C', 'Processing'), ('A', 'Approved'), ('R', 'Rejected'), # When expense was rejected. - ('X', 'Remove'), # When the fellow decided to remove their request. + ('X', 'Removed'), # When the fellow decided to remove their request. ) GRANT_HEADING = ( diff --git a/lowfat/models/fund.py b/lowfat/models/fund.py index eaf55049..4add4c7c 100644 --- a/lowfat/models/fund.py +++ b/lowfat/models/fund.py @@ -47,7 +47,7 @@ ('R', 'Rejected'), # Fund was rejected. ('F', 'Archived'), # Approved funds with all claims and blog posts were processed. No funds are reserved. ('C', 'Cancelled'), # When the fellow decided to cancel their request. - ('X', 'Remove'), # When the fellow decided to remove their request. + ('X', 'Removed'), # When the fellow decided to remove their request. ) #: Set of statuses which constitute an approved fund @@ -64,6 +64,7 @@ 'R': "Your fund request was declided.", 'F': "We archived your fund request since all the expense claims were processed.", 'C': "You decided to cancel this request for any reason.", + 'X': "You decided to remove this request.", } GRANT_HEADING = ( diff --git a/lowfat/templates/lowfat/blog_detail.html b/lowfat/templates/lowfat/blog_detail.html index a7f9c940..7bb2481a 100644 --- a/lowfat/templates/lowfat/blog_detail.html +++ b/lowfat/templates/lowfat/blog_detail.html @@ -17,7 +17,7 @@

Blog Detail (Funding Request ID: {{ blog.fund.id }}) {% endif %} {% if user.is_staff or blog.status == "U" %} Edit - Remove + {% comment %} Remove {% endcomment %} {% endif %} {% endif %}

diff --git a/lowfat/templates/lowfat/blog_review.html b/lowfat/templates/lowfat/blog_review.html index 8dd20080..bfde7105 100644 --- a/lowfat/templates/lowfat/blog_review.html +++ b/lowfat/templates/lowfat/blog_review.html @@ -9,7 +9,7 @@

{% endif %} {% if user.is_staff %} Edit - Remove + {% comment %} Remove {% endcomment %} {% endif %}