Example #1
0
        /// <summary>
        /// Get URL for a page to show tracking info (third party tracking page)
        /// </summary>
        /// <param name="trackingNumber">The tracking number to track</param>
        /// <param name="shipment">Shipment; pass null if the tracking number is not associated with a specific shipment</param>
        /// <returns>
        /// A task that represents the asynchronous operation
        /// The task result contains the URL of a tracking page
        /// </returns>
        public async Task <string> GetUrlAsync(string trackingNumber, Shipment shipment = null)
        {
            if (string.IsNullOrEmpty(trackingNumber))
            {
                return(string.Empty);
            }

            if (!await _shippingPluginManager.IsPluginActiveAsync(EasyPostDefaults.SystemName))
            {
                return(string.Empty);
            }

            return((await _easyPostService.GetTrackingUrlAsync(shipment, trackingNumber)).Url);
        }
Example #2
0
        /// <summary>
        /// Handle model received event
        /// </summary>
        /// <param name="eventMessage">Event message</param>
        /// <returns>A task that represents the asynchronous operation</returns>
        public async Task HandleEventAsync(ModelReceivedEvent <BaseNopModel> eventMessage)
        {
            if (eventMessage.Model is not ProductModel model)
            {
                return;
            }

            if (!await _shippingPluginManager.IsPluginActiveAsync(EasyPostDefaults.SystemName))
            {
                return;
            }

            if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
            {
                return;
            }

            var product = await _productService.GetProductByIdAsync(model.Id);

            if (product is null)
            {
                return;
            }

            //try to get additional form values for the product
            var form = _httpContextAccessor.HttpContext.Request.Form;

            if (form.TryGetValue(EasyPostDefaults.ProductPredefinedPackageFormKey, out var predefinedPackageValue))
            {
                var predefinedPackage = !StringValues.IsNullOrEmpty(predefinedPackageValue) ? predefinedPackageValue.ToString() : null;
                await _genericAttributeService.SaveAttributeAsync(product, EasyPostDefaults.ProductPredefinedPackageAttribute, predefinedPackage);
            }
            if (form.TryGetValue(EasyPostDefaults.ProductHtsNumberFormKey, out var htsNumberValue))
            {
                var htsNumber = !StringValues.IsNullOrEmpty(htsNumberValue) ? htsNumberValue.ToString() : null;
                await _genericAttributeService.SaveAttributeAsync(product, EasyPostDefaults.ProductHtsNumberAttribute, htsNumber);
            }
            if (form.TryGetValue(EasyPostDefaults.ProductOriginCountryFormKey, out var originCountryValue))
            {
                var originCountry = !StringValues.IsNullOrEmpty(originCountryValue) ? originCountryValue.ToString() : null;
                await _genericAttributeService.SaveAttributeAsync(product, EasyPostDefaults.ProductOriginCountryAttribute, originCountry);
            }
        }
        /// <summary>
        /// Invoke the widget view component
        /// </summary>
        /// <param name="widgetZone">Widget zone</param>
        /// <param name="additionalData">Additional parameters</param>
        /// <returns>
        /// A task that represents the asynchronous operation
        /// The task result contains the view component result
        /// </returns>
        public async Task <IViewComponentResult> InvokeAsync(string widgetZone, object additionalData)
        {
            if (!await _shippingPluginManager.IsPluginActiveAsync(EasyPostDefaults.SystemName))
            {
                return(Content(string.Empty));
            }

            if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageOrders))
            {
                return(Content(string.Empty));
            }

            if (!widgetZone.Equals(AdminWidgetZones.OrderShipmentDetailsButtons))
            {
                return(Content(string.Empty));
            }

            if (additionalData is not ShipmentModel shipmentModel)
            {
                return(Content(string.Empty));
            }

            var shipmentEntry = await _shipmentService.GetShipmentByIdAsync(shipmentModel.Id);

            if (shipmentEntry is null)
            {
                return(Content(string.Empty));
            }

            var order = await _orderService.GetOrderByIdAsync(shipmentEntry.OrderId);

            if (order is null)
            {
                return(Content(string.Empty));
            }

            if (order.ShippingRateComputationMethodSystemName != EasyPostDefaults.SystemName)
            {
                return(Content(string.Empty));
            }

            TEnum getEnumValue <TEnum>(string value) where TEnum : Enum => typeof(TEnum).GetFields()
            .FirstOrDefault(field => field.IsLiteral &&
                            field.GetCustomAttributes(false).OfType <EnumMemberAttribute>().FirstOrDefault()?.Value == value)
            ?.GetValue(null) is TEnum enumValue ? enumValue : default;

            async Task <List <SelectListItem> > prepareSelectList <TEnum>(TEnum enumValue) where TEnum : struct =>
        /// <summary>
        /// Manage sitemap. You can use "SystemName" of menu items to manage existing sitemap or add a new menu item.
        /// </summary>
        /// <param name="rootNode">Root node of the sitemap.</param>
        /// <returns>A task that represents the asynchronous operation</returns>
        public async Task ManageSiteMapAsync(SiteMapNode rootNode)
        {
            if (!await _shippingPluginManager.IsPluginActiveAsync(EasyPostDefaults.SystemName))
            {
                return;
            }

            if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageOrders))
            {
                return;
            }

            var salesNode = rootNode.ChildNodes.FirstOrDefault(node => node.SystemName.Equals("Sales"));

            if (salesNode is null)
            {
                return;
            }

            var shipmentsNode = salesNode.ChildNodes.FirstOrDefault(node => node.SystemName.Equals("Shipments"));

            if (shipmentsNode is null)
            {
                return;
            }

            salesNode.ChildNodes.Insert(salesNode.ChildNodes.IndexOf(shipmentsNode) + 1, new SiteMapNode
            {
                SystemName     = "EasyPost Batches",
                Title          = await _localizationService.GetResourceAsync("Plugins.Shipping.EasyPost.Batch"),
                ControllerName = "EasyPost",
                ActionName     = "BatchList",
                IconClass      = "far fa-dot-circle",
                Visible        = true,
                RouteValues    = new RouteValueDictionary {
                    { "area", AreaNames.Admin }
                }
            });
        }
        /// <summary>
        /// Invoke the widget view component
        /// </summary>
        /// <param name="widgetZone">Widget zone</param>
        /// <param name="additionalData">Additional parameters</param>
        /// <returns>
        /// A task that represents the asynchronous operation
        /// The task result contains the view component result
        /// </returns>
        public async Task <IViewComponentResult> InvokeAsync(string widgetZone, object additionalData)
        {
            if (!await _shippingPluginManager.IsPluginActiveAsync(EasyPostDefaults.SystemName))
            {
                return(Content(string.Empty));
            }

            if (!widgetZone.Equals(PublicWidgetZones.OpCheckoutShippingMethodTop))
            {
                return(Content(string.Empty));
            }

            if (!_easyPostSettings.AddressVerification)
            {
                return(Content(string.Empty));
            }

            if (!TempData.ContainsKey(NopMessageDefaults.NotificationListKey))
            {
                return(Content(string.Empty));
            }

            var warnings = JsonConvert.DeserializeObject <IList <NotifyData> >(TempData[NopMessageDefaults.NotificationListKey].ToString())
                           .Where(note => note.Type == NotifyType.Warning)
                           .Select(note => note.Message)
                           .ToList();

            if (!warnings.Any())
            {
                return(Content(string.Empty));
            }

            var script = @$ "
                <script>
                    $(document).ready(function () {{
                        alert('{string.Join(".", warnings).TrimEnd(' ')}');
                    }});
        /// <summary>
        /// Invoke the widget view component
        /// </summary>
        /// <param name="widgetZone">Widget zone</param>
        /// <param name="additionalData">Additional parameters</param>
        /// <returns>
        /// A task that represents the asynchronous operation
        /// The task result contains the view component result
        /// </returns>
        public async Task <IViewComponentResult> InvokeAsync(string widgetZone, object additionalData)
        {
            if (!await _shippingPluginManager.IsPluginActiveAsync(EasyPostDefaults.SystemName))
            {
                return(Content(string.Empty));
            }

            if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageShippingSettings))
            {
                return(Content(string.Empty));
            }

            if (!widgetZone.Equals(AdminWidgetZones.ProductDetailsBlock))
            {
                return(Content(string.Empty));
            }

            if (additionalData is not ProductModel productModel || !productModel.IsShipEnabled)
            {
                return(Content(string.Empty));
            }

            var product = await _productService.GetProductByIdAsync(productModel.Id);

            if (product is null)
            {
                return(Content(string.Empty));
            }

            //try to get previously saved values
            var predefinedPackageValue = await _genericAttributeService
                                         .GetAttributeAsync <string>(product, EasyPostDefaults.ProductPredefinedPackageAttribute) ?? string.Empty;

            var carrier           = predefinedPackageValue.Split('.').FirstOrDefault();
            var predefinedPackage = predefinedPackageValue.Split('.').LastOrDefault();
            var htsNumber         = await _genericAttributeService.GetAttributeAsync <string>(product, EasyPostDefaults.ProductHtsNumberAttribute);

            var originCountry = await _genericAttributeService.GetAttributeAsync <string>(product, EasyPostDefaults.ProductOriginCountryAttribute);

            var availablePredefinedPackages = PredefinedPackage.PredefinedPackages.SelectMany(carrierPackages => carrierPackages.Value
                                                                                              .Select(package => new SelectListItem($"{carrierPackages.Key} - {package}", $"{carrierPackages.Key}.{package}")))
                                              .ToList();

            availablePredefinedPackages.Insert(0, new SelectListItem("---", string.Empty));

            var availableCountries = (await _countryService.GetAllCountriesAsync(showHidden: true))
                                     .Select(country => new SelectListItem(country.Name, country.TwoLetterIsoCode))
                                     .ToList();

            availableCountries.Insert(0, new SelectListItem("---", string.Empty));

            var model = new ProductDetailsModel
            {
                EasyPostPredefinedPackage   = !string.IsNullOrEmpty(predefinedPackageValue) ? $"{carrier}.{predefinedPackage}" : string.Empty,
                AvailablePredefinedPackages = availablePredefinedPackages,
                EasyPostHtsNumber           = htsNumber,
                EasyPostOriginCountry       = originCountry,
                AvailableCountries          = availableCountries
            };

            return(View("~/Plugins/Shipping.EasyPost/Views/Product/_CreateOrUpdate.EasyPost.cshtml", model));
        }