public void SendAndForget(NotificationResultWrapper result, CancellationToken cancellationToken, Action <string> onSendingFailed, Action continuation)
 {
     try
     {
         this.Send(result, cancellationToken);
     }
     catch (Exception e)
     {
         string queueName = _msmq?.QueueName ?? Address;
         PXTrace.WriteError($"Sending to MSMQ {queueName} failed: {e.Message}");
         onSendingFailed($"Send to target {this.Name} failed: ({e.Message})");
     }
     finally
     {
         continuation();
     }
 }
        //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);
                    }
                }
            }
        }
 public void Send(NotificationResultWrapper results, CancellationToken cancellationToken)
 {
     PostNotification(results, cancellationToken);
 }