3.0.1.2 Requirements & tidy

This commit is contained in:
Andy Howard
2025-02-26 18:42:52 +00:00
parent d7dc5f8fbc
commit 80b085cf29
79 changed files with 2472 additions and 594 deletions
@@ -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
{
@@ -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();
@@ -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();
@@ -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;
@@ -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);
}
//-------------------------------------------------------------------
}
//=======================================================================
}
@@ -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('.')}.");
@@ -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;
}
//-------------------------------------------------------------------