From 10287d90e77a854223a315fd0c78070b46841101 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Tue, 9 Nov 2021 18:10:52 +0000 Subject: [PATCH] SuggestedQuantity field added to pm and wo item parts --- .vscode/launch.json | 2 +- docs/8.0/ayanova/docs/ay-biz-admin-import-v7.md | 13 +++++++++++-- docs/8.0/ayanova/docs/ay-start-changes-from-v7.md | 3 +++ server/AyaNova/DataList/PMItemPartDataList.cs | 8 ++++++++ .../AyaNova/DataList/WorkOrderItemPartDataList.cs | 8 ++++++++ server/AyaNova/biz/FormFieldReference.cs | 4 +++- server/AyaNova/models/WorkOrderItemPart.cs | 1 + server/AyaNova/resource/de.json | 1 + server/AyaNova/resource/en.json | 1 + server/AyaNova/resource/es.json | 1 + server/AyaNova/resource/fr.json | 1 + server/AyaNova/util/AySchema.cs | 2 +- 12 files changed, 40 insertions(+), 5 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 924c5283..dde42e99 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -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\\" diff --git a/docs/8.0/ayanova/docs/ay-biz-admin-import-v7.md b/docs/8.0/ayanova/docs/ay-biz-admin-import-v7.md index 4a8c76d0..af0434c0 100644 --- a/docs/8.0/ayanova/docs/ay-biz-admin-import-v7.md +++ b/docs/8.0/ayanova/docs/ay-biz-admin-import-v7.md @@ -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. diff --git a/docs/8.0/ayanova/docs/ay-start-changes-from-v7.md b/docs/8.0/ayanova/docs/ay-start-changes-from-v7.md index 751d0e90..07e51e7e 100644 --- a/docs/8.0/ayanova/docs/ay-start-changes-from-v7.md +++ b/docs/8.0/ayanova/docs/ay-start-changes-from-v7.md @@ -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. diff --git a/server/AyaNova/DataList/PMItemPartDataList.cs b/server/AyaNova/DataList/PMItemPartDataList.cs index b5c5b525..cc72b54f 100644 --- a/server/AyaNova/DataList/PMItemPartDataList.cs +++ b/server/AyaNova/DataList/PMItemPartDataList.cs @@ -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", diff --git a/server/AyaNova/DataList/WorkOrderItemPartDataList.cs b/server/AyaNova/DataList/WorkOrderItemPartDataList.cs index 1b46a77f..eea6bb8a 100644 --- a/server/AyaNova/DataList/WorkOrderItemPartDataList.cs +++ b/server/AyaNova/DataList/WorkOrderItemPartDataList.cs @@ -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", diff --git a/server/AyaNova/biz/FormFieldReference.cs b/server/AyaNova/biz/FormFieldReference.cs index cf55ec3e..65744dee 100644 --- a/server/AyaNova/biz/FormFieldReference.cs +++ b/server/AyaNova/biz/FormFieldReference.cs @@ -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" }); diff --git a/server/AyaNova/models/WorkOrderItemPart.cs b/server/AyaNova/models/WorkOrderItemPart.cs index 273304fe..e77ab78e 100644 --- a/server/AyaNova/models/WorkOrderItemPart.cs +++ b/server/AyaNova/models/WorkOrderItemPart.cs @@ -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; } diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 6012ef58..00f6f90b 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -1542,6 +1542,7 @@ "WorkOrderItemPartPartWarehouseID": "Lager", "WorkOrderItemPartPrice": "Preis", "WorkOrderItemPartQuantity": "Menge", + "WorkOrderItemPartSuggestedQuantity": "Empfohlene Menge", "WorkOrderItemPartQuantityReserved": "Gewählte Menge", "WorkOrderItemPartTaxPartSaleID": "Umsatzsteuer", "WorkOrderItemPartUIQuantityReservedPM": "Erforderliche Menge", diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 8d2f33f9..dca8fed7 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -1542,6 +1542,7 @@ "WorkOrderItemPartPartWarehouseID": "Warehouse", "WorkOrderItemPartPrice": "Price", "WorkOrderItemPartQuantity": "Quantity", + "WorkOrderItemPartSuggestedQuantity": "Suggested quantity", "WorkOrderItemPartQuantityReserved": "Pre-selected quantity", "WorkOrderItemPartTaxPartSaleID": "Sales tax", "WorkOrderItemPartUIQuantityReservedPM": "Quantity required", diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 91052f81..bca4379d 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -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", diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index a6fb390d..e9e11e3e 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -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", diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 63e09c92..91cacab1 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -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