mirror of
https://github.com/inventree/inventree-app.git
synced 2025-12-04 03:09:56 +00:00
SalesOrderShipment (#697)
* Add detail widget for SalesOrderShipment * Support editing of shipment details * Rearrange SalesOrderDetail page * Add support for attachments against shipment model * refactoring * Add shipment details page * Add user actions for shipments: - Check / uncheck - Take photo * Placeholder action to send shipment * Send shipment from app * Display pending shipments on the home screen * Improve rending for shipments list * Add class definition for SalesOrderAllocation * Display list of items allocated against SalesOrderShipment * Bump release notse * Click through to stock item * Bump version number * dart format * cleanup * Remove unused imports
This commit is contained in:
@@ -601,7 +601,7 @@ class InvenTreeModel {
|
||||
|
||||
// POST data to update the model
|
||||
Future<APIResponse> update({
|
||||
Map<String, String> values = const {},
|
||||
Map<String, dynamic> values = const {},
|
||||
int? expectedStatusCode = 200,
|
||||
}) async {
|
||||
var url = path.join(URL, pk.toString());
|
||||
|
||||
@@ -5,6 +5,9 @@ import "package:inventree/helpers.dart";
|
||||
import "package:inventree/inventree/company.dart";
|
||||
import "package:inventree/inventree/model.dart";
|
||||
import "package:inventree/inventree/orders.dart";
|
||||
import "package:inventree/inventree/part.dart";
|
||||
import "package:inventree/inventree/stock.dart";
|
||||
import "package:inventree/widget/order/so_shipment_detail.dart";
|
||||
import "package:inventree/widget/progress.dart";
|
||||
import "package:inventree/widget/order/extra_line_detail.dart";
|
||||
import "package:inventree/widget/order/sales_order_detail.dart";
|
||||
@@ -269,6 +272,19 @@ class InvenTreeSalesOrderShipment extends InvenTreeModel {
|
||||
@override
|
||||
String get URL => "/order/so/shipment/";
|
||||
|
||||
String get SHIP_SHIPMENT_URL => "/order/so/shipment/${pk}/ship/";
|
||||
|
||||
@override
|
||||
Future<Object?> goToDetailPage(BuildContext context) async {
|
||||
return Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) => SOShipmentDetailWidget(this)),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
List<String> get rolesRequired => ["sales_order"];
|
||||
|
||||
static const String MODEL_TYPE = "salesordershipment";
|
||||
|
||||
@override
|
||||
@@ -284,6 +300,18 @@ class InvenTreeSalesOrderShipment extends InvenTreeModel {
|
||||
return fields;
|
||||
}
|
||||
|
||||
int get orderId => getInt("order");
|
||||
|
||||
InvenTreeSalesOrder? get order {
|
||||
dynamic order_detail = jsondata["order_detail"];
|
||||
|
||||
if (order_detail == null) {
|
||||
return null;
|
||||
} else {
|
||||
return InvenTreeSalesOrder.fromJson(order_detail as Map<String, dynamic>);
|
||||
}
|
||||
}
|
||||
|
||||
String get reference => getString("reference");
|
||||
|
||||
String get tracking_number => getString("tracking_number");
|
||||
@@ -292,7 +320,113 @@ class InvenTreeSalesOrderShipment extends InvenTreeModel {
|
||||
|
||||
String? get shipment_date => getString("shipment_date");
|
||||
|
||||
bool get shipped => shipment_date != null && shipment_date!.isNotEmpty;
|
||||
String? get delivery_date => getString("delivery_date");
|
||||
|
||||
int? get checked_by_id => getInt("checked_by");
|
||||
|
||||
bool get isChecked => checked_by_id != null && checked_by_id! > 0;
|
||||
|
||||
bool get isShipped => shipment_date != null && shipment_date!.isNotEmpty;
|
||||
|
||||
bool get isDelivered => delivery_date != null && delivery_date!.isNotEmpty;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class representing an allocation of stock against a SalesOrderShipment
|
||||
*/
|
||||
class InvenTreeSalesOrderAllocation extends InvenTreeAttachment {
|
||||
InvenTreeSalesOrderAllocation() : super();
|
||||
|
||||
InvenTreeSalesOrderAllocation.fromJson(Map<String, dynamic> json)
|
||||
: super.fromJson(json);
|
||||
|
||||
@override
|
||||
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
|
||||
InvenTreeSalesOrderAllocation.fromJson(json);
|
||||
|
||||
@override
|
||||
String get URL => "/order/so-allocation/";
|
||||
|
||||
@override
|
||||
List<String> get rolesRequired => ["sales_order"];
|
||||
|
||||
@override
|
||||
Map<String, String> defaultFilters() {
|
||||
return {
|
||||
"part_detail": "true",
|
||||
"order_detail": "true",
|
||||
"item_detail": "true",
|
||||
"location_detail": "true",
|
||||
};
|
||||
}
|
||||
|
||||
static const String MODEL_TYPE = "salesorderallocation";
|
||||
|
||||
int get orderId => getInt("order");
|
||||
|
||||
InvenTreeSalesOrder? get order {
|
||||
dynamic order_detail = jsondata["order_detail"];
|
||||
|
||||
if (order_detail == null) {
|
||||
return null;
|
||||
} else {
|
||||
return InvenTreeSalesOrder.fromJson(order_detail as Map<String, dynamic>);
|
||||
}
|
||||
}
|
||||
|
||||
int get stockItemId => getInt("item");
|
||||
|
||||
InvenTreeStockItem? get stockItem {
|
||||
dynamic item_detail = jsondata["item_detail"];
|
||||
|
||||
if (item_detail == null) {
|
||||
return null;
|
||||
} else {
|
||||
return InvenTreeStockItem.fromJson(item_detail as Map<String, dynamic>);
|
||||
}
|
||||
}
|
||||
|
||||
int get partId => getInt("part");
|
||||
|
||||
InvenTreePart? get part {
|
||||
dynamic part_detail = jsondata["part_detail"];
|
||||
|
||||
if (part_detail == null) {
|
||||
return null;
|
||||
} else {
|
||||
return InvenTreePart.fromJson(part_detail as Map<String, dynamic>);
|
||||
}
|
||||
}
|
||||
|
||||
int get shipmentId => getInt("shipment");
|
||||
|
||||
bool get hasShipment => shipmentId > 0;
|
||||
|
||||
InvenTreeSalesOrderShipment? get shipment {
|
||||
dynamic shipment_detail = jsondata["shipment_detail"];
|
||||
|
||||
if (shipment_detail == null) {
|
||||
return null;
|
||||
} else {
|
||||
return InvenTreeSalesOrderShipment.fromJson(
|
||||
shipment_detail as Map<String, dynamic>,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
int get locationId => getInt("location");
|
||||
|
||||
InvenTreeStockLocation? get location {
|
||||
dynamic location_detail = jsondata["location_detail"];
|
||||
|
||||
if (location_detail == null) {
|
||||
return null;
|
||||
} else {
|
||||
return InvenTreeStockLocation.fromJson(
|
||||
location_detail as Map<String, dynamic>,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -319,3 +453,23 @@ class InvenTreeSalesOrderAttachment extends InvenTreeAttachment {
|
||||
? "attachment/"
|
||||
: "order/so/attachment/";
|
||||
}
|
||||
|
||||
class InvenTreeSalesOrderShipmentAttachment extends InvenTreeAttachment {
|
||||
InvenTreeSalesOrderShipmentAttachment() : super();
|
||||
|
||||
InvenTreeSalesOrderShipmentAttachment.fromJson(Map<String, dynamic> json)
|
||||
: super.fromJson(json);
|
||||
|
||||
@override
|
||||
InvenTreeModel createFromJson(Map<String, dynamic> json) =>
|
||||
InvenTreeSalesOrderShipmentAttachment.fromJson(json);
|
||||
|
||||
@override
|
||||
String get REFERENCE_FIELD => "shipment";
|
||||
|
||||
@override
|
||||
String get REF_MODEL_TYPE => "salesordershipment";
|
||||
|
||||
@override
|
||||
String get URL => "attachment/";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user