SuggestedQuantity field added to pm and wo item parts

This commit is contained in:
2021-11-09 18:10:52 +00:00
parent e3d73d00de
commit 10287d90e7
12 changed files with 40 additions and 5 deletions

2
.vscode/launch.json vendored
View File

@@ -55,7 +55,7 @@
"AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles",
"AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles",
"AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles",
"AYANOVA_SERVER_TEST_MODE": "true",
"AYANOVA_SERVER_TEST_MODE": "false",
"AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small",
"AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7",
"AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_14\\bin\\"

View File

@@ -20,7 +20,6 @@ v8 does not have a Global Wiki page (the Wiki page formerly accessible from the
v8 does not have Regions, all functionality previously in Regions will be split out into several new and changed objects.
The Region Wiki if found will be migrated to a User account created just to hold the Wiki and files named "zV8Migrate REGION_WIKI_REPOSITORY_region name"
### Security groups
* Security groups have been replaced by Roles.
* No v7 security group information or settings are migrated into v8.
@@ -124,7 +123,14 @@ The service bank feature has not been ported to AyaNova 8 as it does not appear
### Inventory
To ensure the inventory balances match, all parts are initially migrated to v8 with one billion in stock quantity. Then all inventory related objects are migrated such as Purchase Orders, Inventory adjustments and Service Work orders. Finally at the end of migration inventory transactions are made to the v8 inventory levels to bring the quantities on hand into balance with the v7 quantity on hand for each part. In AyaNova 8 inventory is consumed the moment a Part is saved on a work order which differs from v7 where inventory is consumed when a Part is set to Used in service on a work order. For this reason inventory totals will be lower in v8 than in v7 due to any work orders migrated that have not had their parts set to Used in service in v7.
To ensure the inventory balances match, all parts are initially migrated to v8 with one billion in stock quantity. Then all inventory related objects are migrated such as Purchase Orders, Inventory adjustments and Service Work orders. Finally at the end of migration inventory transactions are made to the v8 inventory levels to bring the quantities on hand into balance with the v7 quantity on hand for each part. In AyaNova 8 inventory is consumed the moment a Part is saved on a work order which differs from v7 where inventory is consumed when a Part is set to Used in service on a work order.
#### Work order item parts not "Used in service"
v8 work order item part affects inventory immediately when entered and saved but in v7 inventory is not affected until "Used in service" is checkmarked. For this reason, v7 work orders with work order item parts **not** checkmarked Used in service will have those quantities migrated to the "Suggested quantity" field instead of the Quantity field. This is to ensure that inventory remains in balance after migration.
In v8 Users will need to either use the "Realize suggested part quantities" command in the work order to automatically copy the suggested amounts to the Quantity field in all work order item part records for that work order or manually enter each one in the quantity field as appropriate.
#### Inventory adjustments
Inventory and Serial numbers work differently in v8; Inventory adjustments can not be migrated with their original entry dates as the new v8 inventory "blockchain" system does not allow entries out of order so they are migrated as Inventory Transactions in v8 and the description of the transaction is named in this pattern: `v7Adjustment {v7 inventory adjustment ID number} {v7 adjustment "reason" field} {v7 adjustment "Date Adjusted"}` For example "v7Adjustment 45 Store stock opening inventory adjustment on 2005-11-27 10:50:53 AM".
@@ -148,6 +154,8 @@ You should keep a copy of AyaNova 7 available for some time after migration for
Users are migrated to inactive accounts with no authorization Roles, password or login name set.
Note: **Inactive users do not display in the v8 schedule** - in v8 the schedule does not show scheduled user records for inactive users so initially you will not see scheduled items show in the schedule until Users are set back to Active=true.
All active users will need to have some settings made:
* Role - you will need to select one or more Authorization Roles to grant the User access to AyaNova.
@@ -157,6 +165,7 @@ All active users will need to have some settings made:
Once Users are able to login they will need to subscribe to any [Notifications](home-notify-subscriptions.md) they require. The V8 Notification system is simplified from v7 and easier to set up but it can't be migrated as they are very different systems.
### Customize Translations
If you had previously been using a customized Locale in v7 read the important note regarding this in the section above. We recommend not using the migrated translation but rather replicating any changes needed in a copy of a v8 stock language translation and setting User's to *that* translation rather than the one the v8Migrate has created.

View File

@@ -52,6 +52,9 @@ All inventory changes are tracked in a blockchain inside your AyaNova database a
AyaNova 8 does not permit negative on hand inventory values to exist, every part consumed must have a quantity of on-hand inventory to back it up or it's not allowed to be saved.
#### Suggested quantity
If there is a need to enter parts on a work order as a placeholder so as not to affect inventory for planning purposes the work order item part's "Suggested Quantity" field can be utilized for this purpose.
### Purchase orders / receipts
Purchase orders and receipts have been combined in v8 and are no longer separate objects.

View File

@@ -86,6 +86,14 @@ namespace AyaNova.DataList
SqlValueColumnName = "apmitempart.quantity"
});
FieldDefinitions.Add(new DataListFieldDefinition
{
TKey = "WorkOrderItemPartSuggestedQuantity",
FieldKey = "WorkOrderItemPartSuggestedQuantity",
UiFieldDataType = (int)UiFieldDataType.Decimal,
SqlValueColumnName = "apmitempart.suggestedquantity"
});
FieldDefinitions.Add(new DataListFieldDefinition
{
TKey = "PartUPC",

View File

@@ -85,6 +85,14 @@ namespace AyaNova.DataList
SqlValueColumnName = "aworkorderitempart.quantity"
});
FieldDefinitions.Add(new DataListFieldDefinition
{
TKey = "WorkOrderItemPartSuggestedQuantity",
FieldKey = "WorkOrderItemPartSuggestedQuantity",
UiFieldDataType = (int)UiFieldDataType.Decimal,
SqlValueColumnName = "apmitempart.suggestedquantity"
});
FieldDefinitions.Add(new DataListFieldDefinition
{
TKey = "PartUPC",

View File

@@ -942,6 +942,7 @@ namespace AyaNova.Biz
l.Add(new FormField { TKey = "WorkOrderItemPartPartID", FieldKey = "WorkOrderItemPartPartID", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartPartWarehouseID", FieldKey = "WorkOrderItemPartPartWarehouseID", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartQuantity", FieldKey = "WorkOrderItemPartQuantity", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartSuggestedQuantity", FieldKey = "WorkOrderItemPartSuggestedQuantity", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartTaxPartSaleID", FieldKey = "WorkOrderItemPartTaxPartSaleID", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "PartName", FieldKey = "PartName", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "PartUPC", FieldKey = "PartUPC", TKeySection = "WorkOrderItemParts" });
@@ -1493,7 +1494,8 @@ namespace AyaNova.Biz
l.Add(new FormField { TKey = "PurchaseOrderItemSerialNumbers", FieldKey = "WorkOrderItemPartSerials", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartPartID", FieldKey = "WorkOrderItemPartPartID", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartPartWarehouseID", FieldKey = "WorkOrderItemPartPartWarehouseID", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartQuantity", FieldKey = "WorkOrderItemPartQuantity", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartQuantity", FieldKey = "WorkOrderItemPartQuantity", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartSuggestedQuantity", FieldKey = "WorkOrderItemPartSuggestedQuantity", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "WorkOrderItemPartTaxPartSaleID", FieldKey = "WorkOrderItemPartTaxPartSaleID", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "PartName", FieldKey = "PartName", TKeySection = "WorkOrderItemParts" });
l.Add(new FormField { TKey = "PartUPC", FieldKey = "PartUPC", TKeySection = "WorkOrderItemParts" });

View File

@@ -27,6 +27,7 @@ namespace AyaNova.Models
public string PartWarehouseViz { get; set; }
[Required]
public decimal Quantity { get; set; }
public decimal SuggestedQuantity { get; set; }
public long? TaxPartSaleId { get; set; }
[NotMapped]
public string TaxCodeViz { get; set; }

View File

@@ -1542,6 +1542,7 @@
"WorkOrderItemPartPartWarehouseID": "Lager",
"WorkOrderItemPartPrice": "Preis",
"WorkOrderItemPartQuantity": "Menge",
"WorkOrderItemPartSuggestedQuantity": "Empfohlene Menge",
"WorkOrderItemPartQuantityReserved": "Gewählte Menge",
"WorkOrderItemPartTaxPartSaleID": "Umsatzsteuer",
"WorkOrderItemPartUIQuantityReservedPM": "Erforderliche Menge",

View File

@@ -1542,6 +1542,7 @@
"WorkOrderItemPartPartWarehouseID": "Warehouse",
"WorkOrderItemPartPrice": "Price",
"WorkOrderItemPartQuantity": "Quantity",
"WorkOrderItemPartSuggestedQuantity": "Suggested quantity",
"WorkOrderItemPartQuantityReserved": "Pre-selected quantity",
"WorkOrderItemPartTaxPartSaleID": "Sales tax",
"WorkOrderItemPartUIQuantityReservedPM": "Quantity required",

View File

@@ -1542,6 +1542,7 @@
"WorkOrderItemPartPartWarehouseID": "Almacén",
"WorkOrderItemPartPrice": "Precio",
"WorkOrderItemPartQuantity": "Cantidad",
"WorkOrderItemPartSuggestedQuantity": "Cantidad sugerida",
"WorkOrderItemPartQuantityReserved": "Cantidad preseleccionada",
"WorkOrderItemPartTaxPartSaleID": "Impuesto sobre la venta",
"WorkOrderItemPartUIQuantityReservedPM": "Cantidad solicitada",

View File

@@ -1542,6 +1542,7 @@
"WorkOrderItemPartPartWarehouseID": "Magasin",
"WorkOrderItemPartPrice": "Prix",
"WorkOrderItemPartQuantity": "Quantité",
"WorkOrderItemPartSuggestedQuantity": "Quantité suggérée",
"WorkOrderItemPartQuantityReserved": "Quantité présélectionnée",
"WorkOrderItemPartTaxPartSaleID": "Taxe sur les ventes",
"WorkOrderItemPartUIQuantityReservedPM": "Quantité requise",

View File

@@ -846,7 +846,7 @@ $BODY$ LANGUAGE PLPGSQL STABLE");
//WORKORDERITEM PART
await ExecQueryAsync("CREATE TABLE aworkorderitempart (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, workorderitemid BIGINT NOT NULL REFERENCES aworkorderitem (id), "
+ "description TEXT, serials TEXT, partid BIGINT NOT NULL REFERENCES apart, partwarehouseid BIGINT NOT NULL REFERENCES apartwarehouse, quantity DECIMAL(19,5) NOT NULL default 0, "
+ "cost DECIMAL(38,18) NOT NULL default 0, listprice DECIMAL(38,18) NOT NULL default 0, taxpartsaleid BIGINT REFERENCES ataxcode, priceoverride DECIMAL(38,18) "
+ "suggestedquantity DECIMAL(19,5) NOT NULL default 0, cost DECIMAL(38,18) NOT NULL default 0, listprice DECIMAL(38,18) NOT NULL default 0, taxpartsaleid BIGINT REFERENCES ataxcode, priceoverride DECIMAL(38,18) "
+ ")");
//WORKORDERITEM PART REQUEST