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