mirror of
https://github.com/HendrikRauh/inventree-app.git
synced 2026-01-13 03:26:24 +00:00
Sales order support (#438)
* Add new models for SalesOrder - Create generic Order and OrderLine models with common functionality * Refactor - Move some widgets around - Cleanup directory structure * Add link to home screen and nav drawer * Add SalesOrder list widget * Linting fixes * Fix string * Refactor PurchaseOrderDetailWidget * Tweaks to existing code * linting * Fixes for drawer widget * Add "detail" page for SalesOrder * Add more tiles to SalesOrder detail * Allow editing of salesorder * add list filters for sales orders * Display list of line items * Customer updates - Display customer icon on home screen - Fetch sales orders for customer detail page * Cleanup company detail view * Create new sales order from list * Stricter typing for formFields method * Create new PurchaseOrder and SalesOrder from company deatil * Status code updates - Add function for name comparison - Remove hard-coded values * Update view permission checks for home widget * Add ability to manually add SalesOrderLineItem * Add nice progress bar widgets * Display detail view for sales order line item * edit SalesOrderLineItem * Fix unused import * Hide "shipped items" tab - Will be added in a future update
This commit is contained in:
parent
c1c0d46957
commit
bdd5470e68
45 changed files with 1565 additions and 284 deletions
190
lib/inventree/sales_order.dart
Normal file
190
lib/inventree/sales_order.dart
Normal file
|
|
@ -0,0 +1,190 @@
|
|||
|
||||
|
||||
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/api.dart";
|
||||
|
||||
|
||||
/*
|
||||
* Class representing an individual SalesOrder
|
||||
*/
|
||||
class InvenTreeSalesOrder extends InvenTreeOrder {
|
||||
|
||||
InvenTreeSalesOrder() : super();
|
||||
|
||||
InvenTreeSalesOrder.fromJson(Map<String, dynamic> json) : super.fromJson(json);
|
||||
|
||||
@override
|
||||
InvenTreeModel createFromJson(Map<String, dynamic> json) => InvenTreeSalesOrder.fromJson(json);
|
||||
|
||||
@override
|
||||
String get URL => "order/so/";
|
||||
|
||||
@override
|
||||
List<String> get rolesRequired => ["sales_order"];
|
||||
|
||||
@override
|
||||
Map<String, Map<String, dynamic>> formFields() {
|
||||
Map<String, Map<String, dynamic>> fields = {
|
||||
"reference": {},
|
||||
"customer": {
|
||||
"filters": {
|
||||
"is_customer": true,
|
||||
}
|
||||
},
|
||||
"customer_reference": {},
|
||||
"description": {},
|
||||
"project_code": {},
|
||||
"target_date": {},
|
||||
"link": {},
|
||||
"responsible": {},
|
||||
"contact": {
|
||||
"filters": {
|
||||
"company": customerId,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (!InvenTreeAPI().supportsProjectCodes) {
|
||||
fields.remove("project_code");
|
||||
}
|
||||
|
||||
if (!InvenTreeAPI().supportsContactModel) {
|
||||
fields.remove("contact");
|
||||
}
|
||||
|
||||
return fields;
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, String> defaultGetFilters() {
|
||||
return {
|
||||
"customer_detail": "true",
|
||||
};
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, String> defaultListFilters() {
|
||||
return {
|
||||
"customer_detail": "true",
|
||||
};
|
||||
}
|
||||
|
||||
int get customerId => getInt("customer");
|
||||
|
||||
InvenTreeCompany? get customer {
|
||||
dynamic customer_detail = jsondata["customer_detail"];
|
||||
|
||||
if (customer_detail == null) {
|
||||
return null;
|
||||
} else {
|
||||
return InvenTreeCompany.fromJson(customer_detail as Map<String, dynamic>);
|
||||
}
|
||||
}
|
||||
|
||||
String get customerReference => getString("customer_reference");
|
||||
|
||||
bool get isOpen => api.SalesOrderStatus.isNameIn(status, ["PENDING", "IN_PROGRESS"]);
|
||||
|
||||
bool get isComplete => api.SalesOrderStatus.isNameIn(status, ["SHIPPED"]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class representing an individual line item in a SalesOrder
|
||||
*/
|
||||
class InvenTreeSOLineItem extends InvenTreeOrderLine {
|
||||
|
||||
InvenTreeSOLineItem() : super();
|
||||
|
||||
InvenTreeSOLineItem.fromJson(Map<String, dynamic> json) : super.fromJson(json);
|
||||
|
||||
@override
|
||||
InvenTreeModel createFromJson(Map<String, dynamic> json) => InvenTreeSOLineItem.fromJson(json);
|
||||
|
||||
@override
|
||||
String get URL => "order/so-line/";
|
||||
|
||||
@override
|
||||
List<String> get rolesRequired => ["sales_order"];
|
||||
|
||||
@override
|
||||
Map<String, Map<String, dynamic>> formFields() {
|
||||
return {
|
||||
"order": {
|
||||
"hidden": true,
|
||||
},
|
||||
"part": {},
|
||||
"quantity": {},
|
||||
"reference": {},
|
||||
"notes": {},
|
||||
"link": {},
|
||||
};
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, String> defaultGetFilters() {
|
||||
return {
|
||||
"part_detail": "true",
|
||||
};
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, String> defaultListFilters() {
|
||||
return {
|
||||
"part_detail": "true",
|
||||
};
|
||||
}
|
||||
|
||||
double get allocated => getDouble("allocated");
|
||||
|
||||
bool get isAllocated => allocated >= quantity;
|
||||
|
||||
double get shipped => getDouble("shipped");
|
||||
|
||||
double get outstanding => quantity - shipped;
|
||||
|
||||
double get progressRatio {
|
||||
if (quantity <= 0 || shipped <= 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return shipped / quantity;
|
||||
}
|
||||
|
||||
String get progressString => simpleNumberString(shipped) + " / " + simpleNumberString(quantity);
|
||||
|
||||
bool get isComplete => shipped >= quantity;
|
||||
|
||||
double get available => getDouble("available_stock") + getDouble("available_variant_stock");
|
||||
|
||||
double get salePrice => getDouble("sale_price");
|
||||
|
||||
String get salePriceCurrency => getString("sale_price_currency");
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class representing an attachment file against a SalesOrder object
|
||||
*/
|
||||
class InvenTreeSalesOrderAttachment extends InvenTreeAttachment {
|
||||
|
||||
InvenTreeSalesOrderAttachment() : super();
|
||||
|
||||
InvenTreeSalesOrderAttachment.fromJson(Map<String, dynamic> json) : super.fromJson(json);
|
||||
|
||||
@override
|
||||
InvenTreeModel createFromJson(Map<String, dynamic> json) => InvenTreeSalesOrderAttachment.fromJson(json);
|
||||
|
||||
@override
|
||||
String get REFERENCE_FIELD => "order";
|
||||
|
||||
@override
|
||||
String get URL => "order/po/attachment/";
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue