diff --git a/source/Plugins/AyaNova.Plugin.V8/V8.cs b/source/Plugins/AyaNova.Plugin.V8/V8.cs index 71ded00..e62e767 100644 --- a/source/Plugins/AyaNova.Plugin.V8/V8.cs +++ b/source/Plugins/AyaNova.Plugin.V8/V8.cs @@ -266,6 +266,9 @@ namespace AyaNova.PlugIn.V8 private long ClosedWorkOrderStatus = 0; private long ServiceCompletedWorkOrderStatus = 0; + private bool V7UseInventory = false; + private List Allv8WarehouseIds = new List(); + //UNKNOWN / MISSING RECORD OBJECT STAND INs private long UnknownV7PartId = 0;//used when there is no part id on a workorderitempart record @@ -287,6 +290,7 @@ namespace AyaNova.PlugIn.V8 progress.Op("Preparing to export...."); ResetUniqueUserNames(); ResetUniqueNames(); + Allv8WarehouseIds.Clear(); V7ToV8IdMap.Clear(); V7ToV8WorkOrderItemStatusIdMap.Clear(); TagMap.Clear(); @@ -369,6 +373,10 @@ namespace AyaNova.PlugIn.V8 ExportClientNoteTypes(progress); progress.Op("Exporting Business objects"); + + //are we using inventory for this? + V7UseInventory = AyaBizUtils.GlobalSettings.UseInventory; + //BIZ objects await ExportLocales(progress); await ExportStaffUsers(progress); @@ -378,10 +386,11 @@ namespace AyaNova.PlugIn.V8 await ExportHeadOffices(progress); await ExportClients(progress); await ExportVendors(progress); - await TurnOffInventory(progress); + await ExportWarehouses(progress); await ExportLoanItems(progress); await ExportParts(progress); + await InitInventory(progress); await ExportProjects(progress); //PURCHASE ORDERS deferred to possibly never if people can live without it @@ -1505,20 +1514,22 @@ namespace AyaNova.PlugIn.V8 - #region TurnOffInventory - private async System.Threading.Tasks.Task TurnOffInventory(ProgressForm progress) + #region InitInventory + private async System.Threading.Tasks.Task InitInventory(ProgressForm progress) { - ResetUniqueNames(); if (!progress.KeepGoing) return; - progress.Op("Turning off v8 inventory"); - - var a = await util.GetAsync("global-biz-setting"); - dynamic d = a.ObjectResponse["data"]; - d.useInventory = false; - await util.PutAsync("global-biz-setting", d.ToString()); - + if (!V7UseInventory) + { + progress.Append("v7 Use inventory is OFF, not migrating inventory"); + var a = await util.GetAsync("global-biz-setting"); + dynamic d = a.ObjectResponse["data"]; + d.useInventory = false; + await util.PutAsync("global-biz-setting", d.ToString()); + return; + } + progress.Append("v7 Use inventory is Active; parts will be exported with initial inventory to allow migration and adjusted to balance v7 at end of migration"); } - #endregion TurnOffInventory + #endregion InitInventory @@ -1612,6 +1623,20 @@ namespace AyaNova.PlugIn.V8 //Event log fixup await util.EventLog(util.AyaType.Part, RavenId, SafeGetUserMap(c.Creator), SafeGetUserMap(c.Modifier), c.Created, c.Modified); + //INVENTORY? + if (V7UseInventory) + { + foreach (long l in Allv8WarehouseIds) + { + //create opening initial inventory just so migrate can proceed without v8 balking + dynamic di = new JObject(); + di.description = "v8 migrate temporary initial inventory to allow migration"; + di.partId = RavenId; + di.partWarehouseId = l; + di.quantity = 1000000000m;//one billion should cover it + await util.PostAsync("part-inventory", di.ToString()); + } + } } //UntrackedV7PartId @@ -1650,6 +1675,7 @@ namespace AyaNova.PlugIn.V8 if (!progress.KeepGoing) return; if (i.ID == PartWarehouse.DefaultWarehouseID) { + Allv8WarehouseIds.Add(1); Addv7v8IdMap(i.ID, 1); continue; } @@ -1666,6 +1692,7 @@ namespace AyaNova.PlugIn.V8 var rMainObject = await util.PostAsync("part-warehouse", d.ToString()); long RavenId = util.IdFromResponse(rMainObject); Addv7v8IdMap(i.ID, RavenId); + Allv8WarehouseIds.Add(RavenId); await util.EventLog(util.AyaType.PartWarehouse, RavenId, SafeGetUserMap(i.Creator), SafeGetUserMap(i.Modifier), i.Created, i.Modified); } } @@ -2737,10 +2764,38 @@ namespace AyaNova.PlugIn.V8 dwip.workorderItemId = ravenwoitemid; dwip.quantity = wip.Quantity; var tryPartId = Getv7v8IdMapNullOk(wip.PartID); - if (tryPartId==null) + if (tryPartId == null) { dwip.partId = UnknownV7PartId; - if (wip.Quantity == 0 && string.IsNullOrWhiteSpace(wip.Description)) + if (wip.Quantity == 0 && string.IsNullOrWhiteSpace(wip.Description)) + continue; //no part record, no quantity, no text at all, just skip it + } + else + dwip.partId = tryPartId; + dwip.partWarehouseId = Getv7v8IdMap(wip.PartWarehouseID, "warehouse"); + dwip.taxPartSaleId = Getv7v8IdMapNullOk(wip.TaxPartSaleID); + dwip.priceOverride = wip.Price; + dwip.price = wip.Price; + dwip.cost = wip.Cost; + dwip.description = wip.Description; + if (wip.PartSerialID != Guid.Empty) + dwip.serials = PartSerial.GetSerialNumberFromPartSerialID(wip.PartSerialID); + await util.PostAsync("workorder/items/parts", dwip.ToString()); + } + + //##### WORKORDER ITEM PART + foreach (WorkorderItemPart wip in wi.Parts) + { + progress.Op("WorkorderItemPart " + wip.ID.ToString()); + dynamic dwip = new JObject(); + dwip.workOrderId = RavenId; + dwip.workorderItemId = ravenwoitemid; + dwip.quantity = wip.Quantity; + var tryPartId = Getv7v8IdMapNullOk(wip.PartID); + if (tryPartId == null) + { + dwip.partId = UnknownV7PartId; + if (wip.Quantity == 0 && string.IsNullOrWhiteSpace(wip.Description)) continue; //no part record, no quantity, no text at all, just skip it } else