public async Task IssueSalesOrderUpdateNotification(
            ISalesOrderRepository salesOrderRepository,
            SalesOrderWorkItem salesOrderWorkItem,
            SalesOrderWorkflow workflow,
            decimal itemQuantity,
            decimal updatedItemQuantity)
        {
            var salesOrder = await salesOrderRepository.TryGetSalesOrder(salesOrderWorkItem.SalesOrderNumber).ConfigureAwait(false);

            var branchId = _configurationService.GetString(Config.BranchId);
            var branch   = await _branchRepository.ReadAsync(b => b.BranchId == branchId).ConfigureAwait(false);

            var salesOrderUpdateNotice = BuildEmailRecord(
                salesOrderWorkItem,
                workflow,
                itemQuantity,
                updatedItemQuantity,
                branch.BranchEmail,
                branch.BranchSvcRepEmail,
                salesOrder.SalesRepEmail
                );
            var emailString = JsonConvert.SerializeObject(salesOrderUpdateNotice);

            if (_networkService.IsConnected)
            {
                //await SendMessage(emailString).ConfigureAwait(false);
                await ProcessUnsentSalesOrderUpdateNotification().ConfigureAwait(false);
            }
            else
            {
                await _salesOrderUpdateNoticeRepository.CreateAsync(new SalesOrderUpdateNoticeString { Body = emailString }).ConfigureAwait(false);
            }
        }
 private SalesOrderUpdateNotice BuildEmailRecord(
     SalesOrderWorkItem salesOrderWorkItem,
     SalesOrderWorkflow workflow,
     decimal itemQuantity,
     decimal updatedItemQuantity,
     string branchEmail,
     string branchSvcRepEmail,
     string salesRepEmail
     )
 {
     return(new SalesOrderUpdateNotice
     {
         SalesOrderNumber = salesOrderWorkItem.SalesOrderNumber,
         ItemDescription = salesOrderWorkItem.ItemDescription,
         Uom = salesOrderWorkItem.Uom,
         CustomerNumber = salesOrderWorkItem.CustomerNumber,
         CustomerName = salesOrderWorkItem.CustomerName,
         ItemNumber = salesOrderWorkItem.ItemNumber,
         LotNumber = salesOrderWorkItem.LotNumber,
         OriginalQuantity = salesOrderWorkItem.OriginalQuantity,
         QuantityDelta = salesOrderWorkItem.QuantityDelta,
         PickedQuantity = salesOrderWorkItem.PickedQuantity,
         DeliveredQuantity = salesOrderWorkItem.DeliveredQuantity,
         UserId = _configurationService.GetString(Config.UserId),
         BranchId = _configurationService.GetString(Config.BranchId),
         UpdatedWhen = DateTime.Now,
         ItemQuantity = itemQuantity,
         UpdatedItemQuantity = updatedItemQuantity,
         BranchEmail = branchEmail,
         BranchSvcRepEmail = branchSvcRepEmail,
         SalesRepEmail = salesRepEmail
     });
 }
Пример #3
0
 /// <summary>
 ///     Get the item description without "extra" information.
 /// </summary>
 /// <param name="salesOrderWorkItem">A sales order work item instance.</param>
 /// <param name="salesOrderItem">A sales order item instance.</param>
 /// <returns>An item description.</returns>
 public static string GetDescriptionWithoutExtra(
     SalesOrderWorkItem salesOrderWorkItem,
     SalesOrderItem salesOrderItem
     ) => ItemDescriptionHelper.GetDescriptionWithoutExtra(
     salesOrderWorkItem == null
         ? salesOrderItem?.ItemDescription
         : salesOrderWorkItem.ItemDescription
     );
Пример #4
0
 /// <summary>
 ///     Get the UOM combined summary.
 /// </summary>
 /// <param name="workflow">The current workflow.</param>
 /// <param name="salesOrderWorkItem">A sales order work item instance.</param>
 /// <param name="salesOrderItem">A sales order item instance.</param>
 /// <returns>An OUM combined summary.</returns>
 public static string GetUomCombined(
     SalesOrderWorkflow workflow,
     SalesOrderWorkItem salesOrderWorkItem,
     SalesOrderItem salesOrderItem
     ) => ItemDescriptionHelper.GetUomCombined(
     salesOrderWorkItem == null
         ? salesOrderItem?.ItemQuantity ?? 0
         : GetSalesOrderWorkDescriptionQuantity(workflow, salesOrderWorkItem),
     salesOrderWorkItem?.ItemDescription ?? salesOrderItem?.ItemDescription,
     salesOrderWorkItem?.Uom ?? salesOrderItem?.Uom
     );
        /// <inheritdoc />
        public async Task <bool> TryDeleteSalesOrderWorkItem(SalesOrderWorkItem salesOrderWorkItem)
        {
            try
            {
                await _cloudTable.DeleteItemAsync(salesOrderWorkItem).ConfigureAwait(false);

                return(true);
            }
            catch (Exception ex)
            {
                _logService.WriteErrorLogEntry($"Failed to delete SalesOrderWorkItem ({salesOrderWorkItem.Id}): {ex}");
                ex.Report();
                return(false);
            }
        }
        // This is a method to temporarily filter out the sales order workitems that had lot number pre-populated in GP.
        // We want to ignore all such sales order workitems from being submitted back to GP.  The proper solution will
        // make changes to the schema of the Salesorder workitem record and save the original lot number and use that to
        // perform the check.
        private bool HasDifferentLotNumber(SalesOrderWorkItem item)
        {
            List <SalesOrderItem> soItems = new List <SalesOrderItem>();

            Task.Run(async() =>
            {
                soItems = (await _salesOrderItemRepository.TryGetSalesOrderItems(item.SalesOrderNumber)).Where(
                    soItem => soItem.ItemNumber == item.ItemNumber).ToList();
            }).Wait();

            if ((soItems.Count == 1) && soItems.First().LotNumber == item.LotNumber)
            {
                return(false);
            }
            return(true);
        }
Пример #7
0
 /// <summary>
 ///     Convert a SalesOrderWorkItem instance to a PickListItem.
 /// </summary>
 /// <param name="salesOrderWorkItem">The SalesOrderWorkItem instance to convert.</param>
 /// <returns>A new PickListItem instance.</returns>
 public static PickListItem ToPickListItem(
     SalesOrderWorkflow workflow,
     SalesOrderWorkItem salesOrderWorkItem
     ) => salesOrderWorkItem == null
         ? null
         : new PickListItem
 {
     SalesOrderWorkItemId = salesOrderWorkItem.Id,
     ItemNumber           = salesOrderWorkItem.ItemNumber,
     ItemDescription      = salesOrderWorkItem.ItemDescription,
     LotNumber            = salesOrderWorkItem.LotNumber,
     IsLotControlled      = salesOrderWorkItem.IsLotControlled,
     ItemQuantity         = SalesOrderItemDisplayHelper
                            .GetSalesOrderWorkDescriptionQuantity(workflow, salesOrderWorkItem),
     Uom = salesOrderWorkItem.Uom,
     Seq = salesOrderWorkItem.OriginalSequence
 };
Пример #8
0
        /// <summary>
        ///     Get the sales order work item quantity by using the status of the work item.
        /// </summary>
        /// <param name="workflow">The current workflow.</param>
        /// <param name="salesOrderWorkItem">
        ///     The sales order work item to get the quantity of.
        /// </param>
        /// <returns></returns>
        public static decimal GetSalesOrderWorkItemQuantityByStatus(
            SalesOrderWorkflow workflow,
            SalesOrderWorkItem salesOrderWorkItem
            )
        {
            switch (workflow)
            {
            case SalesOrderWorkflow.Pick:
                return(salesOrderWorkItem.PickedQuantity);

            case SalesOrderWorkflow.Deliver:
                return(salesOrderWorkItem.DeliveredQuantity == 0 ?
                       salesOrderWorkItem.PickedQuantity : salesOrderWorkItem.DeliveredQuantity);

            default:
                throw new ArgumentOutOfRangeException(nameof(workflow), workflow, null);
            }
        }
        /// <inheritdoc />
        public async Task <SalesOrderWorkItem> TryUpdateSalesOrderWorkItem(
            SalesOrderWorkItem salesOrderWorkItem
            )
        {
            try
            {
                var table = await GetCloudTable().ConfigureAwait(false);

                // Add the user here
                var userName = PinnacleApp.Get <IAuthService>().CurrentUser.Name;

                return(await table.UpdateItemAsync(salesOrderWorkItem).ConfigureAwait(false));
            }
            catch (Exception ex)
            {
                _logService.WriteErrorLogEntry($"Failed to update SalesOrderWorkItem ({salesOrderWorkItem?.Id}): {ex}");
                ex.Report();
                return(null);
            }
        }
        /// <summary>
        ///     Set the provided SalesOrderWorkItem insance to delivered. This is done by updating the
        ///     item delivered latitude and longitude properties as well as its status.
        /// </summary>
        /// <param name="salesOrderWorkItemRepository">An ISalesOrderWorkItemRepository instnace.</param>
        /// <param name="salesOrderWorkItem">The item to set as delivered.</param>
        /// <param name="position">The location of the device at the time of delivery.</param>
        /// <returns>An asynchronous Task.</returns>
        private static async Task SetSalesOrderWorkItemToDelivered(
            ISalesOrderWorkItemRepository salesOrderWorkItemRepository,
            SalesOrderWorkItem salesOrderWorkItem,
            Location position,
            string deliveredByUser
            )
        {
            salesOrderWorkItem.DeliveredLatitude  = position?.Latitude ?? 0;
            salesOrderWorkItem.DeliveredLongitude = position?.Longitude ?? 0;
            salesOrderWorkItem.DeliveredBy        = deliveredByUser;
            salesOrderWorkItem.DeliveredByName    = PinnacleApp.Get <IAuthService>().CurrentUser.Name;
            salesOrderWorkItem.DeliveredWhen      = DateTime.UtcNow;
            if (salesOrderWorkItem.DeliveredQuantity == 0)
            {
                salesOrderWorkItem.DeliveredQuantity = salesOrderWorkItem.PickedQuantity;
            }

            salesOrderWorkItem.Status = SalesOrderWorkItemStatus.Delivered;

            await salesOrderWorkItemRepository
            .TryUpdateSalesOrderWorkItem(salesOrderWorkItem).ConfigureAwait(false);
        }
Пример #11
0
        /// <summary>
        ///     Get the quantity of the sales order work item using the
        ///     newly selected lot number.
        /// </summary>
        /// <param name="workItem">The sales order work item to get a quantity for.</param>
        /// <param name="lotNumber">The newly selected (or cleared) lot number.</param>
        /// <returns></returns>
        private static decimal GetQuantity(
            SalesOrderWorkflow workflow,
            SalesOrderWorkItem workItem,
            string lotNumber
            )
        {
            // Get the quantity by the status of the work item.
            var quantityByStatus =
                SalesOrderItemDisplayHelper.GetSalesOrderWorkItemQuantityByStatus(workflow, workItem);

            // Lot number is null, use the quantity by status value.
            if (string.IsNullOrWhiteSpace(lotNumber))
            {
                return(quantityByStatus);
            }

            return(quantityByStatus == 0
                   // Nothing set, use original quantity.
                ? workItem.OriginalQuantity
                   // Value was set, use it.
                : quantityByStatus);
        }
        /// <summary>
        ///     Try to set the provided SalesOrderWorkItem instance status.
        /// </summary>
        /// <param name="salesOrderWorkItem">The sales order work item.</param>
        /// <param name="position">The pick-up location.</param>
        /// <returns>An asynchronous Task instance.</returns>
        private async Task TrySetSalesOrderWorkItemAsPicked(
            SalesOrderWorkItem salesOrderWorkItem,
            Location position
            )
        {
            salesOrderWorkItem.Status          = SalesOrderWorkItemStatus.Picked;
            salesOrderWorkItem.PickedLatitude  = position?.Latitude ?? 0;
            salesOrderWorkItem.PickedLongitude = position?.Longitude ?? 0;
            salesOrderWorkItem.PickedWhen      = DateTime.UtcNow;

            var table = await GetCloudTable().ConfigureAwait(false);

            try
            {
                await table.UpdateItemAsync(salesOrderWorkItem).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                _logService.WriteErrorLogEntry("Failed to update sales order work item status " +
                                               $"({salesOrderWorkItem.Id}): {ex}");
                ex.Report();
            }
        }
Пример #13
0
 /// <summary>
 ///     Get the sales order work item display state description quantity.
 /// </summary>
 /// <param name="workflow">The current workflow.</param>
 /// <param name="salesOrderWorkItem">The sales order work item.</param>
 /// <returns>The display state quantity.</returns>
 public static decimal GetSalesOrderWorkItemTakenQuantity(
     SalesOrderWorkflow workflow,
     SalesOrderWorkItem salesOrderWorkItem
     ) => string.IsNullOrWhiteSpace(salesOrderWorkItem.LotNumber)
     ? 0
     : GetSalesOrderWorkItemQuantityByStatus(workflow, salesOrderWorkItem);
Пример #14
0
 /// <summary>
 ///     Get the sales order work item display state taken quantity.
 /// </summary>
 /// <param name="workflow">The current workflow.</param>
 /// <param name="salesOrderWorkItem">The sales order work item.</param>
 /// <returns>The display state quantity.</returns>
 public static decimal GetSalesOrderWorkDescriptionQuantity(
     SalesOrderWorkflow workflow,
     SalesOrderWorkItem salesOrderWorkItem
     ) => GetSalesOrderWorkItemQuantityByStatus(workflow, salesOrderWorkItem);