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