private bool IsPreviousMessage(SyncType syncType, string inventoryId, Message msg, string warehouse) { bool result = false; var reader = new StreamReader(msg.BodyStream); try { var json = reader.ReadToEnd(); var msgObj = JsonConvert.DeserializeObject <KCMSMQMessage>(json); if (KCMSMQQueueHelper.ParseSyncName(msgObj.Query) == syncType) { //should be only one inserted var firstInserted = (JToken)msgObj.Inserted.FirstOrDefault(); if (firstInserted != null && firstInserted.SelectToken(INVENTORY_ID)?.ToString() == inventoryId && firstInserted.SelectToken("WarehouseID")?.ToString() == warehouse) { result = true; } } } finally { reader.Dispose(); } return(result); }
//16.05.19 VG: NB!!! Do not change method signature public void PostNotification(NotificationResultWrapper results, CancellationToken cancellationToken) { if (!MessageQueue.Exists(Address)) { return; } //23.09.19 KA: Getting the type of synchrnization var syncType = KCMSMQQueueHelper.ParseSyncName(results.Result.Query); if (syncType == SyncType.Unknown) { return; } var jObj = JObject.Parse(results.SerializedResult); var insertedObjects = jObj.SelectToken(INSERTED); if (insertedObjects?.HasValues != true) { //return; } var deletedObjects = jObj.SelectToken(DELETED); var baseMessage = JObject.Parse(results.SerializedResult); baseMessage.SelectToken(INSERTED)?.Parent.Remove(); baseMessage.SelectToken(DELETED)?.Parent.Remove(); var insertedList = insertedObjects.ToArray(); var deletedList = deletedObjects.ToArray(); using (new PXConnectionScope()) { var graph = PXGraph.CreateInstance <KCInventoryManagementMaint>(); for (var x = 0; x < insertedList.Length; x++) { var inserted = insertedList[x]; var inventoryCD = inserted.SelectToken(INVENTORY_ID)?.ToString(); var warehouseID = inserted.SelectToken(WAREHOUSE_ID)?.ToString(); if (string.IsNullOrWhiteSpace(inventoryCD)) { continue; } JToken deleted = null;// deletedObjects?.FirstOrDefault(z => z.SelectToken(INVENTORY_ID)?.ToString() == inventoryCD); if (syncType == SyncType.InventoryPrice && IsPriceChanged(inserted, x)) { FixNullPrices(inserted); SetRetailPrice(inserted); SetDefPrice(inserted); SendUpdateMessage(syncType, inventoryCD, baseMessage, inserted, deleted); } else if (syncType == SyncType.InventoryQuantity || syncType == SyncType.VendorQuantity) { if (syncType == SyncType.InventoryQuantity) { var rule = graph.InventoryTrackingRule.SelectSingle().InventoryTrackingRule; if (rule == KCInventoryTrackingRulesConstants.Consolidate) { SendInventoryUpdateMessage(syncType, inventoryCD, baseMessage, inserted, deleted, warehouseID); } else { var warehouse = inserted.SelectToken("INSite_siteID")?.ToString(); if (!string.IsNullOrWhiteSpace(warehouse)) { SendInventoryUpdateMessage(syncType, inventoryCD, baseMessage, inserted, deleted); } } } else if (syncType == SyncType.VendorQuantity && graph.HasAnyMappedVendors()) { SendInventoryUpdateMessage(syncType, inventoryCD, baseMessage, inserted, deleted); } } } for (var x = 0; x < deletedList.Length; x++) { if (deletedList.Length == 1 && insertedList.Length == 0) { var del = deletedList[x]; var inventoryCD = del.SelectToken(INVENTORY_ID)?.ToString(); if (string.IsNullOrWhiteSpace(inventoryCD)) { continue; } var deleted = deletedObjects?.FirstOrDefault(z => z.SelectToken(INVENTORY_ID)?.ToString() == inventoryCD); JToken inserted = deleted; FixNullPrices(deleted); SetRetailPrice(deleted); SendUpdateMessage(syncType, inventoryCD, baseMessage, inserted, deleted); } } } }