Add attribute to button eg disable

 @Sana.SubmitButton("Submit", "btn btn-big btnCreateNewAcc", htmlAttributes: new { @disabled = "disabled" })

Checkbox must true

[MustBeTrue(ErrorMessage = "Register_IsAgreedMessage")]
        [Display(Name = "Register_IsConfirm")]
        [Required]
        [UIHint("Register_IsConfirm")]
        public virtual bool IsAgreed { get; set; }

How to Create New Mail Template


1. Issue :Ravensburger  [49417] 3.5. ORDER FAILURE – E-MAIL

2. Issue: Versalert 3.7. PRODUCT LIST/DETAIL PAGE – REQUEST TO ADD/DELETE ITEM FROM FIXED ORDER LIST


Ravensburger  [49417] 3.5. ORDER FAILURE – E-MAIL
1. create a Template Name


public virtual string GetOrderFailedMailTemplateName()
 {
    return "OrderFail";
 }



2.Get Email Address and Create Order Mail Method on ExtendedCheckoutApi.






/// <summary>
        /// [49417] 3.5. ORDER FAILURE – E-MAIL
        /// This method will send the Order Failed Mail
        /// </summary>
        /// <param name="order">order</param>
        /// <param name="basket">basket</param>
        /// <param name="errorMessage">error message</param>
        private void SendFailedOrderMail(IOrder order,IBasket basket, string errorMessage)
        {
            //Set Order Total values from Basket Values.
            SetOrderTotalPrice(order, basket);
 
            //Get Admin Setting Order Failed Email address 
            var settings = (CommerceFrameworkBase.ShopSettings.GetSettings(SettingsKeys.General));
            var ws = ObjectFactory.Create<Sana.Commerce.Shop.IWebsiteSettings>();
            ws.Initialize(settings);
            var list = ((ExtendedWebsiteSettings)ws).OrderFailedEmailAddress.Split(';');
 
            if (list != null)
            {
                List<MailAddress> addressList = new List<MailAddress>();
                foreach (var item in list)
                {
                    if (!string.IsNullOrEmpty(item))
                    {
                        addressList.Add(new MailAddress(item));
                    }
                }
                ((Sana.Commerce.Order.Order)order).OrderFailedErrorMessage = errorMessage;
 
                var templateName = GetOrderFailedMailTemplateName();
                var mail = ServiceManager.GetInstance<ExtendedOrderConfirmationHelper>().GetOrderFailureMail(templateName, order, null, addressList);
                ShopApi.Mail.Send(mail);
 
            }
        }



3.
ExtendedOrderConfirmationHelper > GetOrderFailureMail

Email creation has done from here.(set order template, Replace tags,BCC,CC, receipts )


public virtual MailMessage GetOrderFailureMail(string templateName, IOrder order, NameValueCollection additionalReplaceTags = null, IList<MailAddress> recipients = null)
        {
            var shopContext = ShopContext.GetCurrent();
            var settings = shopContext.Settings;
 
            var fromAddress = new MailAddress(settings.FromEmailAddress);
            var replaceTags = GetFailOrderReplaceTags(shopContext, order);
            if (additionalReplaceTags != null)
            {
                additionalReplaceTags.AllKeys.Each(tagName => replaceTags.Add(tagName, additionalReplaceTags[tagName]));
            }
 
            var additionalData = new Dictionary<string, object>();
            additionalData.Add("OrderDetails", CreateOrderDetailsModel(shopContext, order));
 
            if (recipients == null)
            {
                recipients = GetEmailAddresses(shopContext, order);
            }
 
            var mail = ShopApi.Mail.Render(fromAddress, recipients, templateName, replaceTags, additionalData);
            if (settings.BccEmailAddresses != null)
            {
                settings.BccEmailAddresses.Each(bcc => mail.Bcc.Add(new MailAddress(bcc)));
            }
            return mail;
        }


4.
ExtendedOrderConfirmationHelper > GetReplaceTags()


protected virtual NameValueCollection GetFailOrderReplaceTags(ShopContext shopContext, IOrder order)
        {
            var currentUserAccount = CommerceFramework.ShopAccounts.GetShopAccount(shopContext.ShopAccount.Id, true);
            var customer = CommerceFrameworkBase.Customers.GetCustomer(shopContext.CommerceContext.AccountId);
 
            var replaceTags = base.GetReplaceTags(shopContext, order);
 
            replaceTags.Add("CUSTOMER_NAME_LABEL", CommerceFrameworkBase.SanaTexts.GetSanaText("CustomerNameLabel", "Customer Name"));
            replaceTags.Add("CUSTOMER_ID_LABEL", CommerceFrameworkBase.SanaTexts.GetSanaText("CustomerIdLabel", "Customer Id"));
            replaceTags.Add("SHOPACCOUNT_EMAIL_LABEL", CommerceFrameworkBase.SanaTexts.GetSanaText("ShopAccountEmailLabel", "Shop Account Email"));
            replaceTags.Add("SHOPACCOUNT_NAME_LABEL", CommerceFrameworkBase.SanaTexts.GetSanaText("ShopAccountNameLabel", "Shop Account"));
 
            replaceTags.Add("CUSTOMER_NAME", customer.Name);
            replaceTags.Add("CUSTOMER_ID", customer.Id);
            replaceTags.Add("SHOPACCOUNT_EMAIL", shopContext.ShopAccount.Email);
            replaceTags.Add("ORDER_ERROR_MESSAGE", ((Sana.Commerce.Order.Order)order).OrderFailedErrorMessage);
            return replaceTags;
        }


5. Add new email Template
~/Views/Default/MailTemplates/OrderFail.cshtml

6.Update Language packs Mail templates
\Ravensburger\@data\packages\LanguagePack_de-DE.9.3.5.0\MailTemplates




2. Versalert 3.7. PRODUCT LIST/DETAIL PAGE – REQUEST TO ADD/DELETE ITEM FROM FIXED ORDER LIST

ExtendedProductListController > SendRequestToAddToFixedOrderList


3.Bachofen : QuoteEmailAddress





If Need to Create Admin setting also :- search :
Add Admin Setting , Add new Email Section to Admin

add field to ExtendedStoreInfoModel ,ExtendedWebsiteSettings


Get Data to View without using passing through model , Pass Data to View


You can access get Value to view from Managers

 Eg : Order Manager

Project : Divercy :- 
page :- _MonthlyBuddgetAllowance.cshtml , _FinancialOverview.cshtml.

//53103 [Functional] [Diversey] 3.5. CURRENT MONTH BUDGET SPEND DETAILS ON THE CHILD ACCOUNT MANAGEMENT PAGE







 expenditureInfo = CommerceFramework.Orders.GetExpenditureInfoValues(Shop.ShopAccount.ReferenceId);

Or

  expenditureInfo = ((ExtendedOrderManager)CommerceFrameworkBase.Orders).GetExpenditureInfoValues(Shop.ShopAccount.ReferenceId);

Do not call Controller directly. From the view.

Add Admin Setting , Add new Email Section to Admin


issue : https://sanacommerce.visualstudio.com/Sana%20Projects/_workitems/edit/49417/?triage=true

Ravensburger AG
Ticket 49417: 3.5. ORDER FAILURE – E-MAIL





create ExtendedStoreInfoModel model 


Add property to Web settings 


 public class ExtendedWebsiteSettings : WebsiteSettings
    {
        /// <summary>
        /// [49417] 3.5. ORDER FAILURE – E-MAIL
        /// Gets or sets the 'Orde rFailed Email Address' email address.
        /// </summary>   
        [DataMember]
        public virtual string OrderFailedEmailAddress
        {
            get { return Values.GetValue<string>(Sana.Commerce.Customization.Constants.OrderFailedEmailAddress, "scdemo@sana-commerce.com"); }
            set { Values[Sana.Commerce.Customization.Constants.OrderFailedEmailAddress] = value; }
        }
                
    }





Sana Text ,Rich Text, Simple Text

use Sana Text in C# code:

CommerceFrameworkBase.SanaTexts.GetSanaText("ShopAccountNameLabel", "Shop Account"));

use Static class

ExtendedSanaTextKeys.CutOffTimePassed 
public static class ExtendedSanaTextKeys
    {
        public const string CutOffTimePassed = "Validation_CutOff";
    }
and Add text to SanaText.resx
<data name="Validation_CutOff" xml:space="preserve">
    <value>Requested delivery date is invalid or the cut off time has been missed.</value>
  </data>


Sana Text in Html

@Sana.SimpleText("ViewOrderDetails")


Rich Text

 @Sana.RichText("YouAreCurrentlyEditingOrder")



use with replace tags. 
@Sana.SimpleText("YourFirstPossibleDeliveryDate", "Your first possible delivery date is [FirstPossibleDeliveryDate]").iReplace("[FirstPossibleDeliveryDate]", nextDeleverydate.AsHtml(encode: true))




 string message = CommerceFrameworkBase.SanaTexts.GetSanaText("CustomerSwitchMessage").Replace("[SubAccountEmailAddress]", currentShopAccount.Email)
                .Replace("[CustomerAccountIDorigin]", currentShopAccount.ReferenceId)
                .Replace("[CustomerAccountNameOrigin]", currentCustomer.Name)
                .Replace("[CustomerAccountIDNew]", newCustomerId)
                .Replace("[CustomerAccountNameNew]", newCustomerName);

One Page checkout , normal checkout

One Page Checkout :-  Checkout control > index()

Normal Checkout : Checkout control > OrderOverview()