Quellcode durchsuchen

Detailansicht für Nachtrag fertiggestellt + Template für VA-Liste begonnen!

Arne Diekmann vor 8 Jahren
Ursprung
Commit
95790d2e84

+ 23 - 1
GreenTree.Nachtragsmanagement.Web/Content/function.css

@@ -110,4 +110,26 @@ input[type="tel"], input[type="color"],
     display: inline-block;
     color: red;
     margin-left: 3px;
-} 
+}
+
+/* Deviation data row template */
+
+.deviationDataRowTemplate {
+    border-bottom: 1px Solid #dfdfdf;
+}
+
+.deviationDataRowTemplate > table {
+
+}
+
+.deviationDataRowTemplate > table > tbody > tr {
+
+}
+
+.deviationDataRowTemplate > table > tbody > tr > td {
+    padding: 6px 8px;
+}
+
+.deviationDataRowTemplate > table > tbody > tr > td:nth-child(2n+1) {
+    font-weight: bold;
+}

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

@@ -5,6 +5,7 @@ using GreenTree.Nachtragsmanagement.Core;
 using GreenTree.Nachtragsmanagement.Core.Authentication;
 using GreenTree.Nachtragsmanagement.Core.Domain.Appendix;
 using GreenTree.Nachtragsmanagement.Services.Appendix;
+using GreenTree.Nachtragsmanagement.Services.Configuration;
 using GreenTree.Nachtragsmanagement.Services.Deviation;
 using GreenTree.Nachtragsmanagement.Services.Logging;
 using GreenTree.Nachtragsmanagement.Services.Site;
@@ -32,19 +33,22 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
         private readonly ISiteService _siteService;
         private readonly IUserHelper _userHelper;
         private readonly ILogger _logger;
+        private readonly IConfigurationService _configurationService;
 
         public AppendixController(
             IDeviationService deviationService,
             IAppendixService appendixService,
             ISiteService siteService,
             IUserHelper userHelper,
-            ILogger logger)
+            ILogger logger,
+            IConfigurationService configurationService)
         {
             _deviationSerivce = deviationService;
             _appendixService = appendixService;
             _siteService = siteService;
             _userHelper = userHelper;
             _logger = logger;
+            _configurationService = configurationService;
 
             ViewData["AllCategories"] = _appendixService.GetAllCategories();
             ViewData["AllStates"] = _appendixService.GetAllStates();
@@ -265,6 +269,25 @@ namespace GreenTree.Nachtragsmanagement.Web.Controllers
             return PartialView("~/Views/Appendices/_AppendixEditPartial.cshtml", appendixModel);
         }
 
+        /// <summary>
+        /// Partial edit for viewing an existing appendix
+        /// </summary>
+        /// <param name="id">Id for existing appendix, otherweise -1.</param>
+        public ActionResult ViewAppendix(int id = -1)
+        {
+            if (id == -1)
+                return new EmptyResult();
+
+            var appendix = _appendixService.GetAppendixById(id);
+            var appendixModel = AppendixDataModel.FromAppendix(appendix, true);
+            var deviationModels = appendix.Deviations
+                .Select(d => DeviationDataModel.FromDeviation(d, false, _configurationService));
+
+            ViewData["AppendixDeviations"] = deviationModels;
+
+            return PartialView("~/Views/Appendices/_AppendixViewPartial.cshtml", appendixModel);
+        }
+
         /// <summary>
         /// Partial edit for creating a new deviation for a site
         /// </summary>

+ 23 - 1
GreenTree.Nachtragsmanagement.Web/Extensions/GridViewSettingsHelper.cs

@@ -11,6 +11,8 @@ using System.Linq;
 using System.Collections.Generic;
 using System.Web.UI;
 using System.Web.UI.WebControls;
+using System.Web.Mvc.Html;
+using GreenTree.Nachtragsmanagement.Web.Models.Deviation;
 
 namespace GreenTree.Nachtragsmanagement.Web.Extensions
 {
@@ -342,10 +344,12 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
 
             s.Columns.Add(column =>
             {
-                column.Caption = "Nr.";
+                column.Caption = "#";
                 column.FieldName = "CustomNumber";
                 column.MinWidth = 50;
                 column.Width = new Unit(60, UnitType.Pixel);
+                column.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
+                column.Settings.ShowFilterRowMenu = DefaultBoolean.False;
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
                 column.Settings.SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;
             });
@@ -498,6 +502,14 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.Visible = false;
             });
 
+            s.SetDataRowTemplateContent(t =>
+            {
+                var list = t.Grid.DataSource as List<DeviationDataModel>;
+                var model = list.First(l => l.Id == (int)t.KeyValue);
+
+                html.RenderPartial("~/Views/Deviations/_DeviationDataRowPartial.cshtml", model, html.ViewData);
+            });
+
             var totalDaysReceiptToAppendixOfferingSum = 0;
             var totalDaysReceiptToAppendixOfferingCount = 0;
 
@@ -739,6 +751,8 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.FieldName = "CustomNumber";
                 column.MinWidth = 80;
                 column.Width = new Unit(80, UnitType.Pixel);
+                column.Settings.AutoFilterCondition = AutoFilterCondition.Equals;
+                column.Settings.ShowFilterRowMenu = DefaultBoolean.False;
                 column.Settings.SortMode = DevExpress.XtraGrid.ColumnSortMode.Custom;
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
             });
@@ -749,6 +763,14 @@ namespace GreenTree.Nachtragsmanagement.Web.Extensions
                 column.MinWidth = 200;
                 column.Width = new Unit(14, UnitType.Percentage);
                 column.SettingsHeaderFilter.Mode = GridHeaderFilterMode.CheckedList;
+                column.SetDataItemTemplateContent(c =>
+                {
+                    var id = Convert.ToInt32(DataBinder.Eval(c.DataItem, "Id"));
+                    var description = DataBinder.Eval(c.DataItem, "Description");
+
+                    html.ViewContext.Writer.Write(description +
+                        "<br/><a href=\"#\" onclick='viewAppendix(" + id + ")'>Details anzeigen</a>");
+                });
             });
             s.Columns.Add(column =>
             {

+ 3 - 0
GreenTree.Nachtragsmanagement.Web/GreenTree.Nachtragsmanagement.Web.csproj

@@ -337,6 +337,9 @@
     <Content Include="Views\Shared\SaveDocumentViewer.cshtml" />
     <Content Include="Views\Deviations\_DeviationAssignPartial.cshtml" />
     <Content Include="Views\Appendices\_EditOrderInvoiceCreatedPartial.cshtml" />
+    <Content Include="Views\Appendices\_AppendixViewPartial.cshtml" />
+    <Content Include="Views\Appendices\_AppendixDeviationsPartial.cshtml" />
+    <Content Include="Views\Deviations\_DeviationDataRowPartial.cshtml" />
     <None Include="Web.Debug.config">
       <DependentUpon>Web.config</DependentUpon>
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

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

@@ -58,6 +58,23 @@
 		}
 	}
 
+	function viewAppendix(id) {
+		if (!id) return;
+		$.ajax({
+			url: '@Url.Action("ViewAppendix", "Appendix")',
+			data: { Id: id },
+			success: function (response) {
+				setTimeout(function () {
+					$(".appendixViewContainer").remove();
+					$("body").append(response);
+				}, 200);
+			},
+			error: function () {
+				 alert("error occured");
+			}
+		});
+	}
+
 	function editAppendix(id) {
 		if (!id) return;
 		$.ajax({

+ 81 - 0
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixDeviationsPartial.cshtml

@@ -0,0 +1,81 @@
+@{ 
+	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
+}
+
+<div style="width: 100%; overflow: auto; max-height: 380px; overflow-x: hidden">
+
+@Html.DevExpress().GridView(t =>
+{
+	t.Name = "devGridViewAppendixDeviations";
+	t.Width = Unit.Percentage(100);
+	t.SettingsPager.Mode = GridViewPagerMode.ShowAllRecords;
+
+	t.Columns.Add(column =>
+	{
+		column.FieldName = "CustomNumber";
+		column.Caption = "#";
+		column.CellStyle.Wrap = DefaultBoolean.True;
+	});
+	t.Columns.Add(column =>
+	{
+		column.FieldName = "Description";
+		column.Caption = "Bezeichnung";
+		column.CellStyle.Wrap = DefaultBoolean.True;
+	});
+	t.Columns.Add(column =>
+	{
+		column.Caption = "Eingang";
+		column.FieldName = "ReceiptDate";
+		column.PropertiesEdit.DisplayFormatString = "dd.MM.yyyy";
+	});
+	t.Columns.Add(column =>
+	{
+		column.Caption = "Bewertung";
+		column.FieldName = "Value";
+		column.PropertiesEdit.DisplayFormatString = "c2";
+		column.Width = new Unit(100, UnitType.Pixel);
+	});
+	t.Columns.Add("KindDescription", "VA-Art");
+	t.Columns.Add("StatusDescription", "Status");
+	t.Columns.Add(column =>
+	{
+		column.FieldName = "DisturbanceValuesDescription";
+		column.Caption = "Kategorien";
+		column.CellStyle.Wrap = DefaultBoolean.True;
+		column.Width = new Unit(170, UnitType.Pixel);
+	});
+	t.Columns.Add(column =>
+	{
+		column.Caption = "Kommentar";
+		column.CellStyle.Wrap = DefaultBoolean.True;
+		column.SetDataItemTemplateContent(c =>
+		{
+			var id = Convert.ToInt32(DataBinder.Eval(c.DataItem, "Id"));
+
+			var comment = DataBinder.Eval(c.DataItem, "Comment");
+			var text = comment == null
+				? String.Empty
+				: comment.ToString();
+
+			if (text.ToString().Length > 40)
+			{
+				ViewContext.Writer.Write(text.Substring(0, 40) + " ...");
+				ViewContext.Writer.Write("<a href=\"#\" onclick='showComment(\"deviation\"," + id + ",this)'><br />Anzeigen</a>");
+			}
+			else
+				ViewContext.Writer.Write(text);
+		});
+	});
+
+	t.HtmlRowPrepared = (sender, e) =>
+	{
+
+	};
+
+	t.Style.Add("box-shadow", "none");
+	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);
+}).Bind(ViewData["AppendixDeviations"]).GetHtml()
+
+</div>

+ 57 - 22
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixEditPartial.cshtml

@@ -3,6 +3,7 @@
 @{ 
 	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
 	var categoryValues = Model.CategoryValueEntities.ToArray();
+	var isReadOnly = ViewData["ReadOnly"] != null && Convert.ToBoolean(ViewData["ReadOnly"]);
 }
 
 @model GreenTree.Nachtragsmanagement.Web.Models.Appendix.AppendixDataModel
@@ -213,6 +214,7 @@
 					Html.DevExpress().TextBoxFor(m => m.CustomNumber, t =>
 					{
 						t.Width = new Unit(90, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
@@ -223,6 +225,7 @@
 					Html.DevExpress().TextBoxFor(m => m.Description, t =>
 					{
 						t.Width = new Unit(97, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
@@ -233,6 +236,7 @@
 					Html.DevExpress().DateEditFor(m => m.OfferingDate, t =>
 					{
 						t.Width = new Unit(100, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
@@ -249,6 +253,7 @@
 					{
 						t.Name = "devDropDownListCategoryValues";
 						t.Width = new Unit(96, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 
 						if (Model.CategoryValueEntities != null && Model.CategoryValueEntities.Any())
 							t.Text = String.Join(", ",
@@ -279,14 +284,17 @@
 						});
 					}).Render();
 
-					Html.DevExpress().HyperLink(t =>
+					if (!isReadOnly)
 					{
-						t.Name = "devHyperLinkCategoryValueAdd";
-						t.Properties.Text = "Hinzufügen";
-						t.NavigateUrl = "#";
-						t.Properties.ClientSideEvents.Click = "function (s, e) { devCategoryValuePopup.Show(); }";
-						t.Style.Add("line-height", "24px");
-					}).Render();
+						Html.DevExpress().HyperLink(t =>
+						{
+							t.Name = "devHyperLinkCategoryValueAdd";
+							t.Properties.Text = "Hinzufügen";
+							t.NavigateUrl = "#";
+							t.Properties.ClientSideEvents.Click = "function (s, e) { devCategoryValuePopup.Show(); }";
+							t.Style.Add("line-height", "24px");
+						}).Render();
+					}
 				}
 				ViewContext.Writer.Write("</div>");
 
@@ -297,6 +305,7 @@
 					Html.DevExpress().SpinEditFor(m => m.OfferingValue, t =>
 					{
 						t.Width = new Unit(94, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 						t.Properties.ClientInstanceName = "OfferingValueAppendix";
 						t.Properties.DecimalPlaces = 2;
 						t.Properties.NumberType = SpinEditNumberType.Float;
@@ -313,6 +322,7 @@
 					Html.DevExpress().SpinEditFor(m => m.Percentage, t =>
 					{
 						t.Width = new Unit(88, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 						t.Properties.ClientInstanceName = "PercentageAppendix";
 						t.Properties.MaxValue = 1;
 						t.Properties.MinValue = 0;
@@ -331,6 +341,7 @@
 					Html.DevExpress().SpinEditFor(m => m.PercentageValue, t =>
 					{
 						t.Width = new Unit(100, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 						t.Properties.ClientInstanceName = "PercentageValueAppendix";
 						t.Properties.DecimalPlaces = 2;
 						t.Properties.NumberType = SpinEditNumberType.Float;
@@ -349,6 +360,7 @@
 					Html.DevExpress().SpinEditFor(m => m.NegotiationValue, t =>
 					{
 						t.Width = new Unit(96, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 						t.Properties.DecimalPlaces = 2;
 						t.Properties.NumberType = SpinEditNumberType.Float;
 						t.Properties.DisplayFormatString = "c2";
@@ -363,6 +375,7 @@
 					Html.DevExpress().DateEditFor(m => m.NegotiationDate, t =>
 					{
 						t.Width = new Unit(100, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
@@ -377,6 +390,7 @@
 					Html.DevExpress().TextBoxFor(m => m.OrderNumber, t =>
 					{
 						t.Width = new Unit(96, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
@@ -387,6 +401,7 @@
 					Html.DevExpress().DateEditFor(m => m.OrderDate, t =>
 					{
 						t.Width = new Unit(100, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
 					}).Render();
 				}
 				ViewContext.Writer.Write("</div>");
@@ -400,16 +415,17 @@
 					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.StateId, "NT-Status:"));
 					ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.StateId).ToHtmlString());
 
-					Session.Add("AppendixStatesComboBoxSettings", new Action<ComboBoxSettings>(a =>
+					Session.Add("AppendixStatesComboBoxSettings", new Action<ComboBoxSettings>(t =>
 					{
-						a.Width = new Unit(96, UnitType.Percentage);
-						a.Properties.ValueType = typeof(int);
-						a.Properties.ValueField = "Id";
-						a.Properties.TextField = "Description";
+						t.Width = new Unit(96, UnitType.Percentage);
+						t.ReadOnly = isReadOnly;
+						t.Properties.ValueType = typeof(int);
+						t.Properties.ValueField = "Id";
+						t.Properties.TextField = "Description";
 
 						var serializedModel = Newtonsoft.Json.JsonConvert.SerializeObject(Model);
 
-						a.CallbackRouteValues = new
+						t.CallbackRouteValues = new
 						{
 							Controller = "DataCallback",
 							Action = "StatesComboBox",
@@ -421,7 +437,7 @@
 					ViewData.Add("StatesComboBoxSettings", "AppendixStatesComboBoxSettings");
 					Html.RenderPartial("~/Views/Shared/DataEditorTemplates/_StatesComboBox.cshtml", Model, ViewData);
 
-					if (userContext.CurrentUser.HasFunction("Appendix-Claims-Edit"))
+					if (userContext.CurrentUser.HasFunction("Appendix-Claims-Edit") && !isReadOnly)
 					{
 						Html.DevExpress().HyperLink(t =>
 						{
@@ -488,6 +504,7 @@
 							{
 								t.Text = "Ja";
 								t.GroupName = "protocolExists";
+								t.ReadOnly = isReadOnly;
 							}).Render();
 						}
 						ViewContext.Writer.Write("</div>");
@@ -500,6 +517,7 @@
 								t.Text = "Nein";
 								t.GroupName = "protocolExists";
 								t.Checked = !Model.ProtocolExists;
+								t.ReadOnly = isReadOnly;
 							}).Render();
 						}
 						ViewContext.Writer.Write("</div>");
@@ -519,6 +537,7 @@
 							{
 								t.Text = "Ja";
 								t.GroupName = "orderInvoiceCreated";
+								t.ReadOnly = isReadOnly;
 							}).Render();
 						}
 						ViewContext.Writer.Write("</div>");
@@ -531,6 +550,7 @@
 								t.Text = "Nein";
 								t.GroupName = "orderInvoiceCreated";
 								t.Checked = !Model.OrderInvoiceCreated;
+								t.ReadOnly = isReadOnly;
 							}).Render();
 						}
 						ViewContext.Writer.Write("</div>");
@@ -547,18 +567,33 @@
 			{
 				t.Width = new Unit(100, UnitType.Percentage);
 				t.Height = new Unit(90, UnitType.Pixel);
+				t.ReadOnly = isReadOnly;
 			}).Render();
 
 			ViewContext.Writer.Write("</div>");
 
-			Html.RenderPartial(
-				"~/Views/Shared/_PopupButtonPanel.cshtml",
-				new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
-				{
-					PopupName = "devPopupControlEditAppendix",
-					AcceptFunction = "function (s, e) { saveAppendix(); }"
-				}
-			);
+			if (isReadOnly)
+			{
+				Html.RenderPartial(
+					"~/Views/Shared/_PopupButtonPanel.cshtml",
+					new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
+					{
+						PopupName = "devPopupControlEditAppendix",
+						AcceptFunction = "function (s, e) { return false; }"
+					}
+				);
+			}
+			else
+			{
+				Html.RenderPartial(
+					"~/Views/Shared/_PopupButtonPanel.cshtml",
+					new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
+					{
+						PopupName = "devPopupControlEditAppendix",
+						AcceptFunction = "function (s, e) { saveAppendix(); }"
+					}
+				);
+			}
 		}
 	});
 	s.Styles.Content.Paddings.Padding = new Unit(0);

+ 434 - 0
GreenTree.Nachtragsmanagement.Web/Views/Appendices/_AppendixViewPartial.cshtml

@@ -0,0 +1,434 @@
+@using GreenTree.Nachtragsmanagement.Web.Extensions
+
+@{ 
+	var userContext = GreenTree.Nachtragsmanagement.Core.CommonHelper.UserContext();
+	var categoryValues = Model.CategoryValueEntities.ToArray();
+}
+
+@model GreenTree.Nachtragsmanagement.Web.Models.Appendix.AppendixDataModel
+
+<div class="appendixViewContainer">
+
+	<script>
+
+
+
+	</script>
+
+	<style>
+		.devHyperLinkEditInvoice {
+			margin: 0 4px;
+			text-decoration: none;
+		}
+
+		.devHyperLinkEditInvoice:hover {
+			text-decoration: underline;
+		}
+	</style>
+
+	@Html.Partial("~/Views/Appendices/_CategoryValueEditPartial.cshtml")
+
+	@Html.DevExpress().PopupControl(s =>
+{
+	s.Name = "devPopupControlViewAppendix";
+	s.HeaderText = "\"" + Model.CustomNumber + "\" bearbeiten";
+	s.Modal = true;
+	s.Width = new Unit(950, UnitType.Pixel);
+	s.CloseAction = CloseAction.CloseButton;
+	s.PopupHorizontalAlign = PopupHorizontalAlign.WindowCenter;
+	s.PopupVerticalAlign = PopupVerticalAlign.TopSides;
+	s.PopupVerticalOffset = 15;
+	s.AllowDragging = true;
+	s.AllowResize = false;
+	s.ShowFooter = false;
+	s.ShowOnPageLoad = true;
+	s.SetContent(() =>
+	{
+		ViewContext.Writer.Write("<div class='editFormWrapper'>");
+
+		ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.Id + "\" id=\"Id\" name=\"Id\" />");
+		ViewContext.Writer.Write("<input type=\"hidden\" value=\"" + Model.SiteId + "\" id=\"SiteId\" name=\"SiteId\" />");
+
+		ViewContext.Writer.Write(Html.ValidationMessageFor(m => m).ToHtmlString());
+
+		ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+		{
+			ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 15%'>");
+			{
+				ViewContext.Writer.Write(Html.CustomLabelFor(m => m.CustomNumber, "Nummer:"));
+				ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.CustomNumber).ToHtmlString());
+				Html.DevExpress().TextBoxFor(m => m.CustomNumber, t =>
+				{
+					t.Width = new Unit(90, UnitType.Percentage);
+					t.ReadOnly = true;
+				}).Render();
+			}
+			ViewContext.Writer.Write("</div>");
+			ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 55%'>");
+			{
+				ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Description, "Bezeichnung:"));
+				ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Description).ToHtmlString());
+				Html.DevExpress().TextBoxFor(m => m.Description, t =>
+				{
+					t.Width = new Unit(97, UnitType.Percentage);
+					t.ReadOnly = true;
+				}).Render();
+			}
+			ViewContext.Writer.Write("</div>");
+			ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 30%'>");
+			{
+				ViewContext.Writer.Write(Html.CustomLabelFor(m => m.OfferingDate, "Einreichdatum NT:"));
+				ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.OfferingDate).ToHtmlString());
+				Html.DevExpress().DateEditFor(m => m.OfferingDate, t =>
+				{
+					t.Width = new Unit(100, UnitType.Percentage);
+					t.ReadOnly = true;
+				}).Render();
+			}
+			ViewContext.Writer.Write("</div>");
+		}
+		ViewContext.Writer.Write("</div>");
+
+		Html.DevExpress().PageControl(c =>
+		{
+			c.Name = "devPageControlAppendix";
+			c.ActiveTabIndex = 1;
+			c.Width = new Unit(100, UnitType.Percentage);
+			c.TabPages.Add(tab =>
+			{
+				tab.Name = "devTabAppendixDetails";
+				tab.Text = "Nachtragdetails";
+				tab.SetContent(() =>
+				{
+					ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+					{
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 40%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.CategoryEntities, "Kategorien:"));
+							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.CategoryEntities).ToHtmlString());
+							Html.DevExpress().DropDownEdit(t =>
+							{
+								t.Name = "devDropDownListCategoryValues";
+								t.Width = new Unit(96, UnitType.Percentage);
+								t.ReadOnly = true;
+
+								if (Model.CategoryValueEntities != null && Model.CategoryValueEntities.Any())
+									t.Text = String.Join(", ",
+										Model.CategoryValueEntities
+											.Select(d => d.Description));
+
+								t.SetDropDownWindowTemplateContent(l =>
+								{
+									Html.DevExpress().ListBoxFor(m => m.CategoryEntities, lb =>
+									{
+										lb.Width = new Unit(100, UnitType.Percentage);
+										lb.Properties.TextField = "Description";
+										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 description = DataBinder.Eval(i.DataItem, "Description").ToString();
+
+											ViewContext.Writer.Write(description);
+											ViewContext.Writer.Write(
+												"<a class=\"disturbanceRemoveLink\" style=\"float: right\" href=\"#\" onclick='removeCategoryValue(\"" + description + "\")'>Entfernen</a>");
+										});
+										lb.ControlStyle.Border.BorderStyle = BorderStyle.None;
+									}).BindList(Model.CategoryValueEntities).Render();
+								});
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 22%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.OfferingValue, "Angebotssumme:"));
+							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.OfferingValue).ToHtmlString());
+							Html.DevExpress().SpinEditFor(m => m.OfferingValue, t =>
+							{
+								t.Width = new Unit(94, UnitType.Percentage);
+								t.ReadOnly = true;
+								t.Properties.ClientInstanceName = "OfferingValueAppendix";
+								t.Properties.DecimalPlaces = 2;
+								t.Properties.NumberType = SpinEditNumberType.Float;
+								t.Properties.DisplayFormatString = "c2";
+								t.Properties.ClientSideEvents.ValueChanged = "function (s, e) { calculateValueAppendix(); }";
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 16%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Percentage, "Bewertung (%):"));
+							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Percentage).ToHtmlString());
+							Html.DevExpress().SpinEditFor(m => m.Percentage, t =>
+							{
+								t.Width = new Unit(88, UnitType.Percentage);
+								t.ReadOnly = true;
+								t.Properties.ClientInstanceName = "PercentageAppendix";
+								t.Properties.MaxValue = 1;
+								t.Properties.MinValue = 0;
+								t.Properties.Increment = (decimal)0.1;
+								t.Properties.NumberType = SpinEditNumberType.Float;
+								t.Properties.NumberFormat = SpinEditNumberFormat.Percent;
+								t.Properties.DisplayFormatString = "p0";
+								t.Properties.DisplayFormatInEditMode = true;
+								t.Properties.ClientSideEvents.ValueChanged = "function (s, e) { calculateValueAppendix(); }";
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 22%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.PercentageValue, "Wert:"));
+							Html.DevExpress().SpinEditFor(m => m.PercentageValue, t =>
+							{
+								t.Width = new Unit(100, UnitType.Percentage);
+								t.ReadOnly = true;
+								t.Properties.ClientInstanceName = "PercentageValueAppendix";
+								t.Properties.DecimalPlaces = 2;
+								t.Properties.NumberType = SpinEditNumberType.Float;
+								t.Properties.DisplayFormatString = "c2";
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+					}
+					ViewContext.Writer.Write("</div>");
+
+					ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+					{
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 40%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.NegotiationValue, "Verhandlungssumme:"));
+							Html.DevExpress().SpinEditFor(m => m.NegotiationValue, t =>
+							{
+								t.Width = new Unit(96, UnitType.Percentage);
+								t.ReadOnly = true;
+								t.Properties.DecimalPlaces = 2;
+								t.Properties.NumberType = SpinEditNumberType.Float;
+								t.Properties.DisplayFormatString = "c2";
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 36.1%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.NegotiationDate, "Verhandlungstermin:"));
+							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.NegotiationDate).ToHtmlString());
+							Html.DevExpress().DateEditFor(m => m.NegotiationDate, t =>
+							{
+								t.Width = new Unit(100, UnitType.Percentage);
+								t.ReadOnly = true;
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+					}
+					ViewContext.Writer.Write("</div>");
+
+					ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+					{
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 40%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.OrderNumber, "Bestellschein-Nr.:"));
+							Html.DevExpress().TextBoxFor(m => m.OrderNumber, t =>
+							{
+								t.Width = new Unit(96, UnitType.Percentage);
+								t.ReadOnly = true;
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 36.1%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.OrderDate, "Bestellscheindatum:"));
+							Html.DevExpress().DateEditFor(m => m.OrderDate, t =>
+							{
+								t.Width = new Unit(100, UnitType.Percentage);
+								t.ReadOnly = true;
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+					}
+					ViewContext.Writer.Write("</div>");
+
+					ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+					{
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 40%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.StateId, "NT-Status:"));
+							ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.StateId).ToHtmlString());
+
+							Session.Add("AppendixStatesComboBoxSettings", new Action<ComboBoxSettings>(t =>
+							{
+								t.Width = new Unit(96, UnitType.Percentage);
+								t.ReadOnly = true;
+								t.Properties.ValueType = typeof(int);
+								t.Properties.ValueField = "Id";
+								t.Properties.TextField = "Description";
+
+								var serializedModel = Newtonsoft.Json.JsonConvert.SerializeObject(Model);
+
+								t.CallbackRouteValues = new
+								{
+									Controller = "DataCallback",
+									Action = "StatesComboBox",
+									SettingsKey = "AppendixStatesComboBoxSettings",
+									Model = serializedModel,
+									Type = Model.GetType().FullName
+								};
+							}));
+							ViewData.Add("StatesComboBoxSettings", "AppendixStatesComboBoxSettings");
+							Html.RenderPartial("~/Views/Shared/DataEditorTemplates/_StatesComboBox.cshtml", Model, ViewData);
+						}
+						ViewContext.Writer.Write("</div>");
+
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 60%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Invoices, "Rechnungen:"));
+
+							if (Model.Id == -1)
+							{
+								ViewContext.Writer.Write("<span style=\"margin-left: 8px; color: red\">Nachtrag muss erst gespeichert werden!</span>");
+							}
+
+							Html.DevExpress().DropDownEdit(t =>
+							{
+								t.Name = "devDropDownListInvoices";
+								t.Width = new Unit(100, UnitType.Percentage);
+								t.ClientEnabled = Model.Id != -1;
+
+								if (Model.Invoices != null && Model.Invoices.Any())
+									t.Text = String.Join(", ",
+										Model.Invoices
+											.Select(d => d.CustomNumber));
+
+								t.SetDropDownWindowTemplateContent(l =>
+								{
+									Html.RenderPartial("~/Views/Appendices/_InvoiceListPartial.cshtml", Model);
+								});
+							}).Render();
+
+							Html.DevExpress().HyperLink(t =>
+							{
+								t.Name = "devHyperLinkInvoiceAdd";
+								t.Properties.Text = "Hinzufügen";
+								t.NavigateUrl = "#";
+								t.ClientEnabled = Model.Id != -1;
+								t.Properties.ClientSideEvents.Click = "function (s, e) { editInvoice(-1); }";
+								t.Style.Add("line-height", "24px");
+							}).Render();
+						}
+						ViewContext.Writer.Write("</div>");
+					}
+					ViewContext.Writer.Write("</div>");
+
+					ViewContext.Writer.Write("<div class='inlineModelPropertyContainer'>");
+					{
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 25%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.ProtocolExists, "Protokoll liegt vor:"));
+							ViewContext.Writer.Write("<div style=\"overflow: hidden\">");
+							{
+								ViewContext.Writer.Write("<div style=\"float: left\">");
+								{
+									Html.DevExpress().RadioButtonFor(m => m.ProtocolExists, t =>
+									{
+										t.Text = "Ja";
+										t.GroupName = "protocolExists";
+										t.ReadOnly = true;
+									}).Render();
+								}
+								ViewContext.Writer.Write("</div>");
+
+								ViewContext.Writer.Write("<div style=\"float: left; margin-left: 8px\">");
+								{
+									Html.DevExpress().RadioButton(t =>
+									{
+										t.Name = "protocolExistsFalse";
+										t.Text = "Nein";
+										t.GroupName = "protocolExists";
+										t.Checked = !Model.ProtocolExists;
+										t.ReadOnly = true;
+									}).Render();
+								}
+								ViewContext.Writer.Write("</div>");
+							}
+							ViewContext.Writer.Write("</div>");
+						}
+						ViewContext.Writer.Write("</div>");
+
+						ViewContext.Writer.Write("<div class='inlineModelProperty' style='width: 25%'>");
+						{
+							ViewContext.Writer.Write(Html.CustomLabelFor(m => m.OrderInvoiceCreated, "AR gestellt:"));
+							ViewContext.Writer.Write("<div style=\"overflow: hidden\">");
+							{
+								ViewContext.Writer.Write("<div style=\"float: left\">");
+								{
+									Html.DevExpress().RadioButtonFor(m => m.OrderInvoiceCreated, t =>
+									{
+										t.Name = "OrderInvoiceCreatedViewTrue";
+										t.Text = "Ja";
+										t.GroupName = "orderInvoiceCreatedView";
+										t.ReadOnly = true;
+									}).Render();
+								}
+								ViewContext.Writer.Write("</div>");
+
+								ViewContext.Writer.Write("<div style=\"float: left; margin-left: 8px\">");
+								{
+									Html.DevExpress().RadioButton(t =>
+									{
+										t.Name = "OrderInvoiceCreatedViewFalse";
+										t.Text = "Nein";
+										t.GroupName = "orderInvoiceCreatedView";
+										t.Checked = !Model.OrderInvoiceCreated;
+										t.ReadOnly = true;
+									}).Render();
+								}
+								ViewContext.Writer.Write("</div>");
+							}
+							ViewContext.Writer.Write("</div>");
+						}
+						ViewContext.Writer.Write("</div>");
+					}
+					ViewContext.Writer.Write("</div>");
+
+					ViewContext.Writer.Write(Html.CustomLabelFor(m => m.Comment, "Kommentar:"));
+					ViewContext.Writer.Write(Html.ValidationMessageFor(m => m.Comment).ToHtmlString());
+					Html.DevExpress().MemoFor(m => m.Comment, t =>
+					{
+						t.Width = new Unit(100, UnitType.Percentage);
+						t.Height = new Unit(90, UnitType.Pixel);
+						t.ReadOnly = true;
+					}).Render();
+				});
+			});
+
+			c.TabPages.Add(tab =>
+			{
+				tab.Name = "devTabAppendixDeviations";
+				tab.Text = "Vertragsabweichungen";
+				tab.SetContent(() =>
+				{
+					Html.RenderPartial("~/Views/Appendices/_AppendixDeviationsPartial.cshtml", ViewData);
+				});
+			});
+		}).Render();
+
+		ViewContext.Writer.Write("</div>");
+
+		Html.RenderPartial(
+			"~/Views/Shared/_PopupButtonPanel.cshtml",
+			new GreenTree.Nachtragsmanagement.Web.Models.Global.PopupModel
+			{
+				PopupName = "devPopupControlViewAppendix",
+				AcceptFunction = "function (s, e) { devPopupControlViewAppendix.Hide(); }"
+			}
+		);
+	});
+	s.Styles.Content.Paddings.Padding = new Unit(0);
+	s.Styles.ModalBackground.Opacity = 0;
+}).GetHtml()
+</div>

+ 26 - 0
GreenTree.Nachtragsmanagement.Web/Views/Deviations/_DeviationDataRowPartial.cshtml

@@ -0,0 +1,26 @@
+@using GreenTree.Nachtragsmanagement.Web.Extensions
+
+@model GreenTree.Nachtragsmanagement.Web.Models.Deviation.DeviationDataModel
+
+<div class="deviationDataRowTemplate">
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					Nummer:
+				</td>
+				<td>
+					@Model.CustomNumber
+				</td>
+			</tr>
+			<tr>
+				<td>
+					Bezeichnung:
+				</td>
+				<td>
+					@Model.Description
+				</td>
+			</tr>
+		</tbody>
+	</table>
+</div>