675 lines
40 KiB
Plaintext
675 lines
40 KiB
Plaintext
@using EnVisage.Code
|
|
@using EnVisage.Code.HtmlHelpers
|
|
@using EnVisage.Models
|
|
@using EnVisage.Code.Cache
|
|
@model ScenarioDetailModel
|
|
|
|
@{
|
|
// need to init angular header controller
|
|
var json = Newtonsoft.Json.JsonConvert.SerializeObject(new
|
|
{
|
|
id = Model.Id,
|
|
name = Model.Name,
|
|
parentId = Model.ParentId,
|
|
templateId = Model.TemplateId.Equals(Guid.Empty) ? (Guid?)null : Model.TemplateId,
|
|
startDate = (Model.StartDate ?? DateTime.Today).ToString("MM/dd/yyyy"),
|
|
endDate = (Model.EndDate ?? DateTime.Today).ToString("MM/dd/yyyy"),
|
|
growthScenario = Model.GrowthScenario,
|
|
expense = Model.TDDirectCosts,
|
|
revenue = Model.ProjectedRevenue,
|
|
useLMMargin = Model.UseLMMargin,
|
|
grossMargin = Model.GrossMargin ?? 0,
|
|
lmMargin = Model.LMMargin ?? 0,
|
|
isActiveScenario = Model.IsActiveScenario,
|
|
duration = Model.Duration,
|
|
dateForStartOfChanges = Model.DateForStartOfChanges.HasValue ? Model.DateForStartOfChanges.Value.ToString("MM/dd/yyyy") : string.Empty,
|
|
activeTab = Model.ActiveTab
|
|
});
|
|
}
|
|
@{
|
|
ViewBag.Title = ((!string.IsNullOrEmpty(Model.PartName)) ? Model.PartName + ": " : "") + Model.ProjectName + " " + "Scenario Details";
|
|
}
|
|
@section stylesheets
|
|
{
|
|
<link href="~/Content/stylesheets/xeditable.css" rel="stylesheet" type="text/css" />
|
|
<link href="~/Content/stylesheets/select.min.css" rel="stylesheet" type="text/css" />
|
|
<link href="~/Content/stylesheets/angular-dnd.css" rel="stylesheet" type="text/css" />
|
|
<link href="~/Content/stylesheets/bootstrap-modal-bs3patch.css" rel="stylesheet" />
|
|
<link href="~/Content/stylesheets/bootstrap-modal.css" rel="stylesheet" />
|
|
}
|
|
@section Scripts
|
|
{
|
|
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
|
|
<script src="@Url.Content("~/Scripts/URIjs.min.js")" type="text/javascript"></script>
|
|
@Scripts.Render("~/bundles/angular-app-modules")
|
|
<script src="~/Scripts/Angular/app.js"></script>
|
|
<script src="~/Scripts/Angular/Controllers/scenarioDetailController.js"></script>
|
|
<script src="~/Scripts/Angular/Controllers/scenarioHeaderController.js"></script>
|
|
<script src="~/Scripts/Angular/Controllers/costSavingController.js"></script>
|
|
<script src="@Url.Content("~/Scripts/sliders.js")" type="text/javascript"></script>
|
|
<script src="@Url.Content("~/Scripts/Plugins/ScenarioDetailsGrid.js")" type="text/javascript"></script>
|
|
<script src="@Url.Content("~/Scripts/CustomValidation.js")" type="text/javascript"></script>
|
|
<script src="@Url.Content("~/Scripts/bootstrap-modalmanager.js")" type="text/javascript"></script>
|
|
<script src="@Url.Content("~/Scripts/bootstrap-modal.js")" type="text/javascript"></script>
|
|
<script type="text/javascript">
|
|
//fix modal force focus
|
|
$.fn.modal.Constructor.prototype.enforceFocus = function () {
|
|
var that = this;
|
|
$(document).on('focusin.modal', function (e) {
|
|
if ($(e.target).hasClass('select2-input')) {
|
|
return true;
|
|
}
|
|
|
|
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
|
|
that.$element.focus();
|
|
}
|
|
});
|
|
};
|
|
var changesMade = false;
|
|
var autoclick = false;
|
|
function onDataChanged() {
|
|
changesMade = true;
|
|
}
|
|
|
|
function onDataSaved() {
|
|
changesMade = false;
|
|
}
|
|
|
|
function setupUnload() {
|
|
$(window).on('beforeunload', function () {
|
|
if (changesMade) {
|
|
return '@EnVisage.Code.Constants.CONFIRM_EDIT_SCENARIO';
|
|
}
|
|
});
|
|
}
|
|
|
|
emulateNavUrl = "/Scenarios";
|
|
init.push(function () {
|
|
setupUnload();
|
|
initCostSaving();
|
|
initFinInfoGraph();
|
|
|
|
$(document).on('sd.dataload.completed', function (e, costs) {
|
|
var data = {
|
|
ECExpense: costs,
|
|
IsRevenueGenerating: @Model.IsRevenueGenerating.ToString().ToLower(),
|
|
ProjectedRevenue: @(Model.IsRevenueGenerating ? Html.Raw(string.Format("$('#{0}').val()", Html.IdFor(x => x.ProjectedRevenue))) : (object)"null"),
|
|
TDDirectCosts: $('#@Html.IdFor(x=> x.TDDirectCosts)').val(),
|
|
CostSavings: $('#@Html.IdFor(x=> x.CostSaving.CostSavings)').val()
|
|
};
|
|
refreshFinInfoGraphData(data);
|
|
});
|
|
$('#scenario-header').find('input[type=checkbox],input[type=text],select,textarea').on("change", function () {
|
|
if (typeof onDataChanged === 'function')
|
|
onDataChanged();
|
|
});
|
|
|
|
@if (Model.Id != Guid.Empty)
|
|
{
|
|
@:StartEdit('Scenario', '@Model.Id', "#btnDelete", "#btnsave", "erorMsgPlaceholder");
|
|
}
|
|
$('#visibilitydropdown').click(function (event) {
|
|
if (event.target == null || event.target.nodeName == null || (event.target.nodeName != 'A' && event.target.parentNode.nodeName != 'A')) {
|
|
event.stopPropagation();
|
|
}
|
|
});
|
|
$('#btnCopySubmit').click(function () {
|
|
if (!changesMade || confirm('@EnVisage.Code.Constants.CONFIRM_EDIT_SCENARIO')) {
|
|
if ($(this).parents('form').valid()) {
|
|
blockUI();
|
|
$(window).off('beforeunload');
|
|
}
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
});
|
|
$('#btnNewTemplate').click(function () {
|
|
if (!changesMade || confirm('@EnVisage.Code.Constants.CONFIRM_EDIT_SCENARIO')) {
|
|
if ($(this).parents('form').valid()) {
|
|
blockUI();
|
|
$(window).off('beforeunload');
|
|
}
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
});
|
|
var tab = $.QueryString["ptab"];
|
|
if (tab == "copy")
|
|
$('#btnCopyTo').click();
|
|
|
|
$('#@Html.ClientIdFor(x=> x.IsActiveScenario)').switcher({
|
|
on_state_content: 'Active',
|
|
off_state_content: 'Inactive'
|
|
});
|
|
$('#@Html.ClientIdFor(x=> x.IsActiveScenario)').parent().css('width', '100px');
|
|
|
|
$('#@Html.ClientIdFor(x=> x.UseLMMargin)').switcher({
|
|
on_state_content: 'L&M',
|
|
off_state_content: 'Gross'
|
|
});
|
|
$('#@Html.ClientIdFor(x=> x.UseLMMargin)').parent().css('width', '100px');
|
|
|
|
var options = {
|
|
format: 'mm/dd/yyyy',
|
|
autoclose: true,
|
|
orientation: $('body').hasClass('right-to-left') ? "auto right" : 'auto auto',
|
|
startDate: '@Constants.MIN_SELECTABLE_DATE', // SA. ENV-1235. Disable incorrect dates input
|
|
endDate: '@Constants.MAX_SELECTABLE_DATE' // SA. ENV-1235. Disable incorrect dates input
|
|
};
|
|
|
|
$('#bs-scenario-details-datepicker-rangeStart').datepicker(options);
|
|
$('#bs-scenario-details-datepicker-rangeEnd').datepicker(options);
|
|
|
|
|
|
var s = $("#scenario-details-container .forselect2").select2({
|
|
allowClear: true
|
|
});
|
|
|
|
$('#headerController .datepicker').datepicker(options);
|
|
initScenarioDetails();
|
|
|
|
$(document).on('hide.bs.modal', '#copyTo', function (e) {
|
|
// skip modal hide event from datepickers
|
|
if ($(e.target).attr('id') != 'copyTo')
|
|
return true; // close modal form
|
|
// check that form has been changed
|
|
if (typeof isCTDataChanged === 'function')
|
|
// if form has been changed
|
|
if (isCTDataChanged()) {
|
|
// ask user for confirmation of form close
|
|
if (confirm("@EnVisage.Code.Constants.CONFIRM_CREATE_SCENARIO")) {
|
|
// reset change indicator
|
|
if (typeof resetCTDataChanged === 'function') {
|
|
resetCTDataChanged();
|
|
}
|
|
return true; // close modal form
|
|
};
|
|
return false; // DO NOT close modal form
|
|
}
|
|
return true; // close modal form
|
|
});
|
|
$(document).on('hide.bs.modal', '#createTemplate', function (e) {
|
|
if ($(e.target).attr('id') != 'createTemplate')
|
|
return true; // close modal form
|
|
if (typeof isTemplateDataChanged === 'function')
|
|
if (isTemplateDataChanged()) {
|
|
if (confirm("Template form contains unsaved changes, do you really want to close the form?")) {
|
|
if (typeof resetTemplateDataChanged === 'function') {
|
|
resetTemplateDataChanged();
|
|
}
|
|
};
|
|
return false; // DO NOT close modal form
|
|
}
|
|
return true; // close modal form
|
|
});
|
|
$('#@Html.IdFor(x=> x.ProjectedRevenue)').on('change', function(){
|
|
var revenue = parseFloat($(this).val() || 0);
|
|
var expense = parseFloat($('#@Html.IdFor(x=> x.TDDirectCosts)').val() || 0);
|
|
|
|
updateRevenueAndExpenseOnFinGraph(revenue, expense);
|
|
});
|
|
$('#@Html.IdFor(x=> x.TDDirectCosts)').on('change', function(){
|
|
var value = parseFloat($(this).val() || 0);
|
|
updateProjectedExpenseOnFinGraph(value);
|
|
});
|
|
$('#@Html.IdFor(x=> x.GrossMargin)').on('change', function(){
|
|
var expense = parseFloat($('#@Html.IdFor(x=> x.TDDirectCosts)').val() || 0);
|
|
updateProjectedExpenseOnFinGraph(expense);
|
|
});
|
|
$('#@Html.IdFor(x=> x.LMMargin)').on('change', function(){
|
|
var expense = parseFloat($('#@Html.IdFor(x=> x.TDDirectCosts)').val() || 0);
|
|
updateProjectedExpenseOnFinGraph(expense);
|
|
});
|
|
$('#@Html.IdFor(x=> x.UseLMMargin)').on('change', function(){
|
|
var expense = parseFloat($('#@Html.IdFor(x=> x.TDDirectCosts)').val() || 0);
|
|
updateProjectedExpenseOnFinGraph(expense);
|
|
});
|
|
$('#@Html.IdFor(x=> x.CostSaving.CostSavings)').on('change', function(){
|
|
var value = parseFloat($(this).val() || 0);
|
|
updateCostSavingsOnFinGraph(value);
|
|
});
|
|
});
|
|
function onCreateTemplateFailure(xhr) {
|
|
unblockUI();
|
|
$('#createTemplateModal').html(xhr.responseText);
|
|
}
|
|
function onCreateTemplateSuccess(data) {
|
|
unblockUI();
|
|
document.location.href = document.location.href;
|
|
}
|
|
|
|
function onCopyToFailure(xhr) {
|
|
$('#copyToModal').html(xhr.responseText);
|
|
unblockUI();
|
|
}
|
|
|
|
function onCopyToSuccess(data) {
|
|
unblockUI();
|
|
var url = '@Url.Action("Details", new { @Id = "VarId" , @tab=string.Empty, @backUrl=Model.BackUrl, @backName=Model.BackName })';
|
|
document.location.href = url.replace('VarId', data);
|
|
}
|
|
|
|
// TODO: remove it
|
|
function showAdjustMagrinModal(id) {
|
|
var url = '@Url.Action("AdjustMargin", "Scenarios", new { id = "idval" })';
|
|
url = url.replace('idval', id);
|
|
$('#modalAdjustMargin .divForCreate').load(url, function () {
|
|
$(".innerForm input").removeData("validator");
|
|
$(".innerForm input").removeData("unobtrusiveValidation");
|
|
$.validator.unobtrusive.parseDynamicContent('.innerForm');
|
|
$('#modalAdjustMargin').modal('show');
|
|
|
|
$(".datepicker").datepicker({
|
|
autoclose: true,
|
|
startDate: '@Constants.MIN_SELECTABLE_DATE', // SA. ENV-1235. Disable incorrect dates input
|
|
endDate: '@Constants.MAX_SELECTABLE_DATE' // SA. ENV-1235. Disable incorrect dates input
|
|
});
|
|
});
|
|
}
|
|
|
|
// TODO: remove it
|
|
function saveMarginConfirmed() {
|
|
if (!changesMade || confirm('@EnVisage.Code.Constants.CONFIRM_EDIT_SCENARIO')) {
|
|
blockUI();
|
|
$(window).off('beforeunload');
|
|
}
|
|
else
|
|
return false;
|
|
$('#saveLoader').show();
|
|
$('#saveButton').addClass('disabled');
|
|
var data = $('#adjustMarginForm').serialize();
|
|
var url = '@Url.Action("AdjustMargin", "Scenarios")';
|
|
$.post(url, data, function (responseData) {
|
|
unblockUI();
|
|
if (responseData != null) {
|
|
$('#saveLoader').hide();
|
|
$('#saveButton').removeClass('disabled');
|
|
if (responseData.Status == 'Ok') {
|
|
$('#modalAdjustMargin').modal('hide');
|
|
setTimeout(function () { window.location.href = window.location.href; }, 500);
|
|
} else if (responseData.Status == undefined) {
|
|
$('#modalAdjustMargin .divForCreate').html(responseData);
|
|
setupUnload();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function isValid() {
|
|
return $('#scenario-header').valid();
|
|
}
|
|
|
|
function showDetailsGraph() {
|
|
var scope = angular.element(document.getElementById('controller-details-grid')).scope();
|
|
setTimeout(scope.showGraph, 300);
|
|
}
|
|
</script>
|
|
}
|
|
<div ng-app="app">
|
|
<div id="erorMsgPlaceholder"></div>
|
|
<div class="tab-content tab-content-bordered" id="scenario-details-container" ng-controller="scenarioHeaderController" ng-init="init(@json)">
|
|
<ul id="uidemo-tabs-default-demo" class="nav nav-tabs">
|
|
<li ng-class="getTabClass('general')">
|
|
<a href="#general" data-toggle="tab" ng-disabled="headerWasConfirmed()">Scenario Header<span class="badge badge-primary"></span></a>
|
|
</li>
|
|
<li ng-class="getTabClass('scenarios')">
|
|
<a href="#scenarios" data-toggle="tab" ng-disabled="canBeSaved() && !headerWasConfirmed()" onclick="showDetailsGraph();">Scenario Details<span class="badge badge-primary"></span></a>
|
|
</li>
|
|
<li ng-class="getTabClass('rateTable')">
|
|
<a href="#rateTable" data-toggle="tab" ng-disabled="canBeSaved()">Rates<span class="badge badge-primary"></span></a>
|
|
</li>
|
|
<li ng-class="getTabClass('notes')">
|
|
<a href="#notes" data-toggle="tab" ng-disabled="canBeSaved()">Notes<span class="badge badge-primary"></span></a>
|
|
</li>
|
|
</ul>
|
|
<div class="tab-pane fade @(string.IsNullOrEmpty(Model.ActiveTab) || Model.ActiveTab == "general" ? "in active" : string.Empty)" id="general">
|
|
<form style="border:0;" id="scenario-header" editable-form>
|
|
@Html.HiddenFor(t => t.Id)
|
|
@Html.HiddenFor(t => t.ParentId)
|
|
@Html.HiddenFor(t => t.BackUrl)
|
|
@Html.HiddenFor(t => t.BackName)
|
|
<div class="panel-body" style="border: 0;" id="headerController">
|
|
<fieldset id="fsHead" class="form-group-margin">
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<span class="text-bold text-lg">Scenario Information</span>
|
|
@Html.CheckBoxFor(model => model.IsActiveScenario, new { @class = "form-control", @ng_model = "changedData.isActiveScenario", @ng_change = "modelChanged()" })
|
|
<hr />
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(model => model.ProjectName, new { @class = "control-label" })
|
|
@Html.TextBoxFor(model => model.ProjectName, new { @class = "form-control", @disabled = "disabled" })
|
|
</div>
|
|
</div>
|
|
@if (!string.IsNullOrWhiteSpace(Model.PartName))
|
|
{
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(model => model.PartName, new { @class = "control-label" })
|
|
@Html.TextBoxFor(model => model.PartName, new { @class = "form-control", @disabled = "disabled" })
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(model => model.Name, new { @class = "control-label" })
|
|
@Html.TextBoxFor(model => model.Name, new { @class = "form-control", @ng_model = "changedData.name", @ng_change = "modelChanged()" })
|
|
@Html.ValidationMessageFor(model => model.Name)
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
<label class="control-label">Scenario Dates</label>
|
|
@* env-716 start *@
|
|
<div class="date-range-wrapper">
|
|
<div class="input-daterange input-group date floatdaterange" id="bs-scenario-details-datepicker-rangeStart">
|
|
@Html.TextBoxFor(x => x.StartDate, "{0:MM/dd/yyyy}", new { @class = "form-control", @ng_model = "changedData.startDate", @ng_change = string.Format("refreshDuration('{0}')", Url.Action("CalculateScenarioDuration", "Scenarios")) })
|
|
</div>
|
|
<div class="pull-left floatdaterange-addon">To</div>
|
|
<div class="input-daterange input-group date floatdaterange" id="bs-scenario-details-datepicker-rangeEnd">
|
|
@Html.TextBoxFor(x => x.EndDate, "{0:MM/dd/yyyy}", new { @class = "form-control", @ng_model = "changedData.endDate", @ng_change = string.Format("refreshDuration('{0}')", Url.Action("CalculateScenarioDuration", "Scenarios")) })
|
|
</div>
|
|
</div>
|
|
@* <div class="input-daterange input-group" id="bs-scenario-details-datepicker-range">
|
|
@Html.TextBoxFor(x => x.StartDate, "{0:MM/dd/yyyy}", new { @class = "form-control", @ng_model = "changedData.startDate", @ng_change = string.Format("refreshDuration('{0}')", Url.Action("CalculateScenarioDuration", "Scenarios")) })
|
|
<span class="input-group-addon">to</span>
|
|
@Html.TextBoxFor(x => x.EndDate, "{0:MM/dd/yyyy}", new { @class = "form-control", @ng_model = "changedData.endDate", @ng_change = string.Format("refreshDuration('{0}')", Url.Action("CalculateScenarioDuration", "Scenarios")) })
|
|
</div>
|
|
env-716 end *@
|
|
@Html.ValidationMessageFor(model => model.StartDate)
|
|
@Html.ValidationMessageFor(model => model.EndDate)
|
|
@if (Model.ProjectDeadline.HasValue)
|
|
{
|
|
<i>(@Html.LabelFor(x => x.ProjectDeadline) @Html.DisplayFor(x => x.ProjectDeadline))</i>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.TemplateId, new { @class = "control-label" })
|
|
<select id="@Html.ClientIdFor(x=> x.TemplateId)"
|
|
name="@System.Web.Mvc.Html.NameExtensions.NameFor(Html, x=> x.TemplateId)"
|
|
class="form-control forselect2" ng-model="changedData.templateId" ng-change="modelChanged()"
|
|
data-val="true" data-val-required="The Template field is required.">
|
|
@Utils.GetTemplates(Model.TemplateId)
|
|
</select>
|
|
@Html.ValidationMessageFor(x => x.TemplateId)
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.Duration, new { @class = "control-label" })
|
|
@Html.TextBoxFor(x => x.Duration, new { @disabled = "disabled", @class = "form-control", @ng_model = "changedData.duration" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<fieldset>
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<span class="text-bold text-lg">Financials</span>
|
|
<hr />
|
|
</div>
|
|
</div>
|
|
<div class="row" ng-show="isFinancialAdjusted()">
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.DateForStartOfChanges, new { @class = "control-label" })
|
|
@Html.EditorFor(x => x.DateForStartOfChanges, new { htmlAttributes = new { @class = "form-control date", @ng_model = "changedData.dateForStartOfChanges", @ng_change = "modelChanged()", @ng_disabled = "!isFinancialAdjusted()" } })
|
|
@Html.ValidationMessageFor(x => x.DateForStartOfChanges)
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<div class="form-group no-margin-hr">
|
|
@* Expenditures will be here *@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
@if (Model.IsRevenueGenerating)
|
|
{
|
|
<fieldset>
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<span class="text-bold text-bg">Revenue</span>
|
|
<hr />
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.ProjectedRevenue, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">$</span>
|
|
@Html.EditorFor(model => model.ProjectedRevenue, new { htmlAttributes = new { @class = "form-control", @ng_model = "changedData.revenue", @ng_change = "projectedRevenueChanged(changedData.revenue)", @ng_disabled = "!isFinancialAdjusted()" } })
|
|
</div>
|
|
<i ng-show="changedData.oldRevenue != changedData.revenue" ng-cloak>
|
|
(<label>Currently: </label>${{changedData.oldRevenue}})
|
|
</i>
|
|
@Html.ValidationMessageFor(model => model.ProjectedRevenue)
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.RevenueAfterCost, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">$</span>
|
|
@Html.TextBoxFor(x => x.RevenueAfterCost, "{0:0}", new { @disabled = "disabled", @class = "form-control" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.ActualRevenueAfterCost, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">$</span>
|
|
@Html.TextBoxFor(x => x.ActualRevenueAfterCost, "{0:0}", new { @disabled = "disabled", @class = "form-control" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
<label class="control-label">Projected Margin</label>
|
|
<div class="input-group">
|
|
<span class="input-group-addon">%</span>
|
|
@Html.TextBoxFor(x => x.GrossMargin, new { @class = "form-control", @ng_model = "changedData.grossMargin", @ng_change = "marginChanged(changedData.grossMargin)", @ng_disabled = "!isFinancialAdjusted()", @ng_show = "!changedData.useLMMargin" })
|
|
@Html.TextBoxFor(x => x.LMMargin, new { @class = "form-control", @ng_model = "changedData.lmMargin", @ng_change = "marginChanged(changedData.lmMargin)", @ng_disabled = "!isFinancialAdjusted()", @ng_show = "changedData.useLMMargin" })
|
|
<span class="input-group-addon" style="padding-top: 3px; padding-bottom: 1px;" ng-show="isFinancialAdjusted()">
|
|
@Html.CheckBoxFor(x => x.UseLMMargin, new { @class = "form-control", @ng_model = "changedData.useLMMargin", @ng_change = "marginTypeChanged(changedData.useLMMargin)" })
|
|
</span>
|
|
<span class="input-group-addon" ng-show="!isFinancialAdjusted()">
|
|
@(Model.UseLMMargin ? "L&M" : "Gross")
|
|
</span>
|
|
</div>
|
|
<i ng-show="!changedData.useLMMargin && changedData.oldGrossMargin != changedData.grossMargin" ng-cloak>
|
|
(<label>Currently: </label>{{changedData.oldGrossMargin}}%)
|
|
</i>
|
|
<i ng-show="changedData.useLMMargin && changedData.oldLMMargin != changedData.lmMargin" ng-cloak>
|
|
(<label>Currently: </label>{{changedData.oldLMMargin}}%)
|
|
</i>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
<label class="control-label">Calculated Margin</label>
|
|
<div class="input-group">
|
|
<span class="input-group-addon">%</span>
|
|
@Html.TextBoxFor(x => x.CalculatedGrossMargin, new { @class = "form-control", @disabled = "disabled", @ng_show = "!changedData.useLMMargin" })
|
|
@Html.TextBoxFor(x => x.CalculatedGrossMarginLM, new { @class = "form-control", @disabled = "disabled", @ng_show = "changedData.useLMMargin" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
<label class="control-label">Actual Margin</label>
|
|
<div class="input-group">
|
|
<span class="input-group-addon">%</span>
|
|
@Html.TextBoxFor(x => x.CalculatedGrossMarginActuals, new { @class = "form-control", @disabled = "disabled", @ng_show = "!changedData.useLMMargin" })
|
|
@Html.TextBoxFor(x => x.CalculatedGrossMarginLMActuals, new { @class = "form-control", @disabled = "disabled", @ng_show = "changedData.useLMMargin" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
}
|
|
<fieldset>
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<span class="text-bold text-bg">Expenses</span>
|
|
<hr />
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.TDDirectCosts, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">$</span>
|
|
@Html.TextBoxFor(model => model.TDDirectCosts, new { @class = "form-control", @ng_model = "changedData.expense", @ng_change = "modelChanged()", @ng_disabled = Model.IsRevenueGenerating ? "true" : "!isFinancialAdjusted()" })
|
|
</div>
|
|
<i ng-show="changedData.oldExpense != changedData.expense" ng-cloak>
|
|
(<label>Currently: </label>${{changedData.oldExpense}})
|
|
</i>
|
|
@Html.ValidationMessageFor(model => model.TDDirectCosts)
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.BUDirectCosts, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">$</span>
|
|
@Html.TextBoxFor(x => x.BUDirectCosts, new { @disabled = "disabled", @class = "form-control" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.ActualLabor, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">$</span>
|
|
@Html.TextBoxFor(x => x.ActualLabor, new { @disabled = "disabled", @class = "form-control" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.LaborMaterialsSplit, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">%</span>
|
|
@Html.TextBoxFor(model => model.LaborMaterialsSplit, new { @class = "form-control", @disabled = "disabled" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.ActualLaborMaterialsSplit, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">%</span>
|
|
@Html.TextBoxFor(x => x.ActualLaborMaterialsSplit, new { @disabled = "disabled", @class = "form-control" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-4">
|
|
<div class="form-group no-margin-hr">
|
|
@Html.LabelFor(x => x.ActualMaterials, new { @class = "control-label" })
|
|
<div class="input-group">
|
|
<span class="input-group-addon">$</span>
|
|
@Html.TextBoxFor(x => x.ActualMaterials, new { @disabled = "disabled", @class = "form-control" })
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<fieldset id="cost-saving">
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<span class="text-bold text-bg">Cost Savings</span>
|
|
<hr />
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
@Html.EditorFor(x => x.CostSaving)
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
<fieldset id="fin-info-chart">
|
|
<div class="row">
|
|
<div class="col-sm-12" data-section="fin-info-chart">
|
|
@Html.Partial("_finInfoChart")
|
|
</div>
|
|
</div>
|
|
</fieldset>
|
|
@Html.ValidationSummary(false, "The Scenario could not be saved due to the following errors:", new { id = "header-val-summary" })
|
|
<div class="form-group" style="margin-bottom: 0;">
|
|
<div class="col-sm-offset-3 col-sm-9">
|
|
@* SA. ENV-707. For the following line HREF and button title where corrected to use backUrl and backName parameters *@
|
|
<a class="btn btn-primary" href='@Model.BackUrl'><i class="fa fa-backward"></i> Back to @Model.BackName</a>
|
|
<button id="btnCopyTo" type="button" class="btn btn-warning lockable" data-toggle="modal" data-target="#copyTo">Copy</button>
|
|
<button type="button" class="btn btn-warning lockable" data-toggle="modal" data-target="#createTemplate">Create Template</button>
|
|
@*<a onclick="showAdjustMagrinModal('@Model.Id')" data-toggle="popover" data-placement="left" class="btn btn-info popover-warning popover-dark lockable"><i class="fa fa-adjust"></i> Adjust Margin</a>*@
|
|
<button type="button" class="btn btn-success lockable" id="btnAdjustFinancials" ng-disabled="!canAdjustFinancial()" ng-click="adjustFinancial()"><i class="fa fa-adjust"></i> Adjust Financials</button>
|
|
<button type="button" class="btn btn-success" id="btnsave" ng-disabled="!canBeSaved()" ng-click="recalculateCalendar()">
|
|
<i class=" fa fa-save"></i> Submit Changes
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="tab-pane @(Model.ActiveTab == "scenarios" ? "in active" : string.Empty)" id="scenarios" data-section="scenarioCalendar">
|
|
@{
|
|
var user = (new UsersCache()).Value.FirstOrDefault(x => x.Id == new Guid(User.Identity.GetID()));
|
|
var detailsModel = (new ScenarioDetailsCalendarModel(Model, user, ScenarioDetailsCalendarModel.ScenarioCalendarOpener.Details));
|
|
Html.RenderPartial("_scenarioCalendar", detailsModel);
|
|
}
|
|
</div>
|
|
<div class="tab-pane fade @(Model.ActiveTab == "rateTable" ? "in active" : string.Empty)" id="rateTable">
|
|
@Html.Partial("_rates", Model.RatesModel)
|
|
</div>
|
|
<div class="tab-pane fade @(Model.ActiveTab == "notes" ? "in active" : string.Empty)" id="notes">
|
|
@Html.Partial("_notes", Model.Id)
|
|
</div>
|
|
</div>
|
|
<div id="createTemplate" class="modal fade" tabindex="-2" role="dialog" style="display: none;" data-backdrop="static">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content" id="createTemplateModal">
|
|
@Html.Partial("_createTemplateModal", new ScenarioTemplateCreationModel(Model))
|
|
</div> <!-- / .modal-content -->
|
|
</div> <!-- / .modal-dialog -->
|
|
</div> <!-- /.modal -->
|
|
<!-- / Modal -->
|
|
|
|
<div id="modalAdjustMargin" class="modal fade" tabindex="-1" role="dialog" style="display: none;" data-backdrop="static">
|
|
<div class="modal-dialog divForCreate" style="width:900px;">
|
|
|
|
</div> <!-- / .modal-dialog -->
|
|
</div> <!-- / .modal -->
|
|
<!-- Modal -->
|
|
<div id="copyTo" class="modal fade" tabindex="-1" role="dialog" style="display: none;" data-backdrop="static">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content" id="copyToModal">
|
|
@Html.Partial("_copyToModal", new ScenarioCopyModel()
|
|
{
|
|
TargetProjectId = Model.ParentId,
|
|
ScenarioId = Model.Id,
|
|
TargetStatus = ScenarioStatus.Inactive,
|
|
hasCostSavings = Model.CostSaving.CostSavingStartDate.HasValue
|
|
})
|
|
</div> <!-- / .modal-content -->
|
|
</div> <!-- / .modal-dialog -->
|
|
</div> <!-- /.modal -->
|
|
</div> |