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);
                    }
                }
            }
        }