Преглед на файлове

Deviation Editieren abgeschlossen!

Arne Diekmann преди 8 години
родител
ревизия
3891883aa9
променени са 26 файла, в които са добавени 657 реда и са изтрити 313 реда
  1. 2 2
      GreenTree.Nachtragsmanagement.Core/Domain/Appendix/Appendix.cs
  2. 1 1
      GreenTree.Nachtragsmanagement.Core/Domain/Appendix/CategoryValue.cs
  3. 13 4
      GreenTree.Nachtragsmanagement.Core/Domain/Deviation/Deviation.cs
  4. 1 1
      GreenTree.Nachtragsmanagement.Core/Domain/Deviation/DisturbanceValue.cs
  5. 21 0
      GreenTree.Nachtragsmanagement.Core/StaticHelper.cs
  6. 1 1
      GreenTree.Nachtragsmanagement.Data/AppendixObjectContext.cs
  7. 0 1
      GreenTree.Nachtragsmanagement.Web/Controllers/AppendixController.cs
  8. 83 13
      GreenTree.Nachtragsmanagement.Web/Controllers/DeviationController.cs
  9. 54 1
      GreenTree.Nachtragsmanagement.Web/Controllers/GlobalController.cs
  10. 0 2
      GreenTree.Nachtragsmanagement.Web/Global.asax.cs
  11. 4 1
      GreenTree.Nachtragsmanagement.Web/GreenTree.Nachtragsmanagement.Web.csproj
  12. 33 28
      GreenTree.Nachtragsmanagement.Web/Models/Deviation/DeviationDataModel.cs
  13. 23 0
      GreenTree.Nachtragsmanagement.Web/Models/Deviation/DisturbanceValueDataModel.cs
  14. 0 13
      GreenTree.Nachtragsmanagement.Web/Models/Deviation/IRequireDisturbanceDataModel.cs
  15. 1 1
      GreenTree.Nachtragsmanagement.Web/Models/Global/EmptyIRequireDataModel.cs
  16. 4 4
      GreenTree.Nachtragsmanagement.Web/Validation/Deviation/DeviationDataModelValidator.cs
  17. 71 0
      GreenTree.Nachtragsmanagement.Web/Views/Appendices/View.cshtml
  18. 54 0
      GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixGridPartial.cshtml
  19. 0 23
      GreenTree.Nachtragsmanagement.Web/Views/Deviations/View.cshtml
  20. 101 162
      GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DeviationEditPartial.cshtml
  21. 4 26
      GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DeviationGridPartial.cshtml
  22. 64 0
      GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DisturbanceValueEdit.cshtml
  23. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Home/Index.cshtml
  24. 25 0
      GreenTree.Nachtragsmanagement.Web/Views/Shared/_FunctionLayout.cshtml
  25. 58 14
      GreenTree.Nachtragsmanagement.Web/Views/Sites/_SiteEditPartial.cshtml
  26. 38 14
      GreenTree.Nachtragsmanagement.Web/Views/Sites/_SiteEditTreePartial.cshtml

+ 2 - 2
GreenTree.Nachtragsmanagement.Core/Domain/Appendix/Appendix.cs

@@ -100,7 +100,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Appendix
         /// <summary>
         /// Corresponding site
         /// </summary>
-        public State State { get; set; }
+        public virtual State State { get; set; }
 
         /// <summary>
         /// Id of corresponding site
@@ -110,7 +110,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Appendix
         /// <summary>
         /// Corresponding site
         /// </summary>
-        public Site.Site Site { get; set; }
+        public virtual Site.Site Site { get; set; }
 
         /// <summary>
         /// Category values related to the appendix

+ 1 - 1
GreenTree.Nachtragsmanagement.Core/Domain/Appendix/CategoryValue.cs

@@ -16,7 +16,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Appendix
         /// <summary>
         /// Corresponding category
         /// </summary>
-        public Category Category { get; set; }
+        public virtual Category Category { get; set; }
 
         /// <summary>
         /// Monetary value

+ 13 - 4
GreenTree.Nachtragsmanagement.Core/Domain/Deviation/Deviation.cs

@@ -55,7 +55,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Deviation
         /// <summary>
         /// Corresponding appendix
         /// </summary>
-        public Appendix.Appendix Appendix { get; set; }
+        public virtual Appendix.Appendix Appendix { get; set; }
 
         /// <summary>
         /// Date when deviation was matched to a an appendix
@@ -70,7 +70,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Deviation
         /// <summary>
         /// Corresponding site
         /// </summary>
-        public Site.Site Site { get; set; }
+        public virtual Site.Site Site { get; set; }
 
         /// <summary>
         /// Id of the current deviation status
@@ -80,7 +80,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Deviation
         /// <summary>
         /// Current deviation status
         /// </summary>
-        public Status Status { get; set; }
+        public virtual Status Status { get; set; }
 
         /// <summary>
         /// Id of the current deviation kind
@@ -90,7 +90,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Deviation
         /// <summary>
         /// Current deviation kind
         /// </summary>
-        public Kind Kind { get; set; }
+        public virtual Kind Kind { get; set; }
 
         /// <summary>
         /// Disturbances values related to the deviation
@@ -100,5 +100,14 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Deviation
             get { return _disturbanceValues ?? (_disturbanceValues = new List<DisturbanceValue>()); }
             protected set { _disturbanceValues = value; }
         }
+
+        #region Helper
+
+        public void SetDisturbanceValues(ICollection<DisturbanceValue> disturbanceValues)
+        {
+            DisturbanceValues = disturbanceValues;
+        }
+
+        #endregion
     }
 }

+ 1 - 1
GreenTree.Nachtragsmanagement.Core/Domain/Deviation/DisturbanceValue.cs

@@ -16,7 +16,7 @@ namespace GreenTree.Nachtragsmanagement.Core.Domain.Deviation
         /// <summary>
         /// Corresponding disturbance
         /// </summary>
-        public Disturbance Disturbance { get; set; }
+        public virtual Disturbance Disturbance { get; set; }
 
         /// <summary>
         /// Monetary value

+ 21 - 0
GreenTree.Nachtragsmanagement.Core/StaticHelper.cs

@@ -149,5 +149,26 @@ namespace GreenTree.Nachtragsmanagement.Core
         }
 
         #endregion
+
+        #region Conversion
+
+        /// <summary>
+        /// Trys to convert a string to an integer
+        /// </summary>
+        /// <param name="text">The string to be converted.</param>
+        /// <returns>Returns -1, if conversion fails otherwise converted value.</returns>
+        public static int TryParseInt(string text)
+        {
+            int result;
+
+            var success = int.TryParse(text, out result);
+
+            return
+                success
+                    ? result
+                    : -1;
+        }
+
+        #endregion
     }
 }

+ 1 - 1
GreenTree.Nachtragsmanagement.Data/AppendixObjectContext.cs

@@ -40,7 +40,7 @@ namespace GreenTree.Nachtragsmanagement.Data
         public AppendixObjectContext(string nameOrConnectionString)
             : base(nameOrConnectionString)
         {
-            //((IObjectContextAdapter) this).ObjectContext.ContextOptions.LazyLoadingEnabled = true;
+            ((IObjectContextAdapter)this).ObjectContext.ContextOptions.LazyLoadingEnabled = true;
 
             var userSet = Set<User>();
             var roleSet = Set<Role>();

+ 0 - 1
GreenTree.Nachtragsmanagement.Web/Controllers/AppendixController.cs

@@ -23,7 +23,6 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             _deviationSerivce = deviationService;
             _appendixService = appendixService;
 
-            ViewData["AllDeviations"] = _deviationSerivce.GetAllDeviations();
             ViewData["AllCategories"] = _appendixService.GetAllCategories();
         }
 

+ 83 - 13
GreenTree.Nachtragsmanagement.Web/Controllers/DeviationController.cs

@@ -1,7 +1,9 @@
-using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
+using GreenTree.Nachtragsmanagement.Core;
+using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
 using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
 using GreenTree.Nachtragsmanagement.Services.Appendix;
 using GreenTree.Nachtragsmanagement.Services.Deviation;
+using GreenTree.Nachtragsmanagement.Services.Site;
 using GreenTree.Nachtragsmanagement.Web.Framework.Authorization;
 using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
 using Newtonsoft.Json;
@@ -17,15 +19,17 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
     {
         private readonly IDeviationService _deviationService;
         private readonly IAppendixService _appendixService;
+        private readonly ISiteService _siteService;
 
         public DeviationController(
             IDeviationService deviationService,
-            IAppendixService appendixService)
+            IAppendixService appendixService,
+            ISiteService siteService)
         {
             _deviationService = deviationService;
             _appendixService = appendixService;
+            _siteService = siteService;
 
-            ViewData["AllAppendices"] = _appendixService.GetAllAppendices();
             ViewData["AllStatuses"] = _deviationService.GetAllStatuses();
             ViewData["AllDisturbances"] = _deviationService.GetAllDisturbances();
             ViewData["AllKinds"] = _deviationService.GetAllKinds();
@@ -95,6 +99,72 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
         }
 
+        /// <summary>
+        /// Partial edit for creating a new deviation for a site
+        /// </summary>
+        /// <param name="siteId">Id of the site which the deviation should be appended to.</param>
+        public ActionResult AppendDeviationToSite(int siteId)
+        {
+            var site = _siteService.GetSiteById(siteId);
+            var allDeviations = new List<Deviation>();
+
+            allDeviations.AddRange(
+                site.Appendices
+                    .SelectMany(a => a.Deviations));
+
+            allDeviations.AddRange(
+                site.Deviations);
+
+            var lastCustomNumber = allDeviations
+                .Max(d => StaticHelper.TryParseInt(d.CustomNumber));
+
+            var deviationModel = new DeviationDataModel
+            {
+                Id = -1,
+                CustomNumber = (lastCustomNumber + 1).ToString(),
+                Percentage = 100,
+            };
+
+            ViewData["relationType"] = "site";
+            ViewData["relationId"] = siteId;
+
+            return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
+        }
+
+        /// <summary>
+        /// Partial edit for creating a new deviation for an appendix
+        /// </summary>
+        /// <param name="appendixId">Id of the appendix which the deviation should be appended to.</param>
+        public ActionResult AppendDeviationToAppendix(int appendixId)
+        {
+            var appendix = _appendixService.GetAppendixById(appendixId);
+            var site = appendix.Site;
+
+            var allDeviations = new List<Deviation>();
+
+            allDeviations.AddRange(
+                site.Appendices
+                    .SelectMany(a => a.Deviations));
+
+            allDeviations.AddRange(
+                site.Deviations);
+
+            var lastCustomNumber = allDeviations
+                .Max(d => StaticHelper.TryParseInt(d.CustomNumber));
+
+            var deviationModel = new DeviationDataModel
+            {
+                Id = -1,
+                CustomNumber = (lastCustomNumber + 1).ToString(),
+                Percentage = 100,
+            };
+
+            ViewData["relationType"] = "appendix";
+            ViewData["relationId"] = appendixId;
+
+            return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
+        }
+
         /// <summary>
         /// Partial edit result if ModelState is valid, otherwise simple JSON result for success
         /// </summary>
@@ -102,23 +172,23 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         [HttpPost, ValidateInput(false)]
         public ActionResult EditDeviation(DeviationDataModel deviationModel)
         {
-            if (!ModelState.IsValid)
-            {
-                foreach (var disturbance in deviationModel.DisturbanceValues)
-                    deviationModel.DisturbanceDescriptions.Add(
-                        ((IList<Disturbance>)ViewData["AllDisturbances"])
-                            .First(r => r.Id == disturbance).Description);
+            deviationModel.DisturbanceValueEntities =
+                deviationModel.DisturbanceEntities
+                    .Select(r => JsonConvert.DeserializeObject<DisturbanceValueDataModel>(r))
+                    .ToList();
 
+            if (!ModelState.IsValid)
                 return PartialView("~/Views/Deviations/_DeviationEditPartial.cshtml", deviationModel);
-            }
 
-            var selectedDisturbances = _deviationService.GetDisturbancesByIds(deviationModel.DisturbanceValues.ToArray());
+            var disturbanceValues = deviationModel.DisturbanceValueEntities
+                .Select(r => r.ToDisturbanceValue())
+                .ToList();
 
             if (deviationModel.Id == -1)
             {
                 var deviation = deviationModel.ToDeviation();
 
-                //deviation.SetDisturbances(selectedDisturbances);
+                deviation.SetDisturbanceValues(disturbanceValues);
 
                 _deviationService.InsertDeviation(deviation);
             }
@@ -135,7 +205,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
                 deviation.KindId = deviationModel.KindId;
                 deviation.Comment = deviationModel.Comment;
 
-                //deviation.SetDisturbances(selectedDisturbances);
+                deviation.SetDisturbanceValues(disturbanceValues);
 
                 _deviationService.UpdateDeviation(deviation);
             }

+ 54 - 1
GreenTree.Nachtragsmanagement.Web/Controllers/GlobalController.cs

@@ -1,6 +1,10 @@
 using GreenTree.Nachtragsmanagement.Core.Authentication;
+using GreenTree.Nachtragsmanagement.Services.Appendix;
+using GreenTree.Nachtragsmanagement.Services.Deviation;
+using GreenTree.Nachtragsmanagement.Services.Site;
 using GreenTree.Nachtragsmanagement.Services.User;
 using GreenTree.Nachtragsmanagement.Web.Models.Global;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -13,13 +17,22 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
     {
         private readonly IUserHelper _userHelper;
         private readonly IUserService _userService;
+        private readonly IAppendixService _appendixService;
+        private readonly IDeviationService _deviationService;
+        private readonly ISiteService _siteService;
 
         public GlobalController(
             IUserHelper userHelper,
-            IUserService userService)
+            IUserService userService,
+            IAppendixService appendixService,
+            IDeviationService deviationService,
+            ISiteService siteService)
         {
             _userHelper = userHelper;
             _userService = userService;
+            _appendixService = appendixService;
+            _deviationService = deviationService;
+            _siteService = siteService;
         }
 
         /// <summary>
@@ -79,5 +92,45 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         {
             return View("~/Views/Global/NotAuthorized.cshtml");
         }
+
+        /// <summary>
+        /// Gets a full comment of a given entity
+        /// </summary>
+        /// <param name="entityType">The entity type.</param>
+        /// <param name="id">The entity id.</param>
+        public ActionResult GetEntityComment(string entityType, int id)
+        {
+            var result = new JsonResult
+            {
+                JsonRequestBehavior = JsonRequestBehavior.AllowGet,
+                Data = String.Empty
+            };
+
+            if (String.IsNullOrEmpty(entityType))
+                return result;
+
+            switch (entityType)
+            {
+                case "appendix":
+                    var appendix = _appendixService.GetAppendixById(id);
+
+                    result.Data = appendix.Comment;
+                    break;
+                case "deviation":
+                    var deviation = _deviationService.GetDeviationById(id);
+
+                    result.Data = deviation.Comment;
+                    break;
+                case "site":
+                    var site = _siteService.GetSiteById(id);
+
+                    result.Data = site.Comment;
+                    break;
+                default:
+                    return result;
+            }
+
+            return result;
+        }
     }
 }

+ 0 - 2
GreenTree.Nachtragsmanagement.Web/Global.asax.cs

@@ -599,8 +599,6 @@ namespace GreenTree.Nachtragsmanagement.Web
 
                 dbContext.SaveChanges();
             }
-
-            var allDeviations = deviationService.GetAllDeviations();
         }
 
         #endregion

+ 4 - 1
GreenTree.Nachtragsmanagement.Web/GreenTree.Nachtragsmanagement.Web.csproj

@@ -274,6 +274,9 @@
     <Content Include="Views\Sites\_SiteGridPartial.cshtml" />
     <Content Include="Views\Sites\View.cshtml" />
     <Content Include="Views\Sites\_SiteEditTreePartial.cshtml" />
+    <Content Include="Views\Appendices\View.cshtml" />
+    <Content Include="Views\Appendices\_AppendixGridPartial.cshtml" />
+    <Content Include="Views\Deviations\_DisturbanceValueEdit.cshtml" />
     <None Include="Web.Debug.config">
       <DependentUpon>Web.config</DependentUpon>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -312,7 +315,6 @@
     <Compile Include="Models\Deviation\DeviationDataModel.cs" />
     <Compile Include="Models\Deviation\DisturbanceDataModel.cs" />
     <Compile Include="Models\Deviation\IRequireKindDataModel.cs" />
-    <Compile Include="Models\Deviation\IRequireDisturbanceDataModel.cs" />
     <Compile Include="Models\Deviation\IRequireStatusDataModel.cs" />
     <Compile Include="Models\Deviation\KindDataModel.cs" />
     <Compile Include="Models\Deviation\StatusDataModel.cs" />
@@ -330,6 +332,7 @@
     <Compile Include="Models\Login\LoginModel.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Validation\AppendixValidatorFactory.cs" />
+    <Compile Include="Models\Deviation\DisturbanceValueDataModel.cs" />
     <Compile Include="Validation\Deviation\KindDataModelValidator.cs" />
     <Compile Include="Validation\Deviation\DisturbanceDataModelValidator.cs" />
     <Compile Include="Validation\Deviation\StatusDataModelValidator.cs" />

+ 33 - 28
GreenTree.Nachtragsmanagement.Web/Models/Deviation/DeviationDataModel.cs

@@ -1,4 +1,6 @@
-using GreenTree.Nachtragsmanagement.Web.Models.Appendix;
+using GreenTree.Nachtragsmanagement.Core.Domain.Deviation;
+using GreenTree.Nachtragsmanagement.Web.Models.Appendix;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -7,7 +9,7 @@ using System.Web;
 namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
 {
     public class DeviationDataModel 
-        : IRequireAppendixDataModel, IRequireStatusDataModel, IRequireDisturbanceDataModel, IRequireKindDataModel
+        : IRequireAppendixDataModel, IRequireStatusDataModel, IRequireKindDataModel
     {
         public int Id { get; set; }
         public string CustomNumber { get; set; }
@@ -26,23 +28,13 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
         public int? SiteId { get; set; }
         public string AppendixDescription { get; set; }
         public int? AppendixId { get; set; }
-        public ICollection<int> DisturbanceValues { get; set; }
-        public ICollection<string> DisturbanceDescriptions { get; set; }
-        public string DisturbanceDescription
-        {
-            get
-            {
-                if (DisturbanceDescriptions == null)
-                    return String.Empty;
-                else
-                    return String.Join(", ", DisturbanceDescriptions);
-            }
-        }
+        public ICollection<string> DisturbanceEntities { get; set; }
+        public ICollection<DisturbanceValueDataModel> DisturbanceValueEntities { get; set; }
 
         public DeviationDataModel()
         {
-            DisturbanceValues = new List<int>();
-            DisturbanceDescriptions = new List<string>();
+            DisturbanceEntities = new List<string>();
+            DisturbanceValueEntities = new List<DisturbanceValueDataModel>();
         }
 
         public static DeviationDataModel FromDeviation(Core.Domain.Deviation.Deviation deviationEntity, bool newWhenIsNull)
@@ -57,7 +49,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
             if (deviationEntity == null && !newWhenIsNull)
                 throw new ArgumentNullException("deviationEntity", "Cannot create DeviationDataModel from NULL deviation entity.");
 
-            return new DeviationDataModel
+            var model = new DeviationDataModel
             {
                 Id = deviationEntity.Id,
                 CustomNumber = deviationEntity.CustomNumber,
@@ -66,14 +58,16 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
                 AppendixDate = deviationEntity.AppendixDate,
                 Value = deviationEntity.Value.Value,
                 Percentage = deviationEntity.Percentage.Value,
-                PercentageValue = deviationEntity.Value.Value * (deviationEntity.Percentage.Value / 100),
+                PercentageValue = deviationEntity.Value.Value * ((decimal)deviationEntity.Percentage.Value / (decimal)100),
                 SiteId = deviationEntity.SiteId,
                 SiteDescription = deviationEntity.Site == null
-                    ? null
+                    ? deviationEntity.Appendix == null
+                        ? String.Empty
+                        : deviationEntity.Appendix.Site.CustomNumber
                     : deviationEntity.Site.CustomNumber,
                 AppendixId = deviationEntity.AppendixId,
                 AppendixDescription = deviationEntity.Appendix == null
-                    ? null
+                    ? "Offen"
                     : deviationEntity.Appendix.CustomNumber,
                 StatusId = deviationEntity.StatusId.Value,
                 StatusDescription = deviationEntity.Status == null
@@ -84,17 +78,28 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
                     ? null
                     : deviationEntity.Kind.Description,
                 Comment = deviationEntity.Comment,
-                DisturbanceValues =
-                    deviationEntity.DisturbanceValues
-                        .Select(r => r.Id)
-                        .ToList(),
-                DisturbanceDescriptions =
+                DisturbanceValueEntities =
                     deviationEntity.DisturbanceValues
-                        .Select(r => r.Disturbance == null
-                            ? String.Empty
-                            : r.Disturbance.Description)
+                        .Select(r =>
+                            new DisturbanceValueDataModel
+                            {
+                                DisturbanceId = r.DisturbanceId,
+                                Description = String.Format("{0} - {1:c2}", r.Disturbance.Description, r.Value),
+                                Value = r.Value
+                            })
                         .ToList()
             };
+
+            foreach (var disturbance in model.DisturbanceValueEntities)
+            {
+                var json = JsonConvert.SerializeObject(disturbance);
+
+                disturbance.Json = json;
+
+                model.DisturbanceEntities.Add(json);
+            }
+
+            return model;
         }
 
         public Core.Domain.Deviation.Deviation ToDeviation()

+ 23 - 0
GreenTree.Nachtragsmanagement.Web/Models/Deviation/DisturbanceValueDataModel.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+
+namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
+{
+    public class DisturbanceValueDataModel
+    {
+        public int? DisturbanceId { get; set; }
+        public decimal? Value { get; set; }
+        public string Description { get; set; }
+        public string Json { get; set; }
+        public Core.Domain.Deviation.DisturbanceValue ToDisturbanceValue()
+        {
+            return new Core.Domain.Deviation.DisturbanceValue
+            {
+                DisturbanceId = DisturbanceId.Value,
+                Value = Value.Value
+            };
+        }
+    }
+}

+ 0 - 13
GreenTree.Nachtragsmanagement.Web/Models/Deviation/IRequireDisturbanceDataModel.cs

@@ -1,13 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace GreenTree.Nachtragsmanagement.Web.Models.Deviation
-{
-    public interface IRequireDisturbanceDataModel
-    {
-        ICollection<int> DisturbanceValues { get; set; }
-    }
-}

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Models/Global/EmptyIRequireDataModel.cs

@@ -9,7 +9,7 @@ using System.Web;
 namespace GreenTree.Nachtragsmanagement.Web.Models.Global
 {
     public class EmptyIRequireDataModel
-        : IRequireRoleDataModel, IRequireStatusDataModel, IRequireDisturbanceDataModel, IRequireKindDataModel, IRequireAppendixDataModel
+        : IRequireRoleDataModel, IRequireStatusDataModel, IRequireKindDataModel, IRequireAppendixDataModel
     {
         public int? RoleId { get; set; }
         public int? StatusId { get; set; }

+ 4 - 4
GreenTree.Nachtragsmanagement.Web/Validation/Deviation/DeviationDataModelValidator.cs

@@ -21,9 +21,9 @@ namespace GreenTree.Nachtragsmanagement.Web.Validation.Admin.User
                 .NotEmpty()
                     .WithMessage("Beschreibung wird benötigt");
 
-            //RuleFor(m => m.ReceiptDate)
-            //    .NotEmpty()
-            //        .WithMessage("Einreichdatum wird benötigt");
+            RuleFor(m => m.ReceiptDate)
+                .NotEmpty()
+                    .WithMessage("Einreichdatum wird benötigt");
 
             RuleFor(m => m.Value)
                 .NotEmpty()
@@ -37,7 +37,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Validation.Admin.User
                 .NotEmpty()
                     .WithMessage("Ein Status muss gewählt werden");
 
-            RuleFor(m => m.DisturbanceValues)
+            RuleFor(m => m.DisturbanceEntities)
                 .Must(r => r.Count > 0)
                     .WithMessage("Eine Kategorie muss ausgewählt werden");
 

+ 71 - 0
GreenTree.Nachtragsmanagement.Web/Views/Appendices/View.cshtml

@@ -0,0 +1,71 @@
+@{
+	Layout = "~/Views/Shared/_FunctionLayout.cshtml";
+}
+
+@model IEnumerable<GreenTree.Nachtragsmanagement.Web.Models.Appendix.AppendixDataModel>
+
+<script>
+	var deleteId;
+
+	function editAppendix(id) {
+		if (!id) return;
+		$.ajax({
+			url: '@Url.Action("EditAppendix", "Appendix")',
+			data: { Id: id },
+			success: function (response) {
+				setTimeout(function () {
+					$(".appendixEditContainer").remove();
+					$("body").append(response);
+				}, 200);
+			},
+			error: function () {
+				 alert("error occured");
+			}
+		});
+	}
+
+	function confirmDelete(id) {
+		if (!id) return;
+		deleteId = id;
+		$.ajax({
+			type: "GET",
+			url: '@Url.Action("GetAppendix", "Appendix")',
+			data: { Id: id },
+			success: function (response) {
+				if (response == "notFound") return;
+				var appendix = JSON.parse(response);
+				var popupControl = MVCxClientPopupControl.Cast(devPopupControlDeleteAppendix);
+				popupControl.SetHeaderText(popupControl.GetHeaderText().replace("{appendix}", appendix.CustomNumber));
+				$(".dialogText").text($(".dialogText").text().replace("{appendix}", appendix.CustomNumber));
+				popupControl.Show();
+			}
+		});
+	}
+
+	function deleteAppendix() {
+		$.ajax({
+			type: "POST",
+			url: '@Url.Action("DeleteAppendix", "Appendix")',
+			data: { Id: deleteId },
+			success: function (response) {
+				var popupControl = MVCxClientPopupControl.Cast(devPopupControlDeleteAppendix);
+				popupControl.Hide();
+				setTimeout(function () {
+					devGridViewAppendix.PerformCallback();
+				}, 200);
+			},
+			error: function () {
+				 alert("error occured");
+			}
+		});
+	}
+</script>
+
+@Html.Partial("~/Views/Appendices/_AppendixGridPartial.cshtml", Model)
+@Html.Partial("~/Views/Shared/_PopupDialogYesNo.cshtml", new GreenTree.Nachtragsmanagement.Web.Models.Global.YesNoDialogModel
+{
+	PopupName = "devPopupControlDeleteAppendix",
+	Content = "<div class='dialogText' style='padding: 12px'>Sind Sie sicher, dass Sie den Nachtrag \"{appendix}\" löschen möchten?</div>",
+	HeaderText = "\"{appendix}\" löschen",
+	YesFunction = "function (s, e) { deleteAppendix(); }"
+})

+ 54 - 0
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixGridPartial.cshtml

@@ -0,0 +1,54 @@
+@model IEnumerable<GreenTree.Nachtragsmanagement.Web.Models.Appendix.AppendixDataModel>
+
+@{ 
+	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
+}
+
+@Html.DevExpress().GridView(s =>
+{
+	s.Name = "devGridViewAppendix";
+	s.KeyFieldName = "Id";
+	s.CallbackRouteValues = new { Controller = "Appendix", Action = "PartialAppendices" };
+	s.Width = Unit.Percentage(100);
+	s.Settings.ShowFilterRow = true;
+	s.Settings.ShowFilterRowMenu = true;
+	s.Settings.ShowFooter = true;
+	s.Settings.ShowGroupPanel = true;
+
+	s.Columns.Add("CustomNumber", "Nummer");
+	s.Columns.Add("Description", "Bezeichnung");
+	s.Columns.Add("SiteDescription", "Baustelle");
+	s.Columns.Add("AppendixDescription", "Nachtrag");
+	s.Columns.Add(column =>
+	{
+		column.Caption = "Eingang";
+		column.FieldName = "ReceiptDate";
+		column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+	});
+	s.Columns.Add(column =>
+	{
+		column.Caption = "Schätzung bew.";
+		column.FieldName = "PercentageValue";
+		column.PropertiesEdit.DisplayFormatString = "c2";
+	});
+	s.Columns.Add("StatusDescription", "Status");
+	s.Columns.Add("DisturbanceDescription", "Kategorien");
+	s.Columns.Add("KindDescription", "Art");
+	s.Columns.Add("Comment", "Kommentar");
+
+	s.TotalSummary.Add(DevExpress.Data.SummaryItemType.Sum, "PercentageValue");
+	s.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "PercentageValue");
+
+	s.ClientLayout = (sender, e) =>
+	{
+		if (e.LayoutMode == ClientLayoutMode.Loading)
+		{
+			if (Session["AppendixGridState"] != null)
+				e.LayoutData = (string)Session["AppendixGridState"];
+		}
+		else
+			Session["AppendixGridState"] = e.LayoutData;
+	};
+
+	s.Styles.AlternatingRow.BackColor = System.Drawing.Color.FromArgb(247, 247, 247);
+}).Bind(Model).GetHtml()

+ 0 - 23
GreenTree.Nachtragsmanagement.Web/Views/Deviations/View.cshtml

@@ -7,29 +7,6 @@
 <script>
 	var deleteId;
 
-	function saveDeviation() {
-		var form = $("#deviationEditForm");
-		$(form).submit(function (e) {
-			$.ajax({
-				type: "POST",
-				url: '@Url.Action("EditDeviation", "Deviation")',
-				data: form.serialize(),
-				success: function (response) {
-					setTimeout(function () {
-						$(".deviationEditContainer").remove();
-						if (response == "success") {
-							devGridViewDeviation.PerformCallback();
-						} else {
-							$("body").append(response);
-						}
-					}, 200);
-				}
-			});
-			e.preventDefault();
-		});
-		form.submit();
-	}
-
 	function editDeviation(id) {
 		if (!id) return;
 		$.ajax({

+ 101 - 162
GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DeviationEditPartial.cshtml

@@ -2,6 +2,7 @@
 
 @{ 
 	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
+	var disturbanceValues = Model.DisturbanceValueEntities.ToArray();
 }
 
 @model GreenTree.Nachtragsmanagement.Web.Models.Deviation.DeviationDataModel
@@ -11,6 +12,32 @@
 	<script>
 		var textSeparator = ", ";
 
+		function saveDeviation() {
+			DisturbanceEntities.SelectAll();
+			var form = $("#deviationEditForm");
+			$(form).submit(function (e) {
+				$.ajax({
+					type: "POST",
+					url: '@Url.Action("EditDeviation", "Deviation")',
+					data: form.serialize(),
+					success: function (response) {
+						setTimeout(function () {
+							$(".deviationEditContainer").remove();
+							if (response == "success") {
+								if (typeof onDeviationSaveSuccess === 'function') {
+									onDeviationSaveSuccess();
+								}
+							} else {
+								$("body").append(response);
+							}
+						}, 200);
+					}
+				});
+				e.preventDefault();
+			});
+			form.submit();
+		}
+
 		function addStatus() {
 			$.ajax({
 				url: '@Url.Action("EditClaim", "Deviation")',
@@ -68,55 +95,46 @@
 			});
 		}
 
-		function calculateValue() {
-			Sum.SetValue(Value.GetValue() * (Percentage.GetValue() / 100));
+		function setDropDownText() {
+			var allItems = DisturbanceEntities.GetItemCount();
+			var text = "";
+			for (var i = 0; i < allItems; i++) {
+				if (i == allItems - 1) {
+					text += JSON.parse(DisturbanceEntities.GetItem(i).value).Description;
+				} else {
+					text += JSON.parse(DisturbanceEntities.GetItem(i).value).Description + ", ";
+				}
+			}
+			devDropDownListDisturbanceValues.SetText(text);
 		}
 
-		function onListBoxSelectionChanged(s, e) {
-			if (e.index == 0)
-				e.isSelected ? s.SelectAll() : s.UnselectAll();
-			updateSelectAllItemState();
-			updateText();
-		}
-		function updateSelectAllItemState() {
-			isAllSelected() ? DisturbanceValues.SelectIndices([0]) : DisturbanceValues.UnselectIndices([0]);
-		}
-		function isAllSelected() {
-			for (var i = 1; i < DisturbanceValues.GetItemCount(); i++)
-				if (!DisturbanceValues.GetItem(i).selected)
-					return false;
-			return true;
+		function addDisturbanceValue() {
+			var distVal = {
+				DisturbanceId: devListBoxAllDisturbances.GetValue(),
+				Description: devListBoxAllDisturbances.GetSelectedItem().text + " - " + devSpinEditDisturbanceValue.GetText(),
+				Value: devSpinEditDisturbanceValue.GetValue()
+			};
+			var distValJson = JSON.stringify(distVal);
+			var listBox = MVCxClientListBox.Cast(DisturbanceEntities);
+			listBox.AddItem(distVal.Description + "<a style=\"float: right\" href=\"#\" onclick='removeDisturbanceValue(\"" + distVal.Description + "\")'>Entfernen</a>", distValJson);
+			devDisturbanceValuePopup.Hide();
+			setDropDownText();
 		}
-		function updateText() {
-			var selectedItems = DisturbanceValues.GetSelectedItems();
-			devDropDownListDisturbanceValues.SetText(getSelectedItemsText(selectedItems));
-		}
-		function synchronizeListBoxValues(s, e) {
-			DisturbanceValues.UnselectAll();
-			var texts = s.GetText().split(textSeparator);
-			var values = getValuesByTexts(texts);
-			DisturbanceValues.SelectValues(values);
-			updateSelectAllItemState();
-			updateText();
-		}
-		function getSelectedItemsText(items) {
-			var texts = [];
-			for (var i = 0; i < items.length; i++)
-				if (items[i].index != 0)
-					texts.push(items[i].text);
-			return texts.join(textSeparator);
-		}
-		function getValuesByTexts(texts) {
-			var actualValues = [];
-			var item;
-			for (var i = 0; i < texts.length; i++) {
-				item = DisturbanceValues.FindItemByText(texts[i]);
-				if (item != null)
-					actualValues.push(item.value);
+
+		function removeDisturbanceValue(description) {
+			var allItems = DisturbanceEntities.GetItemCount();
+			for (var i = 0; i < allItems; i++) {
+				var item = DisturbanceEntities.GetItem(i);
+				if (item.text.startsWith(description)) {
+					DisturbanceEntities.RemoveItem(i);
+				}
 			}
-			return actualValues;
+			setDropDownText();
 		}
 	</script>
+
+	@Html.Partial("~/Views/Deviations/_DisturbanceValueEdit.cshtml");
+
 	@Html.DevExpress().PopupControl(s =>
 {
 	s.Name = "devPopupControlEditDeviation";
@@ -131,8 +149,8 @@
 	s.CloseAction = CloseAction.CloseButton;
 	s.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
 	s.PopupVerticalAlign = PopupVerticalAlign.TopSides;
-	s.PopupVerticalOffset = 10;
-	s.AllowDragging = false;
+	s.PopupVerticalOffset = 15;
+	s.AllowDragging = true;
 	s.AllowResize = false;
 	s.ShowFooter = false;
 	s.ShowOnPageLoad = true;
@@ -183,59 +201,50 @@
 			{
 				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 40%'>");
 				{
-					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.DisturbanceValues, "Kategorien:"));
-					ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.DisturbanceValues).ToHtmlString());
+					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.DisturbanceEntities, "Kategorien:"));
+					ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.DisturbanceEntities).ToHtmlString());
 					Html.DevExpress().DropDownEdit(t =>
 					{
 						t.Name = "devDropDownListDisturbanceValues";
 						t.Width = new Unit(95, UnitType.Percentage);
 
-						if (Model.DisturbanceDescriptions != null && Model.DisturbanceDescriptions.Any())
-							t.Text = String.Join(", ", Model.DisturbanceDescriptions);
+						if (Model.DisturbanceValueEntities != null && Model.DisturbanceValueEntities.Any())
+							t.Text = String.Join(", ",
+								Model.DisturbanceValueEntities
+									.Select(d => d.Description));
 
 						t.SetDropDownWindowTemplateContent(l =>
 						{
-							Html.DevExpress().ListBox(lb =>
+							Html.DevExpress().ListBoxFor(m => m.DisturbanceEntities, lb =>
 							{
-								lb.Name = "DisturbanceValues";
 								lb.Width = new Unit(100, UnitType.Percentage);
 								lb.Properties.TextField = "Description";
-								lb.Properties.ValueField = "Id";
-								lb.Properties.ValueType = typeof(int);
-								lb.Properties.SelectionMode = ListEditSelectionMode.CheckColumn;
-								lb.ControlStyle.Border.BorderStyle = BorderStyle.None;
-								lb.PreRender = (sender, e) =>
+								lb.Properties.ValueField = "Json";
+								lb.Properties.ValueType = typeof(string);
+								lb.Properties.EnableClientSideAPI = true;
+								lb.Properties.SelectionMode = ListEditSelectionMode.Multiple;
+								lb.EncodeHtml = false;
+								lb.SetItemTemplateContent(i =>
 								{
-									var listBox = sender as MVCxListBox;
+									var description = DataBinder.Eval(i.DataItem, "Description").ToString();
 
-									foreach (ListEditItem listItem in listBox.Items)
-									{
-										if (Model.DisturbanceValues == null || !Model.DisturbanceValues.Any(m => m == (int)listItem.Value)) continue;
-
-										listItem.Selected = true;
-									}
-
-									listBox.Items.Insert(0, new ListEditItem("(Alle auswählen)", -1));
-								};
-								lb.Properties.ClientSideEvents.SelectedIndexChanged = "function (s, e) { onListBoxSelectionChanged(s, e); }";
-							}).BindList(ViewData["AllDisturbances"]).Render();
-
-							t.Properties.ClientSideEvents.TextChanged = "function (s, e) { synchronizeListBoxValues(s, e); }";
-							t.Properties.ClientSideEvents.DropDown = "function (s, e) { synchronizeListBoxValues(s, e); }";
+									ViewContext.Writer.Write(description);
+									ViewContext.Writer.Write(
+										"<a class=\"disturbanceRemoveLink\" style=\"float: right\" href=\"#\" onclick='removeDisturbanceValue(\"" + description + "\")'>Entfernen</a>");
+								});
+								lb.ControlStyle.Border.BorderStyle = BorderStyle.None;
+							}).BindList(Model.DisturbanceValueEntities).Render();
 						});
 					}).Render();
 
-					if (userContext.CurrentUser.HasFunction("Deviation-Claims-Edit"))
+					Html.DevExpress().HyperLink(t =>
 					{
-						Html.DevExpress().HyperLink(t =>
-						{
-							t.Name = "devHyperLinkDisturbanceEventReceiver";
-							t.Properties.Text = "Hinzufügen";
-							t.NavigateUrl = "#";
-							t.Properties.ClientSideEvents.Click = "function (s, e) { addDisturbance(); }";
-							t.Style.Add("line-height", "24px");
-						}).Render();
-					}
+						t.Name = "devHyperLinkDisturbanceValueAdd";
+						t.Properties.Text = "Hinzufügen";
+						t.NavigateUrl = "#";
+						t.Properties.ClientSideEvents.Click = "function (s, e) { devDisturbanceValuePopup.Show(); }";
+						t.Style.Add("line-height", "24px");
+					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
 
@@ -249,6 +258,7 @@
 						t.Properties.DecimalPlaces = 2;
 						t.Properties.NumberType = SpinEditNumberType.Float;
 						t.Properties.DisplayFormatString = "c2";
+						t.Properties.ClientSideEvents.Init = "function (s, e) { calculateValue(); }";
 						t.Properties.ClientSideEvents.ValueChanged = "function (s, e) { calculateValue(); }";
 					}).Render();
 				}
@@ -262,10 +272,11 @@
 					{
 						t.Width = new Unit(88, UnitType.Percentage);
 						t.Properties.DecimalPlaces = 0;
-						t.Properties.MaxValue = 100;
+						t.Properties.MaxValue = 1000;
 						t.Properties.MinValue = 0;
 						t.Properties.NumberType = SpinEditNumberType.Integer;
 						t.Properties.DisplayFormatString = "{0:n0} %";
+						t.Properties.ClientSideEvents.Init = "function (s, e) { calculateValue(); }";
 						t.Properties.ClientSideEvents.ValueChanged = "function (s, e) { calculateValue(); }";
 					}).Render();
 				}
@@ -277,7 +288,6 @@
 					{
 						t.Name = "Sum";
 						t.Width = new Unit(100, UnitType.Percentage);
-						t.ClientEnabled = false;
 						t.Properties.DecimalPlaces = 2;
 						t.Properties.NumberType = SpinEditNumberType.Float;
 						t.Properties.DisplayFormatString = "c2";
@@ -287,47 +297,16 @@
 			}
 			ViewContext.Writer.Write("</div>");
 
-			ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+			if (ViewData["relationType"] != null && ViewData["relationType"].ToString() == "site")
 			{
-				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 50%'>");
-				{
-					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.AppendixId, "Nachtrag:"));
-
-					Session.Add("DeviationAppendicesComboBoxSettings", new Action<ComboBoxSettings>(a =>
-					{
-						a.Width = new Unit(95, UnitType.Percentage);
-						a.Properties.ValueType = typeof(int);
-						a.Properties.ValueField = "Id";
-						a.Properties.TextField = "Description";
-
-						var serializedModel = Newtonsoft.Json.JsonConvert.SerializeObject(Model);
-
-						a.CallbackRouteValues = new
-						{
-							Controller = "DataCallback",
-							Action = "AppendicesComboBox",
-							SettingsKey = "DeviationAppendicesComboBoxSettings",
-							Model = serializedModel,
-							Type = Model.GetType().FullName
-						};
-					}));
-					ViewData.Add("AppendicesComboBoxSettings", "DeviationAppendicesComboBoxSettings");
-					Html.RenderPartial("~/Views/Shared/DataEditorTemplates/_AppendicesComboBox.cshtml", Model, ViewData);
-				}
-				ViewContext.Writer.Write("</div>");
-
-				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 50%'>");
-				{
-					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.AppendixDate, "Einreichdatum NT:"));
-					ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.AppendixDate).ToHtmlString());
-					Html.DevExpress().DateEditFor(m => m.AppendixDate, t =>
-					{
-						t.Width = new Unit(100, UnitType.Percentage);
-					}).Render();
-				}
-				ViewContext.Writer.Write("</div>");
+				ViewContext.Writer.Write(
+					"<input type=\"hidden\" value=\"" + ViewData["relationId"].ToString() + "\" id=\"SiteId\" name=\"SiteId\" />");
+			}
+			else if (ViewData["relationType"] != null && ViewData["relationType"].ToString() == "appendix")
+			{
+				ViewContext.Writer.Write(
+					"<input type=\"hidden\" value=\"" + ViewData["relationId"].ToString() + "\" id=\"AppendixId\" name=\"AppendixId\" />");
 			}
-			ViewContext.Writer.Write("</div>");
 
 			ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
 			{
@@ -371,46 +350,6 @@
 				}
 				ViewContext.Writer.Write("</div>");
 
-				//ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 33%'>");
-				//{
-				//	ViewContext.Writer.Write(Html.CustomLabelFor(m => m.DisturbanceId, "Verzögerung:"));
-				//	ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.DisturbanceId).ToHtmlString());
-
-				//	Session.Add("DeviationDisturbancesComboBoxSettings", new Action<ComboBoxSettings>(a =>
-				//	{
-				//		a.Width = new Unit(95, UnitType.Percentage);
-				//		a.Properties.ValueType = typeof(int);
-				//		a.Properties.ValueField = "Id";
-				//		a.Properties.TextField = "Description";
-
-				//		var serializedModel = Newtonsoft.Json.JsonConvert.SerializeObject(Model);
-
-				//		a.CallbackRouteValues = new
-				//		{
-				//			Controller = "DataCallback",
-				//			Action = "DisturbancesComboBox",
-				//			SettingsKey = "DeviationDisturbancesComboBoxSettings",
-				//			Model = serializedModel,
-				//			Type = Model.GetType().FullName
-				//		};
-				//	}));
-				//	ViewData.Add("DisturbancesComboBoxSettings", "DeviationDisturbancesComboBoxSettings");
-				//	Html.RenderPartial("~/Views/Shared/DataEditorTemplates/_DisturbancesComboBox.cshtml", Model, ViewData);
-
-				//	if (userContext.CurrentUser.HasFunction("Deviation-Claims-Edit"))
-				//	{
-				//		Html.DevExpress().HyperLink(t =>
-				//		{
-				//			t.Name = "devHyperLinkDisturbanceEventReceiver";
-				//			t.Properties.Text = "Hinzufügen";
-				//			t.NavigateUrl = "#";
-				//			t.Properties.ClientSideEvents.Click = "function (s, e) { addDisturbance(); }";
-				//			t.Style.Add("line-height", "24px");
-				//		}).Render();
-				//	}
-				//}
-				//ViewContext.Writer.Write("</div>");
-
 				ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 50%'>");
 				{
 					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.KindId, "Art:"));

+ 4 - 26
GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DeviationGridPartial.cshtml

@@ -15,31 +15,10 @@
 	s.Settings.ShowFooter = true;
 	s.Settings.ShowGroupPanel = true;
 
-	if (userContext.CurrentUser.HasFunction("Deviation-Deviations-Edit"))
-	{
-		s.Columns.Add(column =>
-		{
-			column.Caption = "#";
-			column.SetDataItemTemplateContent(c =>
-			{
-				ViewContext.Writer.Write(
-					"<a href=\"#\" onclick=\"editDeviation(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Bearbeiten</a>&nbsp;" +
-					"<a href=\"#\" onclick=\"confirmDelete(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Löschen</a>"
-				);
-			});
-			column.SetHeaderTemplateContent(c =>
-			{
-				ViewContext.Writer.Write(
-					"<a href=\"#\" onclick=\"editDeviation(-1)\">Neu</a>&nbsp;");
-			});
-			column.Settings.AllowDragDrop = DefaultBoolean.False;
-			column.Settings.AllowSort = DefaultBoolean.False;
-			column.Width = 70;
-		});
-	}
 	s.Columns.Add("CustomNumber", "Nummer");
-	s.Columns.Add("SiteDescription", "Baustelle");
 	s.Columns.Add("Description", "Bezeichnung");
+	s.Columns.Add("SiteDescription", "Baustelle");
+	s.Columns.Add("AppendixDescription", "Nachtrag");
 	s.Columns.Add(column =>
 	{
 		column.Caption = "Eingang";
@@ -55,11 +34,10 @@
 	s.Columns.Add("StatusDescription", "Status");
 	s.Columns.Add("DisturbanceDescription", "Kategorien");
 	s.Columns.Add("KindDescription", "Art");
-	s.Columns.Add("AppendixDescription", "Nachtrag");
 	s.Columns.Add("Comment", "Kommentar");
 
-	s.TotalSummary.Add(DevExpress.Data.SummaryItemType.Sum, "Value");
-	s.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "Value");
+	s.TotalSummary.Add(DevExpress.Data.SummaryItemType.Sum, "PercentageValue");
+	s.GroupSummary.Add(DevExpress.Data.SummaryItemType.Sum, "PercentageValue");
 
 	s.ClientLayout = (sender, e) =>
 	{

+ 64 - 0
GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DisturbanceValueEdit.cshtml

@@ -0,0 +1,64 @@
+@using GreenTree.Nachtragsmanagement.Web.Extensions
+
+@model GreenTree.Nachtragsmanagement.Web.Models.Deviation.DeviationDataModel
+
+@Html.DevExpress().PopupControl(s =>
+{
+	s.Name = "devDisturbanceValuePopup";
+	s.HeaderText = "Kategorie zuweisen";
+	s.Modal = true;
+	s.Width = new Unit(350, UnitType.Pixel);
+	s.CloseAction = CloseAction.CloseButton;
+	s.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
+	s.PopupVerticalAlign = PopupVerticalAlign.TopSides;
+	s.PopupVerticalOffset = 40;
+	s.AllowDragging = true;
+	s.AllowResize = false;
+	s.ShowFooter = false;
+	s.SetContent(() =>
+	{
+		ViewContext.Writer.Write("<div class='editFormWrapper'>");
+		{
+			ViewContext.Writer.Write(Html.CustomLabelFor(m => m.DisturbanceEntities, "Kategorie:"));
+			Html.DevExpress().DropDownEdit(t =>
+			{
+				t.Name = "devDropDownListAllDisturbances";
+				t.Width = new Unit(100, UnitType.Percentage);
+				t.SetDropDownWindowTemplateContent(l =>
+				{
+					Html.DevExpress().ListBox(lb =>
+					{
+						lb.Name = "devListBoxAllDisturbances";
+						lb.Width = new Unit(100, UnitType.Percentage);
+						lb.Properties.TextField = "Description";
+						lb.Properties.ValueField = "Id";
+						lb.Properties.ValueType = typeof(int);
+						lb.Properties.SelectionMode = ListEditSelectionMode.Single;
+						lb.Properties.ClientSideEvents.SelectedIndexChanged = "function (s, e) { devDropDownListAllDisturbances.SetText(s.GetSelectedItem().text); devDropDownListAllDisturbances.HideDropDown(); }";
+						lb.ControlStyle.Border.BorderStyle = BorderStyle.None;
+					}).BindList(ViewData["AllDisturbances"]).Render();
+				});
+			}).Render();
+
+			ViewContext.Writer.Write(Html.CustomLabelFor(m => m.DisturbanceEntities, "Wert:"));
+			Html.DevExpress().SpinEdit(t =>
+			{
+				t.Name = "devSpinEditDisturbanceValue";
+				t.Properties.MinValue = 0;
+				t.Properties.DisplayFormatString = "c2";
+			}).Render();
+		}
+		ViewContext.Writer.Write("</div>");
+
+		Html.RenderPartial(
+			"~/Views/Shared/_PopupButtonPanel.cshtml",
+			new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
+			{
+				PopupName = "devDisturbanceValuePopup",
+				AcceptFunction = "function (s, e) { addDisturbanceValue(); }"
+			}
+		);
+	});
+	s.Styles.Content.Paddings.Padding = new Unit(0);
+	s.Styles.ModalBackground.Opacity = 0;
+}).GetHtml()

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Home/Index.cshtml

@@ -10,7 +10,7 @@
 	var openOffsetY = 5;
 
 	var popupNames = [];
-	
+
 	var popupElements = {};
 	var popupStatus = {};
 	var popupImages = {};

+ 25 - 0
GreenTree.Nachtragsmanagement.Web/Views/Shared/_FunctionLayout.cshtml

@@ -24,9 +24,34 @@
 	<link rel="stylesheet" type="text/css" href="~/Content/global.css" />
 	<link rel="stylesheet" type="text/css" href="~/Content/devex.css" />
 	<link rel="stylesheet" type="text/css" href="~/Content/function.css" />
+
+	<script>
+		function showComment(entityType, id, element) {
+			if (!entityType || !id || !element) return;
+			$.ajax({
+				url: '@Url.Action("GetEntityComment", "Global")',
+				data: { entityType: entityType, id: id },
+				success: function (response) {
+					$("#commentContent").text(response);
+					var commentPopup = MVCxClientPopupControl.Cast(devPopupControlCommentBox);
+					commentPopup.ShowAtElement(element);
+				}
+			});
+		}
+	</script>
 </head>
 
 <body>
+	@Html.DevExpress().PopupControl(p =>
+	{
+		p.Name = "devPopupControlCommentBox";
+		p.ShowHeader = false;
+		p.ShowFooter = false;
+		p.Width = new Unit(300, UnitType.Pixel);
+		p.SetContent("<div id=\"commentContent\"></div>");
+		p.CloseAction = CloseAction.OuterMouseClick;
+		p.PopupHorizontalAlign = PopupHorizontalAlign.OutsideLeft;
+	}).GetHtml()
 	<div class="globalContent">
 		@RenderBody()
 	</div>

+ 58 - 14
GreenTree.Nachtragsmanagement.Web/Views/Sites/_SiteEditPartial.cshtml

@@ -9,23 +9,66 @@
 <div class="siteEditContainer">
 
 	<script>
+		function addDeviationToSite(siteId) {
+			if (!siteId) return;
+			$.ajax({
+				url: '@Url.Action("AppendDeviationToSite", "Deviation")',
+				data: { SiteId: siteId },
+				success: function (response) {
+					setTimeout(function () {
+						$(".deviationEditContainer").remove();
+						$("body").append(response);
+					}, 200);
+				},
+				error: function () {
+					 alert("error occured");
+				}
+			});
+		}
 
-
-
-	</script>
-
-	<style>
-		.siteTreeList {
-
+		function addDeviationToAppendix(appendixId) {
+			if (!appendixId) return;
+			$.ajax({
+				url: '@Url.Action("AppendDeviationToAppendix", "Deviation")',
+				data: { AppendixId: appendixId },
+				success: function (response) {
+					setTimeout(function () {
+						$(".deviationEditContainer").remove();
+						$("body").append(response);
+					}, 200);
+				},
+				error: function () {
+					 alert("error occured");
+				}
+			});
 		}
 
-		.siteTreeList > tbody > tr > td > table > tbody > tr:nth-child(2n) {
-			background-color: #F7F7F7;
+		function editDeviation(id) {
+			if (!id) return;
+			$.ajax({
+				url: '@Url.Action("EditDeviation", "Deviation")',
+				data: { Id: id },
+				success: function (response) {
+					setTimeout(function () {
+						$(".deviationEditContainer").remove();
+						$("body").append(response);
+					}, 200);
+				},
+				error: function () {
+					 alert("error occured");
+				}
+			});
 		}
 
-		.siteTreeList > tbody > tr > td > table > tbody > tr:nth-child(2n) > td:first-child {
-			background-color: #F7F7F7;
+		function onDeviationSaveSuccess() {
+			devTreeListSiteDeviationAppendices.PerformCallback();
 		}
+	</script>
+
+	<style>
+		.siteTreeList { }
+		.siteTreeList > tbody > tr > td > table > tbody > tr:nth-child(2n) { background-color: #F7F7F7; }
+		.siteTreeList > tbody > tr > td > table > tbody > tr:nth-child(2n) > td:first-child { background-color: #F7F7F7; }
 	</style>
 
 	@Html.DevExpress().PopupControl(s =>
@@ -44,8 +87,9 @@
 	s.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
 	s.PopupVerticalAlign = PopupVerticalAlign.TopSides;
 	s.PopupVerticalOffset = 10;
-	s.AllowDragging = false;
-	s.AllowResize = true;
+	s.AllowDragging = true;
+	s.AllowResize = false;
+	s.ShowMaximizeButton = true;
 	s.ShowFooter = false;
 	s.ShowOnPageLoad = true;
 	s.SetContent(() =>
@@ -109,7 +153,7 @@
 
 			ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Deviations, "Vertragsabweichungen / Nachträge:"));
 
-			ViewContext.Writer.Write("<div style='width: 100%; overflow: auto; max-height: 500px; border: 1px solid #d0d0d0'>");
+			ViewContext.Writer.Write("<div style='width: 100%; overflow: auto; max-height: 450px; border: 1px solid #d0d0d0'>");
 			{
 				ViewContext.Writer.Write(Html.Partial("~/Views/Sites/_SiteEditTreePartial.cshtml", Model).ToHtmlString());
 			}

+ 38 - 14
GreenTree.Nachtragsmanagement.Web/Views/Sites/_SiteEditTreePartial.cshtml

@@ -1,6 +1,4 @@
-@using GreenTree.Nachtragsmanagement.Web.Extensions
-
-@{ 
+@{ 
 	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
 }
 
@@ -22,16 +20,27 @@
 		{
 			var treeKey = DataBinder.Eval(c.DataItem, "TreeKey").ToString();
 
-			if (treeKey.StartsWith("a"))
+			if (treeKey == "a_0")
 			{
 				ViewContext.Writer.Write(
-					"<a href=\"#\" onclick=\"addDeviationToAppendix(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Neue VA</a>&nbsp;");
+					"<a href=\"#\" onclick=\"addDeviationToSite(" + Model.Id + ")\">Neue VA</a><br />");
+			}
+			else if (treeKey.StartsWith("d"))
+			{
+				ViewContext.Writer.Write(
+					"<a href=\"#\" onclick=\"editDeviation(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Bearbeiten</a>&nbsp;");
+				ViewContext.Writer.Write(
+					"<a href=\"#\" onclick=\"confirmDeleteDeviation(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Löschen</a>");
+			}
+			else if (treeKey.StartsWith("a"))
+			{
+				ViewContext.Writer.Write(
+					"<a href=\"#\" onclick=\"addDeviationToAppendix(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Neue VA</a><br />");
+				ViewContext.Writer.Write(
+					"<a href=\"#\" onclick=\"editAppendix(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Bearbeiten</a>&nbsp;");
+				ViewContext.Writer.Write(
+					"<a href=\"#\" onclick=\"confirmDeleteAppendix(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Löschen</a>");
 			}
-
-			ViewContext.Writer.Write(
-				"<a href=\"#\" onclick=\"addDeviationToAppendix(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Bearbeiten</a>&nbsp;");
-			ViewContext.Writer.Write(
-				"<a href=\"#\" onclick=\"confirmDeleteAppendix(" + DataBinder.Eval(c.DataItem, "Id") + ")\">Löschen</a>");
 		});
 	});
 
@@ -46,9 +55,18 @@
 			{
 				ViewContext.Writer.Write("<b>" + DataBinder.Eval(c.DataItem, "CustomNumber") + "</b>");
 			}
+			else if (treeKey.StartsWith("d"))
+			{
+				ViewContext.Writer.Write(DataBinder.Eval(c.DataItem, "CustomNumber"));
+			}
 		});
 	});
-	t.Columns.Add("Description", "Bezeichnung");
+	t.Columns.Add(column =>
+	{
+		column.FieldName = "Description";
+		column.Caption = "Bezeichnung";
+		column.CellStyle.Wrap = DefaultBoolean.True;
+	});
 	t.Columns.Add(column =>
 	{
 		column.Caption = "Eingang";
@@ -62,7 +80,12 @@
 		column.PropertiesEdit.DisplayFormatString = "c2";
 	});
 	t.Columns.Add("StatusDescription", "Status");
-	t.Columns.Add("DistCatDescription", "Kategorien");
+	t.Columns.Add(column =>
+	{
+		column.FieldName = "DistCatDescription";
+		column.Caption = "Kategorien";
+		column.CellStyle.Wrap = DefaultBoolean.True;
+	});
 	t.Columns.Add(column =>
 	{
 		column.Caption = "Kommentar";
@@ -82,9 +105,9 @@
 				ViewContext.Writer.Write(text.Substring(0, 40) + " ...");
 
 				if (treeKey.StartsWith("a"))
-					ViewContext.Writer.Write("<a href=\"#\" onclick='parent.showComment(\"appendix\"," + id + ")'><br />Anzeigen</a>");
+					ViewContext.Writer.Write("<a href=\"#\" onclick='showComment(\"appendix\"," + id + ",this)'><br />Anzeigen</a>");
 				else
-					ViewContext.Writer.Write("<a href=\"#\" onclick='parent.showComment(\"appendix\"," + id + ")'><br />Anzeigen</a>");
+					ViewContext.Writer.Write("<a href=\"#\" onclick='showComment(\"appendix\"," + id + ",this)'><br />Anzeigen</a>");
 			}
 			else
 				ViewContext.Writer.Write(text);
@@ -92,6 +115,7 @@
 	});
 
 	t.ControlStyle.CssClass += "siteTreeList";
+	t.Styles.IndentWithButton.Paddings.PaddingTop = new Unit(18, UnitType.Pixel);
 	t.Styles.Cell.VerticalAlign = VerticalAlign.Top;
 	t.Styles.Cell.Paddings.PaddingTop = new Unit(14, UnitType.Pixel);
 	t.Styles.Cell.Paddings.PaddingBottom = new Unit(14, UnitType.Pixel);