Ver código fonte

Diverse Anpassungen vorgenommen!

Arne Diekmann 8 anos atrás
pai
commit
bbe337bee8
38 arquivos alterados com 200 adições e 163 exclusões
  1. 2 2
      GreenTree.Nachtragsmanagement.Plugin.Test/Description.txt
  2. 2 2
      GreenTree.Nachtragsmanagement.Plugin.Test/GreenTree.Nachtragsmanagement.Plugin.Test.csproj
  3. 1 1
      GreenTree.Nachtragsmanagement.Plugin.Test/Properties/PublishProfiles/Lokal.pubxml
  4. 0 1
      GreenTree.Nachtragsmanagement.Web/App_Data/InstalledPlugins.txt
  5. 10 5
      GreenTree.Nachtragsmanagement.Web/Content/devex.css
  6. 6 2
      GreenTree.Nachtragsmanagement.Web/Content/global.css
  7. 5 0
      GreenTree.Nachtragsmanagement.Web/Controllers/AdminController.cs
  8. 7 7
      GreenTree.Nachtragsmanagement.Web/Controllers/AppendixController.cs
  9. 1 1
      GreenTree.Nachtragsmanagement.Web/Controllers/DeviationController.cs
  10. 6 0
      GreenTree.Nachtragsmanagement.Web/Controllers/HomeController.cs
  11. 7 2
      GreenTree.Nachtragsmanagement.Web/Controllers/LoginController.cs
  12. 1 1
      GreenTree.Nachtragsmanagement.Web/Controllers/MiscController.cs
  13. 77 48
      GreenTree.Nachtragsmanagement.Web/Extensions/GridViewSettingsHelper.cs
  14. 12 0
      GreenTree.Nachtragsmanagement.Web/Implementations/AppendixNotificationPlugin.cs
  15. 4 0
      GreenTree.Nachtragsmanagement.Web/Implementations/DeviationNotificationPlugin.cs
  16. 3 0
      GreenTree.Nachtragsmanagement.Web/Models/Admin/AppInfo/AppInfoDataModel.cs
  17. 11 2
      GreenTree.Nachtragsmanagement.Web/Models/Appendix/AppendixDataModel.cs
  18. 12 6
      GreenTree.Nachtragsmanagement.Web/Models/Site/SiteDataModel.cs
  19. 2 1
      GreenTree.Nachtragsmanagement.Web/Models/Site/SiteTreeDataModel.cs
  20. 0 63
      GreenTree.Nachtragsmanagement.Web/Plugins/Allgemein.Test/GreenTree.Nachtragsmanagement.Plugin.Test.dll.config
  21. 3 3
      GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/Description.txt
  22. BIN
      GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/GreenTree.Nachtragsmanagement.Plugin.Test.dll
  23. 0 0
      GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/Views/Home/Index.cshtml
  24. 1 0
      GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/Web.config
  25. 0 0
      GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/logo.jpg
  26. 11 2
      GreenTree.Nachtragsmanagement.Web/Views/Admin/AppInfo/View.cshtml
  27. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Admin/Plugins/View.cshtml
  28. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Admin/Plugins/_PluginsGridPartial.cshtml
  29. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Admin/Roles/View.cshtml
  30. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Admin/Users/View.cshtml
  31. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Appendices/View.cshtml
  32. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Appendices/_CategoryListPartial.cshtml
  33. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Config/View.cshtml
  34. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Deviations/View.cshtml
  35. 4 2
      GreenTree.Nachtragsmanagement.Web/Views/Home/Index.cshtml
  36. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Misc/Logs.cshtml
  37. 2 2
      GreenTree.Nachtragsmanagement.Web/Views/Misc/MailNotifications.cshtml
  38. 1 1
      GreenTree.Nachtragsmanagement.Web/Views/Sites/View.cshtml

+ 2 - 2
GreenTree.Nachtragsmanagement.Plugin.Test/Description.txt

@@ -1,8 +1,8 @@
 Group: Misc
 FriendlyName: Nachtragsmanagement Test
 SystemName: GreenTree.Nachtragsmanagement.Test
-Version: 1.0
-SupportedVersions: 1.0.0
+Version: 0.9
+SupportedVersions: 0.9.1.3
 Author: GreenTree Studios
 DisplayOrder: 1
 FileName: GreenTree.Nachtragsmanagement.Plugin.Test.dll

+ 2 - 2
GreenTree.Nachtragsmanagement.Plugin.Test/GreenTree.Nachtragsmanagement.Plugin.Test.csproj

@@ -114,11 +114,11 @@
     <Compile Include="TestPlugin.cs" />
   </ItemGroup>
   <ItemGroup>
-    <Content Include="packages.config" />
+    <None Include="packages.config" />
     <Content Include="Views\Home\Index.cshtml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <None Include="Properties\PublishProfiles\FolderProfile.pubxml" />
+    <None Include="Properties\PublishProfiles\Lokal.pubxml" />
     <None Include="Web.Debug.config">
       <DependentUpon>Web.config</DependentUpon>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

+ 1 - 1
GreenTree.Nachtragsmanagement.Plugin.Test/Properties/PublishProfiles/FolderProfile.pubxml → GreenTree.Nachtragsmanagement.Plugin.Test/Properties/PublishProfiles/Lokal.pubxml

@@ -7,7 +7,7 @@ indem Sie diese MSBuild-Datei bearbeiten. Weitere Informationen hierzu finden Si
   <PropertyGroup>
     <WebPublishMethod>FileSystem</WebPublishMethod>
     <PublishProvider>FileSystem</PublishProvider>
-    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
+    <LastUsedBuildConfiguration>Debug</LastUsedBuildConfiguration>
     <LastUsedPlatform>Any CPU</LastUsedPlatform>
     <SiteUrlToLaunchAfterPublish />
     <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>

+ 0 - 1
GreenTree.Nachtragsmanagement.Web/App_Data/InstalledPlugins.txt

@@ -1 +0,0 @@
-GreenTree.Nachtragsmanagement.Test

+ 10 - 5
GreenTree.Nachtragsmanagement.Web/Content/devex.css

@@ -11,7 +11,7 @@
 
 .devExGridGroupRow { color: #009688 !important; }
 .devExGridFooterPanel { color: #009688 !important; }
-.devExGridFooterPanel > td.dxgv { color: #009688 !important; white-space: normal; }
+.devExGridFooterPanel > td.dxgv { color: #009688 !important; white-space: normal; padding: 6px 0 4px !important; }
 
 .devExNoBorder { border-style: none; }
 .devExBorderLeft { border-left-style: solid !important; }
@@ -31,15 +31,20 @@
 .devExDisplayHidden { display: none; }
 .devExDisplayTableRow { display: table-row; }
 
+.dxpc-header { padding: 10px 10px 4px 12px !important; white-space: unset !important; }
+
 .devExListItemControlContainer { float: right; }
 .devExListItemControlContainer > a { color: #009688; text-decoration: none; }
 .devExListItemControlContainer > a:hover { text-decoration: underline; }
 .dxeListBoxItemSelected_Material .devExListItemControlContainer > a { color: white; text-decoration: none; }
 .dxeListBoxItemSelected_Material .devExListItemControlContainer > a:hover { text-decoration: underline; }
 
-.dxgvDataRow_Material td.dxgv { border-right: 1px solid #bfbfbf !important; border-bottom: 1px solid #bfbfbf !important; padding: 8px 10px; }
-.dxgvFilterRow_Material td.dxgv { border-right: 1px solid #bfbfbf !important; border-bottom: 1px solid #bfbfbf !important; }
-.dxgvHeader_Material { border: 1px solid #bfbfbf !important; border-top-width: 0 !important; border-left-width: 0 !important;  }
+.dxgvDataRow_Material td.dxgv { border-right: 1px solid #bfbfbf !important; border-bottom: 1px solid #bfbfbf !important; padding: 4px 7px; }
+.dxgvFilterRow_Material td.dxgv { border-right: 1px solid #bfbfbf !important; border-bottom: 1px solid #bfbfbf !important; padding: 8px 10px 6px !important; }
+.dxgvHeader_Material { border: 1px solid #bfbfbf !important; border-top-width: 0 !important; border-left-width: 0 !important; padding: 8px 10px 5px !important; }
 .dxgvRBB { border-bottom: 1px solid #bfbfbf !important; }
 .dxgvHSDC { border-left: 1px solid #bfbfbf !important; border-top: 1px solid #bfbfbf !important; }
-.dxgvCSD { border-left: 1px solid #bfbfbf !important; }
+.dxgvCSD { border-left: 1px solid #bfbfbf !important; }
+.dxgvGroupPanel_Material { padding: 8px 10px 8px !important; }
+.dxmLite_Material .dxctToolbar_Material.dxm-main.dxmtb { padding-top: 10px !important; padding-bottom: 8px !important; }
+.dxgvPagerBottomPanel_Material { padding: 2px 0 0px !important; }

+ 6 - 2
GreenTree.Nachtragsmanagement.Web/Content/global.css

@@ -40,10 +40,14 @@ h1, h2, h3, h4, h5, h6 {
     height: 24px;
 }
 
-.functionHeader > .controlIcon {
+.functionHeader > .controlContainer {
+    float: right;
+    width: 120px;
+}
+
+.functionHeader > .controlContainer > .controlIcon {
     width: 16px;
     height: 16px;
-    float: right;
     cursor: pointer;
     margin: 0 6px;
 }

+ 5 - 0
GreenTree.Nachtragsmanagement.Web/Controllers/AdminController.cs

@@ -419,6 +419,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         /// <summary>
         /// Basic plugin view function
         /// </summary>
+        [FunctionAuthorize(true, "Administration-Plugins")]
         public ActionResult ViewPlugins()
         {
             var plugins = _pluginFinder.GetPlugins<IPlugin>(LoadPluginsMode.All);
@@ -524,11 +525,15 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         /// <summary>
         /// Basic appInfo view function
         /// </summary>
+        [FunctionAuthorize(true, "Administration-AppInfo")]
         public ActionResult ViewAppInfo()
         {
             var model = new AppInfoDataModel
             {
                 BaseDirectory = AppDomain.CurrentDomain.BaseDirectory,
+                AspNetVersion = Environment.Version.ToString(),
+                OperatingSystem = Environment.OSVersion.VersionString,
+                Is64BitOs = Environment.Is64BitOperatingSystem,
                 IsUpdate = false
             };
 

+ 7 - 7
GreenTree.Nachtragsmanagement.Web/Controllers/AppendixController.cs

@@ -66,7 +66,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
 
             var appendices = _appendixService.GetAllUserAssignedAppendices(currentUser);
             var appendixModels = appendices
-                .Select(u => AppendixDataModel.FromAppendix(u, false))
+                .Select(u => AppendixDataModel.FromAppendix(u, false, _configurationService))
                 .ToList();
 
             return View("~/Views/Appendices/View.cshtml", appendixModels);
@@ -86,7 +86,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
                     JsonRequestBehavior = JsonRequestBehavior.AllowGet
                 };
 
-            var appendixModel = AppendixDataModel.FromAppendix(appendix, false);
+            var appendixModel = AppendixDataModel.FromAppendix(appendix, false, _configurationService);
 
             return new JsonResult
             {
@@ -104,7 +104,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
 
             var appendices = _appendixService.GetAllUserAssignedAppendices(currentUser);
             var appendixModels = appendices
-                .Select(u => AppendixDataModel.FromAppendix(u, false))
+                .Select(u => AppendixDataModel.FromAppendix(u, false, _configurationService))
                 .OrderBy(u => u.CustomNumber)
                 .ToList();
 
@@ -126,7 +126,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
 
             var appendices = _appendixService.GetAllUserAssignedAppendices(currentUser);
             var appendixModels = appendices
-                .Select(u => AppendixDataModel.FromAppendix(u, false))
+                .Select(u => AppendixDataModel.FromAppendix(u, false, _configurationService))
                 .ToList();
 
             var viewContext = new ViewContext();
@@ -402,7 +402,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         public ActionResult EditAppendix(int id = -1)
         {
             var appendix = _appendixService.GetAppendixById(id);
-            var appendixModel = AppendixDataModel.FromAppendix(appendix, true);
+            var appendixModel = AppendixDataModel.FromAppendix(appendix, true, _configurationService);
 
             var defaultState = _appendixService.GetDefaultState();
 
@@ -422,7 +422,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
                 return new EmptyResult();
 
             var appendix = _appendixService.GetAppendixById(id);
-            var appendixModel = AppendixDataModel.FromAppendix(appendix, true);
+            var appendixModel = AppendixDataModel.FromAppendix(appendix, true, _configurationService);
             var deviationModels = appendix.Deviations
                 .Select(d => DeviationDataModel.FromDeviation(d, false, _configurationService));
 
@@ -650,7 +650,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             if (appendix == null)
                 return PartialView("~/Views/Appendices/_InvoiceListPartial.cshtml", new AppendixDataModel());
 
-            var appendixDataModel = AppendixDataModel.FromAppendix(appendix, false);
+            var appendixDataModel = AppendixDataModel.FromAppendix(appendix, false, _configurationService);
 
             return PartialView("~/Views/Appendices/_InvoiceListPartial.cshtml", appendixDataModel);
         }

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Controllers/DeviationController.cs

@@ -621,7 +621,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             }
 
             var appendixModels = availableAppendices
-                .Select(a => AppendixDataModel.FromAppendix(a, false))
+                .Select(a => AppendixDataModel.FromAppendix(a, false, _configurationService))
                 .ToList();
 
             if (deviation.Appendix != null && deviation.Appendix.Site != null)

+ 6 - 0
GreenTree.Nachtragsmanagement.Web/Controllers/HomeController.cs

@@ -44,8 +44,14 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         public ActionResult Index()
         {
             var cookieUser = _userHelper.FromCookiesOrSession();
+
+            if (cookieUser == null) return new RedirectResult("~/login");
+
             var dbUser = _userService.GetUserById(cookieUser.Id);
 
+            if (cookieUser != null && dbUser == null)
+                _userHelper.ClearCookieAndSession();
+
             if (dbUser == null) return new RedirectResult("~/login");
 
             if (dbUser.CurrentRole == null || (dbUser.CurrentRole != null && dbUser.CurrentRole.Id != cookieUser.CurrentRole.Id))

+ 7 - 2
GreenTree.Nachtragsmanagement.Web/Controllers/LoginController.cs

@@ -30,9 +30,14 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         // GET: Login
         public ActionResult Index()
         {
-            var user = _userHelper.FromCookiesOrSession();
+            var cookieUser = _userHelper.FromCookiesOrSession();
 
-            if (user != null && user.Id != 0)
+            if (cookieUser == null)
+                return View("~/Views/Login/Index.cshtml");
+
+            var dbUser = _userService.GetUserById(cookieUser.Id);
+
+            if (cookieUser.Id != 0 && dbUser != null)
                 return RedirectToAction("Index", "Home");
 
             return View("~/Views/Login/Index.cshtml");

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Controllers/MiscController.cs

@@ -698,7 +698,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
                 if (fileSaveSettings == null)
                 {
                     fileSaveSettings = new HtmlEditorFileSaveSettings();
-                    fileSaveSettings.FileSystemSettings.UploadFolder = "../Content/Images/HelpPages/";
+                    fileSaveSettings.FileSystemSettings.UploadFolder = "~/Content/Images/HelpPages/";
                 }
                 return fileSaveSettings;
             }

+ 77 - 48
GreenTree.Nachtragsmanagement.Web/Extensions/GridViewSettingsHelper.cs

@@ -233,6 +233,22 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Width = new Unit(120, UnitType.Pixel);
             });
             s.Columns.Add(column =>
+            {
+                column.Caption = "Bew. NT-Sum.";
+                column.FieldName = "AppendixValueCalculated";
+                column.PropertiesEdit.DisplayFormatString = "c2";
+                column.MinWidth = 120;
+                column.Width = new Unit(120, UnitType.Pixel);
+            });
+            s.Columns.Add(column =>
+            {
+                column.Caption = "Pot. NT-Sum.";
+                column.FieldName = "AppendixValueCleared";
+                column.PropertiesEdit.DisplayFormatString = "c2";
+                column.MinWidth = 120;
+                column.Width = new Unit(120, UnitType.Pixel);
+            });
+            s.Columns.Add(column =>
             {
                 column.Caption = "Verh. NT-Sum.";
                 column.FieldName = "AppendixValueNegotiated";
@@ -249,23 +265,9 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.SetDataItemTemplateContent(c =>
                 {
                     var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
+                    var formattedUserDescription = FormatUserDescriptions(userDescriptions);
 
-                    if (userDescriptions != null)
-                    {
-                        foreach (var description in userDescriptions)
-                        {
-                            var split = description.Split('|');
-
-                            if (split.Length > 1)
-                                html.ViewContext.Writer.Write(
-                                    "<span style=\"float: left\">" + split[0] + "</span>" +
-                                    "<span style=\"float: right\">" + split[1] + "</span><br />");
-                            else
-                                html.ViewContext.Writer.Write(
-                                    "<span>" + split[0] + "</span><br />");
-                        }
-
-                    }
+                    html.ViewContext.Writer.Write(formattedUserDescription);
                 });
             });
             s.Columns.Add(column =>
@@ -545,23 +547,9 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.SetDataItemTemplateContent(c =>
                 {
                     var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
+                    var formattedUserDescription = FormatUserDescriptions(userDescriptions);
 
-                    if (userDescriptions != null)
-                    {
-                        foreach (var description in userDescriptions)
-                        {
-                            var split = description.Split('|');
-
-                            if (split.Length > 1)
-                                html.ViewContext.Writer.Write(
-                                    "<span style=\"float: left\">" + split[0] + "</span>" +
-                                    "<span style=\"float: right\">" + split[1] + "</span><br />");
-                            else
-                                html.ViewContext.Writer.Write(
-                                    "<span>" + split[0] + "</span><br />");
-                        }
-
-                    }
+                    html.ViewContext.Writer.Write(formattedUserDescription);
                 });
             });
             s.Columns.Add(column =>
@@ -1047,23 +1035,9 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.SetDataItemTemplateContent(c =>
                 {
                     var userDescriptions = DataBinder.Eval(c.DataItem, "UserDescriptions") as List<string>;
+                    var formattedUserDescription = FormatUserDescriptions(userDescriptions);
 
-                    if (userDescriptions != null)
-                    {
-                        foreach (var description in userDescriptions)
-                        {
-                            var split = description.Split('|');
-
-                            if (split.Length > 1)
-                                html.ViewContext.Writer.Write(
-                                    "<span style=\"float: left\">" + split[0] + "</span>" +
-                                    "<span style=\"float: right\">" + split[1] + "</span><br />");
-                            else
-                                html.ViewContext.Writer.Write(
-                                    "<span>" + split[0] + "</span><br />");
-                        }
-
-                    }
+                    html.ViewContext.Writer.Write(formattedUserDescription);
                 });
             });
             s.Columns.Add(column =>
@@ -1162,6 +1136,14 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
             s.Columns.Add(column =>
+            {
+                column.Caption = "Offen";
+                column.FieldName = "IsRemaining";
+                column.MinWidth = 40;
+                column.Width = new Unit(50, UnitType.Pixel);
+                column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
+            });
+            s.Columns.Add(column =>
             {
                 column.Caption = "Bestellsch.-Datum";
                 column.FieldName = "OrderDate";
@@ -1857,5 +1839,52 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
 
             return s;
         }
+
+        /// <summary>
+        /// Formats the UserDescriptions to single string format
+        /// </summary>
+        /// <param name="userDescriptions">The UserDescription (Name and Role).</param>
+        private static string FormatUserDescriptions(List<string> userDescriptions)
+        {
+            if (userDescriptions == null) return null;
+
+            var result = String.Empty;
+            var counter = 0;
+
+            foreach (var description in userDescriptions)
+            {
+                if (counter > 1)
+                {
+                    var remainingDescriptions =
+                        String.Join(
+                            ", ",
+                            userDescriptions
+                                .Skip(2)
+                                .Take(userDescriptions.Count - 2)
+                                .Select(u => u.Split('|').Length > 1
+                                    ? String.Format("{0} {1}", u.Split('|')[0], u.Split('|')[1])
+                                    : String.Format("{0}", u.Split('|')[0])));
+
+                    result += "<a href='#' title='" + remainingDescriptions + "'>...</a>";
+                    break;
+                }
+                else
+                {
+                    var split = description.Split('|');
+
+                    if (split.Length > 1)
+                        result +=
+                            "<span style=\"float: left\">" + split[0] + "</span>" +
+                            "<span style=\"float: right\">" + split[1] + "</span><br />";
+                    else
+                        result +=
+                            "<span>" + split[0] + "</span><br />";
+                }
+
+                counter++;
+            }
+
+            return result;
+        }
     }
 }

+ 12 - 0
GreenTree.Nachtragsmanagement.Web/Implementations/AppendixNotificationPlugin.cs

@@ -248,6 +248,10 @@ namespace GreenTree.Nachtragsmanagement.Web.Implementations
             appendices = appendices
                 .Where(a => (currentCalendarWeek - GetCalendarWeek(a.OfferingDate.Value) % interval == 0) ||
                             (currentCalendarWeek - GetCalendarWeek(a.OfferingDate.Value) < 0))
+                .OrderBy(a => a.Site == null
+                    ? String.Empty
+                    : a.Site.CustomNumber)
+                .ThenBy(a => a.CustomNumber)
                 .ToList();
 
             if (appendices.Any())
@@ -295,6 +299,10 @@ namespace GreenTree.Nachtragsmanagement.Web.Implementations
             appendices = appendices
                 .Where(a => (currentCalendarWeek - GetCalendarWeek(a.OfferingDate.Value) % interval == 0) ||
                             (currentCalendarWeek - GetCalendarWeek(a.OfferingDate.Value) < 0))
+                .OrderBy(a => a.Site == null
+                    ? String.Empty
+                    : a.Site.CustomNumber)
+                .ThenBy(a => a.CustomNumber)
                 .ToList();
 
             if (appendices.Any())
@@ -335,6 +343,10 @@ namespace GreenTree.Nachtragsmanagement.Web.Implementations
             appendices = appendices
                 .Where(a => (currentCalendarWeek - GetCalendarWeek(a.OfferingDate.Value) % interval == 0) ||
                             (currentCalendarWeek - GetCalendarWeek(a.OfferingDate.Value) < 0))
+                .OrderBy(a => a.Site == null
+                    ? String.Empty
+                    : a.Site.CustomNumber)
+                .ThenBy(a => a.CustomNumber)
                 .ToList();
 
             if (appendices.Any())

+ 4 - 0
GreenTree.Nachtragsmanagement.Web/Implementations/DeviationNotificationPlugin.cs

@@ -202,6 +202,10 @@ namespace GreenTree.Nachtragsmanagement.Web.Implementations
             var deviationsLevel2 = _deviationService.GetAllDeviations()
                 .Where(d => !d.AppendixId.HasValue &&
                             (DateTime.Now - d.ReceiptDate).Value.Days >= ageDaysLevel2)
+                .OrderBy(d => d.Site == null
+                    ? String.Empty
+                    : d.Site.CustomNumber)
+                .ThenBy(d => d.CustomNumber)
                 .ToList();
 
             if (deviationsLevel1.Any() || deviationsLevel2.Any())

+ 3 - 0
GreenTree.Nachtragsmanagement.Web/Models/Admin/AppInfo/AppInfoDataModel.cs

@@ -10,6 +10,9 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Admin.AppInfo
     {
         public AssemblyDataModel[] Assemblies { get; set; }
         public string BaseDirectory { get; set; }
+        public string AspNetVersion { get; set; }
+        public string OperatingSystem { get; set; }
+        public bool Is64BitOs { get; set; }
         public bool IsUpdate { get; set; }
 
         /// <summary>

+ 11 - 2
GreenTree.Nachtragsmanagement.Web/Models/Appendix/AppendixDataModel.cs

@@ -1,4 +1,5 @@
-using Newtonsoft.Json;
+using GreenTree.Nachtragsmanagement.Services.Configuration;
+using Newtonsoft.Json;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -29,6 +30,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Appendix
         public string Comment { get; set; }
         public int? StateId { get; set; }
         public StateDataModel State { get; set; }
+        public string IsRemaining { get; set; }
         public string StateDescription { get; set; }
         public string SiteDescription { get; set; }
         public string SiteCustomNumber { get; set; }
@@ -63,7 +65,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Appendix
             Invoices = new List<InvoiceDataModel>();
         }
 
-        public static AppendixDataModel FromAppendix(Core.Domain.Appendix.Appendix appendixEntity, bool newWhenIsNull)
+        public static AppendixDataModel FromAppendix(Core.Domain.Appendix.Appendix appendixEntity, bool newWhenIsNull,
+            IConfigurationService configurationService)
         {
             if (appendixEntity == null && newWhenIsNull)
                 return new AppendixDataModel
@@ -75,6 +78,9 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Appendix
             if (appendixEntity == null && !newWhenIsNull)
                 throw new ArgumentNullException("appendixEntity", "Cannot create AppendixDataModel from NULL appendix entity.");
 
+            var remainingAppendixStatuses = configurationService.TryGetConfigItemValue<int[]>(
+                "GreenTree.Nachtragsmanagement.SiteGrid.RemainingAppendixStatuses", new[] { 1, 5, 6, 7, 11, 12, 13 });
+
             var model = new AppendixDataModel
             {
                 Id = appendixEntity.Id,
@@ -122,6 +128,9 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Appendix
                 State = appendixEntity.State == null
                     ? null
                     : StateDataModel.FromState(appendixEntity.State, false),
+                IsRemaining = remainingAppendixStatuses.Contains(appendixEntity.StateId ?? 0)
+                    ? "Ja"
+                    : "Nein",
                 StateDescription = appendixEntity.State == null
                     ? null
                     : appendixEntity.State.Description,

+ 12 - 6
GreenTree.Nachtragsmanagement.Web/Models/Site/SiteDataModel.cs

@@ -59,6 +59,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Site
             }
         }
         public decimal? AppendixValueRemaining { get; set; }
+        public decimal? AppendixValueCalculated { get; set; }
+        public decimal? AppendixValueCleared { get; set; }
         public decimal? AppendixValueNegotiated { get; set; }
         public ICollection<int> UserValues { get; set; }
         public ICollection<string> UserDescriptions { get; set; }
@@ -93,7 +95,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Site
             var remainingAppendixStatuses = configurationService.TryGetConfigItemValue<int[]>(
                 "GreenTree.Nachtragsmanagement.SiteGrid.RemainingAppendixStatuses", new[] { 1, 5, 6, 7, 11, 12, 13 });
 
-            return new SiteDataModel
+            var siteModel = new SiteDataModel
             {
                 Id = siteEntity.Id,
                 CustomNumber = siteEntity.CustomNumber,
@@ -143,7 +145,7 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Site
                         .ToList(),
                 Appendices = 
                     siteEntity.Appendices
-                        .Select(r => AppendixDataModel.FromAppendix(r, false))
+                        .Select(r => AppendixDataModel.FromAppendix(r, false, configurationService))
                         .ToList(),
                 UserValues =
                     siteEntity.Users
@@ -163,12 +165,12 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Site
                     siteEntity.Appendices
                         .Where(r => remainingAppendixStatuses.Contains(r.StateId ?? 0))
                         .Sum(r => 
-                            r.Value.HasValue && r.Percentage.HasValue
-                                ? r.Value.Value * r.Percentage.Value
+                            r.Value.HasValue
+                                ? r.Value.Value
                                 : 0),
-                AppendixValueNegotiated =
+                AppendixValueCalculated =
                     siteEntity.Appendices
-                        .Where(r => !remainingAppendixStatuses.Contains(r.StateId ?? 0))
+                        .Where(r => remainingAppendixStatuses.Contains(r.StateId ?? 0))
                         .Sum(r =>
                             r.Value.HasValue && r.Percentage.HasValue
                                 ? r.Value.Value * r.Percentage.Value
@@ -187,6 +189,10 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Site
                         .Select(r => UserDataModel.FromUser(r, false))
                         .ToList(),
             };
+
+            siteModel.AppendixValueCleared = siteModel.AppendixValueRemaining - siteModel.AppendixValueCalculated;
+
+            return siteModel;
         }
 
         public Core.Domain.Site.Site ToSite()

+ 2 - 1
GreenTree.Nachtragsmanagement.Web/Models/Site/SiteTreeDataModel.cs

@@ -46,7 +46,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Models.Site
                 return result;
 
             var openDeviations = siteEntity.Deviations
-                .Where(d => d.Appendix == null);
+                .Where(d => d.Appendix == null)
+                .OrderBy(d => d.CustomNumber);
 
             var emptyAppendix = new SiteTreeDataModel
             {

+ 0 - 63
GreenTree.Nachtragsmanagement.Web/Plugins/Allgemein.Test/GreenTree.Nachtragsmanagement.Plugin.Test.dll.config

@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  For more information on how to configure your ASP.NET application, please visit
-  https://go.microsoft.com/fwlink/?LinkId=301880
-  -->
-<configuration>
-  <configSections>
-    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
-      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
-      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
-    </sectionGroup>
-  </configSections>
-  <system.web.webPages.razor>
-    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
-    <pages pageBaseType="System.Web.Mvc.WebViewPage">
-      <namespaces>
-        <add namespace="System.Web.Mvc" />
-        <add namespace="System.Web.Mvc.Ajax" />
-        <add namespace="System.Web.Mvc.Html" />
-        <add namespace="System.Web.Routing" />
-        <add namespace="GreenTree.Nachtragsmanagement.Plugin.Test" />
-      </namespaces>
-    </pages>
-  </system.web.webPages.razor>
-  <appSettings>
-    <add key="webpages:Version" value="3.0.0.0" />
-    <add key="webpages:Enabled" value="false" />
-    <add key="ClientValidationEnabled" value="true" />
-    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
-  </appSettings>
-  <system.web>
-    <compilation debug="true" targetFramework="4.5.2" />
-    <httpRuntime targetFramework="4.5.2" />
-  </system.web>
-  <system.webServer>
-    <handlers>
-      <remove name="BlockViewHandler" />
-      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
-    </handlers>
-  </system.webServer>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
-        <bindingRedirect oldVersion="0.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-  <system.codedom>
-    <compilers>
-      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
-      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
-    </compilers>
-  </system.codedom>
-</configuration>

+ 3 - 3
GreenTree.Nachtragsmanagement.Web/Plugins/Allgemein.Test/Description.txt → GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/Description.txt

@@ -1,8 +1,8 @@
-Group: Allgemein
+Group: Misc
 FriendlyName: Nachtragsmanagement Test
 SystemName: GreenTree.Nachtragsmanagement.Test
-Version: 1.0
-SupportedVersions: 1.0.0
+Version: 0.9
+SupportedVersions: 0.9.1.3
 Author: GreenTree Studios
 DisplayOrder: 1
 FileName: GreenTree.Nachtragsmanagement.Plugin.Test.dll

BIN
GreenTree.Nachtragsmanagement.Web/Plugins/Allgemein.Test/GreenTree.Nachtragsmanagement.Plugin.Test.dll → GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/GreenTree.Nachtragsmanagement.Plugin.Test.dll


+ 0 - 0
GreenTree.Nachtragsmanagement.Web/Plugins/Allgemein.Test/Views/Home/Index.cshtml → GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/Views/Home/Index.cshtml


+ 1 - 0
GreenTree.Nachtragsmanagement.Web/Plugins/Allgemein.Test/Web.config → GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/Web.config

@@ -61,3 +61,4 @@
     </compilers>
   </system.codedom>
 </configuration>
+<!--ProjectGuid: F60F0134-7C08-4535-8D06-227AA0DC7FC5-->

+ 0 - 0
GreenTree.Nachtragsmanagement.Web/Plugins/Allgemein.Test/logo.jpg → GreenTree.Nachtragsmanagement.Web/Plugins/Misc.Test/logo.jpg


+ 11 - 2
GreenTree.Nachtragsmanagement.Web/Views/Admin/AppInfo/View.cshtml

@@ -56,8 +56,17 @@
 				<div style="padding-bottom: 3px; margin-bottom: 3px; vertical-align: top; border-bottom: 1px solid #009688">
 					<b>Sonstige Informationen</b>
 				</div>
-				Basisverzeichnis:<br/>
-				<i>@Model.BaseDirectory</i>
+				<ul>
+					<li>
+						Basisverzeichnis: <i>@Model.BaseDirectory</i>
+					</li>
+					<li>
+						ASP.NET Info: <i>v<span>@Model.AspNetVersion</span></i>
+					</li>
+					<li>
+						Betriebssystem: <i>@Model.OperatingSystem (@(Model.Is64BitOs ? "64Bit" : "32Bit"))</i>
+					</li>
+				</ul>
 				<div style="width: 90%; margin: 0 5%; text-align: center">
 					<h3 style="color: #009688">
 						Aktuelle Programmpaketversion

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Admin/Plugins/View.cshtml

@@ -8,7 +8,7 @@
 
 <script>
 	var gridScrollHeight;
-	var gridScrollOffset = 130;
+	var gridScrollOffset = 100;
 	var resizeFinished;
 
 	$(document).ready(function () {

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Admin/Plugins/_PluginsGridPartial.cshtml

@@ -38,7 +38,7 @@
 			});
 			column.Settings.AllowDragDrop = DefaultBoolean.False;
 			column.Settings.AllowSort = DefaultBoolean.False;
-			column.Width = 60;
+			column.Width = 80;
 		});
 	}
 	s.Columns.Add(column =>

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Admin/Roles/View.cshtml

@@ -10,7 +10,7 @@
 	var deleteId;
 	var deleteReplaceId = -1;
 	var gridScrollHeight;
-	var gridScrollOffset = 130;
+	var gridScrollOffset = 100;
 	var resizeFinished;
 
 	$(document).ready(function () {

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Admin/Users/View.cshtml

@@ -8,7 +8,7 @@
 	var deleteId;
 	var resizeFinished;
 	var gridScrollHeight;
-	var gridScrollOffset = 130;
+	var gridScrollOffset = 100;
 	var resizeFinished;
 
 	$(document).ready(function () {

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Appendices/View.cshtml

@@ -7,7 +7,7 @@
 <script>
 	var deleteId;
 	var gridScrollHeight;
-	var gridScrollOffset = 240;
+	var gridScrollOffset = 185;
 	var resizeFinished;
 	var editOrderInvoiceCreatedCallback;
 

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_CategoryListPartial.cshtml

@@ -17,7 +17,7 @@
 			ViewContext.Writer.Write(DataBinder.Eval(c.DataItem, "Description"));
 			ViewContext.Writer.Write(
 				"<div class=\"devExListItemControlContainer\">" +
-					"<a href=\"#\" onclick='editCategory(\"category\", " + DataBinder.Eval(c.DataItem, "Id") + ")'>Bearbeiten</a>&nbsp;" +
+					"<a href=\"#\" onclick='editClaim(\"category\", " + DataBinder.Eval(c.DataItem, "Id") + ")'>Bearbeiten</a>&nbsp;" +
 					"<a href=\"#\" onclick='confirmDelete(\"category\", " + DataBinder.Eval(c.DataItem, "Id") + ")'>Löschen</a>" +
 				"</div>"
 			);

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Config/View.cshtml

@@ -7,7 +7,7 @@
 <script>
 	var deleteId;
 	var gridScrollHeight;
-	var gridScrollOffset = 130;
+	var gridScrollOffset = 85;
 	var resizeFinished;
 
 	$(document).ready(function () {

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Deviations/View.cshtml

@@ -7,7 +7,7 @@
 <script>
 	var deleteId;
 	var gridScrollHeight;
-	var gridScrollOffset = 240;
+	var gridScrollOffset = 185;
 	var resizeFinished;
 	var customFilters = {};
 	var customFilterDelay = 800;

+ 4 - 2
GreenTree.Nachtragsmanagement.Web/Views/Home/Index.cshtml

@@ -353,14 +353,16 @@
 					"<div class=\"functionHeader\">" +
 						"<img class=\"headerIcon\" src=\"" + Url.Content(i.ImageUrl) + "\" />" +
 						"<span class=\"headerText\">" + i.Description + "</span>" +
+						"<div class=\"controlContainer\">" +
 						"<img class=\"controlIcon\" src=\"" +
-							Url.Content("~/Content/Images/close-16.png") + "\" onclick=\"hideFunction('" + i.Name + "',false);\" />" +
+							Url.Content("~/Content/Images/minimize-16.png") + "\" onclick=\"hideFunction('" + i.Name + "',true);\" />" +
 						"<img class=\"controlIcon\" src=\"" +
 							Url.Content("~/Content/Images/maximize-16.png") + "\" onclick=\"toggleMaximizeFunction('" + i.Name + "');\" />" +
 						"<img class=\"controlIcon\" src=\"" +
 							Url.Content("~/Content/Images/fullScreen-16.png") + "\" onclick=\"toggleFullscreenFunction('" + i.Name + "',this);\" />" +
 						"<img class=\"controlIcon\" src=\"" +
-							Url.Content("~/Content/Images/minimize-16.png") + "\" onclick=\"hideFunction('" + i.Name + "',true);\" />" +
+							Url.Content("~/Content/Images/close-16.png") + "\" onclick=\"hideFunction('" + i.Name + "',false);\" />" +
+						"</div>" +
 					"</div>");
 				s.ContentUrl = Url.RouteUrl(i.RouteName);
 				s.Modal = false;

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Misc/Logs.cshtml

@@ -6,7 +6,7 @@
 
 <script>
 	var gridScrollHeight;
-	var gridScrollOffset = 250;
+	var gridScrollOffset = 195;
 	var resizeFinished;
 
 	$(document).ready(function () {

+ 2 - 2
GreenTree.Nachtragsmanagement.Web/Views/Misc/MailNotifications.cshtml

@@ -8,7 +8,7 @@
 	var deleteId;
 	var processId;
 	var gridScrollHeight;
-	var gridScrollOffset = 240;
+	var gridScrollOffset = 185;
 	var resizeFinished;
 
 	$(document).ready(function () {
@@ -170,7 +170,7 @@
 	PopupName = "devPopupControlProcessMailNotification",
 	Content = "<div class='dialogTextMailNotificationProcess' style='padding: 12px'>Sind Sie sicher, dass Sie die Benachrichtigung " +
 			  "\"{mailNotification}\" sofort durchführen möchten?</div>",
-	HeaderText = "\"{mailNotification}\" löschen",
+	HeaderText = "\"{mailNotification}\" sofort ausführen",
 	YesFunction = "function (s, e) { processMailNotification(); }",
 	YesButtonName = "devButtonProcessMailNotificationYes",
 	NoButtonName = "devButtonProcessMailNotificationNo"

+ 1 - 1
GreenTree.Nachtragsmanagement.Web/Views/Sites/View.cshtml

@@ -7,7 +7,7 @@
 <script>
 	var deleteId;
 	var gridScrollHeight;
-	var gridScrollOffset = 240;
+	var gridScrollOffset = 185;
 	var resizeFinished;
 
 	$(document).ready(function () {