From a0adf3c63c09357fbe47592d42b9d19a20099c11 Mon Sep 17 00:00:00 2001 From: Leo Hemsted Date: Fri, 27 Aug 2021 11:44:19 +0100 Subject: [PATCH] add new billing details page contains both signed in and signed out versions (when signed in you can see bank details etc) --- app/main/views/index.py | 13 ++ app/main/views/sub_navigation_dictionaries.py | 4 + app/navigation.py | 1 + app/templates/admin_template.html | 4 + .../pricing/billing-details-signed-out.html | 26 ++++ .../views/pricing/billing-details.html | 128 ++++++++++++++++++ tests/app/main/views/test_index.py | 1 + tests/app/test_navigation.py | 19 ++- 8 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 app/templates/views/pricing/billing-details-signed-out.html create mode 100644 app/templates/views/pricing/billing-details.html diff --git a/app/main/views/index.py b/app/main/views/index.py index 1ca93b295..57d537796 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -81,6 +81,19 @@ def how_to_pay(): ) +@main.route('/pricing/billing-details') +def billing_details(): + if current_user.is_authenticated: + return render_template( + 'views/pricing/billing-details.html', + navigation_links=pricing_nav(), + ) + return render_template( + 'views/pricing/billing-details-signed-out.html', + navigation_links=pricing_nav(), + ) + + @main.route('/delivery-and-failure') @main.route('/features/messages-status') def delivery_and_failure(): diff --git a/app/main/views/sub_navigation_dictionaries.py b/app/main/views/sub_navigation_dictionaries.py index 1d30f6606..7d42937be 100644 --- a/app/main/views/sub_navigation_dictionaries.py +++ b/app/main/views/sub_navigation_dictionaries.py @@ -47,6 +47,10 @@ def pricing_nav(): "name": "How to pay", "link": "main.how_to_pay", }, + { + "name": "Billing details", + "link": "main.billing_details", + }, ] diff --git a/app/navigation.py b/app/navigation.py index 2ceda0b15..15939c553 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -59,6 +59,7 @@ class HeaderNavigation(Navigation): 'pricing': { 'pricing', 'how_to_pay', + 'billing_details', }, 'documentation': { 'documentation', diff --git a/app/templates/admin_template.html b/app/templates/admin_template.html index 55f3a96d3..480a9770e 100644 --- a/app/templates/admin_template.html +++ b/app/templates/admin_template.html @@ -225,6 +225,10 @@ { "href": url_for("main.how_to_pay"), "text": "How to pay" + }, + { + "href": url_for("main.billing_details"), + "text": "Billing details" } ] }, diff --git a/app/templates/views/pricing/billing-details-signed-out.html b/app/templates/views/pricing/billing-details-signed-out.html new file mode 100644 index 000000000..9bb6f4711 --- /dev/null +++ b/app/templates/views/pricing/billing-details-signed-out.html @@ -0,0 +1,26 @@ +{% extends "content_template.html" %} +{% from "components/page-header.html" import page_header %} + +{% block per_page_title %} + Billing details +{% endblock %} + +{% block content_column_content %} + + {{ page_header('Billing details') }} + +

+ Sign in to see our: +

+ + + +

+ You can use this information to add the Cabinet Office as a supplier. Your organisation may need to do this before you can raise a purchase order. +

+ +{% endblock %} diff --git a/app/templates/views/pricing/billing-details.html b/app/templates/views/pricing/billing-details.html new file mode 100644 index 000000000..9ee53b27c --- /dev/null +++ b/app/templates/views/pricing/billing-details.html @@ -0,0 +1,128 @@ +{% extends "content_template.html" %} +{% from "components/page-header.html" import page_header %} + +{% from "components/copy-to-clipboard.html" import copy_to_clipboard %} + +{% block per_page_title %} + Billing details +{% endblock %} + +{% block content_column_content %} + + {{ page_header('Billing details') }} + +

+ You can use the information on this page to add the Cabinet Office as a supplier. Your organisation may need to do this before you can raise a purchase order (PO). +

+ +

+ Contact us if you need any other details. +

+ +

+ Supplier details +

+ +

+ Cabinet Office +

+ +

+ The White Chapel Building
+ 10 Whitechapel High Street
+ London
+ E1 8QS +

+ +

+ Email addresses +

+ + + +

+ VAT number +

+ +
+ {{ copy_to_clipboard( + 'GB 88 88 010 80', + name=None, + thing='VAT number', + ) }} +
+ +

+ Bank details +

+ +

+ National Westminster Bank PLC (part of RBS group)
+ Government Banking Services Branch
+ 2nd Floor
+ 280 Bishopsgate
+ London
+ EC2M 4RB +

+ +

+ Account name +

+ +

+ Cabinet Office +

+ +
+ {{ copy_to_clipboard( + '98765432', + name='Account number', + thing='account number', + ) }} +
+ +
+ {{ copy_to_clipboard( + '01-23-45', + name='Sort code', + thing='sort code', + ) }} +
+ +
+ {{ copy_to_clipboard( + 'GB33BUKB20201555555555', + name='IBAN', + thing='IBAN', + ) }} +
+ +
+ {{ copy_to_clipboard( + 'ABCDEF12', + name='Swift code', + thing='Swift code', + ) }} +
+ +

+ Invoice address +

+ +

+ SSCL – Accounts Receivable
+ PO Box 221
+ Thornton-Cleveleys
+ Blackpool
+ Lancashire
+ FY1 9JN +

+ +{% endblock %} diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py index 998ef65d5..f338c2ff1 100644 --- a/tests/app/main/views/test_index.py +++ b/tests/app/main/views/test_index.py @@ -100,6 +100,7 @@ def test_hiding_pages_from_search_engines( 'guidance_index', 'branding_and_customisation', 'create_and_send_messages', 'edit_and_format_messages', 'send_files_by_email', 'upload_a_letter', 'who_can_use_notify', + 'billing_details', ]) def test_static_pages( client_request, diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py index 5488ea728..0f6e23116 100644 --- a/tests/app/test_navigation.py +++ b/tests/app/test_navigation.py @@ -31,6 +31,7 @@ EXCLUDED_ENDPOINTS = tuple(map(Navigation.get_endpoint_with_blueprint, { 'archive_user', 'bat_phone', 'begin_tour', + 'billing_details', 'branding_and_customisation', 'branding_request', 'broadcast', @@ -371,7 +372,11 @@ navigation_instances = ( ) -@pytest.mark.parametrize('navigation_instance', navigation_instances) +@pytest.mark.parametrize( + 'navigation_instance', + navigation_instances, + ids=(x.__class__.__name__ for x in navigation_instances) +) def test_navigation_items_are_properly_defined(navigation_instance): for endpoint in navigation_instance.endpoints_with_navigation: assert ( @@ -399,7 +404,11 @@ def test_excluded_navigation_items_are_properly_defined(): ), f'{endpoint} found more than once in EXCLUDED_ENDPOINTS' -@pytest.mark.parametrize('navigation_instance', navigation_instances) +@pytest.mark.parametrize( + 'navigation_instance', + navigation_instances, + ids=(x.__class__.__name__ for x in navigation_instances) +) def test_all_endpoints_are_covered(navigation_instance): covered_endpoints = ( navigation_instance.endpoints_with_navigation + @@ -411,7 +420,11 @@ def test_all_endpoints_are_covered(navigation_instance): assert endpoint in covered_endpoints, f'{endpoint} is not listed or excluded' -@pytest.mark.parametrize('navigation_instance', navigation_instances) +@pytest.mark.parametrize( + 'navigation_instance', + navigation_instances, + ids=(x.__class__.__name__ for x in navigation_instances) +) @pytest.mark.xfail(raises=KeyError) def test_raises_on_invalid_navigation_item( client_request, navigation_instance