nopCommerce 3.80 roadmap and estimated release date. Let's discuss

4 years ago
I have some of the features in Mind. Lets have a look on it

1 Multi Vendor Module:
1.1 There should be the subscription facility for vendors.(With different plan-limitation to categories, no of product upload, and validity)
1.2 Vendor payment settlement of sales report.
1.3 Store owner should get certain commission on selling of vendor's products.

2 Access control list (ACL)
Access control list should be provided to each and every menu, sub menu  items. This will help the store owner to enable, disable each menu.
Like if I Enable Admin area. Manage Customers it enables menu customers, customer roles, online customer, customer reports. Instead of this a separate ACL for each sub menu(Admin area. Manage Customers Roles, Admin area. Manage Online Customers, Admin area. Manage Customers reports) should be provided.

3. Logistic Integration

As it is need of time, in nopCommerce there is payment gateway integration, but there is no logistics support. (The shipping calculation methods are only to calculate shipping rates). See examples from Shopify here You can integrate all the possible logistics partners all over world by creating the plugins for it. This will help the customer as well as admin to manage and track the delivery of products.

4. Warehouse Management
There should be more clarity in terms of warehouse management. The inventory need to be track on basis of Location allocation (which shelf / bin it needs to be on). We can have bar code scanning facility in warehouse.


5. Discount Coupons
There must an area on public store where all the product discount coupons should display with all the essential conditions, valid period, etc
4 years ago
Nice list!!
4 years ago
Hi Andrei,

I suggest to add "product like/dislike by  customer"  feature in nop 3.80. I have done it with  for several clients.  source code=======>.

1.=====>modify Product.cs
 #region  liker_customer added by sohel
private ICollection<Customer> _likerCustomers;
        /// <summary>
        /// Gets or sets the product tags
        /// </summary>
        public virtual ICollection<Customer> LikerCustomers
        {
            get { return _likerCustomers ?? (_likerCustomers = new List<Customer>()); }
            protected set { _likerCustomers = value; }
        }

        #endregion

2.=====>modify Customer.cs
#region  liked_products added by sohel
private ICollection<Product> _likedProducts;
        /// <summary>
        /// Gets or sets the product tags
        /// </summary>
        public virtual ICollection<Product> LikedProducts
        {
            get { return _likedProducts ?? (_likedProducts = new List<Product>()); }
            protected set { _likedProducts = value; }
        }

        #endregion

3.=====>modify ProductMap.cs
//added by sohel
            this.HasMany(p => p.LikerCustomers)
               .WithMany(c => c.LikedProducts)
               .Map(m => m.ToTable("Bs_Product_Customer_Like_Mapping"));

4.=====>Modify Nop.Web     ====> ProductController.cs
#region product like/unlike added by sohel

      

        [HttpPost]
        [ActionName("ProductLike")]
        //[ValidateAntiForgeryToken]
        public ActionResult ProductLike(int  productId)
        {
            var product = _productService.GetProductById(productId);
            if(product==null)
                throw new Exception("No product found with this id."); ;

            if (!_workContext.CurrentCustomer.IsRegistered())
                throw new Exception("Anonymous like is not allowed! Please Login and then try again.");

            var customer = _workContext.CurrentCustomer;
            string responseError = string.Empty;
            if(product.LikerCustomers.Contains(customer))
                throw new Exception("You are already liked the product. Please the refresh page.");
            try
            {
                
                product.LikerCustomers.Add(customer);
                _productService.UpdateProduct(product);
                int productLikeCount = product.LikerCustomers.Count;
                return Json(new { success = true, liked_unliked = 1, productlikecounthtml = productLikeCount.ToString(), message = "Your like  request Success! " });

            }
            catch (Exception exc)
            {
                ModelState.AddModelError("", exc.Message);
                responseError += exc.Message;
            }

            return Json(new { success = false, message = responseError });
        }



        [HttpPost]
        [ActionName("ProductUnLike")]
        //[ValidateAntiForgeryToken]
        public ActionResult ProductUnLike(int productId)
        {

            if (!_workContext.CurrentCustomer.IsRegistered())
                throw new Exception("Anonymous like is not allowed! Please Login and then try again.");
            var product = _productService.GetProductById(productId);
            if (product == null)
                throw new Exception("No product found with this id.");
           var customer = _workContext.CurrentCustomer;
           if (!product.LikerCustomers.Contains(customer))
               throw new Exception("You are already unliked  the product. Please refresh the page.");
            string responseError = string.Empty;

            try
            {

                 product.LikerCustomers.Remove(customer);
                _productService.UpdateProduct(product);
                int productLikeCount = product.LikerCustomers.Count;
                return Json(new { success = true, liked_unliked = 1, productlikecounthtml = productLikeCount.ToString(), message = "Your unlike  request Success! " });
            }
            catch (Exception exc)
            {
                ModelState.AddModelError("", exc.Message);
                responseError += exc.Message;
            }

            return Json(new { success = false, message = responseError });
        }


  
        #endregion

5. Java Script=====>
/*
** //product like counter update added by Md. Minul Islam sohel Bs-23
    
*/



var ProductLike = {
    loadWaiting: false,
    usepopupnotifications: false,
    like_unlike_selector: '',
    
    init: function (usepopupnotifications, like_unlike_selector) {
        this.loadWaiting = false;
        this.usepopupnotifications = usepopupnotifications;
        this.like_unlike_selector = like_unlike_selector;
        
    },

    setLoadWaiting: function (display) {
        displayAjaxLoading(display);
        this.loadWaiting = display;
    },
    
  
    like: function (urllike, like_unlike_selector) {
        if (this.loadWaiting != false) {
            return;
        }
        this.setLoadWaiting(true);
        this.init(false, like_unlike_selector);
        $.ajax({
            cache: false,
            url: urllike,
            type: 'post',
            success: this.success_process,
            complete: this.resetLoadWaiting,
            error: this.ajaxFailure
        });
    },

    
    unlike: function (urlunlike, like_unlike_selector) {
        if (this.loadWaiting != false) {
            return;
        }
        this.setLoadWaiting(true);
        this.init(false,like_unlike_selector);
        $.ajax({
            cache: false,
            url: urlunlike,
            type: 'post',
            success: this.success_process,
            complete: this.resetLoadWaiting,
            error: this.ajaxFailure
        });
    },
    guestlike: function () {
        displayPopupNotification("Please <a href=\"/login\" class=\"ico-login\" style=\"color:red;text-decoration: underline;\"> Log in</a> to like the products", 'error', true);
      
    },
    

    success_process: function (response) {
        if (response.message) {
            //display notification
            if (response.success == true) {
                //success
                if (response.productlikecounthtml) {
                    $(ProductLike.like_unlike_selector).html(response.productlikecounthtml);
                    $(ProductLike.like_unlike_selector).toggle();
                }
                
                if (ProductLike.usepopupnotifications == true) {
                    displayPopupNotification(response.message, 'success', true);
                }
                else {
                    //specify timeout for success messages
                    displayBarNotification(response.message, 'success', 3500);
                }
            }
            else {
                //error
                if (ProductLike.usepopupnotifications == true) {
                    displayPopupNotification(response.message, 'error', true);
                }
                else {
                    //no timeout for errors
                    displayBarNotification(response.message, 'error', 0);
                }
            }
            return false;
        }
        if (response.redirect) {
            location.href = response.redirect;
            return true;
        }
        return false;
    },

    resetLoadWaiting: function () {
        ProductLike.setLoadWaiting(false);
    },

    ajaxFailure: function () {
        alert('Failed to like or unlike the product. Please refresh the page and try one more time.');
    }
};


6. ====> Modify  _ProductBox.cshtml

@{
// product like unlike url added by sohel
    var urlLike = Url.RouteUrl("CustomerProductLike", new { productId = Model.Id });
    var urlUnLike = Url.RouteUrl("CustomerProductUnLike", new { productId = Model.Id });
    var isGuestCustomer = EngineContext.Current.Resolve<IWorkContext>().CurrentCustomer.IsGuest();
}
@if (@isGuestCustomer)
                {
                    <a style="@(!(Model.IsLikedByCurrentCustomer) ? "display:block" : "display:none")" class="[email protected](Model.Id) like-btn item-like-counter disabled" onclick="ProductLike.guestlike()">@Model.ProductLikeCount</a>
                    <a style="@(!(Model.IsLikedByCurrentCustomer) ? "display:none" : "display:block")" class="[email protected](Model.Id) unlike-btn item-like-counter disabled">@Model.ProductLikeCount</a>

                }
                else
                {
                    <a style="@(!(Model.IsLikedByCurrentCustomer) ? "display:block" : "display:none")" class="[email protected](Model.Id) like-btn item-like-counter" onclick="ProductLike.like('@urlLike','[email protected](Model.Id)');return false; ">@Model.ProductLikeCount</a>
                    <a style="@(!(Model.IsLikedByCurrentCustomer) ? "display:none" : "display:block")" class="[email protected](Model.Id) unlike-btn item-like-counter" onclick="ProductLike.unlike('@urlUnLike','[email protected](Model.Id)');return false; ">@Model.ProductLikeCount</a>

                }
4 years ago
Hi,

Roadmap for 3.80 looks impressive. While all the current items on roadmap looks impressive. I would add / emphasize the few.

* Vendor enhancements that supports vendor subscription levels, better reporting and auditing for vendors actions on store and payment tracking reports
* Simplifying product addition by using predefined template - that will save a lot of time
* Better Analytics out of the box with more meaningful dashboard that can be modified by admin
* More powerful email campaigns with list / segment management so that campaigns can be sent to specific segment of customers based on their locations, purchase behaviour, products bought, etc.
* Better and faster Product import / export support out of the box, currently this feature is useless if you want to import once you have more than few thousands products, its too slow. And doesn't support attributes, etc.
* Enhancement to Blog area
* Ability to easily create separate catalogs using rules, pricing rules per catalog and assign it to store, currently it can be achieved using ACL on Products and tier price per role, but its time consuming to maintain.

Thanks,
Krunal
4 years ago
Thanks a lot for suggestions! I've just created work items for them
4 years ago
Small change to reward points and products would be great. Additional setting on product with extra points to earn if this product is purchased.

So not only reward points earn based on amount, but also for purchasing product as well.
4 years ago
It will be great to add a Product Picture in Cart Details in OrderDetails Page.
4 years ago
anik1991 wrote:
It will be great to add a Product Picture in Cart Details in OrderDetails Page.

Do you mean order details page in public store or admin area?
4 years ago
Hi Andrei,

Add vendor logo in product details page in vendor info section.
4 years ago
a.m. wrote:
It will be great to add a Product Picture in Cart Details in OrderDetails Page.
Do you mean order details page in public store or admin area?

In public store. By seeing picture customer easily understand which product he bought in case they forget without going to product details.