From c578d7668609937ea0c803b5b3ba9d7ba88b1ddd Mon Sep 17 00:00:00 2001 From: mrsaicharan1 Date: Wed, 15 May 2019 16:32:44 +0530 Subject: [PATCH] Order Invoice generation method added Added serving route and static page Add billing info invoice --- app/api/auth.py | 21 +++++ app/api/helpers/order.py | 8 +- app/api/helpers/storage.py | 3 +- app/templates/pdf/order_invoice.html | 126 +++++++++++++++++++++++++++ 4 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 app/templates/pdf/order_invoice.html diff --git a/app/api/auth.py b/app/api/auth.py index d7564d15b9..fc32f36972 100644 --- a/app/api/auth.py +++ b/app/api/auth.py @@ -304,3 +304,24 @@ def ticket_attendee_authorized(order_identifier): return ForbiddenError({'source': ''}, 'Unauthorized Access').respond() else: return ForbiddenError({'source': ''}, 'Authentication Required to access ticket').respond() + + +@ticket_blueprint.route('/orders/invoices/') +@jwt_required() +def order_invoices(order_identifier): + if current_user: + try: + order = Order.query.filter_by(identifier=order_identifier).first() + user_id = order.user.id + except NoResultFound: + return NotFoundError({'source': ''}, 'Order Invoice not found').respond() + if current_user.id == user_id: + key = UPLOAD_PATHS['pdf']['order'].format(identifier=order_identifier) + file_path = '../generated/invoices/{}/{}/'.format(key, generate_hash(key)) + order_identifier + '.pdf' + response = make_response(send_file(file_path)) + response.headers['Content-Disposition'] = 'attachment; filename=invoice-%s.zip' % order_identifier + return response + else: + return ForbiddenError({'source': ''}, 'Unauthorized Access').respond() + else: + return ForbiddenError({'source': ''}, 'Authentication Required to access Invoice').respond() diff --git a/app/api/helpers/order.py b/app/api/helpers/order.py index 1bea190527..66847b6d68 100644 --- a/app/api/helpers/order.py +++ b/app/api/helpers/order.py @@ -47,13 +47,14 @@ def set_expiry_for_order(order, override=False): def create_pdf_tickets_for_holder(order): """ - Create tickets for the holders of an order. + Create tickets and invoices for the holders of an order. :param order: The order for which to create tickets for. """ if order.status == 'completed': pdf = create_save_pdf(render_template('pdf/ticket_purchaser.html', order=order), UPLOAD_PATHS['pdf']['ticket_attendee'], dir_path='/static/uploads/pdf/tickets/', identifier=order.identifier, upload_dir='generated/tickets/') + order.tickets_pdf_url = pdf for holder in order.ticket_holders: @@ -67,6 +68,11 @@ def create_pdf_tickets_for_holder(order): pdf = order.tickets_pdf_url holder.pdf_url = pdf save_to_db(holder) + + # create order invoices pdf + create_save_pdf(render_template('pdf/order_invoice.html', order=order, event=order.event), + UPLOAD_PATHS['pdf']['order'], dir_path='/static/uploads/pdf/tickets/', + identifier=order.identifier, upload_dir='generated/invoices/') save_to_db(order) diff --git a/app/api/helpers/storage.py b/app/api/helpers/storage.py index 091fef22c2..c935bd963d 100644 --- a/app/api/helpers/storage.py +++ b/app/api/helpers/storage.py @@ -79,7 +79,8 @@ 'system_image': 'event_topic/{event_topic_id}/system_image' }, 'pdf': { - 'ticket_attendee': 'attendees/tickets/pdf/{identifier}' + 'ticket_attendee': 'attendees/tickets/pdf/{identifier}', + 'order': 'orders/invoices/pdf/{identifier}' } } diff --git a/app/templates/pdf/order_invoice.html b/app/templates/pdf/order_invoice.html new file mode 100644 index 0000000000..a45d624eca --- /dev/null +++ b/app/templates/pdf/order_invoice.html @@ -0,0 +1,126 @@ + + + + + {{ ("Order Invoice") }} + + + +

{{ ("Order Invoice") }}

+
+ + + + + + + + + + {% if order.status != "deleted" %} + + + + {% if order.is_billing_enabled %} + + + {% endif %} + + {% endif %} + +
+ {{ ("Order") }} + + {{ ("Order Details") }} + + {{ ("Billing Info") }} +

+ Order Number :
+ Order By :
+ Order Status :
+ Quantity :
+ Total Amount :
+ Payment Mode :
+ Discount Code :
+

+ {{ order.get_invoice_number() }}
+ {% if order.user and order.user.first_name and order.user.last_name %} + {{ order.user.fullname }} + {% elif order.user %} + {{ order.user.email }} + {% else %} + {{ ('Information unavailable') }} + {% endif %}
+ {% if order.status == 'completed' %} + {{ order.status | capitalize }} + {% elif order.status == 'pending' or order.status == 'initialized' %} + {{ ("Pending") }} + {% elif order.status == 'placed' %} + {{ order.status | capitalize }} + {% elif order.status == 'cancelled' %} + {{ order.status | capitalize }} + {% else %} + {{ order.status | capitalize }} + {% endif %}
+ {{ order.tickets_count }}
+ {{ event.payment_currency | currency_symbol }}{{ order.amount | money }}
+ {% if order.status == 'completed' %} + {{ order.paid_via | capitalize }} + {% else %} + {{ ('Payment pending') }} + {% endif %}
+ {% if order.discount_code %} + {{ order.discount_code.code }}
+ {% else %} + {{ ('NA') }} + {% endif %}
+

+ + Company :
+ Tax Info :
+ Address :
+ City :
+ State/Province :
+ Zip Code:
+ Country:
+
+

+ + {{ order.company }}
+ {{ order.tax_business_info }}
+ {{ order.address }}
+ {{ order.city }}
+ {{ order.state }}
+ {{ order.zipcode }}
+ {{ order.country }}
+
+
+ +