From d4b2204baf290c8e98acca2eb1f09dc019070b16 Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@gmail.com>
Date: Thu, 5 Dec 2024 17:09:57 +1100
Subject: [PATCH] Sales order shipment progress (#560)

- Display progress bar for sales order page
---
 lib/inventree/orders.dart                |  4 ++++
 lib/widget/order/sales_order_detail.dart | 13 +++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/lib/inventree/orders.dart b/lib/inventree/orders.dart
index 25b97d7b..8d63f340 100644
--- a/lib/inventree/orders.dart
+++ b/lib/inventree/orders.dart
@@ -28,6 +28,10 @@ class InvenTreeOrder extends InvenTreeModel {
 
   int get completedLineItemCount => getInt("completed_lines", backup: 0);
 
+  int get shipmentCount => getInt("shipments_count", backup: 0);
+
+  int get completedShipmentCount => getInt("completed_shipments_count", backup: 0);
+
   bool get complete => completedLineItemCount >= lineItemCount;
 
   bool get overdue => getBool("overdue");
diff --git a/lib/widget/order/sales_order_detail.dart b/lib/widget/order/sales_order_detail.dart
index 243a77f1..30c218ed 100644
--- a/lib/widget/order/sales_order_detail.dart
+++ b/lib/widget/order/sales_order_detail.dart
@@ -362,6 +362,19 @@ class _SalesOrderDetailState extends RefreshableState<SalesOrderDetailWidget> {
       trailing: Text("${widget.order.completedLineItemCount} / ${widget.order.lineItemCount}", style: TextStyle(color: lineColor)),
     ));
 
+    // Shipment progress
+    if (widget.order.shipmentCount > 0) {
+      tiles.add(ListTile(
+        title: Text(L10().shipments),
+        subtitle: ProgressBar(
+          widget.order.completedShipmentCount.toDouble(),
+          maximum: widget.order.shipmentCount.toDouble()
+        ),
+        leading: Icon(TablerIcons.truck_delivery),
+        trailing: Text("${widget.order.completedShipmentCount} / ${widget.order.shipmentCount}", style: TextStyle(color: lineColor)),
+      ));
+    }
+
     // TODO: total price
 
     if (widget.order.targetDate.isNotEmpty) {