3.0.1.2 Requirements & tidy
This commit is contained in:
@@ -280,6 +280,19 @@ namespace Sarand.BusinessMgr.Web.Portal.App
|
||||
}
|
||||
/// <summary>Transaction filter properties.</summary>
|
||||
public TransactionData Transaction { get; } = new TransactionData();
|
||||
|
||||
// ProductionControl filter.
|
||||
public class ProductionControlData
|
||||
{
|
||||
public class FilterData
|
||||
{
|
||||
public uint PageNo { get; set; } = 1;
|
||||
public ushort PageLength { get; set; } = 200;
|
||||
}
|
||||
public FilterData Filter { get; } = new FilterData();
|
||||
}
|
||||
/// <summary>ProductionControl filter properties.</summary>
|
||||
public ProductionControlData ProductionControl { get; } = new ProductionControlData();
|
||||
}
|
||||
public UserProfileData Profile { get; protected set; } = new UserProfileData();
|
||||
|
||||
|
||||
@@ -410,6 +410,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
||||
SysId affilliateIdOwner = data.AffiliateIdOrganisation;
|
||||
Dictionary<String, SaTaxCode> taxCodes = Internals.GetTaxCodesEffectiveOn(DateTime.Today).ToDictionary(item => item.Code, item => item);
|
||||
SaTaxCode taxCodeDefault = taxCodes.Values.FirstOrDefault(item => item.Code.EqualsCI(Internals.GetDefaultTaxCode()));
|
||||
Dictionary<SaUomType, SaUnitMeasure> uomTypes = Internals.GetUnitsOfMeasure().ToDictionary(item => item.UnitType, item => item);
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Sales Orders.
|
||||
@@ -488,6 +489,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
||||
|
||||
SbmRequirement requirement = Internals.TransactionMgr.CreateRequirement(transactionData.Transaction.AssociationId, transactionData.Transaction.Id, Sbm.RequirementType.Detail);
|
||||
requirement.CommodityId = commodityData.Id;
|
||||
requirement.ProductCode = commodityData.Code;
|
||||
requirement.UomId = uomTypes.GetValueOrDefault(commodityData.SaleUnitType)?.Id;
|
||||
requirement.DescBrief = commodityData.Caption;
|
||||
requirement.Quantity = (decimal)(commodityData.Type == Sbm.CommodityType.Service ? 0.25 * SacsRandomHelper.GetInt32(2, 12) : SacsRandomHelper.GetInt32(1, 6));
|
||||
requirement.AmountUnit = commodityData.SalePrice;
|
||||
@@ -530,7 +533,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
||||
// Update transaction totals.
|
||||
Internals.TransactionMgr.RefreshTransactionTotals(transactionData.Transaction, requirements.Where(item => SysId.IsValid(item.Id)));
|
||||
if (!Internals.TransactionMgr.UpdateTransaction(transactionData.Transaction, DbUpdateInfo))
|
||||
SaLogger.Warn($"{SysUtil.Fn} Faield to update transaction. {Internals.TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update transaction. {Internals.TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+4
-4
@@ -133,8 +133,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Search { get; set; }
|
||||
public bool? Maintain { get; set; }
|
||||
public ushort? Search { get; set; }
|
||||
public ushort? Maintain { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// AssetCategory list.
|
||||
@@ -162,9 +162,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
responseData.Mode = new AjaxResponse_AssetCategoryList.ModeData();
|
||||
Model_AssetCategory.ViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_AssetCategory.ViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
responseData.Mode.Maintain = 1;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
responseData.Mode.Search = 1;
|
||||
|
||||
// Item filter.
|
||||
SbmAssetCategory.Params prmAssetCategory = new SbmAssetCategory.Params();
|
||||
|
||||
@@ -131,9 +131,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Search { get; set; }
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? AssetsForItem { get; set; }
|
||||
public ushort? Search { get; set; }
|
||||
public ushort? Maintain { get; set; }
|
||||
public ushort? AssetsForItem { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// Asset list.
|
||||
@@ -161,11 +161,11 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
responseData.Mode = new AjaxResponse_AssetList.ModeData();
|
||||
Model_Asset.ViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Asset.ViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
responseData.Mode.Maintain = 1;
|
||||
else if (viewMode == Model_Asset.ViewMode.AssetsForItem)
|
||||
responseData.Mode.AssetsForItem = true;
|
||||
responseData.Mode.AssetsForItem = 1;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
responseData.Mode.Search = 1;
|
||||
|
||||
// Item filter.
|
||||
SbmAsset.Params prmAsset = new SbmAsset.Params();
|
||||
|
||||
@@ -64,7 +64,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
private class AjaxResponse_CodeList : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_CodeList(SbmModel_Portal model) : base(model) { }
|
||||
public AjaxResponse_CodeList(SbmModel_Portal model, String messageTitle) : base(model, messageTitle) { }
|
||||
// Reference data.
|
||||
public List<ItemCodeDesc> CodeTypes { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||
@@ -81,7 +81,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
public IActionResult Ajax_GetCodeList(Model_Code model)
|
||||
{
|
||||
String messageTitle = Localiser["label.codes"];
|
||||
AjaxResponse_CodeList responseData = new AjaxResponse_CodeList(model);
|
||||
AjaxResponse_CodeList responseData = new AjaxResponse_CodeList(model, messageTitle);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
@@ -161,7 +161,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
private class AjaxResponse_Code : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_Code(SbmModel_Portal model) : base(model) { }
|
||||
public AjaxResponse_Code(SbmModel_Portal model, String messageTitle) : base(model, messageTitle) { }
|
||||
// Code details.
|
||||
public CodeItemData code { get; } = new CodeItemData();
|
||||
}
|
||||
@@ -172,7 +172,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
public IActionResult Ajax_GetCode(Model_Code model)
|
||||
{
|
||||
String messageTitle = Localiser["label.code"];
|
||||
AjaxResponse_Code responseData = new AjaxResponse_Code(model);
|
||||
AjaxResponse_Code responseData = new AjaxResponse_Code(model, messageTitle);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
@@ -222,7 +222,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
public IActionResult Ajax_StoreCode(Model_Code model)
|
||||
{
|
||||
String messageTitle = Localiser["label.code"];
|
||||
AjaxResponse_Code responseData = new AjaxResponse_Code(model);
|
||||
AjaxResponse_Code responseData = new AjaxResponse_Code(model, messageTitle);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
|
||||
@@ -23,12 +23,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
//-------------------------------------------------------------------
|
||||
// Definitions.
|
||||
|
||||
// CodeType data.
|
||||
// Code Type response data.
|
||||
private class CodeTypeListData : AjaxResponse_Data.ItemData_Base
|
||||
{
|
||||
public String Code { get; set; }
|
||||
public String Name { get; set; }
|
||||
public long? CodeCount { get; set; }
|
||||
public byte? CodeLength { get; set; }
|
||||
}
|
||||
private class CodeTypeItemData : CodeTypeListData
|
||||
{
|
||||
@@ -39,6 +40,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
data.Id = SysId.ToString(codeType.Id);
|
||||
data.Code = codeType.Code;
|
||||
data.Name = codeType.Name;
|
||||
if (codeType.MaxCodeLen > 0) data.CodeLength = codeType.MaxCodeLen;
|
||||
long codeCount = model.GetInternals().CodeTypeConsole.GetCodeTypeCountById(codeType.Id);
|
||||
if (codeCount > 0)
|
||||
data.CodeCount = codeCount;
|
||||
data.StatusCode = codeType.StatusCode;
|
||||
data.StatusDesc = codeType.StatusDesc;
|
||||
}
|
||||
@@ -50,14 +55,46 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
data.Notes = codeType.Notes;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Populate Code Types ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
// Populate response only used on error. Successful population returns Code Type list response.
|
||||
private class AjaxResponse_PopulateCodeType : AjaxResponse_CodeTypeList
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_PopulateCodeType(SbmModel_Portal model, String messageTitle) : base(model, messageTitle) { }
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("Codes/CodeType/Ajax/Populate")]
|
||||
public IActionResult Ajax_PopulateCodeTypes(Model_CodeType model)
|
||||
{
|
||||
String messageTitle = Localiser["caption.code.types"];
|
||||
AjaxResponse_CodeTypeList responseData = new AjaxResponse_CodeTypeList(model, messageTitle);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
RefreshModel(model);
|
||||
|
||||
// Populate Code Types.
|
||||
if (CodeTypeConsole.Populate(DbUpdateInfo))
|
||||
model.AddInfoMessage(Localiser["msg.items.populated"]);
|
||||
else
|
||||
model.AddWarningMessage(Localiser["msg.error.system"]);
|
||||
|
||||
// Return Code Type list.
|
||||
return Ajax_GetCodeTypeList(model);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get CodeType List ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_CodeTypeList : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_CodeTypeList(SbmModel_Portal model) : base(model) { }
|
||||
// CodeTYpe list.
|
||||
public AjaxResponse_CodeTypeList(SbmModel_Portal model, String messageTitle) : base(model, messageTitle) { }
|
||||
// Code Type list.
|
||||
public List<CodeTypeListData> CodeTypes { get; } = new List<CodeTypeListData>();
|
||||
// Reference data.
|
||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||
@@ -72,7 +109,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
public IActionResult Ajax_GetCodeTypeList(Model_CodeType model)
|
||||
{
|
||||
String messageTitle = Localiser["caption.code.types"];
|
||||
AjaxResponse_CodeTypeList responseData = new AjaxResponse_CodeTypeList(model);
|
||||
AjaxResponse_CodeTypeList responseData = new AjaxResponse_CodeTypeList(model, messageTitle);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
@@ -99,11 +136,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
ColumnDfn colId = CodeTypeConsole.GetCodeTypeColumnDfn(SaCodeType.Column.Id);
|
||||
ColumnDfn colCode = CodeTypeConsole.GetCodeTypeColumnDfn(SaCodeType.Column.Code);
|
||||
ColumnDfn colName = CodeTypeConsole.GetCodeTypeColumnDfn(SaCodeType.Column.Name);
|
||||
ColumnDfn colMaxCodeLen = CodeTypeConsole.GetCodeTypeColumnDfn(SaCodeType.Column.MaxCodeLen);
|
||||
ColumnDfn colCodeCount = CodeTypeConsole.GetCodeTypeColumnDfn(SaCodeType.Column.Codes_Count);
|
||||
ColumnDfn colStatus = CodeTypeConsole.GetCodeTypeColumnDfn(SaCodeType.Column.Status);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colCode, colName,
|
||||
colId, colCode, colName, colMaxCodeLen,
|
||||
colCodeCount, colStatus
|
||||
};
|
||||
prmCodeType.SortColumns.Add(colName);
|
||||
@@ -123,6 +161,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
StatusCode = values.GetString(colStatus.DataName),
|
||||
StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName))
|
||||
};
|
||||
byte maxCodeLen = (byte)values.GetLong(colMaxCodeLen.DataName);
|
||||
if (maxCodeLen > 0)
|
||||
codeTypeData.CodeLength = maxCodeLen;
|
||||
long codeCount = values.GetLong(colCodeCount.DataName);
|
||||
if (codeCount > 0)
|
||||
codeTypeData.CodeCount = codeCount;
|
||||
@@ -144,7 +185,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
private class AjaxResponse_CodeType : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_CodeType(SbmModel_Portal model) : base(model) { }
|
||||
public AjaxResponse_CodeType(SbmModel_Portal model, String messageTitle) : base(model, messageTitle) { }
|
||||
// CodeType details.
|
||||
public CodeTypeItemData codeType { get; } = new CodeTypeItemData();
|
||||
}
|
||||
@@ -155,7 +196,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
public IActionResult Ajax_GetCodeType(Model_CodeType model)
|
||||
{
|
||||
String messageTitle = Localiser["caption.code.type"];
|
||||
AjaxResponse_CodeType responseData = new AjaxResponse_CodeType(model);
|
||||
AjaxResponse_CodeType responseData = new AjaxResponse_CodeType(model, messageTitle);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
@@ -196,7 +237,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Codes
|
||||
public IActionResult Ajax_StoreCodeType(Model_CodeType model)
|
||||
{
|
||||
String messageTitle = Localiser["caption.code.type"];
|
||||
AjaxResponse_CodeType responseData = new AjaxResponse_CodeType(model);
|
||||
AjaxResponse_CodeType responseData = new AjaxResponse_CodeType(model, messageTitle);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidReferer) return Forbid();
|
||||
|
||||
+8
-8
@@ -205,10 +205,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Search { get; set; }
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? StockControl { get; set; }
|
||||
public bool? StockTake { get; set; }
|
||||
public ushort? Search { get; set; }
|
||||
public ushort? Maintain { get; set; }
|
||||
public ushort? StockControl { get; set; }
|
||||
public ushort? StockTake { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// Commodity list.
|
||||
@@ -235,13 +235,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Commodities
|
||||
responseData.Mode = new AjaxResponse_CommodityList.ModeData();
|
||||
Model_Commodity.ViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Commodity.ViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
responseData.Mode.Maintain = 1;
|
||||
else if (viewMode == Model_Commodity.ViewMode.StockControl)
|
||||
responseData.Mode.StockControl = true;
|
||||
responseData.Mode.StockControl = 1;
|
||||
else if (viewMode == Model_Commodity.ViewMode.StockTake)
|
||||
responseData.Mode.StockTake = true;
|
||||
responseData.Mode.StockTake = 1;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
responseData.Mode.Search = 1;
|
||||
|
||||
// Item filter.
|
||||
SbmCommodity.Params prmCommodity = new SbmCommodity.Params();
|
||||
|
||||
+8
-8
@@ -161,10 +161,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Search { get; set; }
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? Relationships { get; set; }
|
||||
public bool? PriceSet { get; set; }
|
||||
public ushort? Search { get; set; }
|
||||
public ushort? Maintain { get; set; }
|
||||
public ushort? Relationships { get; set; }
|
||||
public ushort? PriceSet { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// Association list.
|
||||
@@ -191,13 +191,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
responseData.Mode = new AjaxResponse_AssociationList.ModeData();
|
||||
Model_Association.ViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Association.ViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
responseData.Mode.Maintain = 1;
|
||||
else if (viewMode == Model_Association.ViewMode.Relationships)
|
||||
responseData.Mode.Relationships = true;
|
||||
responseData.Mode.Relationships = 1;
|
||||
else if (viewMode == Model_Association.ViewMode.PriceSet)
|
||||
responseData.Mode.PriceSet = true;
|
||||
responseData.Mode.PriceSet = 1;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
responseData.Mode.Search = 1;
|
||||
|
||||
// Item filter.
|
||||
SbmAssociation.Params prmAssociation = new SbmAssociation.Params();
|
||||
|
||||
@@ -54,9 +54,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
// Association page.
|
||||
Model_Association model = new Model_Association(Localiser);
|
||||
RefreshModel(model);
|
||||
if (Request.Path.Value.MatchCI("/Customers/?$"))
|
||||
if (Request.Path.Value.IsMatchCI("/Customers/?$"))
|
||||
model.Filter.AssociationType = Internals.AssociationTypeCodes.GetCodeForType(Sbm.AssociationType.Customer);
|
||||
else if (Request.Path.Value.MatchCI("/Suppliers/?$"))
|
||||
else if (Request.Path.Value.IsMatchCI("/Suppliers/?$"))
|
||||
model.Filter.AssociationType = Internals.AssociationTypeCodes.GetCodeForType(Sbm.AssociationType.Supplier);
|
||||
model.PopulateListConfig();
|
||||
model.Paging.PageNo = SessionData_Portal.Profile.Association.Filter.PageNo;
|
||||
|
||||
@@ -190,8 +190,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? Search { get; set; }
|
||||
public ushort? Maintain { get; set; }
|
||||
public ushort? Search { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// Affiliate list.
|
||||
@@ -218,13 +218,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Contacts
|
||||
responseData.Mode = new AjaxResponse_ContactList.ModeData();
|
||||
Model_Contact.ViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Contact.ViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
responseData.Mode.Maintain = 1;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
responseData.Mode.Search = 1;
|
||||
|
||||
// Item filter.
|
||||
SbmAffiliate.Params prmAffiliate = new SbmAffiliate.Params();
|
||||
prmAffiliate.Search = model.Filter.Search;
|
||||
prmAffiliate.AssociationTypeExclude = model.GetFilterAssociationTypeExclude();
|
||||
prmAffiliate.AffiliateType = model.GetFilterContactType();
|
||||
if (prmAffiliate.AffiliateType == Sbm.AffiliateType.Any && viewMode == Model_Contact.ViewMode.Search)
|
||||
prmAffiliate.AffiliateType = Sbm.AffiliateType.AnyContact;
|
||||
|
||||
+602
@@ -0,0 +1,602 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Contacts;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Requirements;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.ReferenceData;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Transactions;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Requirements
|
||||
{
|
||||
//=======================================================================
|
||||
// Portal Requirement Controller - Ajax actions.
|
||||
//=======================================================================
|
||||
partial class RequirementController
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Item data.
|
||||
private class RequirementListData : AjaxResponse_Data.ItemData_Base
|
||||
{
|
||||
// Field values.
|
||||
public AjaxResponse_Data.FieldValuesData Field { get; } = new AjaxResponse_Data.FieldValuesData();
|
||||
}
|
||||
private enum RequirementDataGroup
|
||||
{
|
||||
Core, Costing
|
||||
}
|
||||
private class RequirementItemData : RequirementListData
|
||||
{
|
||||
// Affiliate properties with specific handling.
|
||||
}
|
||||
private void PopulateRequirementResponseListData(SbmModel_Portal model, SbmTransaction transaction, SbmRequirement requirement, RequirementListData data)
|
||||
{
|
||||
data.Id = SysId.ToString(requirement.Id);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.Id}", $"{SysId.ToLong(requirement.Id)}");
|
||||
// Status dates for list refresh.
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.RequiredFmt}", model.FormatDateForDisplay(requirement.Required));
|
||||
}
|
||||
private void PopulateRequirementResponseItemData(SbmModel_Portal model, SbmTransaction transaction, SbmRequirement requirement, RequirementItemData data, HashSet<RequirementDataGroup> dataGroups = null)
|
||||
{
|
||||
PopulateRequirementResponseListData(model, transaction, requirement, data as RequirementListData);
|
||||
// Requirement properties.
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.TransactionId}", $"{SysId.ToLong(requirement.TransactionId)}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.Type}", Internals.RequirementTypeCodes.GetDescForType(requirement.RequirementType));
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.Sequence}", $"{requirement.Seq}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.JobNumber}", requirement.JobNumber);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.Required}", model.FormatDateForForm(requirement.Required));
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.DescBrief}", requirement.DescBrief);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.CommodityId}", $"{SysId.ToLong(requirement.CommodityId)}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.ProductCode}", requirement.ProductCode);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.Quantity}", $"{requirement.Quantity}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.QuantityProd}", $"{requirement.QuantityProd}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.UomId}", $"{SysId.ToLong(requirement.UomId)}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.MaterialSourceCode}", requirement.MaterialSourceCode);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.PromotionCode}", requirement.PromotionCode);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.LocationIdStock}", $"{SysId.ToLong(requirement.LocationIdStock)}");
|
||||
// Amounts.
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.AmountUnit}", $"{requirement.AmountUnit}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.AmountAct}", $"{requirement.AmountAct}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.AmountDisc}", $"{requirement.AmountDisc}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.AmountNet}", $"{requirement.AmountNet}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.TaxCode}", Internals.GetTaxCodeById(requirement.TaxCodeId)?.Code);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.TaxCodeId}", $"{SysId.ToLong(requirement.TaxCodeId)}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.TaxRate}", $"{Internals.GetTaxCodeById(requirement.TaxCodeId)?.TaxRate}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.AmountTax}", $"{requirement.AmountTax}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.AmountTot}", $"{requirement.AmountTot}");
|
||||
// Times.
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.TimeEst}", $"{requirement.TimeEst}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.TimeAct}", $"{requirement.TimeAct}");
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.TimeTot}", $"{requirement.TimeTot}");
|
||||
if (dataGroups != null && dataGroups.Contains(RequirementDataGroup.Core))
|
||||
{
|
||||
// Core.
|
||||
}
|
||||
if (dataGroups != null && dataGroups.Contains(RequirementDataGroup.Costing))
|
||||
{
|
||||
// Costing.
|
||||
// CostLabourHours
|
||||
// CostLabourRateHour
|
||||
// CostLabour
|
||||
// CostCommodity
|
||||
// CostPurchase
|
||||
// CostProcess
|
||||
// CostAdditional
|
||||
// CostTotal
|
||||
// CostCalculated
|
||||
// CostPercentMargin
|
||||
}
|
||||
// Common properties.
|
||||
data.StatusCode = requirement.StatusCode;
|
||||
data.StatusDesc = requirement.StatusDesc;
|
||||
data.Field.Value.Add($"{Model_Contact.ItemField.Status}", requirement.StatusDesc);
|
||||
// Cleanse field values.
|
||||
data.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
|
||||
// Populate item list values that might be cleared during update after removing blank values to ensure that blank values are published.
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.Notes}", requirement.Notes);
|
||||
data.Field.Value.Add($"{Model_Requirement.ItemField.UpdatedOn}", model.FormatDateForForm(requirement.UpdateStamp.On));
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Requirement configuration.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_RequirementConfig : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_RequirementConfig(SbmModel_Portal model) : base(model) { }
|
||||
// Configuration data - object copied directly to env.datain script.
|
||||
public class ConfigData
|
||||
{
|
||||
// Configurations.
|
||||
public Model_Requirement.ListConfigData CfgList { get; } = new Model_Requirement.ListConfigData();
|
||||
public Model_Requirement.ItemConfigData CfgItemNew { get; } = new Model_Requirement.ItemConfigData();
|
||||
// Reference data.
|
||||
public List<ItemCodeDesc> RequirementTypes { get; } = new List<ItemCodeDesc>();
|
||||
public List<TaxCode> TaxCodes { get; } = new List<TaxCode>();
|
||||
public String taxCodeDefault { get; set; }
|
||||
public List<ItemCodeDesc> UomCats { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> UomTypes { get; } = new List<ItemCodeDesc>();
|
||||
public String uomTypeDefault { get; set; }
|
||||
public List<UomData> Uoms { get; set; } = new List<UomData>();
|
||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||
public String DefaultStatusCode { get; set; }
|
||||
}
|
||||
public ConfigData Data { get; set; } = new ConfigData();
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
[Route("Requirement/Ajax/Config")]
|
||||
[Route("Requirement/Ajax/GetConfig")]
|
||||
public IActionResult Ajax_RequirementConfig(Model_Requirement model)
|
||||
{
|
||||
AjaxResponse_RequirementConfig responseData = new AjaxResponse_RequirementConfig(model);
|
||||
String messageTitle = Localiser["label.requirements"];
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
|
||||
// Populate configuration data.
|
||||
PopulateRequirementConfig(model, responseData);
|
||||
|
||||
// Complete response.
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
private void PopulateRequirementConfig(Model_Requirement model, AjaxResponse_RequirementConfig responseData)
|
||||
{
|
||||
// Configuration.
|
||||
model.PopulateListConfig(responseData.Data.CfgList);
|
||||
model.PopulateItemConfig(responseData.Data.CfgItemNew, null, model.GetFilterTransactionType(), SbmTransaction.StatusCat.Pending, Sbm.RequirementType.Unknown);
|
||||
|
||||
// Reference data - requirement types.
|
||||
foreach (TypeCodeDesc requirementType in GetSystemCodes(Sbm.SystemCode.RequirementType))
|
||||
responseData.Data.RequirementTypes.Add(new AjaxResponse_Data.ItemCodeDesc(requirementType.Code, requirementType.Desc));
|
||||
|
||||
// Tax codes.
|
||||
DateTime taxEffectiveOn = DateTime.Today;
|
||||
responseData.Data.TaxCodes.AddRange(Internals.GetTaxCodesEffectiveOn(taxEffectiveOn).Select(tax => new AjaxResponse_Data.TaxCode() { Id = $"{SysId.ToLong(tax.Id)}", Code = tax.Code, Caption = tax.GetCaption(), Rate = tax.TaxRate }));
|
||||
responseData.Data.taxCodeDefault = Internals.GetDefaultTaxCode();
|
||||
|
||||
// Units of measure.
|
||||
List<TypeCodeDesc> uomCategories = SbmSystem.GetSystemCodes(Sbm.SystemCode.UnitMeasureCategory);
|
||||
List<TypeCodeDesc> uomTypes = SbmSystem.GetSystemCodes(Sbm.SystemCode.UnitMeasureType);
|
||||
responseData.Data.UomCats.AddRange(uomCategories.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Desc)));
|
||||
responseData.Data.UomTypes.AddRange(uomTypes.Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Desc)));
|
||||
foreach (SaUnitMeasure uom in Internals.GetUnitsOfMeasure())
|
||||
{
|
||||
responseData.Data.Uoms.Add(new AjaxResponse_Data.UomData()
|
||||
{
|
||||
Id = $"{SysId.ToLong(uom.Id)}",
|
||||
Category = uomCategories.GetCodeForType(uom.Category),
|
||||
Type = uomTypes.GetCodeForType(uom.UnitType),
|
||||
Caption = uom.GetCaption()
|
||||
});
|
||||
}
|
||||
responseData.Data.uomTypeDefault = uomTypes.GetCodeForType(Internals.GetDefaultUomType());
|
||||
|
||||
// Reference data - statuses.
|
||||
foreach (SaStatus status in SbmRequirement.ValidStatuses.Where(item => item != SaStatus.Deleted))
|
||||
responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
responseData.Data.DefaultStatusCode = SacsSystem.GetStatusCode(SbmRequirement.DefaultStatus);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Requirement list.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_RequirementList : AjaxResponse_RequirementConfig
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_RequirementList(SbmModel_Portal model) : base(model) { }
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public ushort? Search { get; set; }
|
||||
public ushort? Maintain { get; set; }
|
||||
public ushort? ProductionControl { get; set; }
|
||||
public ushort? CommodityHistory_Maintain { get; set; }
|
||||
public ushort? AssetOrders_Maintain { get; set; }
|
||||
public ushort? CommodityHistory_ReadOnly { get; set; }
|
||||
public ushort? AssetOrders_ReadOnly { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// Requirement list.
|
||||
public List<RequirementListData> Requirements { get; } = new List<RequirementListData>();
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
[Route("Requirement/Ajax/List")]
|
||||
[Route("Requirement/Ajax/GetList")]
|
||||
public IActionResult Ajax_RequirementList(Model_Requirement model)
|
||||
{
|
||||
AjaxResponse_RequirementList responseData = new AjaxResponse_RequirementList(model);
|
||||
String messageTitle = Localiser["label.requirements"];
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
|
||||
// Populate configuration data.
|
||||
PopulateRequirementConfig(model, responseData);
|
||||
|
||||
// View mode.
|
||||
responseData.Mode = new AjaxResponse_RequirementList.ModeData();
|
||||
Model_Requirement.ViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Requirement.ViewMode.Maintain)
|
||||
responseData.Mode.Maintain = 1;
|
||||
else if (viewMode == Model_Requirement.ViewMode.ProductionControl)
|
||||
responseData.Mode.ProductionControl = 1;
|
||||
else if (viewMode == Model_Requirement.ViewMode.CommodityHistory_Maintain)
|
||||
responseData.Mode.CommodityHistory_Maintain = 1;
|
||||
else if (viewMode == Model_Requirement.ViewMode.AssetOrders_Maintain)
|
||||
responseData.Mode.AssetOrders_Maintain = 1;
|
||||
else if (viewMode == Model_Requirement.ViewMode.CommodityHistory_ReadOnly)
|
||||
responseData.Mode.CommodityHistory_ReadOnly = 1;
|
||||
else if (viewMode == Model_Requirement.ViewMode.AssetOrders_ReadOnly)
|
||||
responseData.Mode.AssetOrders_ReadOnly = 1;
|
||||
else
|
||||
responseData.Mode.Search = 1;
|
||||
|
||||
// Item filter.
|
||||
SbmRequirement.Params prmRequirement = new SbmRequirement.Params();
|
||||
prmRequirement.TransactionIdsIncluded.AddId(model.GetFilterTransactionId());
|
||||
prmRequirement.Search = model.Filter.Search;
|
||||
if (model.GetFilterRequirementStatusCat() > 0)
|
||||
prmRequirement.StatusCat = model.GetFilterRequirementStatusCat();
|
||||
else prmRequirement.StatusCat = SbmRequirement.StatusCat.NotDeleted;
|
||||
if (viewMode == Model_Requirement.ViewMode.ProductionControl)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
prmRequirement.SortColumns.Add(TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.TransId));
|
||||
prmRequirement.SortColumns.Add(TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Sequence));
|
||||
}
|
||||
model.Paging.ItemTotal = (ulong)TransactionMgr.GetRequirementCount(prmRequirement);
|
||||
model.PopulatePagingTo(prmRequirement.ResultsPaging);
|
||||
|
||||
// Item columns.
|
||||
ColumnDfn colId = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Id);
|
||||
ColumnDfn colTransType = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Trans_Type);
|
||||
ColumnDfn colTransRef = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Trans_Ref);
|
||||
ColumnDfn colType = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Type);
|
||||
ColumnDfn colSequence = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Sequence);
|
||||
ColumnDfn colJobNumber = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.JobNumber);
|
||||
ColumnDfn colProductCode = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.ProductCode);
|
||||
ColumnDfn colDescBrief = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.DescBrief);
|
||||
ColumnDfn colRequiredOn = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Required);
|
||||
ColumnDfn colQuantity = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Quantity);
|
||||
ColumnDfn colAmountUnit = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.AmountUnit);
|
||||
ColumnDfn colAmountNet = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.AmountNet);
|
||||
ColumnDfn colAmountTax = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.AmountTax);
|
||||
ColumnDfn colAmountTot = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.AmountTot);
|
||||
ColumnDfn colNotes = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Notes);
|
||||
ColumnDfn colStatus = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.Status);
|
||||
ColumnDfn colCreatedOn = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.CreateOn_Date);
|
||||
ColumnDfn colUpdatedOn = TransactionMgr.GetRequirementColumnDfn(SbmRequirement.Column.UpdateOn_Date);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colTransType, colTransRef, colType, colSequence, colJobNumber,
|
||||
colProductCode, colDescBrief, colQuantity, colRequiredOn,
|
||||
colNotes, colStatus, colCreatedOn, colUpdatedOn
|
||||
};
|
||||
if (model.UserCanViewFinancials())
|
||||
columns.AddRange(new[] { colAmountUnit, colAmountNet, colAmountTax, colAmountTot });
|
||||
|
||||
// Query items.
|
||||
using (DbResultSet resultSet = TransactionMgr.ExecuteRequirementQuery(columns, prmRequirement))
|
||||
{
|
||||
while (resultSet != null && resultSet.HasRows && resultSet.NextRecord())
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
Sbm.TransactionType transactionType = (Sbm.TransactionType)values.GetLong(colTransType.DataName);
|
||||
Sbm.RequirementType requirementType = (Sbm.RequirementType)values.GetLong(colType.DataName);
|
||||
RequirementListData requirementData = new RequirementListData()
|
||||
{
|
||||
Id = values.GetString(colId.DataName),
|
||||
StatusCode = values.GetString(colStatus.DataName),
|
||||
};
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.Sequence}", values.GetString(colSequence.DataName));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.TransactionType}", Internals.TransactionTypeCodes.GetDescForType(transactionType));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.TransactionRef}", values.GetString(colTransRef.DataName));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.Type}", Internals.RequirementTypeCodes.GetDescForType(transactionType));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.ProductCode}", values.GetString(colProductCode.DataName));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.DescBrief}", values.GetString(colDescBrief.DataName));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.RequiredFmt}", model.FormatDateForDisplay(values.GetDate(colRequiredOn.DataName)));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.Quantity}", colQuantity.FormatValue(values));
|
||||
// Status dates.
|
||||
if (model.UserCanViewFinancials())
|
||||
{
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.AmountUnit}", colAmountUnit.FormatValue(values));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.AmountNet}", colAmountNet.FormatValue(values));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.AmountTax}", colAmountTax.FormatValue(values));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.AmountTot}", colAmountTot.FormatValue(values));
|
||||
}
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.Notes}", TransactionMgr.GetRequirementDataValue(colNotes, values).ToString());
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.Status}", SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.CreatedOn}", Localiser.FormatDate(values.GetDate(colCreatedOn.DataName)));
|
||||
requirementData.Field.Value.Add($"{Model_Requirement.ItemField.UpdatedOn}", Localiser.FormatDate(values.GetDate(colUpdatedOn.DataName)));
|
||||
// Cleanse item values.
|
||||
requirementData.Field.Value.RemoveAll(item => StringUtil.IsBlank(item.Value));
|
||||
responseData.Requirements.Add(requirementData);
|
||||
}
|
||||
}
|
||||
|
||||
// Refresh paging info.
|
||||
if (model.Paging.IsPaged)
|
||||
model.Paging.ItemCount = (ushort)responseData.Requirements.Count;
|
||||
if (viewMode == Model_Requirement.ViewMode.ProductionControl)
|
||||
{
|
||||
SessionData_Portal.Profile.ProductionControl.Filter.PageNo = model.Paging.PageNo;
|
||||
SessionData_Portal.Profile.ProductionControl.Filter.PageLength = model.Paging.PageLength;
|
||||
}
|
||||
responseData.SetPaging(model);
|
||||
|
||||
// Complete response.
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Get Requirement ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_Requirement : AjaxResponse_Data
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_Requirement(SbmModel_Portal model) : base(model) { }
|
||||
// Configuration.
|
||||
public Model_Requirement.ItemConfigData Config { get; } = new Model_Requirement.ItemConfigData();
|
||||
// Requirement details.
|
||||
public RequirementItemData requirement { get; } = new RequirementItemData();
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("Requirement/Ajax/Item")]
|
||||
[Route("Requirement/Ajax/GetItem")]
|
||||
public IActionResult Ajax_GetItem(Model_Requirement model)
|
||||
{
|
||||
String messageTitle = Localiser["label.requirement"];
|
||||
AjaxResponse_Requirement responseData = new AjaxResponse_Requirement(model);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
|
||||
// Identify item.
|
||||
SysId requirementId = SysId.ToSysId(model.Requirement.Id);
|
||||
if (!SysId.IsValid(requirementId))
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.specified"]));
|
||||
|
||||
// Retrieve item.
|
||||
SbmRequirement requirement = TransactionMgr.GetRequirementById(requirementId);
|
||||
if (requirement == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve requirement for Id: '{model.Requirement.Id}'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
||||
}
|
||||
|
||||
// Transaction.
|
||||
SbmTransaction transaction = TransactionMgr.GetTransactionById(requirement.TransactionId);
|
||||
if (transaction == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve transaction for Id: '{requirement.TransactionId}'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Construct response.
|
||||
model.PopulateItemConfig(responseData.Config, transaction, requirement);
|
||||
PopulateRequirementResponseItemData(model, transaction, requirement, responseData.requirement);
|
||||
|
||||
// Complete response.
|
||||
responseData.Success = true;
|
||||
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Store Requirement ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
private class AjaxResponse_StoreRequirement : AjaxResponse_Requirement
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_StoreRequirement(SbmModel_Portal model) : base(model) { }
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("Requirement/Ajax/Store")]
|
||||
[Route("Requirement/Ajax/StoreItem")]
|
||||
public IActionResult Ajax_StoreItem(Model_Requirement model)
|
||||
{
|
||||
String messageTitle = Localiser["label.requirement"];
|
||||
AjaxResponse_StoreRequirement responseData = new AjaxResponse_StoreRequirement(model);
|
||||
|
||||
// Validate session and referrer.
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
|
||||
// Validate item properties.
|
||||
model.ValidateRequirementData(responseData);
|
||||
if (responseData.HasControlErrors())
|
||||
return Json(responseData);
|
||||
|
||||
// Validate item Id against 'Exists' flag.
|
||||
SysId requirementId = SysId.ToSysId(model.Requirement.Id);
|
||||
bool requirementExists = StringUtil.ToBool(model.Requirement.Exists);
|
||||
if (requirementExists && !SysId.IsValid(requirementId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Id not specified for existing Requirement.");
|
||||
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
if (!requirementExists && SysId.IsValid(requirementId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Id specified for new Requirement: '{model.Requirement.Id}'");
|
||||
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Retrieve existing item.
|
||||
SbmRequirement requirement = TransactionMgr.GetRequirementById(requirementId);
|
||||
if (requirement == null && SysId.IsValid(requirementId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve transaction for Id: '{model.Requirement.Id}'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
||||
}
|
||||
|
||||
// Transaction.
|
||||
SbmTransaction transaction = null;
|
||||
if (requirement != null)
|
||||
{
|
||||
transaction = TransactionMgr.GetTransactionById(requirement.TransactionId);
|
||||
if (transaction == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve transaction for Id: '{requirement.TransactionId}'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
}
|
||||
|
||||
// Create new item if required.
|
||||
if (requirement == null)
|
||||
{
|
||||
// Transaction.
|
||||
SysId transactionId = SysId.ToSysId(model.Requirement.TransactionId);
|
||||
if (!SysId.IsValid(transactionId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Transaction not specified for new Requirement.");
|
||||
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
transaction = TransactionMgr.GetTransactionById(requirement.TransactionId);
|
||||
if (transaction == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve transaction for Id: '{transactionId}'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
|
||||
// Create Requirement.
|
||||
requirement = TransactionMgr.CreateRequirement(transaction.AssociationId, transaction.Id, model.GetRequirementType());
|
||||
if (requirement == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to create Requirement. {TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
}
|
||||
|
||||
// Populate item properties.
|
||||
if (model.Requirement.RequirementIdSource != null)
|
||||
requirement.RequirementIdSource = SysId.ToSysId(model.Requirement.RequirementIdSource);
|
||||
if (model.Requirement.Sequence != null)
|
||||
requirement.Seq = StringUtil.ToShort(model.Requirement.Sequence);
|
||||
if (model.Requirement.JobNumber != null)
|
||||
requirement.JobNumber = model.Requirement.JobNumber;
|
||||
// Dates.
|
||||
if (model.Requirement.Required != null)
|
||||
requirement.Required = model.ParseDateFromForm(model.Requirement.Required);
|
||||
if (model.Requirement.Started != null)
|
||||
requirement.Started = model.ParseDateFromForm(model.Requirement.Started);
|
||||
if (model.Requirement.Completed != null)
|
||||
requirement.Completed = model.ParseDateFromForm(model.Requirement.Completed);
|
||||
// Commodity.
|
||||
if (model.Requirement.CommodityId != null)
|
||||
requirement.CommodityId = model.GetRequirementCommodityId();
|
||||
if (model.Requirement.ProductCode != null)
|
||||
requirement.ProductCode = model.Requirement.ProductCode;
|
||||
if (model.Requirement.DescBrief != null)
|
||||
requirement.DescBrief = model.Requirement.DescBrief;
|
||||
if (model.Requirement.Quantity != null)
|
||||
requirement.Quantity = StringUtil.ToDecimal(model.Requirement.Quantity);
|
||||
if (model.Requirement.QuantityProd != null)
|
||||
requirement.QuantityProd = StringUtil.ToDecimal(model.Requirement.QuantityProd);
|
||||
if (model.Requirement.UomId != null)
|
||||
requirement.UomId = SysId.ToSysId(model.Requirement.UomId);
|
||||
if (model.Requirement.UomIdWeight != null)
|
||||
requirement.UomIdWeight = SysId.ToSysId(model.Requirement.UomIdWeight);
|
||||
if (model.Requirement.MaterialSourceCode != null)
|
||||
requirement.MaterialSourceCode = model.Requirement.MaterialSourceCode;
|
||||
if (model.Requirement.LocationIdStock != null)
|
||||
requirement.LocationIdStock = SysId.ToSysId(model.Requirement.LocationIdStock);
|
||||
// Amounts.
|
||||
if (model.Requirement.AmountUnit != null)
|
||||
requirement.AmountUnit = StringUtil.ToDecimal(model.Requirement.AmountUnit);
|
||||
if (model.Requirement.AmountAct != null)
|
||||
requirement.AmountAct = StringUtil.ToDecimal(model.Requirement.AmountAct);
|
||||
if (model.Requirement.AmountDisc != null)
|
||||
requirement.AmountDisc = StringUtil.ToDecimal(model.Requirement.AmountDisc);
|
||||
if (model.Requirement.AmountNet != null)
|
||||
requirement.AmountNet = StringUtil.ToDecimal(model.Requirement.AmountNet);
|
||||
if (model.Requirement.TaxCodeId != null)
|
||||
requirement.TaxCodeId = SysId.ToSysId(model.Requirement.TaxCodeId);
|
||||
if (model.Requirement.AmountTax != null)
|
||||
requirement.AmountTax = StringUtil.ToDecimal(model.Requirement.AmountTax);
|
||||
if (model.Requirement.AmountTot != null)
|
||||
requirement.AmountTot = StringUtil.ToDecimal(model.Requirement.AmountTot);
|
||||
// Common properties.
|
||||
if (model.Requirement.StatusCode != null)
|
||||
requirement.Status = model.GetRequirementStatus();
|
||||
if (model.Requirement.Notes != null)
|
||||
requirement.Notes = model.Requirement.Notes;
|
||||
|
||||
// Refresh requirement properties.
|
||||
TransactionMgr.CalculateTotal(requirement);
|
||||
|
||||
// Store item.
|
||||
if (!SysId.IsValid(requirement.Id))
|
||||
{
|
||||
if (!TransactionMgr.InsertRequirement(requirement, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to insert transaction: {TransactionMgr.ErrorStateMessage}");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.insert.failed"]));
|
||||
}
|
||||
responseData.SetNotification(messageTitle, Localiser["msg.item.created"]);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!TransactionMgr.UpdateRequirement(requirement, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update transaction [Id:{SysId.ToLong(requirement.Id)}]: {TransactionMgr.ErrorStateMessage}");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.update.failed"]));
|
||||
}
|
||||
responseData.SetNotification(messageTitle, Localiser["msg.item.updated"]);
|
||||
}
|
||||
UpdateAssociatedData(transaction, requirement);
|
||||
|
||||
// Construct response.
|
||||
model.PopulateItemConfig(responseData.Config, transaction, requirement);
|
||||
PopulateRequirementResponseItemData(model, transaction, requirement, responseData.requirement);
|
||||
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// Bring associated data into line with the transaction.
|
||||
/// </summary>
|
||||
/// <param name="transaction"></param>
|
||||
/// <returns></returns>
|
||||
private bool UpdateAssociatedData(SbmTransaction transaction, SbmRequirement requirement)
|
||||
{
|
||||
// Update transaction totals.
|
||||
List<SbmRequirement> requirements = TransactionMgr.GetRequirementsForTransaction(requirement.TransactionId);
|
||||
Internals.TransactionMgr.RefreshTransactionTotals(transaction, requirements.Where(item => SysId.IsValid(item.Id)));
|
||||
if (!Internals.TransactionMgr.UpdateTransaction(transaction, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update transaction. {Internals.TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Requirements;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Requirements
|
||||
{
|
||||
//=======================================================================
|
||||
public partial class RequirementController : SbmController_Portal
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Data members.
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public RequirementController(SbmLocaliser localiser, ILogger<RequirementController> logger) :
|
||||
base(localiser, logger)
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
[HttpGet]
|
||||
public IActionResult Index(String transactionTypeName)
|
||||
{
|
||||
if (!ValidUserSession)
|
||||
AutoLoginUser();
|
||||
|
||||
// No Requirements index page - redirect to Home page.
|
||||
return RedirectToAction("", "");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
[HttpGet]
|
||||
[Route("ProductionControl")]
|
||||
public IActionResult ProductionControl(String transactionTypeName)
|
||||
{
|
||||
if (!ValidUserSession)
|
||||
AutoLoginUser();
|
||||
|
||||
// Redirect to sign-in if not signed-in.
|
||||
if (!ValidUserSession)
|
||||
{
|
||||
ClearKeepLoggedInCookie();
|
||||
return RedirectToAction("", "Security");
|
||||
}
|
||||
|
||||
// Requirement page.
|
||||
Model_Requirement model = new Model_Requirement(Localiser);
|
||||
RefreshModel(model);
|
||||
model.Filter.Mode = $"{Model_Requirement.ViewMode.ProductionControl}";
|
||||
model.Paging.PageNo = SessionData_Portal.Profile.ProductionControl.Filter.PageNo;
|
||||
model.Paging.PageLength = SessionData_Portal.Profile.ProductionControl.Filter.PageLength;
|
||||
model.PopulateListConfig();
|
||||
return View(model);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
}
|
||||
+17
-12
@@ -131,6 +131,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
messageTitle = model.GetTransactionsTypeCaption(model.GetFilterTransactionType());
|
||||
|
||||
// Populate configuration data.
|
||||
PopulateTransactionConfig(model, responseData);
|
||||
@@ -165,12 +166,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
// View mode.
|
||||
public class ModeData
|
||||
{
|
||||
public bool? Search { get; set; }
|
||||
public bool? Maintain { get; set; }
|
||||
public bool? SearchRequirement { get; set; }
|
||||
public bool? DeliveryPlanning { get; set; }
|
||||
public bool? TransactionsForSourceTrans { get; set; }
|
||||
public bool? TransactionsForAssociation { get; set; }
|
||||
public ushort? Search { get; set; }
|
||||
public ushort? Maintain { get; set; }
|
||||
public ushort? SearchRequirement { get; set; }
|
||||
public ushort? DeliveryPlanning { get; set; }
|
||||
public ushort? TransactionsForSourceTrans { get; set; }
|
||||
public ushort? TransactionsForAssociation { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
/// <summary>Status Cats to refresh caption with transaction count.</summary>
|
||||
@@ -191,6 +192,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
if (!ValidUserSession) return GetAjaxResult_InvalidSession(responseData);
|
||||
if (!ValidReferer) return Forbid();
|
||||
RefreshModel(model);
|
||||
messageTitle = model.GetTransactionsTypeCaption(model.GetFilterTransactionType());
|
||||
|
||||
// Populate configuration data.
|
||||
PopulateTransactionConfig(model, responseData);
|
||||
@@ -199,17 +201,17 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
responseData.Mode = new AjaxResponse_TransactionList.ModeData();
|
||||
Model_Transaction.ViewMode viewMode = model.GetFilterMode();
|
||||
if (viewMode == Model_Transaction.ViewMode.Maintain)
|
||||
responseData.Mode.Maintain = true;
|
||||
responseData.Mode.Maintain = 1;
|
||||
else if (viewMode == Model_Transaction.ViewMode.SearchRequirement)
|
||||
responseData.Mode.SearchRequirement = true;
|
||||
responseData.Mode.SearchRequirement = 1;
|
||||
else if (viewMode == Model_Transaction.ViewMode.DeliveryPlanning)
|
||||
responseData.Mode.DeliveryPlanning = true;
|
||||
responseData.Mode.DeliveryPlanning = 1;
|
||||
else if (viewMode == Model_Transaction.ViewMode.TransactionsForSourceTrans)
|
||||
responseData.Mode.TransactionsForSourceTrans = true;
|
||||
responseData.Mode.TransactionsForSourceTrans = 1;
|
||||
else if (viewMode == Model_Transaction.ViewMode.TransactionsForAssociation)
|
||||
responseData.Mode.TransactionsForAssociation = true;
|
||||
responseData.Mode.TransactionsForAssociation = 1;
|
||||
else
|
||||
responseData.Mode.Search = true;
|
||||
responseData.Mode.Search = 1;
|
||||
|
||||
// Status Cats.
|
||||
responseData.StatusCats = model.GetTransactionStatusCats(model.GetFilterTransactionType()).Select(item => new AjaxResponse_Data.ItemCodeDesc(item.Code, item.Desc)).ToList();
|
||||
@@ -348,6 +350,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve transaction for Id: '{model.Transaction.Id}'");
|
||||
return Json(responseData.SetMessage(messageTitle, Localiser["msg.error.item.id.not.found"]));
|
||||
}
|
||||
messageTitle = model.GetTransactionsTypeCaption(transaction.TransactionType);
|
||||
|
||||
// Construct response.
|
||||
model.PopulateItemConfig(responseData.Config, transaction);
|
||||
@@ -404,6 +407,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
|
||||
// Retrieve existing item.
|
||||
SbmTransaction transaction = TransactionMgr.GetTransactionById(transactionId);
|
||||
messageTitle = model.GetTransactionsTypeCaption(transaction?.TransactionType ?? Sbm.TransactionType.Unknown);
|
||||
if (transaction == null && SysId.IsValid(transactionId))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve transaction for Id: '{model.Transaction.Id}'");
|
||||
@@ -420,6 +424,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
return Json(responseData.SetGoHome(messageTitle, Localiser["msg.error.system"]));
|
||||
}
|
||||
transaction = TransactionMgr.CreateTransaction(associationId, model.GetTransactionType());
|
||||
messageTitle = model.GetTransactionsTypeCaption(transaction?.TransactionType ?? Sbm.TransactionType.Unknown);
|
||||
if (transaction == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to create Transaction. {TransactionMgr.ErrorStateMessage.TrimEnd('.')}.");
|
||||
|
||||
+3
-10
@@ -1,23 +1,16 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.Helpers;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
|
||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
|
||||
using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Security;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
|
||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using System.Transactions;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
{
|
||||
|
||||
@@ -68,7 +68,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Codes
|
||||
if (CodeType.Code != null)
|
||||
{
|
||||
String controlName = "CodeTypeCode";
|
||||
CodeType.Code = CodeType.Code.ToUpperInvariant();
|
||||
responseData.SetControlValue(controlName, CodeType.Code);
|
||||
if (StringUtil.IsBlank(CodeType.Code))
|
||||
responseData.SetControlError(controlName, Localiser["msg.validation.mandatory.value"]);
|
||||
|
||||
@@ -377,6 +377,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
public bool? IsOrganisation { get; set; }
|
||||
public bool? IsIndividual { get; set; }
|
||||
public bool? IsGroup { get; set; }
|
||||
// Decimals.
|
||||
public class DecimalsData
|
||||
{
|
||||
public int? PackQty { get; set; } = 0;
|
||||
}
|
||||
public DecimalsData Decimals { get; } = new DecimalsData();
|
||||
// Item fields.
|
||||
public class FieldData
|
||||
{
|
||||
@@ -414,6 +420,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
bool managedByAccounts = Internals.AccountsConsole.IsItemTypeManagedByAccounts(Sbm.ItemType.Commodity);
|
||||
bool showNotes = true;
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Decimals.
|
||||
config.Decimals.PackQty = Internals.GetOwnerOption_NumericDecimals(Sbm.OrgOption_NumericDecimals.OrderQuantity);
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Commodity.
|
||||
|
||||
|
||||
@@ -194,7 +194,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
if (Commodity.SalesPackQty != null)
|
||||
{
|
||||
String controlName = GetFieldName(Model_Commodity.ItemField.SalesPackQty);
|
||||
if (!StringUtil.IsBlank(Commodity.SalesPackQty) && (!StringUtil.IsNumeric(Commodity.SalesPackQty) || GetCommoditySalesPackQty() < 1))
|
||||
if (!StringUtil.IsBlank(Commodity.SalesPackQty) && (!StringUtil.IsDecimal(Commodity.SalesPackQty) || GetCommoditySalesPackQty() < 1))
|
||||
responseData.SetControlError(controlName, Localiser["msg.validation.invalid.value"]);
|
||||
}
|
||||
|
||||
@@ -266,6 +266,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
else
|
||||
msg += $" Issue: None.";
|
||||
SaLogger.Warn($"{SysUtil.Fn} {msg}");
|
||||
responseData.SetControlError(GetFieldName(Model_Commodity.ItemField.Code), Localiser["msg.validation.duplicate.value"]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
public String ContactType { get; set; }
|
||||
public String Search { get; set; }
|
||||
public String Email { get; set; }
|
||||
public String AssociationTypeExclude { get; set; }
|
||||
}
|
||||
public FilterData Filter { get; } = new FilterData();
|
||||
public ViewMode GetFilterMode()
|
||||
@@ -54,6 +55,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Contacts
|
||||
affiliateType = (Sbm.AffiliateType)StringUtil.ToInt(Filter.ContactType);
|
||||
return affiliateType;
|
||||
}
|
||||
public Sbm.AssociationType GetFilterAssociationTypeExclude()
|
||||
{
|
||||
Sbm.AssociationType associationType = (Sbm.AssociationType)SbmSystem.GetSystemCodes(Sbm.SystemCode.AssociationType).GetTypeForCode(Filter.AssociationTypeExclude);
|
||||
if (associationType == 0 && !StringUtil.IsBlank(Filter.AssociationTypeExclude) && StringUtil.IsNumeric(Filter.AssociationTypeExclude, true))
|
||||
associationType = (Sbm.AssociationType)StringUtil.ToInt(Filter.AssociationTypeExclude);
|
||||
return associationType;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Contact properties.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
@@ -28,6 +29,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
Pos,
|
||||
Id,
|
||||
TransactionId,
|
||||
TransactionType,
|
||||
TransactionRef,
|
||||
AssociationName,
|
||||
AssociationId,
|
||||
Type,
|
||||
@@ -53,13 +56,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
NominalCode,
|
||||
RandDIndicator,
|
||||
// Commodity.
|
||||
Commodity,
|
||||
CommodityId,
|
||||
ProductCode,
|
||||
DrawingIssue,
|
||||
AssetId,
|
||||
Quantity,
|
||||
QuantityProd,
|
||||
Unit,
|
||||
UomId,
|
||||
PackQty,
|
||||
MaterialSourceCode,
|
||||
LocationIdStock,
|
||||
AllocationIndicator,
|
||||
@@ -69,6 +75,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
AmountDisc,
|
||||
AmountNet,
|
||||
TaxCodeId,
|
||||
TaxCode,
|
||||
TaxRate,
|
||||
AmountTax,
|
||||
AmountTot,
|
||||
@@ -182,7 +189,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
bool isPurchaseInvoice = transactionType == Sbm.TransactionType.PurchaseInvoice || transactionType == Sbm.TransactionType.ProformaPurchaseInvoice;
|
||||
|
||||
// Requirement.
|
||||
Sbm.RequirementType requirementType = GetFilterRequirementType();
|
||||
SbmRequirement.StatusCat requirementStatusCat = GetFilterRequirementStatusCat();
|
||||
|
||||
// Options.
|
||||
@@ -303,10 +309,24 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
}
|
||||
else config.Column.Hide.Add($"{ItemField.AmountUnit}");
|
||||
|
||||
// Actual Amount - Maintain mode only.
|
||||
if (UserCanViewFinancials() && modeIsMaintain)
|
||||
{
|
||||
// Actual Amount is shown.
|
||||
}
|
||||
else config.Column.Hide.Add($"{ItemField.AmountAct}");
|
||||
|
||||
// Discount Amount - Maintain mode only.
|
||||
if (UserCanViewFinancials() && modeIsMaintain)
|
||||
{
|
||||
// Discount Amount is shown.
|
||||
}
|
||||
else config.Column.Hide.Add($"{ItemField.AmountDisc}");
|
||||
|
||||
// Net Amount - Maintain mode only.
|
||||
if (UserCanViewFinancials() && modeIsMaintain)
|
||||
{
|
||||
// Unit Amount is shown.
|
||||
// Net Amount is shown.
|
||||
}
|
||||
else config.Column.Hide.Add($"{ItemField.AmountNet}");
|
||||
|
||||
@@ -398,33 +418,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
//-------------------------------------------------------------------
|
||||
private String GetListCaptionByTransactionType(Sbm.TransactionType transactionType)
|
||||
{
|
||||
String transactionTypeCaption = GetTransactionTypeCaption(transactionType);
|
||||
String transactionTypeCaption = GetTransactionsTypeCaption(transactionType);
|
||||
if (!StringUtil.IsBlank(transactionTypeCaption))
|
||||
return Localiser.GetText("caption.item.requirements", new object[] { transactionTypeCaption });
|
||||
return Localiser["label.requirements"];
|
||||
}
|
||||
private String GetTransactionTypeCaption(Sbm.TransactionType transactionType)
|
||||
private String GetTransactionsTypeCaption(Sbm.TransactionType transactionType)
|
||||
{
|
||||
switch (transactionType)
|
||||
{
|
||||
case Sbm.TransactionType.Project: return Localiser["caption.projects"];
|
||||
case Sbm.TransactionType.SalesLead: return Localiser["caption.sales.leads"];
|
||||
case Sbm.TransactionType.SalesQuote: return Localiser["caption.sales.quotes"];
|
||||
case Sbm.TransactionType.ProformaSalesOrder: return Localiser["caption.proforma.sales.orders"];
|
||||
case Sbm.TransactionType.SalesPO: return Localiser["caption.sales.purchase.orders"];
|
||||
case Sbm.TransactionType.SalesOrder: return Localiser["caption.sales.orders"];
|
||||
case Sbm.TransactionType.SalesDispatch: return Localiser["caption.sales.dispatches"];
|
||||
case Sbm.TransactionType.ProformaSalesInvoice: return Localiser["caption.proforma.sales.invoices"];
|
||||
case Sbm.TransactionType.SalesInvoice: return Localiser["caption.sales.invoices"];
|
||||
case Sbm.TransactionType.PurchaseQuote: return Localiser["caption.purchase.quotes"];
|
||||
case Sbm.TransactionType.ProformaPurchaseOrder: return Localiser["caption.proforma.purchase.orders"];
|
||||
case Sbm.TransactionType.PurchaseSO: return Localiser["caption.purchase.sales.orders"];
|
||||
case Sbm.TransactionType.PurchaseOrder: return Localiser["caption.purchase.orders"];
|
||||
case Sbm.TransactionType.PurchaseDelivery: return Localiser["caption.purchase.deliveries"];
|
||||
case Sbm.TransactionType.ProformaPurchaseInvoice: return Localiser["caption.proforma.purchase.invoices"];
|
||||
case Sbm.TransactionType.PurchaseInvoice: return Localiser["caption.purchase.invoices"];
|
||||
}
|
||||
return "";
|
||||
return Model_Transaction.GetTransactionsTypeCaption(transactionType, Localiser, "");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -438,6 +439,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
public bool? IsOrganisation { get; set; }
|
||||
public bool? IsIndividual { get; set; }
|
||||
public bool? IsGroup { get; set; }
|
||||
// Decimals.
|
||||
public class DecimalsData
|
||||
{
|
||||
public int? ItemQty { get; set; } = 0;
|
||||
}
|
||||
public DecimalsData Decimals { get; } = new DecimalsData();
|
||||
// Item fields.
|
||||
public class FieldData
|
||||
{
|
||||
@@ -459,17 +466,18 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
/// </summary>
|
||||
public void PopulateItemConfig(ItemConfigData config, SbmTransaction transaction, SbmRequirement requirement)
|
||||
{
|
||||
PopulateItemConfig(config, requirement.GetItemId(), transaction.TransactionType, requirement.RequirementType);
|
||||
PopulateItemConfig(config, requirement?.GetItemId(), transaction?.TransactionType ?? Sbm.TransactionType.Unknown, transaction?.TransactionStatusCat ?? SbmTransaction.StatusCat.Pending, requirement?.RequirementType ?? Sbm.RequirementType.Detail);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Populate item configuration for new or existing requirement.
|
||||
/// </summary>
|
||||
public void PopulateItemConfig(ItemConfigData config, ItemId requirementItemId, Sbm.TransactionType transactionType, Sbm.RequirementType requirementType)
|
||||
public void PopulateItemConfig(ItemConfigData config, ItemId requirementItemId, Sbm.TransactionType transactionType, SbmTransaction.StatusCat transactionStatusCat, Sbm.RequirementType requirementType)
|
||||
{
|
||||
// Item type.
|
||||
bool isSales = SbmTransaction.IsSalesType(transactionType);
|
||||
bool isPurchase = SbmTransaction.IsPurchaseType(transactionType);
|
||||
bool transactionClosed = transactionStatusCat == SbmTransaction.StatusCat.Closed;
|
||||
|
||||
// Configuration options.
|
||||
bool importedFromAccounts = Internals.AccountsConsole.ItemIsImportedFromAccounts(requirementItemId);
|
||||
@@ -477,6 +485,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
bool showDrawingIssue = SessionConsole.DisplayAttribute(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue);
|
||||
bool showNotes = true;
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Decimals.
|
||||
config.Decimals.ItemQty = Internals.GetOwnerOption_NumericDecimals(Sbm.OrgOption_NumericDecimals.OrderQuantity);
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Requirement.
|
||||
|
||||
@@ -496,10 +508,42 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
config.Field.Readonly.Add($"{ItemField.DescBrief}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Sales order.
|
||||
// Commodity.
|
||||
|
||||
// Quantity.
|
||||
if (transactionClosed)
|
||||
config.Field.Readonly.Add($"{ItemField.Quantity}");
|
||||
|
||||
// Production Quantity.
|
||||
if (transactionClosed)
|
||||
config.Field.Readonly.Add($"{ItemField.QuantityProd}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Purchase order.
|
||||
// Amounts.
|
||||
|
||||
// Unit Amount.
|
||||
if (transactionClosed)
|
||||
config.Field.Readonly.Add($"{ItemField.AmountUnit}");
|
||||
|
||||
// Actual Amount.
|
||||
config.Field.Readonly.Add($"{ItemField.AmountAct}");
|
||||
|
||||
// Discount Amount.
|
||||
if (transactionClosed)
|
||||
config.Field.Readonly.Add($"{ItemField.AmountDisc}");
|
||||
|
||||
// Net Amount.
|
||||
config.Field.Readonly.Add($"{ItemField.AmountNet}");
|
||||
|
||||
// Tax Code.
|
||||
if (transactionClosed)
|
||||
config.Field.Readonly.Add($"{ItemField.TaxCode}");
|
||||
|
||||
// Tax Amount.
|
||||
config.Field.Readonly.Add($"{ItemField.AmountTax}");
|
||||
|
||||
// Total Amount.
|
||||
config.Field.Readonly.Add($"{ItemField.AmountTot}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Common.
|
||||
|
||||
@@ -48,8 +48,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
public class FilterData
|
||||
{
|
||||
public String Mode { get; set; }
|
||||
public String TransactionId { get; set; }
|
||||
public String TransactionType { get; set; }
|
||||
public String Type { get; set; }
|
||||
public String Search { get; set; }
|
||||
public String TransactionStatusCat { get; set; }
|
||||
public String StatusCat { get; set; }
|
||||
@@ -59,18 +59,17 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
{
|
||||
return EnumUtil.ParseEnum(Filter.Mode, ViewMode.Search);
|
||||
}
|
||||
public SysId GetFilterTransactionId()
|
||||
{
|
||||
return SysId.ToSysId(Filter.TransactionId);
|
||||
}
|
||||
public Sbm.TransactionType GetFilterTransactionType()
|
||||
{
|
||||
Sbm.TransactionType transactionType = (Sbm.TransactionType)Internals.TransactionTypeCodes.GetTypeForCode(Filter.Type);
|
||||
if (transactionType == 0 && !StringUtil.IsBlank(Filter.Type) && StringUtil.IsNumeric(Filter.Type, true))
|
||||
transactionType = (Sbm.TransactionType)StringUtil.ToInt(Filter.Type);
|
||||
return transactionType;
|
||||
}
|
||||
public Sbm.RequirementType GetFilterRequirementType()
|
||||
{
|
||||
Sbm.RequirementType transactionType = (Sbm.RequirementType)Internals.RequirementTypeCodes.GetTypeForCode(Filter.Type);
|
||||
if (transactionType == 0 && !StringUtil.IsBlank(Filter.Type) && StringUtil.IsNumeric(Filter.Type, true))
|
||||
transactionType = (Sbm.RequirementType)StringUtil.ToInt(Filter.Type);
|
||||
Sbm.TransactionType transactionType = (Sbm.TransactionType)Internals.TransactionTypeCodes.GetTypeForCode(Filter.TransactionType);
|
||||
if (transactionType == 0 && !StringUtil.IsBlank(Filter.TransactionType) && StringUtil.IsNumeric(Filter.TransactionType, true))
|
||||
transactionType = (Sbm.TransactionType)StringUtil.ToInt(Filter.TransactionType);
|
||||
if (transactionType == 0 && SysId.IsValid(GetFilterTransactionId()))
|
||||
transactionType = TransactionMgr.GetTransactionType(GetFilterTransactionId());
|
||||
return transactionType;
|
||||
}
|
||||
public SbmTransaction.StatusCat GetFilterTransactionStatusCat()
|
||||
@@ -134,6 +133,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Requirements
|
||||
{
|
||||
return (Sbm.RequirementType)Internals.RequirementTypeCodes.GetTypeForCode(Requirement.Type);
|
||||
}
|
||||
public SysId GetRequirementCommodityId()
|
||||
{
|
||||
return SysId.ToSysId(Requirement.CommodityId);
|
||||
}
|
||||
public SaStatus GetRequirementStatus()
|
||||
{
|
||||
return SacsSystem.GetStatusForCode(Requirement.StatusCode);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
@@ -233,7 +234,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// List Caption.
|
||||
config.Caption = StringUtil.OnBlank(GetListCaptionByTransactionType(transactionType), Localiser["label.transactions"]);
|
||||
config.Caption = StringUtil.OnBlank(GetTransactionsTypeCaption(transactionType), Localiser["label.transactions"]);
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// Actions.
|
||||
@@ -536,28 +537,32 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Transactions
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private String GetListCaptionByTransactionType(Sbm.TransactionType transactionType)
|
||||
public String GetTransactionsTypeCaption(Sbm.TransactionType transactionType)
|
||||
{
|
||||
return GetTransactionsTypeCaption(transactionType, Localiser, Localiser["label.transactions"]);
|
||||
}
|
||||
public static String GetTransactionsTypeCaption(Sbm.TransactionType transactionType, SbmLocaliser localiser, String defaultCaption)
|
||||
{
|
||||
switch (transactionType)
|
||||
{
|
||||
case Sbm.TransactionType.Project: return Localiser["caption.projects"];
|
||||
case Sbm.TransactionType.SalesLead: return Localiser["caption.sales.leads"];
|
||||
case Sbm.TransactionType.SalesQuote: return Localiser["caption.sales.quotes"];
|
||||
case Sbm.TransactionType.ProformaSalesOrder: return Localiser["caption.proforma.sales.orders"];
|
||||
case Sbm.TransactionType.SalesPO: return Localiser["caption.sales.purchase.orders"];
|
||||
case Sbm.TransactionType.SalesOrder: return Localiser["caption.sales.orders"];
|
||||
case Sbm.TransactionType.SalesDispatch: return Localiser["caption.sales.dispatches"];
|
||||
case Sbm.TransactionType.ProformaSalesInvoice: return Localiser["caption.proforma.sales.invoices"];
|
||||
case Sbm.TransactionType.SalesInvoice: return Localiser["caption.sales.invoices"];
|
||||
case Sbm.TransactionType.PurchaseQuote: return Localiser["caption.purchase.quotes"];
|
||||
case Sbm.TransactionType.ProformaPurchaseOrder: return Localiser["caption.proforma.purchase.orders"];
|
||||
case Sbm.TransactionType.PurchaseSO: return Localiser["caption.purchase.sales.orders"];
|
||||
case Sbm.TransactionType.PurchaseOrder: return Localiser["caption.purchase.orders"];
|
||||
case Sbm.TransactionType.PurchaseDelivery: return Localiser["caption.purchase.deliveries"];
|
||||
case Sbm.TransactionType.ProformaPurchaseInvoice: return Localiser["caption.proforma.purchase.invoices"];
|
||||
case Sbm.TransactionType.PurchaseInvoice: return Localiser["caption.purchase.invoices"];
|
||||
case Sbm.TransactionType.Project: return localiser["caption.projects"];
|
||||
case Sbm.TransactionType.SalesLead: return localiser["caption.sales.leads"];
|
||||
case Sbm.TransactionType.SalesQuote: return localiser["caption.sales.quotes"];
|
||||
case Sbm.TransactionType.ProformaSalesOrder: return localiser["caption.proforma.sales.orders"];
|
||||
case Sbm.TransactionType.SalesPO: return localiser["caption.sales.purchase.orders"];
|
||||
case Sbm.TransactionType.SalesOrder: return localiser["caption.sales.orders"];
|
||||
case Sbm.TransactionType.SalesDispatch: return localiser["caption.sales.dispatches"];
|
||||
case Sbm.TransactionType.ProformaSalesInvoice: return localiser["caption.proforma.sales.invoices"];
|
||||
case Sbm.TransactionType.SalesInvoice: return localiser["caption.sales.invoices"];
|
||||
case Sbm.TransactionType.PurchaseQuote: return localiser["caption.purchase.quotes"];
|
||||
case Sbm.TransactionType.ProformaPurchaseOrder: return localiser["caption.proforma.purchase.orders"];
|
||||
case Sbm.TransactionType.PurchaseSO: return localiser["caption.purchase.sales.orders"];
|
||||
case Sbm.TransactionType.PurchaseOrder: return localiser["caption.purchase.orders"];
|
||||
case Sbm.TransactionType.PurchaseDelivery: return localiser["caption.purchase.deliveries"];
|
||||
case Sbm.TransactionType.ProformaPurchaseInvoice: return localiser["caption.proforma.purchase.invoices"];
|
||||
case Sbm.TransactionType.PurchaseInvoice: return localiser["caption.purchase.invoices"];
|
||||
}
|
||||
return Localiser["label.transactions"];
|
||||
return defaultCaption;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user