From daf5fa236f3832ea95ae58faf36947271ce61f24 Mon Sep 17 00:00:00 2001 From: elliottmotson Date: Mon, 21 Feb 2022 21:31:26 +0000 Subject: [PATCH 01/16] issues.html, init.py has /issues, outstanding_payments func hardcoded --- subscribie/blueprints/admin/__init__.py | 10 ++++ .../admin/templates/admin/issues.html | 46 +++++++++++++++++ .../admin/templates/admin/transactions.html | 49 +++++++++---------- 3 files changed, 80 insertions(+), 25 deletions(-) create mode 100644 subscribie/blueprints/admin/templates/admin/issues.html diff --git a/subscribie/blueprints/admin/__init__.py b/subscribie/blueprints/admin/__init__.py index 8e770a08a..7c5021015 100644 --- a/subscribie/blueprints/admin/__init__.py +++ b/subscribie/blueprints/admin/__init__.py @@ -1147,6 +1147,16 @@ def transactions(): person=person, ) +@admin.route("/issues", methods=["GET"]) #Route is "/issues" but may be changed to a more suitable name. Following Issue #773 spec image +@login_required +def outstanding_payments(): + outstanding_number = "1" # Number of outstanding payments overdue/not paid + customer = "John Doe" # Example customer + debt = "1000" # £10.00 + missed = "1" # 1 missed payment + # In this hardcoded example, user John Doe has missed 1 payment of a value of £10 (1000) + return render_template("admin/issues.html",customer=customer,debt=debt,outstanding_number=outstanding_number, missed=missed) + @admin.route("/order-notes", methods=["GET"]) @login_required diff --git a/subscribie/blueprints/admin/templates/admin/issues.html b/subscribie/blueprints/admin/templates/admin/issues.html new file mode 100644 index 000000000..b4652d3cf --- /dev/null +++ b/subscribie/blueprints/admin/templates/admin/issues.html @@ -0,0 +1,46 @@ +{% extends "admin/layout.html" %} +{% block title %} Payments {% endblock %} + +{% block hero %} + +

+ Payments +

+ +{% endblock hero %} + +{% block body %} +
+
+ +
+
+ +
+
+
+ +
+
+

Outstanding Payments

+
+
+
+
    +
  • {{ customer }} - {{ debt }} - Missed {{ missed }} payments.
  • +
+
+
+ +{% endblock body %} diff --git a/subscribie/blueprints/admin/templates/admin/transactions.html b/subscribie/blueprints/admin/templates/admin/transactions.html index 26d22c94b..1075577f2 100644 --- a/subscribie/blueprints/admin/templates/admin/transactions.html +++ b/subscribie/blueprints/admin/templates/admin/transactions.html @@ -1,27 +1,27 @@ -{% extends "admin/layout.html" %} -{% block title %} Payments {% endblock %} - -{% block hero %} - +{% extends "admin/layout.html" %} +{% block title %} Payments {% endblock %} + +{% block hero %} +

Payments -

- -{% endblock hero %} - + + +{% endblock hero %} + {% block body %} -
-
- +
@@ -35,6 +35,7 @@

Search...

+ {% if person %}

All transactions: {{ full_name|capitalize }} ({{ transactions.total }})

@@ -92,7 +93,7 @@

All Transactions ({{ transactions.total }})

Refund {% endif %} - + {{ transaction.external_id }} £{{ "%.2f"|format(transaction.amount/100) }} {{ transaction.external_src }} @@ -146,12 +147,12 @@

All Transactions ({{ transactions.total }})

{% endif %} {% endif %} - + {% else %} ... {% endif %} {% endfor %} - +
  • {% if transactions.has_next %} {% if request.args.get("plan_title") and request.args.get("subscriber_name") %} @@ -172,6 +173,4 @@

    All Transactions ({{ transactions.total }})

    -{% endblock body %} - - +{% endblock body %} From 7798458efaddca00db64f6b86c43db680dd69730 Mon Sep 17 00:00:00 2001 From: elliottmotson Date: Mon, 21 Feb 2022 21:43:09 +0000 Subject: [PATCH 02/16] introduced currencyFilter into issues.html --- subscribie/blueprints/admin/templates/admin/issues.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subscribie/blueprints/admin/templates/admin/issues.html b/subscribie/blueprints/admin/templates/admin/issues.html index b4652d3cf..e17f7e99d 100644 --- a/subscribie/blueprints/admin/templates/admin/issues.html +++ b/subscribie/blueprints/admin/templates/admin/issues.html @@ -38,7 +38,7 @@

    Outstanding Payments


      -
    • {{ customer }} - {{ debt }} - Missed {{ missed }} payments.
    • +
    • {{ customer }} - {{ debt | currencyFormat }} - Missed {{ missed }} payments.
    From 80998a1267f445c3c7b2d4cd724f5af277c4bc4c Mon Sep 17 00:00:00 2001 From: elliottmotson Date: Tue, 22 Feb 2022 19:43:22 +0000 Subject: [PATCH 03/16] Reformatted placeholder vars, introduced "customer" dict, UX improvement --- subscribie/blueprints/admin/__init__.py | 25 ++++++++++++++----- .../admin/templates/admin/issues.html | 4 +-- .../admin/templates/admin/transactions.html | 6 ++++- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/subscribie/blueprints/admin/__init__.py b/subscribie/blueprints/admin/__init__.py index 7c5021015..d8640b473 100644 --- a/subscribie/blueprints/admin/__init__.py +++ b/subscribie/blueprints/admin/__init__.py @@ -1101,6 +1101,10 @@ def invoices(): @login_required def transactions(): + pay_issues = { + "outstanding_number": "1", # Placeholder + } + page = request.args.get("page", 1, type=int) plan_title = request.args.get("plan_title", None) subscriber_name = request.args.get("subscriber_name", None) @@ -1142,7 +1146,7 @@ def transactions(): flash(msg) return render_template( - "admin/transactions.html", + "admin/transactions.html",pay_issues=pay_issues, transactions=query.paginate(page=page, per_page=10), person=person, ) @@ -1150,12 +1154,21 @@ def transactions(): @admin.route("/issues", methods=["GET"]) #Route is "/issues" but may be changed to a more suitable name. Following Issue #773 spec image @login_required def outstanding_payments(): - outstanding_number = "1" # Number of outstanding payments overdue/not paid - customer = "John Doe" # Example customer - debt = "1000" # £10.00 - missed = "1" # 1 missed payment + pay_issues = { + "outstanding_number": "1", # Number of outstanding payments overdue/not paid - Will be calculated from DB + } + + customer = { + "name": "John Doe", # Example customer + "debt": "1000", # £10.00 + "missed": "1", # 1 missed payment + "balance": "0" + } # In this hardcoded example, user John Doe has missed 1 payment of a value of £10 (1000) - return render_template("admin/issues.html",customer=customer,debt=debt,outstanding_number=outstanding_number, missed=missed) + customer["balance"] = int(customer["balance"])-int(customer["debt"]) + + + return render_template("admin/issues.html",customer=customer,pay_issues=pay_issues) @admin.route("/order-notes", methods=["GET"]) diff --git a/subscribie/blueprints/admin/templates/admin/issues.html b/subscribie/blueprints/admin/templates/admin/issues.html index e17f7e99d..5b101c775 100644 --- a/subscribie/blueprints/admin/templates/admin/issues.html +++ b/subscribie/blueprints/admin/templates/admin/issues.html @@ -29,7 +29,7 @@

    @@ -38,7 +38,7 @@

    Outstanding Payments


      -
    • {{ customer }} - {{ debt | currencyFormat }} - Missed {{ missed }} payments.
    • +
    • {{ customer["name"] }} - {{ customer["debt"] | currencyFormat }} - Missed {{ customer["missed"] }} payments. Balance: {{ customer["balance"] | currencyFormat }}
    diff --git a/subscribie/blueprints/admin/templates/admin/transactions.html b/subscribie/blueprints/admin/templates/admin/transactions.html index 1075577f2..0ab4ea750 100644 --- a/subscribie/blueprints/admin/templates/admin/transactions.html +++ b/subscribie/blueprints/admin/templates/admin/transactions.html @@ -35,8 +35,12 @@

    Search...

    - +
    + +
    {% if person %}

    All transactions: {{ full_name|capitalize }} ({{ transactions.total }})

    {% else %} From 34b1102e40cf7ebbcc862a37e01daa1dc4385d2f Mon Sep 17 00:00:00 2001 From: elliottmotson Date: Tue, 22 Feb 2022 21:40:15 +0000 Subject: [PATCH 04/16] Switched to bs cards, jinja2 for card formatting and colour grading --- subscribie/blueprints/admin/__init__.py | 7 +++---- .../blueprints/admin/templates/admin/issues.html | 11 ++++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/subscribie/blueprints/admin/__init__.py b/subscribie/blueprints/admin/__init__.py index d8640b473..ef4611f34 100644 --- a/subscribie/blueprints/admin/__init__.py +++ b/subscribie/blueprints/admin/__init__.py @@ -1161,14 +1161,13 @@ def outstanding_payments(): customer = { "name": "John Doe", # Example customer "debt": "1000", # £10.00 - "missed": "1", # 1 missed payment + "missed": int(1), # 1 missed payment "balance": "0" } + list_control_number=int(1) # This variable controls how many missed payments are considered critical (Card changes to red in list) # In this hardcoded example, user John Doe has missed 1 payment of a value of £10 (1000) customer["balance"] = int(customer["balance"])-int(customer["debt"]) - - - return render_template("admin/issues.html",customer=customer,pay_issues=pay_issues) + return render_template("admin/issues.html",customer=customer,pay_issues=pay_issues,list_control_number=list_control_number) @admin.route("/order-notes", methods=["GET"]) diff --git a/subscribie/blueprints/admin/templates/admin/issues.html b/subscribie/blueprints/admin/templates/admin/issues.html index 5b101c775..c67d7fb3d 100644 --- a/subscribie/blueprints/admin/templates/admin/issues.html +++ b/subscribie/blueprints/admin/templates/admin/issues.html @@ -38,7 +38,16 @@

    Outstanding Payments


      -
    • {{ customer["name"] }} - {{ customer["debt"] | currencyFormat }} - Missed {{ customer["missed"] }} payments. Balance: {{ customer["balance"] | currencyFormat }}
    • +
    • + {% if customer["missed"] > list_control_number %} +
      + {% else %} +
      + {% endif %} +
      {{ customer["name"] }}
      +
      Missed {{ customer["missed"] }} payments worth {{ customer["debt"] | currencyFormat }}
      + Balance: {{ customer["balance"] | currencyFormat }} +
    From dd9b3a133388f106fb5033f7d9d9fd7a8bbf1ae1 Mon Sep 17 00:00:00 2001 From: elliottmotson Date: Wed, 23 Feb 2022 12:47:44 +0000 Subject: [PATCH 05/16] def getpaymentissues() skeleton function to fech outstanding payments --- subscribie/blueprints/admin/__init__.py | 24 ++++----- .../admin/templates/admin/transactions.html | 49 ++++++++++++++----- 2 files changed, 48 insertions(+), 25 deletions(-) diff --git a/subscribie/blueprints/admin/__init__.py b/subscribie/blueprints/admin/__init__.py index ef4611f34..75eb46485 100644 --- a/subscribie/blueprints/admin/__init__.py +++ b/subscribie/blueprints/admin/__init__.py @@ -421,6 +421,7 @@ def cancel_stripe_subscription(subscription_id: str): @admin.route("/dashboard") @login_required def dashboard(): + integration = Integration.query.first() payment_provider = PaymentProvider.query.first() if payment_provider is None: @@ -447,9 +448,15 @@ def dashboard(): num_active_subscribers=num_active_subscribers, num_subscribers=num_subscribers, num_signups=num_signups, - num_one_off_purchases=num_one_off_purchases, + num_one_off_purchases=num_one_off_purchases,pay_issues=getpaymentissues() ) +def getpaymentissues(): + pay_issues = { + "outstanding_number": "1", # Placeholder + } + return pay_issues + @admin.route("/edit", methods=["GET", "POST"]) @login_required @@ -1101,9 +1108,6 @@ def invoices(): @login_required def transactions(): - pay_issues = { - "outstanding_number": "1", # Placeholder - } page = request.args.get("page", 1, type=int) plan_title = request.args.get("plan_title", None) @@ -1146,18 +1150,14 @@ def transactions(): flash(msg) return render_template( - "admin/transactions.html",pay_issues=pay_issues, - transactions=query.paginate(page=page, per_page=10), - person=person, + "admin/transactions.html", + transactions=query.paginate(page=page,per_page=10), + person=person,pay_issues=getpaymentissues() ) @admin.route("/issues", methods=["GET"]) #Route is "/issues" but may be changed to a more suitable name. Following Issue #773 spec image @login_required def outstanding_payments(): - pay_issues = { - "outstanding_number": "1", # Number of outstanding payments overdue/not paid - Will be calculated from DB - } - customer = { "name": "John Doe", # Example customer "debt": "1000", # £10.00 @@ -1167,7 +1167,7 @@ def outstanding_payments(): list_control_number=int(1) # This variable controls how many missed payments are considered critical (Card changes to red in list) # In this hardcoded example, user John Doe has missed 1 payment of a value of £10 (1000) customer["balance"] = int(customer["balance"])-int(customer["debt"]) - return render_template("admin/issues.html",customer=customer,pay_issues=pay_issues,list_control_number=list_control_number) + return render_template("admin/issues.html",customer=customer,pay_issues=getpaymentissues(),list_control_number=list_control_number) @admin.route("/order-notes", methods=["GET"]) diff --git a/subscribie/blueprints/admin/templates/admin/transactions.html b/subscribie/blueprints/admin/templates/admin/transactions.html index 0ab4ea750..9f8409da8 100644 --- a/subscribie/blueprints/admin/templates/admin/transactions.html +++ b/subscribie/blueprints/admin/templates/admin/transactions.html @@ -10,6 +10,22 @@

    {% endblock hero %} {% block body %} + + +{% if pay_issues["outstanding_number"] == "0" %} + +{% elif pay_issues["outstanding_number"] == "1" %} + +{% else %} + +{% endif %} +

  • From 51fd8052aa08d7fd3dff157fcb9cfafe0f61ed6d Mon Sep 17 00:00:00 2001 From: chrisjsimpson Date: Sun, 31 Dec 2023 23:48:19 +0000 Subject: [PATCH 16/16] wip #773 Easily see failed payments per subscriber --- requirements.txt | 1 + subscribie/blueprints/admin/__init__.py | 60 ++++---- subscribie/blueprints/admin/invoice.py | 83 ++++++++++- subscribie/blueprints/admin/subscriber.py | 16 +++ .../admin/templates/admin/dashboard.html | 21 --- .../admin/invoice/failed_invoices.html | 133 +++++++++++++----- .../admin/subscriber/show_subscriber.html | 78 ++++++++-- .../admin/templates/admin/transactions.html | 24 ---- subscribie/blueprints/subscriber/__init__.py | 17 +++ .../templates/subscriber/account.html | 73 +++++++++- subscribie/models.py | 2 +- subscribie/utils.py | 6 +- 12 files changed, 377 insertions(+), 137 deletions(-) diff --git a/requirements.txt b/requirements.txt index e9afbec06..1de30693d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ graphlib wheel Flask>=2,<3 flask_cors +Werkzeug==2.0.3 Flask-Reuploaded==0.3.2 Flask-WTF==1.0.0 email-validator==1.1.3 diff --git a/subscribie/blueprints/admin/__init__.py b/subscribie/blueprints/admin/__init__.py index c8eba83ac..d991b8dd0 100644 --- a/subscribie/blueprints/admin/__init__.py +++ b/subscribie/blueprints/admin/__init__.py @@ -31,7 +31,6 @@ get_stripe_invoices, currencyFormat, get_shop_default_country_code, - get_payment_issues, ) from subscribie.forms import ( TawkConnectForm, @@ -119,6 +118,16 @@ def dec2pence(amount): return int(math.ceil(float(amount) * 100)) +def ordinal(n): + """ + Convert 1 -> 1st, 2 -> 2nd etc... + Credit Dr. Drang 2020 https://leancrew.com/all-this/2020/06/ordinals-in-python/ + """ + return str(n) + ( + "th" if 4 <= n % 100 <= 20 else {1: "st", 2: "nd", 3: "rd"}.get(n % 10, "th") + ) # noqa: E501 + + @admin.app_template_filter() def timestampToDate(timestamp: str): if timestamp is None: @@ -126,6 +135,24 @@ def timestampToDate(timestamp: str): return datetime.fromtimestamp(int(timestamp)).strftime("%d-%m-%Y") +def dtStylish(dt, f): + """ + Add "nd", "th" and "rd" to date formatting for + human readable dates. + Credit https://stackoverflow.com/a/16671271 + """ + return dt.strftime(f).replace("{th}", ordinal(dt.day)) + + +@admin.app_template_filter() +def timestampToHumanReadableDate(timestamp: str): + if timestamp is None: + return None + dt = datetime.fromtimestamp(int(timestamp)) + + return dtStylish(dt, "{th} %B %Y") + + def store_stripe_transaction(stripe_external_id): """Store Stripe invoice payment in transactions table""" stripe.api_key = get_stripe_secret_key() @@ -479,7 +506,6 @@ def dashboard(): num_one_off_purchases=num_one_off_purchases, shop_default_country_code=shop_default_country_code, saas_url=saas_url, - pay_issues=get_payment_issues(), ) @@ -1412,40 +1438,10 @@ def transactions(): "admin/transactions.html", transactions=query.paginate(page=page, per_page=10), person=person, - pay_issues=get_payment_issues(), action=action, ) -@admin.route("/issues", methods=["GET"]) -@login_required -def outstanding_payments(): - """Route is "/issues" but may be changed to a more suitable name. - Ref Issue #773 - """ - customer = { - "name": "John Doe", # Example customer - "debt": "1000", # £10.00 - "missed": int(1), # 1 missed payment - "balance": "0", - } - # Global threshold how many missed payments are considered critical - # (UI changes to red) - global_num_missed_payments_threshold = os.getenv( - "GLOBAL_NUM_MISSED_PAYMENTS_THRESHOLD", 1 - ) - - # In this hardcoded example, user John Doe has missed 1 - # payment of a value of £10 (1000) - customer["balance"] = int(customer["balance"]) - int(customer["debt"]) - return render_template( - "admin/issues.html", - customer=customer, - pay_issues=get_payment_issues(), - global_num_missed_payments_threshold=global_num_missed_payments_threshold, - ) - - @admin.route("/order-notes", methods=["GET"]) @login_required def order_notes(): diff --git a/subscribie/blueprints/admin/invoice.py b/subscribie/blueprints/admin/invoice.py index 2de03022b..a7dc4243d 100644 --- a/subscribie/blueprints/admin/invoice.py +++ b/subscribie/blueprints/admin/invoice.py @@ -1,14 +1,15 @@ from . import admin +import json import logging from subscribie.auth import login_required, stripe_connect_id_required from subscribie.database import database -from subscribie.models import UpcomingInvoice, Subscription +from subscribie.models import UpcomingInvoice, Subscription, StripeInvoice, Person from subscribie.utils import ( get_stripe_secret_key, get_stripe_connect_account, + get_stripe_connect_account_id, ) from subscribie.utils import ( - getBadInvoices, get_stripe_invoices, ) from flask import render_template, flash, request, redirect, url_for @@ -21,13 +22,87 @@ @login_required @stripe_connect_id_required def failed_invoices(): + stripe.api_key = get_stripe_secret_key() + stripe_connect_account_id = get_stripe_connect_account_id() if "refreshFailedInvoices" in request.args: flash("Invoice statuses are being refreshed") get_stripe_invoices() - badInvoices = getBadInvoices() + # Get failed invoices, grouped by person and their invoices + failedInvoices = ( + database.session.query(StripeInvoice) + .join(Subscription, StripeInvoice.subscribie_subscription) + .join(Person, Subscription.person) + .group_by(Person.id, StripeInvoice.id) + .where(StripeInvoice.status == "open") + .where(StripeInvoice.next_payment_attempt == None) # noqa: E711 + .execution_options(include_archived=True) + .order_by(Person.given_name) + .all() + ) + # Build dictionary of person uuid -> (bad) invoices so + # that it's easier for template to display bad invoices broken down + # per person + subscribersWithFailedInvoicesMap = {} + + for failedInvoice in failedInvoices: + # Populate map with each Person.uuid + if ( + failedInvoice.subscribie_subscription.person.uuid + not in subscribersWithFailedInvoicesMap + ): + # Create person uuid key in map + subscribersWithFailedInvoicesMap[ + failedInvoice.subscribie_subscription.person.uuid + ] = {} + # Create empty list to store persons bad invoices + subscribersWithFailedInvoicesMap[ + failedInvoice.subscribie_subscription.person.uuid + ]["failedInvoices"] = [] + + # Create reference to person object via invoice reference + subscribersWithFailedInvoicesMap[ + failedInvoice.subscribie_subscription.person.uuid + ]["person"] = failedInvoice.subscribie_subscription.person + + # Add hosted_invoice_url attribute to invoice + try: + stripe_invoice = stripe.Invoice.retrieve( + id=failedInvoice.id, stripe_account=stripe_connect_account_id + ) + setattr( + failedInvoice, + "hosted_invoice_url", + stripe_invoice.hosted_invoice_url, + ) + except Exception as e: + log.error( + f"Unable to get/set hosted_invoice_url for invoice: {failedInvoice.id}. {e}" # noqa: E501 + ) + + # Get stripe_decline_code if possible + try: + stripeRawInvoice = json.loads(failedInvoice.stripe_invoice_raw_json) + + payment_intent_id = stripeRawInvoice["payment_intent"] + stripe_decline_code = stripe.PaymentIntent.retrieve( + payment_intent_id, + stripe_account=stripe_connect_account_id, + ).last_payment_error.decline_code + setattr(failedInvoice, "stripe_decline_code", stripe_decline_code) + except Exception as e: + log.debug( + f"Failed to get stripe_decline_code for invoice {failedInvoice.id}. Exeption: {e}" # noqa: E501 + ) + + # Insert invoices per person + subscribersWithFailedInvoicesMap[ + failedInvoice.subscribie_subscription.person.uuid + ]["failedInvoices"].append(failedInvoice) + return render_template( - "admin/invoice/failed_invoices.html", badInvoices=badInvoices + "admin/invoice/failed_invoices.html", + debtors=subscribersWithFailedInvoicesMap, ) diff --git a/subscribie/blueprints/admin/subscriber.py b/subscribie/blueprints/admin/subscriber.py index f0224da2e..07bb73ab0 100644 --- a/subscribie/blueprints/admin/subscriber.py +++ b/subscribie/blueprints/admin/subscriber.py @@ -2,6 +2,8 @@ from subscribie.auth import login_required from subscribie.models import Person from flask import render_template +from subscribie.utils import get_stripe_secret_key, get_stripe_connect_account, get_stripe_connect_account_id +import stripe import logging log = logging.getLogger(__name__) @@ -10,9 +12,21 @@ @admin.route("/show-subscriber/", methods=["GET", "POST"]) @login_required def show_subscriber(subscriber_id): + stripe.api_key = get_stripe_secret_key() + stripe_connect_account_id = get_stripe_connect_account_id() + person = Person.query.execution_options(include_archived=True).get(subscriber_id) customer_balance_list = person.balance() # See models.py 'class Person' invoices = person.invoices() + open_invoices = person.failed_invoices() + # Add hosted_invoice_url attribute to all open invoices + try: + for index, open_invoice in enumerate(open_invoices): + stripe_invoice = stripe.Invoice.retrieve(id=open_invoice.id, stripe_account=stripe_connect_account_id) + setattr(open_invoices[index], 'hosted_invoice_url', stripe_invoice.hosted_invoice_url) + except Exception as e: + log.error(f"Unable to get/set hosted_invoice_url for invoice: {open_invoice.id}. {e}") + # Try to be helpful to the shop owner by highlighting recent payment # payment stripe_decline_code errors (if any). collection_decline_codes = [] @@ -21,10 +35,12 @@ def show_subscriber(subscriber_id): collection_decline_codes.append(invoice.stripe_decline_code) except AttributeError: pass + return render_template( "admin/subscriber/show_subscriber.html", person=person, invoices=invoices, + open_invoices=open_invoices, customer_balance_list=customer_balance_list, collection_decline_codes=set(collection_decline_codes), ) diff --git a/subscribie/blueprints/admin/templates/admin/dashboard.html b/subscribie/blueprints/admin/templates/admin/dashboard.html index 8c7c63645..d68dd8a0b 100644 --- a/subscribie/blueprints/admin/templates/admin/dashboard.html +++ b/subscribie/blueprints/admin/templates/admin/dashboard.html @@ -5,27 +5,6 @@

    Manage My Shop

    -{% if pay_issues["outstanding_number"] == "0" %} - -{% elif pay_issues["outstanding_number"] == "1" %} - - -{% else %} - -{% endif %} - - - - -