public ActionResult Edit(int id, string @return)
 {
     var productType = _productTypeService.GetById(id);
     var model = new ProductTypeEditorModel(productType);
     model.SystemFields = _customFieldService.GetSystemFields().ToArray();
     return View(model);
 }
 public ActionResult Create()
 {
     var model = new ProductTypeEditorModel();
     model.SystemFields = _customFieldService.GetSystemFields().ToArray();
     return View(model);
 }
        public ActionResult Save(ProductTypeEditorModel model, string @return)
        {
            // Create new fields

            ProductType productType = null;

            if (model.Id > 0)
            {
                productType = _productTypeService.GetById(model.Id);
            }
            else
            {
                productType = new ProductType(model.Name, model.SkuAlias);
            }

            productType.Name = model.Name;
            productType.SkuAlias = model.SkuAlias;

            // Custom Fields
            foreach (var field in productType.CustomFields.ToList())
            {
                if (!model.CustomFields.Any(f => f.Id == field.CustomFieldId))
                {
                    productType.RemoveCustomField(field.CustomFieldId);
                }
            }

            foreach (var field in model.CustomFields)
            {
                var customField = CreateOrUpdateField(field);
                var current = productType.FindCustomField(customField.Id);
                if (current == null)
                {
                    current = new ProductTypeCustomField(productType, customField);
                    productType.CustomFields.Add(current);
                }
                else
                {
                    // Update sequence
                }
            }

            // Variant Fields
            foreach (var field in productType.VariationFields.ToList())
            {
                if (!model.VariationFields.Any(f => f.Id == field.CustomFieldId))
                {
                    productType.RemoveVariantField(field.CustomFieldId);
                }
            }

            foreach (var field in model.VariationFields)
            {
                var customField = CreateOrUpdateField(field);
                var current = productType.FindVariantField(customField.Id);
                if (current == null)
                {
                    current = new ProductTypeVariantField(productType, customField);
                    productType.VariationFields.Add(current);
                }
                else
                {
                    // Update sequence
                }
            }

            if (productType.Id == 0)
            {
                _productTypeService.Create(productType);
            }

            CommerceContext.CurrentInstance.Database.SaveChanges();

            productType.NotifyUpdated();

            if (model.IsEnabled)
            {
                _productTypeService.Enable(productType);
            }
            else
            {
                _productTypeService.Disable(productType);
            }

            return AjaxForm().RedirectTo(@return);
        }