From fa95759a009539a2d3ebe5a18321e2290994c64b Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Thu, 11 Mar 2021 14:09:57 +1100
Subject: [PATCH] Enable printing for PO and SO

---
 .../order/templates/order/order_base.html     |   9 +-
 .../templates/order/sales_order_base.html     |   7 ++
 InvenTree/report/api.py                       |   8 +-
 InvenTree/templates/js/report.js              | 108 ++++++++++++++++++
 4 files changed, 127 insertions(+), 5 deletions(-)

diff --git a/InvenTree/order/templates/order/order_base.html b/InvenTree/order/templates/order/order_base.html
index ed90e1f049..649dbda811 100644
--- a/InvenTree/order/templates/order/order_base.html
+++ b/InvenTree/order/templates/order/order_base.html
@@ -35,7 +35,10 @@ src="{% static 'img/blank_image.png' %}"
 <hr>
 <p>{{ order.description }}</p>
 <div class='btn-row'>
-    <div class='btn-group action-buttons'>
+    <div class='btn-group action-buttons' role='group'>
+        <button type='button' class='btn btn-default' id='print-order-report' title='{% trans "Print" %}'>
+            <span class='fas fa-print'></span> 
+        </button>
         {% if roles.purchase_order.change %}
         <button type='button' class='btn btn-default' id='edit-order' title='{% trans "Edit order information" %}'>
             <span class='fas fa-edit icon-green'></span>
@@ -149,6 +152,10 @@ $("#place-order").click(function() {
 });
 {% endif %}
 
+$('#print-order-report').click(function() {
+    printPurchaseOrderReports([{{ order.pk }}]);
+});
+
 $("#edit-order").click(function() {
     launchModalForm("{% url 'po-edit' order.id %}",
         {
diff --git a/InvenTree/order/templates/order/sales_order_base.html b/InvenTree/order/templates/order/sales_order_base.html
index d671154529..3706026bc0 100644
--- a/InvenTree/order/templates/order/sales_order_base.html
+++ b/InvenTree/order/templates/order/sales_order_base.html
@@ -45,6 +45,9 @@ src="{% static 'img/blank_image.png' %}"
 <p>{{ order.description }}</p>
 <div class='btn-row'>
     <div class='btn-group action-buttons'>
+        <button type='button' class='btn btn-default' id='print-order-report' title='{% trans "Print" %}'>
+            <span class='fas fa-print'></span> 
+        </button>
         {% if roles.sales_order.change %}
         <button type='button' class='btn btn-default' id='edit-order' title='Edit order information'>
             <span class='fas fa-edit icon-green'></span>
@@ -158,4 +161,8 @@ $("#ship-order").click(function() {
     });
 });
 
+$('#print-order-report').click(function() {
+    printSalesOrderReports([{{ order.pk }}]);
+});
+
 {% endblock %}
\ No newline at end of file
diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py
index 7f39f16f7f..16c512ed6c 100644
--- a/InvenTree/report/api.py
+++ b/InvenTree/report/api.py
@@ -555,8 +555,8 @@ class POReportList(ReportListView, OrderReportMixin):
                 except:
                     continue
 
-                for order in orders:
-                    order_query = order.models.PurchaseOrder.objects.filter(pk=order.pk)
+                for o in orders:
+                    order_query = order.models.PurchaseOrder.objects.filter(pk=o.pk)
 
                     try:
                         if not order_query.filter(**filters).exists():
@@ -638,8 +638,8 @@ class SOReportList(ReportListView, OrderReportMixin):
                 except:
                     continue
 
-                for order in orders:
-                    order_query = order.models.SalesOrder.objects.filter(pk=order.pk)
+                for o in orders:
+                    order_query = order.models.SalesOrder.objects.filter(pk=o.pk)
 
                     try:
                         if not order_query.filter(**filters).exists():
diff --git a/InvenTree/templates/js/report.js b/InvenTree/templates/js/report.js
index 6b6ce39db9..741692c56c 100644
--- a/InvenTree/templates/js/report.js
+++ b/InvenTree/templates/js/report.js
@@ -247,3 +247,111 @@ function printBomReports(parts, options={}) {
         }
     )
 }
+
+
+function printPurchaseOrderReports(orders, options={}) {
+    /**
+     * Print PO reports for the provided purchase order(s)
+     */
+
+    if (orders.length == 0) {
+        showAlertDialog(
+            '{% trans "Select Purchase Orders" %}',
+            '{% trans "Purchase Order(s) must be selected before printing report" %}',
+        );
+
+        return;
+    }
+
+    // Request avaiable report templates
+    inventreeGet(
+        '{% url "api-po-report-list" %}',
+        {
+            enabled: true,
+            orders: orders,
+        },
+        {
+            success: function(response) {
+                if (response.length == 0) {
+                    showAlertDialog(
+                        '{% trans "No Reports Found" %}',
+                        '{% trans "No report templates found which match selected orders" %}',
+                    );
+
+                    return;
+                }
+
+                // Select report template
+                selectReport(
+                    response,
+                    orders,
+                    {
+                        success: function(pk) {
+                            var href = `/api/report/po/${pk}/print/?`;
+
+                            orders.forEach(function(order) {
+                                href += `order=${order}&`;
+                            });
+
+                            window.location.href = href;
+                        }
+                    }
+                )
+            }
+        }
+    )
+}
+
+
+function printSalesOrderReports(orders, options={}) {
+    /**
+     * Print SO reports for the provided purchase order(s)
+     */
+
+    if (orders.length == 0) {
+        showAlertDialog(
+            '{% trans "Select Sales Orders" %}',
+            '{% trans "Sales Order(s) must be selected before printing report" %}',
+        );
+
+        return;
+    }
+
+    // Request avaiable report templates
+    inventreeGet(
+        '{% url "api-so-report-list" %}',
+        {
+            enabled: true,
+            orders: orders,
+        },
+        {
+            success: function(response) {
+                if (response.length == 0) {
+                    showAlertDialog(
+                        '{% trans "No Reports Found" %}',
+                        '{% trans "No report templates found which match selected orders" %}',
+                    );
+
+                    return;
+                }
+
+                // Select report template
+                selectReport(
+                    response,
+                    orders,
+                    {
+                        success: function(pk) {
+                            var href = `/api/report/so/${pk}/print/?`;
+
+                            orders.forEach(function(order) {
+                                href += `order=${order}&`;
+                            });
+
+                            window.location.href = href;
+                        }
+                    }
+                )
+            }
+        }
+    )
+}