revert / undo shop creatrion sql

   begin transaction


DECLARE @newWebsiteId nvarchar(50);

DECLARE @newWebsiteName nvarchar(50);

DECLARE @newWebsiteDomain nvarchar(50);


--SET @newWebsiteId = N'SANA_CH'; -- set a new website ID instead of 'NewWebsiteID'

--SET @newWebsiteName = N'SANA_CH'; -- set the name of the new website instead of 'New Website Name'

--SET @newWebsiteDomain = N'ravensburger-ch-beta.sanastores.net'; -- set the domain for new website instead of 'localhost'

--SELECT @defaultLanguage = Id FROM [Languages] WHERE [IsDefault] = 1;


 -- delete from [Websites] where id ='SANA_CH' -- @newWebsiteId

-- delete from [WebsiteLanguages] where [WebsiteId] ='SANA_CH' -- @newWebsiteId :: done

-- delete from  FederalMerchants_935.[dbo].[WebsiteDomains]  where [WebsiteId] = 'SANA_CH' :: done


 -- d-elete  AdminUsers manualy :: done

  --delete from FederalMerchants_935.[dbo].[FlexiPages] where [WebsiteId] = 'SANA_CH' --@newWebsiteId :: done

  --delete from FederalMerchants_935.[dbo].[Settings] where [WebsiteId] = 'SANA_CH' --@newWebsiteId :: done

Product Enrichments/Product Page admin add new fields

 

Ticket 100050: [Integria MVP] 3.4. Product details page changes


Need to Get details from GetProducts and save Product Enrichments on product index run 
to do 
Code idea get from: CategoryImportController > LinkProductPages()


public class ExtendedOfflineProductProvider : OfflineProductProvider, IExtendedProductProvider
    {
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Gets the admin data manager.
        /// </summary>
        protected virtual AdminDataManager DataManager
        {
            get { return AdminDataManager.Current; }
        }
 
        public override void SaveProducts(IEnumerable<IProduct> products)
        {
            base.SaveProducts(products);
 
            /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
            LinkProductPages(products);
        }
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Links the product pages to the currently imported navigation item.
        /// below Code from: CategoryImportController > LinkProductPages()
        /// </summary>
        /// <param name="products"></param>
        protected virtual void LinkProductPages(IEnumerable<IProduct> products)
        {
            using (var unit = DataManager.CreateUnitOfWork())
            {
                var productIds = products.Select(r => r.Id).ToArray();
                var enrichments = CommerceFrameworkBase.ProductContent.Provider.GetProductEnrichments(productIds)
                    .ToDictionary(i => i.ProductId, StringComparer.OrdinalIgnoreCase);
 
                foreach (var product in products)
                {
                    IProductEnrichment enrichment;
                    if (enrichments.TryGetValue(product.Id, out enrichment))
                    {
                        var IsValid = FillProductDetailLeveDescriptions(product, enrichment);
                        if (IsValid)
                        {
                            Update(enrichment);
                        }
                    }
                    else
                    {
                        enrichment = ObjectFactory.Create<IProductEnrichment>();
                        enrichment.ProductId = product.Id;
 
                        // Save New Enrichments
                        var IsValid = FillProductDetailLeveDescriptions(product, enrichment);
                        if (IsValid)
                        { 
                            Insert(enrichment);
                        }  
                    }
                }
                unit.Flush();
                unit.Commit();
            }
        }
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// This method will Fill Product level descriptions and check validity of updated Products. 
        /// </summary>
        /// <param name="product">product</param>
        /// <param name="enrichment">enrichment</param>
        /// isChecked :Flag use to identify current product need to be updated or not. True:Should insert or update, Else :ignore
        /// <returns></returns>
        private bool FillProductDetailLeveDescriptions(IProduct product, IProductEnrichment enrichment)
        {
            bool isChecked = false; // Flag use to identify current product need to be updated or not.
 
            if (!string.IsNullOrEmpty(((Product)product).Indications))
            {
                ((ProductEnrichment)enrichment).Description1 = ((Product)product).Indications;
                isChecked = true;
            }
            if (!string.IsNullOrEmpty(((Product)product).Dosage))
            {
                ((ProductEnrichment)enrichment).Description2 = ((Product)product).Dosage;
                isChecked = true;
            }
            if (!string.IsNullOrEmpty(((Product)product).Indications))
            {
                ((ProductEnrichment)enrichment).Description1 = ((Product)product).Indications;
                isChecked = true;
            }
            if (!string.IsNullOrEmpty(((Product)product).Cautions))
            {
                ((ProductEnrichment)enrichment).Description3 = ((Product)product).Cautions;
                isChecked = true;
            }
            if (!string.IsNullOrEmpty(((Product)product).CompanionTherapy))
            {
                ((ProductEnrichment)enrichment).Description4 = ((Product)product).CompanionTherapy;
                isChecked = true;
            }
            if (!string.IsNullOrEmpty(((Product)product).BeneficialFor))
            {
                ((ProductEnrichment)enrichment).Description5 = ((Product)product).BeneficialFor;
                isChecked = true;
            }
            if (!string.IsNullOrEmpty(((Product)product).Ingredients))
            {
                ((ProductEnrichment)enrichment).Description6 = ((Product)product).Ingredients;
                isChecked = true;
            }
            if (!string.IsNullOrEmpty(((Product)product).OtherInfo))
            {
                ((ProductEnrichment)enrichment).Description7 = ((Product)product).OtherInfo;
                isChecked = true;
            }
 
            ((ProductEnrichment)enrichment).LevelId1 = ProductLevel.Level01;
            ((ProductEnrichment)enrichment).LevelId2 = ProductLevel.Level02;
            ((ProductEnrichment)enrichment).LevelId3 = ProductLevel.Level03;
            ((ProductEnrichment)enrichment).LevelId4 = ProductLevel.Level04;
            ((ProductEnrichment)enrichment).LevelId5 = ProductLevel.Level05;
            ((ProductEnrichment)enrichment).LevelId6 = ProductLevel.Level06;
            ((ProductEnrichment)enrichment).LevelId7 = ProductLevel.Level07;
 
            return isChecked;
        }
 
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Updates the specified entity with invoking all registered persistence handlers.
        /// All operations are executed in a single transaction.
        /// </summary>
        /// <param name="entity">The entity.</param>
        protected virtual void Update(object entity)
        {
            using (var unit = DataManager.CreateUnitOfWork())
            {
                OnBeforeUpdate(entity);
                DataManager.Save(entity);
                OnAfterUpdate(entity);
                unit.Commit();
            }
        }
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Inserts the specified entity with invoking all registered persistence handlers.
        /// All operations are executed in a single transaction.
        /// </summary>
        /// <param name="entity">The entity.</param>
        protected virtual void Insert(object entity)
        {
            using (var unit = DataManager.CreateUnitOfWork())
            {
                OnBeforeSave(entity);
                DataManager.Save(entity);
                OnAfterSave(entity);
                unit.Commit();
            }
        }
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Called before an entity is updated in the datastore.
        /// If not overridden in a derived class, invokes the corresponding event on all registered persistence handlers.
        /// </summary>
        /// <param name="entity">The entity.</param>
        protected virtual void OnBeforeUpdate(object entity)
        {
            PersistenceHandlers.Handle(h => h.OnBeforeUpdate(entity));
        }
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Called after an entity has been updated in the datastore.
        /// If not overridden in a derived class, invokes the corresponding event on all registered persistence handlers.
        /// </summary>
        /// <param name="entity">The entity.</param>
        protected virtual void OnAfterUpdate(object entity)
        {
            PersistenceHandlers.Handle(h => h.OnAfterUpdate(entity));
        }
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Called before a new entity is saved to the datastore.
        /// If not overridden in a derived class, invokes the corresponding event on all registered persistence handlers.
        /// </summary>
        /// <param name="entity">The entity.</param>
        protected virtual void OnBeforeSave(object entity)
        {
            PersistenceHandlers.Handle(h => h.OnBeforeSave(entity));
        }
 
        /// Ticket 100050: [Integria MVP] 3.4. Product details page changes
        /// <summary>
        /// Called after a new entity has been saved to the datastore.
        /// If not overridden in a derived class, invokes the corresponding event on all registered persistence handlers.
        /// </summary>
        /// <param name="entity">The entity.</param>
        protected virtual void OnAfterSave(object entity)
        {
            PersistenceHandlers.Handle(h => h.OnAfterSave(entity));
        }
 
 
    }








Open PDF doc in new tab without showing download popup.

 Project :PRL glass 

Ticket 102771: [PRL Glass] 3.3. Download Customer Statement report from My Account
Response.SetCookie(new HttpCookie("fileDownload", "true") { HttpOnly = false });                       
                      
          Response.Buffer = true;
          Response.ContentType = "application/pdf";
 
          Response.AppendHeader("Content-Disposition", "inline; filename=" + reportname + ".pdf");
 
          Response.Cache.SetCacheability(HttpCacheability.NoCache);
          Response.OutputStream.Write(memoryStreamReport, 0, memoryStreamReport.Length);
 
          Response.End();


View\Default\Profile\Index.cshtml

// Ticket 102771: [PRL Glass] 3.3. Download Customer Statement report from My Account
            // Add Button with and set target = "_blank" to open in new window.
            @Sana.LinkButton(textKey: reportName.ToString(),
               url: Url.Action("CustomerStatmentReport", "ErpFileDownload", new { customerId = customerId.ToString() }),
               cssClass: "btn btn-report", defaultText: reportName.ToString(), htmlAttributes: new { rel = "nofollow", target = "_blank" })
           



public class ExtendedErpFileDownloadController : ErpFileDownloadController
    {
        protected override void RegisterSystemRoutes(SanaRouteCollection routes)
        {
            base.RegisterSystemRoutes(routes);
 
            // Ticket 102771: [PRL Glass] 3.3. Download Customer Statement report from My Account
            routes.MapSystemPageRoute(Name, "CustomerStatmentReport", "CustomerStatmentReport", "CustomerStatmentReport/files/Customer-Statment-Report.pdf");
        }
 
        // Ticket 102771: [PRL Glass] 3.3. Download Customer Statement report from My Account
        /// <summary>
        /// A GET action to get the customer statment report.
        /// </summary>
        /// <param name="customerId">The customer ID.</param> 
        /// <returns>Returns the order report.</returns>
        [Authorize]
        [HttpGet]
        public virtual ActionResult CustomerStatmentReport(string customerId, int maxTimeoutExceptionSkips = 5, int sleepDurationBetweenAttempts = 10000)
        {
            if (customerId.IsEmptyString())
                return HttpNotFound();            
 
            Stream reportStream = null;
            var retryCount = maxTimeoutExceptionSkips;
            while (true)
            {
                try
                {
                    reportStream = ((ExtendedAttachmentApi)ShopApi.Attachments).LoadCustomerStatmentReport(customerId);
                }
                catch (SanaConnectionException ex)
                {
                    if (ex.InnerException == null || !(ex.InnerException is TimeoutException))
                        throw;
                    if (retryCount == 0)
                        throw;
                    Thread.Sleep(sleepDurationBetweenAttempts);
                    retryCount--;
                    continue;
                }
                break;
            }
 
            if (reportStream == null)
                return new HttpNotFoundResult();
            
            //Set report name.
            var reportname = "CustomerStatmentReport_" + customerId;
            
            //Get bytes from stream.
            var memoryStreamReport = ((MemoryStream)reportStream).ToArray();
 
            Response.SetCookie(new HttpCookie("fileDownload", "true") { HttpOnly = false });
 
            Response.Buffer = true;
            Response.ContentType = "application/pdf";
            Response.AppendHeader("Content-Disposition", "inline; filename=" + reportname + ".pdf");
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.OutputStream.Write(memoryStreamReport, 0, memoryStreamReport.Length);
            Response.End();
 
            return File(reportStream, System.Net.Mime.MediaTypeNames.Application.Pdf, reportname);            
        }
 
    }











_varient drop down manualy select Holzpitcher Project

 on Customization user able to click view 


_variantDropdown

@model ProductViewModel
@using Sana.Commerce.Catalog;
@using Sana.Commerce.Shop
@using Sana.Commerce.Customization.ExtendedModels
 
@{
    var variants = Model.Product.Variants;
    var firstGroup = Model.Product.VariantComponents.FirstOrDefault();
    var showPrices = Shop.UserAbilities.Has(AbilityTo.ViewPrices);
    var showStock = Shop.UserAbilities.Has(AbilityTo.ViewStock);
 
    var type = Shop.Settings.ActionPricesPresentationType;
 
    // scope not defined 
    //var selectedVarientId = variants.Where(x => ((ExtendedProductVariant)x).IsSelectedVariant == true).FirstOrDefault();
        
 
    var showListPrice = showPrices &&
(type.iEquals(WebsiteSettings.ActionPricePresentationModes.BaseAndSalesPrice)
|| type.iEquals(WebsiteSettings.ActionPricePresentationModes.BaseAndSalesPriceDiscountPercentage)
|| type.iEquals(WebsiteSettings.ActionPricePresentationModes.BaseAndSalesPriceDiscountAmount));
 
    var showDiscountAmount = showPrices &&
                            (type.iEquals(WebsiteSettings.ActionPricePresentationModes.SalesPriceDiscountAmount)
                            || type.iEquals(WebsiteSettings.ActionPricePresentationModes.BaseAndSalesPriceDiscountAmount));
 
    var showDiscountPercent = showPrices &&
                              (type.iEquals(WebsiteSettings.ActionPricePresentationModes.BaseAndSalesPriceDiscountPercentage)
                              || type.iEquals(WebsiteSettings.ActionPricePresentationModes.SalesPriceDiscountPercentage));
}
 
@if (firstGroup == null)
{
    @DropdownFormRow("variantId", showPrices, showListPrice, showDiscountAmount, showDiscountPercent, showStock, null, variants, "withoutgroup")
}
else if (Model.Product.VariantComponents.Count == 1)
{
    @DropdownFormRow("variantId", showPrices, showListPrice, showDiscountAmount, showDiscountPercent, showStock, firstGroup, variants, "single")
}
else
{
    string ddId = "c" + Next();
    @DropdownFormRow(ddId, showPrices, showListPrice, showDiscountAmount, showDiscountPercent, showStock, firstGroup, variants, "multifirst")
    var combinations = InitialCombinations(firstGroup, variants);
    foreach (var group in Model.Product.VariantComponents.Skip(1).Take(Model.Product.VariantComponents.Count - 2))
    {
        ddId = "c" + Next();
        @DropdownFormRow(ddId, showPrices, showListPrice, showDiscountAmount, showDiscountPercent, showStock, group, variants, "multimiddle", combinations)
        combinations = ExpandCombinations(combinations, group);
    }
    var lastGroup = Model.Product.VariantComponents.Last();
    @DropdownFormRow("variantId", showPrices, showListPrice, showDiscountAmount, showDiscountPercent, showStock, lastGroup, variants, "multilast", combinations)
}
 
@helper DropdownFormRow(string ddId, bool showPrices, bool showListPrice, bool showDiscountAmount, bool showDiscountPercent, bool showStock, IVariantComponentGroup group, IProductVariantCollection variants, string mode, IList<dynamic> combinations = null)
{
    <div class="form-row row-variant">
        <div class="control">
            <div class="label">
                <label for="@ddId">@VariantComponentGroupName(group)</label>
            </div>
            <div class="field">
                <div class="ddlb ddlb-component">
                    @if (mode == "withoutgroup")
                    {
                        <select name="@ddId" id="@ddId">
                            @Html.Each(variants,
                                                    @<option value="@item.Id" data-price="@GetPrice(item, showPrices)"
                                                             data-listprice="@GetListPrice(item, showListPrice)"
                                                             data-inventory="@When(showStock, item.Inventory.ToString())"
                                                             data-image-tags="@TagBuilder.CreateSanitizedId('v' + item.Id)"
                                                             data-discount-percentage="@GetDiscountPercantage(item, showDiscountPercent)"
                                                             data-discount-amount="@GetDiscountAmount(item, showDiscountAmount)"
                                                             data-available-sales-agreement-lines="@item.AvailableSalesAgreementLines.ToJson().ToHtmlString()"
                                                             @When(!item.IsOrderable, "data-not-orderable")>
                                                        @item.Title.Or(item.Id)
                                                    </option>)
                        </select>
                    }
                    else if (mode == "single")
                    {
                        <select name="@ddId" id="@ddId">
                            @Html.Each(group.Items.Select(i => variants.FirstOrDefault(v => v.Components.Match(group.Id, i.Id))).Where(v => v != null),
                                                    @<option value="@item.Id" data-price="@GetPrice(item, showPrices)"
                                                             data-listprice="@GetListPrice(item, showListPrice)"
                                                             data-inventory="@When(showStock, item.Inventory.ToString())"
                                                             data-image-tags="@TagBuilder.CreateSanitizedId('v' + item.Id) @TagBuilder.CreateSanitizedId('v' + item.Components[group.Id])"
                                                             data-discount-percentage="@GetDiscountPercantage(item, showDiscountPercent)"
                                                             data-discount-amount="@GetDiscountAmount(item, showDiscountAmount)"
                                                             data-available-sales-agreement-lines="@item.AvailableSalesAgreementLines.ToJson().ToHtmlString()"
                                                             @When(!item.IsOrderable, "data-not-orderable")>
                                                        @group.Items[item.Components[group.Id]].Name
                                                    </option>)
                        </select>
                    }
                    else if (mode == "multifirst")
                    {
                        // 3.3 issue Set selected drop down
                        var selectedVarient = variants.Where(x => ((ExtendedProductVariant)x).IsSelectedVariant == true).FirstOrDefault();
 
                        if (selectedVarient != null)
                        {
                            var selectedVarientComponent = group.Items.FilterByVariants(new List<IProductVariant>() { selectedVarient }).FirstOrDefault();
                            var comId = selectedVarientComponent.Id;
 
                            @Html.DropDownList(ddId, group.Items.FilterByVariants(variants).Select(c => new SelectListItem { Value = c.Id, Text = c.Name, Selected = (c.Id == comId) }))
                        }
                        else
                        {
                            @Html.DropDownList(ddId, group.Items.FilterByVariants(variants).Select(c => new SelectListItem { Value = c.Id, Text = c.Name }))
                        }
                    }
                    else if (mode == "multimiddle")
                    {
                        <select name="@ddId" id="@ddId">
                            @foreach (var scope in combinations)
                            {
                                var selectedVarient = variants.Where(x => ((ExtendedProductVariant)x).IsSelectedVariant == true).FirstOrDefault();
                                if (selectedVarient != null)
                                {
 
                                    var selectedVarientComponent = group.Items.FilterByVariants(new List<IProductVariant>() { selectedVarient }).FirstOrDefault();
                                    var comId = selectedVarientComponent.Id;
 
                                    var ss = (IList<IProductVariant>)scope.Variants;
                                    //var selectedVarientComponent = group.Items.FilterByVariants(new List<IProductVariant>() { selectedVarient }).FirstOrDefault();
                                }
 
                                var items = group.Items.FilterByVariants((IList<IProductVariant>)scope.Variants);
                                <optgroup label="@scope.Text" data-scope="@scope.Key">
                                    @Html.Each(items, @<option value="@scope.Key @item.Id">@item.Name</option>)
                                </optgroup>
                            }
                        </select>
                    }
                    else if (mode == "multilast")
                    {
 
                        var selectedVarient = variants.Where(x => ((ExtendedProductVariant)x).IsSelectedVariant == true).FirstOrDefault();
                        if (selectedVarient != null)
                        {
 
                        }
 
                        <select name="@ddId" id="@ddId">
                            @foreach (var scope in combinations)
                            {
                                var vars = (IList<IProductVariant>)scope.Variants;
                                <optgroup label="@scope.Text" data-scope="@scope.Key">
                                    @foreach (var item in group.Items)
                                    {
                                        var variant = vars.FirstOrDefault(v => v.Components.Match(group.Id, item.Id));
                                        if (variant != null)
                                        {
                                            var selectedValue = "";
 
                                            //if (variant.Id == selectedVarient.Id)
                                            //{
                                            //    selectedValue = "selected";
                                            //}
 
                                            <option @selectedValue
                                                    value="@variant.Id" data-price="@GetPrice(variant, showPrices)"
                                                    data-listprice="@GetListPrice(variant, showListPrice)"
                                                    data-inventory="@When(showStock, variant.Inventory.ToString())"
                                                    data-image-tags="@TagBuilder.CreateSanitizedId('v' + variant.Id) @variant.Components.Values.Select(v => TagBuilder.CreateSanitizedId('v' + v)).JoinWith(" ")"
                                                    data-discount-percentage="@GetDiscountPercantage(variant, showDiscountPercent)"
                                                    data-discount-amount="@GetDiscountAmount(variant, showDiscountAmount)"
                                                    data-available-sales-agreement-lines="@variant.AvailableSalesAgreementLines.ToJson().ToHtmlString()"
                                                    @When(!variant.IsOrderable, "data-not-orderable")>
                                                @item.Name
                                            </option>
                                        }
                                    }
                                </optgroup>
                            }
                        </select>
                    }
                </div>
            </div>
        </div>
    </div>
}
 
@functions
{
    string GetPrice(Sana.Commerce.Catalog.IProductVariant variant, bool showPrices)
    {
        if (!showPrices)
            return null;
 
        return variant.Price.FormatAsPrice();
    }
 
    string GetListPrice(Sana.Commerce.Catalog.IProductVariant variant, bool showPrices)
    {
        if (!showPrices)
            return null;
 
        if (variant.ListPrice == null)
            return string.Empty;
 
        return variant.ListPrice.Value.FormatAsPrice();
    }
 
    string GetDiscountPercantage(Sana.Commerce.Catalog.IProductVariant variant, bool showPrices)
    {
        if (!showPrices)
            return null;
 
        return ProductExtensions.DiscountPercentage(variant.Price, variant.ListPrice, Shop.CommerceContext.CurrencyId).ToHtmlString();
    }
 
    string GetDiscountAmount(Sana.Commerce.Catalog.IProductVariant variant, bool showPrices)
    {
        if (!showPrices)
            return null;
 
        return ProductExtensions.DiscountAmount(variant.Price, variant.ListPrice, Shop.CommerceContext.CurrencyId).ToHtmlString();
    }
 
    IHtmlString VariantComponentGroupName(IVariantComponentGroup group)
    {
        return group == null ? Sana.SimpleText("Variant") : Sana.SimpleText("Product_VariantComponent_" + group.Id, group.Name);
    }
 
    IList<dynamic> InitialCombinations(IVariantComponentGroup group, IList<IProductVariant> variants)
    {
        return ExpandCombinations(new[] { new { Key = string.Empty, Variants = variants } }, group);
    }
 
    IList<dynamic> ExpandCombinations(IList<dynamic> current, IVariantComponentGroup group)
    {
        var result = new List<dynamic>();
        foreach (var parent in current)
        {
            var variants = (IList<IProductVariant>)parent.Variants;
            foreach (var item in group.Items.FilterByVariants(variants))
            {
                result.Add(new
                {
                    Key = parent.Key != string.Empty ? parent.Key + ' ' + item.Id : item.Id,
                    Text = parent.Key != string.Empty ? parent.Text + '-' + item.Name : item.Name,
                    Variants = variants.Where(v => v.Components.Match(group.Id, item.Id)).ToArray()
                });
            }
        }
        return result;
    }
 
}

Ticket 93818: [Holz Pichler] 3.3. Item variants – “range value” attributes.