From 5bb0c4cddaea79e08d3d466bf69147ad8aa053ae Mon Sep 17 00:00:00 2001 From: Amal Elshihaby Date: Wed, 4 Aug 2021 12:03:55 +0200 Subject: [PATCH] Add the invoice template --- .gitignore | 1 + .../static/matrixhosting/css/invoice.css | 113 ++++++++++ .../static/matrixhosting/images/call.png | Bin 0 -> 3507 bytes .../matrixhosting/images/company-large.jpg | Bin 0 -> 40282 bytes .../matrixhosting/images/company-small.jpg | Bin 0 -> 14046 bytes .../static/matrixhosting/images/home.png | Bin 0 -> 3643 bytes .../static/matrixhosting/images/msg.png | Bin 0 -> 4654 bytes .../static/matrixhosting/images/twitter.png | Bin 0 -> 4821 bytes .../static/matrixhosting/js/payment.js | 45 +++- .../matrixhosting/webfonts/Avenir-Book.ttf | Bin 0 -> 79516 bytes .../templates/matrixhosting/base.html | 8 +- .../templates/matrixhosting/invoice.html | 200 ++++++++++++++---- .../matrixhosting/order_confirmation.html | 6 +- .../matrixhosting/order_details.html | 12 +- .../matrixhosting/order_success.html | 3 - matrixhosting/urls.py | 2 +- matrixhosting/utils.py | 19 -- matrixhosting/views.py | 52 +++-- requirements.txt | 3 +- uncloud/settings.py | 7 +- .../migrations/0025_auto_20210803_2118.py | 24 +++ .../0026_remove_order_description.py | 17 ++ uncloud_pay/models.py | 40 +++- uncloud_pay/utils.py | 6 +- 24 files changed, 462 insertions(+), 96 deletions(-) create mode 100644 matrixhosting/static/matrixhosting/css/invoice.css create mode 100644 matrixhosting/static/matrixhosting/images/call.png create mode 100644 matrixhosting/static/matrixhosting/images/company-large.jpg create mode 100644 matrixhosting/static/matrixhosting/images/company-small.jpg create mode 100644 matrixhosting/static/matrixhosting/images/home.png create mode 100644 matrixhosting/static/matrixhosting/images/msg.png create mode 100644 matrixhosting/static/matrixhosting/images/twitter.png create mode 100644 matrixhosting/static/matrixhosting/webfonts/Avenir-Book.ttf create mode 100644 uncloud_pay/migrations/0025_auto_20210803_2118.py create mode 100644 uncloud_pay/migrations/0026_remove_order_description.py diff --git a/.gitignore b/.gitignore index ec901a3..5c039d9 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ dist/ *.iso *.sqlite3 .DS_Store +static/CACHE/ diff --git a/matrixhosting/static/matrixhosting/css/invoice.css b/matrixhosting/static/matrixhosting/css/invoice.css new file mode 100644 index 0000000..60ee335 --- /dev/null +++ b/matrixhosting/static/matrixhosting/css/invoice.css @@ -0,0 +1,113 @@ +body { + font-family: Avenir; + background: white; + font-weight: 500; + line-height: 1.1em; + font-size: 16px; + margin: auto; +} +p { + display: block; + -webkit-margin-before: 14px; + -webkit-margin-after: 14px; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} +.bold { + font-weight: bold; +} +.d1 { + line-height:1.1em; + width: 60%; + float: left; +} +.d2 { + line-height:1.5em; + padding-top: 15px; + width: 40%; + float: left; +} +.d4 { + line-height:1.5em; + width:40%; + float: left; +} +.b1 { + width: 45%; + float: left; +} +.b2 { + width: 55%; + float: left; + text-align: right; + left: 0; +} +.d5 { + width: 100%; +} +.d6 { + width: 68%; + float: left; + font-size: 13px; +} +.d7 { + width: 32%; + float: left; +} +.wf { + width: 100%; +} +hr { + border: 0; + clear:both; + display: inline-block; + width: 100%; + background-color:gray; + height: 1px; + } + .tl { + text-align: left; + margin-left: 5px; + } + + .tr { + text-align: right; + margin-right: 5px; + float: right; + } + .tc { + text-align: center; + } + .pc p { + display: block; + -webkit-margin-before: 3px; + -webkit-margin-after: 5px; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} + .th { + border-top: 1px solid gray; + border-bottom: 1px solid gray; + + } + .ts { + font-size: 14px; + } + .icon { + width: 16px; + height: 14px; + vertical-align: middle; + margin-right: 2px; + } + .footer { + margin-top: 70px; + font-size: 14px; + } + + .footer p { + display: block; + -webkit-margin-before: 5px; + -webkit-margin-after: 5px; + -webkit-margin-start: 0px; + -webkit-margin-end: 0px; +} \ No newline at end of file diff --git a/matrixhosting/static/matrixhosting/images/call.png b/matrixhosting/static/matrixhosting/images/call.png new file mode 100644 index 0000000000000000000000000000000000000000..e774362528ae31636b9136ba2ff6441b2b5e7b6d GIT binary patch literal 3507 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 literal 0 HcmV?d00001 diff --git a/matrixhosting/static/matrixhosting/images/company-large.jpg b/matrixhosting/static/matrixhosting/images/company-large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32d48cd7fd536c938fd763a940684972fb0eae69 GIT binary patch literal 40282 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 N002ovPDHLkV1m+}xikO( literal 0 HcmV?d00001 diff --git a/matrixhosting/static/matrixhosting/images/msg.png b/matrixhosting/static/matrixhosting/images/msg.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7b0c70b77b0b5ebde9f9be8d18b80c41223cb2 GIT binary patch literal 4654 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 literal 0 HcmV?d00001 diff --git a/matrixhosting/static/matrixhosting/images/twitter.png b/matrixhosting/static/matrixhosting/images/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..4db6da08d64c20d74b5d17052126bcaf6bc12b23 GIT binary patch literal 4821 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 literal 0 HcmV?d00001 diff --git a/matrixhosting/static/matrixhosting/js/payment.js b/matrixhosting/static/matrixhosting/js/payment.js index 14d806e..6fdf6fd 100644 --- a/matrixhosting/static/matrixhosting/js/payment.js +++ b/matrixhosting/static/matrixhosting/js/payment.js @@ -8,7 +8,50 @@ function setBrandIcon(brand) { brandIconElement.classList.add(pfClass); } +function fetch_pricing() { + var url = '/pricing/' + $('input[name="pricing_name"]').val() + '/calculate/'; + var cores = $('#cores').val(); + var memory = $('#memory').val(); + var storage = $('#storage').val(); + $.ajax({ + type: 'GET', + url: url, + data: { cores: cores, memory: memory, storage: storage}, + dataType: 'json', + success: function (data) { + if (data && data['total']) { + $('#total').text(data['total']); + } + } + }); +}; + +function incrementValue(e) { + var valueElement = $(e.target).parent().parent().find('input'); + var step = $(valueElement).attr('step'); + var min = parseInt($(valueElement).attr('min')); + var max = parseInt($(valueElement).attr('max')); + var new_value = 0; + if (e.data.inc == 1) { + new_value = Math.min(parseInt($(valueElement).val()) + parseInt(step) * e.data.inc, max); + } else { + new_value = Math.max(parseInt($(valueElement).val()) + parseInt(step) * e.data.inc, min); + } + $(valueElement).val(new_value); + fetch_pricing(); + return false; +}; + + $(document).ready(function () { + if ($('#pricing_name') != undefined) { + fetch_pricing(); + } + + $('.fa-plus-circle.right').bind('click', {inc: 1}, incrementValue); + + $('.fa-minus-circle.left').bind('click', {inc: -1}, incrementValue); + var hasCreditcard = window.hasCreditcard || false; if (hasCreditcard && window.stripeKey) { var stripe = Stripe(window.stripeKey); @@ -154,7 +197,7 @@ $(document).ready(function () { }); $('#checkout-btn').click(function () { - if($('input[name="payment_card"]:checked').size() == 1) { + if($('input[name="payment_card"]:checked').length == 1) { var id = $('input[name="payment_card"]:checked').val(); if (id != 'new') { $('#id_card').val(id); diff --git a/matrixhosting/static/matrixhosting/webfonts/Avenir-Book.ttf b/matrixhosting/static/matrixhosting/webfonts/Avenir-Book.ttf new file mode 100644 index 0000000000000000000000000000000000000000..84ae9145bd703da210c8cc936e06da184b7989f1 GIT binary patch literal 79516 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 CE=`O8 literal 0 HcmV?d00001 diff --git a/matrixhosting/templates/matrixhosting/base.html b/matrixhosting/templates/matrixhosting/base.html index fa4adcf..dcda82d 100644 --- a/matrixhosting/templates/matrixhosting/base.html +++ b/matrixhosting/templates/matrixhosting/base.html @@ -1,4 +1,4 @@ -{% load static i18n %} {% get_current_language as LANGUAGE_CODE %} +{% load static compress i18n %} {% get_current_language as LANGUAGE_CODE %} @@ -22,11 +22,13 @@ type="text/css" /> + {% compress css %} + {% endcompress %} {% block css_extra %} {% endblock css_extra %} @@ -55,6 +57,8 @@ {% block js_extra %} {% endblock js_extra %} - + {% compress js %} + + {% endcompress %} diff --git a/matrixhosting/templates/matrixhosting/invoice.html b/matrixhosting/templates/matrixhosting/invoice.html index 827fae7..dbe8b96 100644 --- a/matrixhosting/templates/matrixhosting/invoice.html +++ b/matrixhosting/templates/matrixhosting/invoice.html @@ -1,49 +1,171 @@ {% load static i18n %} -{% get_current_language as LANGUAGE_CODE %} - + - - - - - - - Hosting Invoice - - - - - - - + + + + {%trans "Invoice: " %} {{bill.id}} + + - -
- -
-
-
- -
-
-

Invoice

-
-
-
-
- - -
-
- -
-
+
+ +
+
+ +
+
+ ungleich glarus ag +
+ Bahnhofstrasse 1
+ 8783 Linthal
+ Switzerland +
+
+
+ +
+ + {{bill.billing_address.full_name}} + +
+ + {{bill.billing_address.owner.email}} +
+ {{bill.billing_address.street}}
+ {{bill.billing_address.city}}
+ {{bill.billing_address.get_country_display}} +
+
+
+
+
+
+ {%trans "Date of invoice:" %} +
+ +
+ {{bill.starting_date|date}} +
+
+
+
+
+ {%trans "Invoice Number:" %} +
+
+ #{{bill.id}} +
+
+
+
+ {%trans "Due Date:" %} + +
+
+ {{bill.due_date}} + +
+
+
+
+
+
+
+ {%trans "INVOICE" %} + {{bill.starting_date|date:"m-Y"}} +
+
+ + + + + + + + + {% for record in bill.bill_records.all %} + + + + + + {% endfor %} +
{%trans "Product" %}{%trans "Quantity" %}{%trans "Amount in " %} CHF
+ {{record.description}} + + {{record.quantity}} + + {{record.subtotal}} +
+
+
+

+ SubTotal + {{bill.subtotal}} + +

+

+ {{vat_rate}} + {{tax_amount}} + +

+
+
+

+ {%trans "CHF" %} + {{bill.sum}} +

+
+
+
+
+ \ No newline at end of file diff --git a/matrixhosting/templates/matrixhosting/order_confirmation.html b/matrixhosting/templates/matrixhosting/order_confirmation.html index e8f9799..b7899e2 100644 --- a/matrixhosting/templates/matrixhosting/order_confirmation.html +++ b/matrixhosting/templates/matrixhosting/order_confirmation.html @@ -1,6 +1,6 @@ {% extends "matrixhosting/base.html" %} -{% load static i18n %} +{% load static compress i18n %} {% block title %} Request Details {% endblock %} @@ -130,7 +130,7 @@

{% trans "VAT for" %} {{pricing.vat_country}} ({{pricing.vat_percent}}%)

-

CHF

+

{{pricing.vat_amount}} CHF

@@ -203,5 +203,7 @@ aria-hidden="true" data-backdrop="static" data-keyboard="false"> + {% compress js %} + {% endcompress %} {% endblock js_extra %} \ No newline at end of file diff --git a/matrixhosting/templates/matrixhosting/order_details.html b/matrixhosting/templates/matrixhosting/order_details.html index 799f89c..3654341 100644 --- a/matrixhosting/templates/matrixhosting/order_details.html +++ b/matrixhosting/templates/matrixhosting/order_details.html @@ -1,6 +1,6 @@ {% extends "matrixhosting/base.html" %} -{% load static i18n %} +{% load static compress i18n %} {% block title %} Request Details {% endblock %} @@ -196,7 +196,7 @@ {% endif %}
-
{{request.session.pricing.total|floatformat}}CHF
+
{{request.session.pricing.total|floatformat}}CHF

@@ -269,7 +269,9 @@ (function () { window.stripeKey = "{{stripe_key}}"; window.current_lan = "{{LANGUAGE_CODE}}"; - window.hasCreditcard = "{{show_cards}}"; + {% if show_cards %} + window.hasCreditcard = true; + {% endif %} })(); {%endif%} @@ -278,5 +280,7 @@ - + {% compress js %} + + {% endcompress %} {% endblock js_extra %} \ No newline at end of file diff --git a/matrixhosting/templates/matrixhosting/order_success.html b/matrixhosting/templates/matrixhosting/order_success.html index 2492cac..d5ab677 100644 --- a/matrixhosting/templates/matrixhosting/order_success.html +++ b/matrixhosting/templates/matrixhosting/order_success.html @@ -50,7 +50,4 @@ {% endblock %} {% block js_extra %} - - - {% endblock js_extra %} \ No newline at end of file diff --git a/matrixhosting/urls.py b/matrixhosting/urls.py index 6954e11..f98ba4d 100644 --- a/matrixhosting/urls.py +++ b/matrixhosting/urls.py @@ -1,7 +1,7 @@ from django.urls import path, include from django.conf import settings from django.conf.urls.static import static - +from wkhtmltopdf.views import PDFTemplateView from .views import * app_name = 'matrixhosting' diff --git a/matrixhosting/utils.py b/matrixhosting/utils.py index 61fb46b..e69de29 100644 --- a/matrixhosting/utils.py +++ b/matrixhosting/utils.py @@ -1,19 +0,0 @@ -import os -from io import BytesIO -from django.http import HttpResponse -from django.template.loader import get_template -from django.conf import settings - -from xhtml2pdf import pisa - -def render_to_pdf(template_src, context_dict={}): - template = get_template(template_src) - html = template.render(context_dict) - result = BytesIO() - # pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")), result) - links = lambda uri, rel: os.path.join(settings.MEDIA_ROOT, uri.replace(settings.MEDIA_URL, '')) - pdf = pisa.pisaDocument(BytesIO(html.encode("ISO-8859-1")),dest=result) - - if not pdf.err: - return HttpResponse(result.getvalue(), content_type='application/pdf') - return None \ No newline at end of file diff --git a/matrixhosting/views.py b/matrixhosting/views.py index b25e6e3..7cd0c2a 100644 --- a/matrixhosting/views.py +++ b/matrixhosting/views.py @@ -17,6 +17,7 @@ from django.conf import settings from django.http import ( HttpResponseRedirect, JsonResponse, HttpResponse ) +from wkhtmltopdf.views import PDFTemplateResponse from rest_framework import viewsets, permissions from uncloud_pay.models import PricingPlan @@ -27,7 +28,7 @@ from uncloud_pay.selectors import get_billing_address_for_user, has_enough_balan import uncloud_pay.stripe as uncloud_stripe from .models import VMInstance from .serializers import * -from .utils import render_to_pdf +from .utils import * logger = logging.getLogger(__name__) @@ -195,6 +196,7 @@ class OrderDetailsView(DetailView): request.session.get('order')) if order: bill = Bill.create_next_bill_for_user_address(billing_address) + self.request.session['bill_id'] = bill.id payment= Payment.withdraw(owner=request.user, amount=total, notes=f"BILL #{bill.id}") if payment: #Close the bill as the payment has been added @@ -244,26 +246,40 @@ class OrderSuccessView(DetailView): 'order': self.request.session.get('order'), 'balance': get_balance_for_user(self.request.user) } - # if ('order' not in request.session): - # return HttpResponseRedirect(reverse('matrix:index')) + if ('order' not in request.session): + return HttpResponseRedirect(reverse('matrix:index')) return render(request, self.template_name, context) class InvoiceDownloadView(View): - def get(self, request, *args, **kwargs): - data = { - 'today': datetime.date.today(), - 'amount': 39.99, - 'customer_name': 'Cooper Mann', - 'order_id': 1233434, - } - pdf = render_to_pdf('matrixhosting/invoice.html', data) - if pdf: - response = HttpResponse(pdf, content_type='application/pdf') - content = "inline; filename=invoice.pdf" - content = "attachment; filename=invoice.pdf" - response['Content-Disposition'] = content - return response - return HttpResponse("Not found") + template = 'matrixhosting/invoice.html' + filename = 'invoice.pdf' + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super().dispatch(*args, **kwargs) + + def get_context_data(self, **kwargs): + context = {'base_url': f'{self.request.scheme}://{self.request.get_host()}'} + bill = Bill.objects.get(id=self.request.session.get('bill_id')) + if bill: + context['bill'] = bill + context['vat_rate'] = str(round(bill.vat_rate * 100, 2)) + '%' + context['tax_amount'] = round(bill.vat_rate * bill.subtotal, 2) + return context + + def get(self, request): + cmd_options = { + 'page_height': 240, + 'page_width':175, + 'orientation': 'Portrait', + 'header_spacing': 65, + 'header_line': False + } + return PDFTemplateResponse(request=request, + template=self.template, + filename = self.filename, + cmd_options= cmd_options, + context= self.get_context_data()) class Dashboard(ListView): diff --git a/requirements.txt b/requirements.txt index 575a52a..7517d42 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,8 +7,9 @@ fontawesome-free psycopg2 ldap3 django-allauth +django-compressor xmltodict -xhtml2pdf +django-wkhtmltopdf parsedatetime # Follow are for creating graph models pyparsing diff --git a/uncloud/settings.py b/uncloud/settings.py index 86e0942..c5567c0 100644 --- a/uncloud/settings.py +++ b/uncloud/settings.py @@ -62,6 +62,8 @@ INSTALLED_APPS = [ 'django.contrib.sites', 'django.contrib.staticfiles', 'django_extensions', + 'compressor', + 'wkhtmltopdf', 'rest_framework', 'django_q', 'notifications', @@ -90,6 +92,7 @@ MIDDLEWARE = [ ] ROOT_URLCONF = 'uncloud.urls' +WKHTMLTOPDF_CMD = "/usr/local/bin/wkhtmltopdf" TEMPLATES = [ { @@ -188,11 +191,13 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.0/howto/static-files/ STATIC_URL = '/static/' -STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ] +STATIC_ROOT = os.path.join(BASE_DIR, "static") STATICFILES_FINDERS = [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + 'compressor.finders.CompressorFinder', ] +COMPRESS_ENABLED = True #VM Deployment TEMPLATE GITLAB_SERVER = env('GITLAB_SERVER') diff --git a/uncloud_pay/migrations/0025_auto_20210803_2118.py b/uncloud_pay/migrations/0025_auto_20210803_2118.py new file mode 100644 index 0000000..5be92a5 --- /dev/null +++ b/uncloud_pay/migrations/0025_auto_20210803_2118.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.4 on 2021-08-03 21:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('uncloud_pay', '0024_auto_20210730_1441'), + ] + + operations = [ + migrations.AlterField( + model_name='billrecord', + name='bill', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bill_records', to='uncloud_pay.bill'), + ), + migrations.AlterField( + model_name='payment', + name='type', + field=models.CharField(choices=[('withdraw', 'Withdraw Money'), ('deposit', 'Deposit Money')], default='deposit', max_length=256), + ), + ] diff --git a/uncloud_pay/migrations/0026_remove_order_description.py b/uncloud_pay/migrations/0026_remove_order_description.py new file mode 100644 index 0000000..c81cdfe --- /dev/null +++ b/uncloud_pay/migrations/0026_remove_order_description.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.4 on 2021-08-03 21:40 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('uncloud_pay', '0025_auto_20210803_2118'), + ] + + operations = [ + migrations.RemoveField( + model_name='order', + name='description', + ), + ] diff --git a/uncloud_pay/models.py b/uncloud_pay/models.py index e45db0d..d5ccedb 100644 --- a/uncloud_pay/models.py +++ b/uncloud_pay/models.py @@ -649,8 +649,6 @@ class Order(models.Model): customer = models.ForeignKey(StripeCustomer, on_delete=models.CASCADE, null=True) - description = models.TextField() - product = models.ForeignKey(Product, blank=False, null=False, on_delete=models.CASCADE) config = models.JSONField() @@ -806,6 +804,19 @@ class Order(models.Model): @property def is_one_time(self): return not self.is_recurring + + @property + def description(self): + desc = self.product.description + "( " + config = json.loads(self.config) + if config and config["cores"]: + desc = f"{desc} {config['cores']} Cores," + if config and config["memory"]: + desc = f"{desc} {config['memory']} RAM," + if config and config["storage"]: + desc = f"{desc} {config['storage']} GB SSD," + desc += " )" + return desc def replace_with(self, new_order): new_order.replaces = self @@ -1011,6 +1022,11 @@ class Bill(models.Model): bill_records = BillRecord.objects.filter(bill=self) return sum([ br.sum for br in bill_records ]) + @property + def subtotal(self): + bill_records = BillRecord.objects.filter(bill=self) + return sum([ br.subtotal for br in bill_records ]) + @property def vat_rate(self): return VATRate.get_vat_rate(self.billing_address, when=self.ending_date) @@ -1114,7 +1130,7 @@ class BillRecord(models.Model): Entry of a bill, dynamically generated from an order. """ - bill = models.ForeignKey(Bill, on_delete=models.CASCADE) + bill = models.ForeignKey(Bill, on_delete=models.CASCADE, related_name='bill_records') order = models.ForeignKey(Order, on_delete=models.CASCADE) creation_date = models.DateTimeField(auto_now_add=True) @@ -1142,12 +1158,30 @@ class BillRecord(models.Model): else: return self.order.one_time_price + @property + def description(self): + if self.order: + return self.order.description + return '' + @property def price(self): if self.is_recurring_record: return self.order.recurring_price else: return self.order.one_time_price + + @property + def subtotal(self): + billing_address_ins = self.order.billing_address + vat_rate = VATRate.get_vat_rate(billing_address_ins) + vat_validation_status = "verified" if billing_address_ins.vat_number_validated_on and billing_address_ins.vat_number_verified else False + config = json.loads(self.order.config) + pricing = uncloud_pay.utils.get_order_total_with_vat( + config["cores"], config["memory"], config["storage"], self.order.pricing_plan.name, + vat_rate=vat_rate * 100, vat_validation_status = vat_validation_status + ) + return pricing['subtotal_after_discount'] def __str__(self): if self.is_recurring_record: diff --git a/uncloud_pay/utils.py b/uncloud_pay/utils.py index cf5d09c..16c2ce7 100644 --- a/uncloud_pay/utils.py +++ b/uncloud_pay/utils.py @@ -124,10 +124,11 @@ def apply_vat_discount(subtotal, pricing_plan, vat_rate=False, vat_validation_st 'amount_with_vat': round(float(discount_amount_with_vat), 2) } subtotal_after_discount = subtotal - discount["amount"] + vat_amount = round(vat_percent * 0.01 * subtotal_after_discount, 2) price_after_discount_with_vat = round((subtotal - discount['amount']) * (1 + vat_percent * 0.01), 2) return (subtotal, round(float(subtotal_after_discount), 2), price_after_discount_with_vat, - round(float(vat), 2), vat_percent, discount) + round(float(vat), 2), vat_percent, vat_amount, discount) def get_order_total_with_vat(cores, memory, storage, @@ -149,13 +150,14 @@ def get_order_total_with_vat(cores, memory, storage, (decimal.Decimal(memory) * pricing.ram_unit_price) + (decimal.Decimal(storage) * (pricing.storage_unit_price)) ) - subtotal, subtotal_after_discount, price_after_discount_with_vat, vat, vat_percent, discount = \ + subtotal, subtotal_after_discount, price_after_discount_with_vat, vat, vat_percent, vat_amount, discount = \ apply_vat_discount(subtotal, pricing, vat_rate, vat_validation_status) return { "name": pricing.name, "subtotal": subtotal, "discount": discount, "vat": vat, "vat_percent": vat_percent, + 'vat_amount': vat_amount, "vat_validation_status": vat_validation_status, "subtotal_after_discount": subtotal_after_discount, "total": price_after_discount_with_vat