From 80b085cf2970898b270ebb8dbf934edb3a9acd92 Mon Sep 17 00:00:00 2001 From: Andy Howard Date: Wed, 26 Feb 2025 18:42:52 +0000 Subject: [PATCH] 3.0.1.2 Requirements & tidy --- .../Web/Components/SbmModel_Base.cs | 13 +- SaBusMgrStandardBase/Base/App/Sbm-Version.cs | 3 +- SaBusMgrStandardBase/Base/App/Sbm.cs | 25 +- .../Base/Bus/SbmRequirement.cs | 48 +- .../Base/Bus/SbmTransaction.cs | 48 -- .../Base/Consoles/SbmCoreInstanceConsole.cs | 14 +- .../Base/Mgr/SbmTransactionMgr_Requirement.cs | 4 +- .../Base/Mgr/SbmTransactionMgr_Transaction.cs | 39 +- .../Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs | 39 +- .../Mgr/SbmTransactionMgr_Dbas-Requirement.cs | 137 ++-- ...bmTransactionMgr_Dbas-Transaction-Utils.cs | 33 +- .../Mgr/SbmTransactionMgr_Dbas-Transaction.cs | 16 +- .../Views/Common/SelectItem.cshtml | 2 +- .../wwwroot/css/sbc-main.css | 2 +- .../wwwroot/js/sbc-ins-rep-db.js | 4 +- .../wwwroot/js/sbc-ins-rep-sch.js | 4 +- .../Localisation/SbmPortalProperties.resx | 56 +- .../Portal/App/SbmSessionData_Portal.cs | 13 + .../Consoles/SbmDemoInstanceConsole_Portal.cs | 5 +- .../Assets/AssetCategoryController-Ajax.cs | 8 +- .../Assets/AssetController-Ajax.cs | 12 +- .../Controllers/Codes/CodeController-Ajax.cs | 10 +- .../Codes/CodeTypeController-Ajax.cs | 57 +- .../Commodities/CommodityController-Ajax.cs | 16 +- .../Contacts/AssociationController-Ajax.cs | 16 +- .../Contacts/AssociationController.cs | 4 +- .../Contacts/ContactController-Ajax.cs | 9 +- .../RequirementController-Ajax.cs | 602 ++++++++++++++++++ .../Requirements/RequirementController.cs | 70 ++ .../TransactionController-Ajax.cs | 29 +- .../Transactions/TransactionController.cs | 13 +- .../Portal/Models/Codes/Model_CodeType.cs | 1 - .../Commodities/Model_Commodity-Config.cs | 10 + .../Models/Commodities/Model_Commodity.cs | 3 +- .../Portal/Models/Contacts/Model_Contact.cs | 8 + .../Requirements/Model_Requirement-Config.cs | 100 ++- .../Models/Requirements/Model_Requirement.cs | 25 +- .../Transactions/Model_Transaction-Config.cs | 45 +- .../SaBusinessMgrCoreWebPortal.csproj | 5 - .../Assets/Asset/Panel-AssetDialog.cshtml | 2 +- .../Assets/Asset/Panel-AssetMaintain.cshtml | 2 +- .../Assets/Asset/Panel-AssetSelect.cshtml | 2 +- .../Panel-AssetCategoryDialog.cshtml | 2 +- .../Panel-AssetCategoryMaintain.cshtml | 2 +- .../Panel-AssetCategorySelect.cshtml | 2 +- .../Panel-AssociationDialog.cshtml | 48 +- .../Panel-AssociationMaintain.cshtml | 9 +- .../Panel-AssociationSelect.cshtml | 3 +- .../Views/Codes/CodeType/Index.cshtml | 28 +- .../Commodity/Panel-CommodityDialog.cshtml | 25 +- .../Commodity/Panel-CommodityMaintain.cshtml | 4 +- .../Commodity/Panel-CommoditySelect.cshtml | 2 +- .../Views/Common/SelectItem.cshtml | 2 +- .../Views/Contact/Panel-ContactDialog.cshtml | 6 +- .../Contact/Panel-ContactMaintain.cshtml | 6 +- .../Views/Contact/Panel-ContactSelect.cshtml | 3 +- .../Views/Requirement/Index.cshtml | 8 + .../Panel-RequirementDialog.cshtml | 373 +++++++++++ .../Requirement/Panel-RequirementList.cshtml | 74 +++ .../Panel-RequirementMaintain.cshtml | 66 ++ .../Panel-RequirementSelect.cshtml | 37 ++ .../Views/Shared/_Layout.cshtml | 2 + .../Panel-TransactionDialog.cshtml | 7 +- .../Panel-TransactionMaintain.cshtml | 10 +- .../Panel-TransactionSelect.cshtml | 2 +- .../Views/_ViewImports.cshtml | 1 + .../wwwroot/css/sbm-cols.css | 10 + .../wwwroot/css/sbm-main.css | 2 +- .../wwwroot/js/sbm-asset-cat.js | 18 +- .../wwwroot/js/sbm-asset.js | 24 +- .../wwwroot/js/sbm-assoc.js | 122 ++-- .../wwwroot/js/sbm-cmd.js | 115 ++-- .../wwwroot/js/sbm-cod-typ.js | 32 +- .../wwwroot/js/sbm-cod.js | 10 +- .../wwwroot/js/sbm-contact.js | 33 +- .../wwwroot/js/sbm-main.js | 11 +- .../wwwroot/js/sbm-req.js | 358 +++++++++++ .../wwwroot/js/sbm-trn.js | 52 +- .../wwwroot/js/sbm-veh-cls.js | 3 +- 79 files changed, 2472 insertions(+), 594 deletions(-) create mode 100644 SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController-Ajax.cs create mode 100644 SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController.cs create mode 100644 SaBusinessMgrCoreWebPortal/Views/Requirement/Index.cshtml create mode 100644 SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementDialog.cshtml create mode 100644 SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml create mode 100644 SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementMaintain.cshtml create mode 100644 SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementSelect.cshtml create mode 100644 SaBusinessMgrCoreWebPortal/wwwroot/js/sbm-req.js diff --git a/SaBusMgrCoreWeb/Web/Components/SbmModel_Base.cs b/SaBusMgrCoreWeb/Web/Components/SbmModel_Base.cs index c47d92b..f48ee7e 100644 --- a/SaBusMgrCoreWeb/Web/Components/SbmModel_Base.cs +++ b/SaBusMgrCoreWeb/Web/Components/SbmModel_Base.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Html; +using DocumentFormat.OpenXml.Drawing; +using Microsoft.AspNetCore.Html; using Microsoft.AspNetCore.Mvc.Rendering; using Sacs.Web.Components; using Sarand.BusinessMgr.Net.Core.Web.App; @@ -71,6 +72,16 @@ namespace Sarand.BusinessMgr.Net.Core.Web.Components // Page configuration. public string InstanceVersion { get { return !App.AppConfig.Instance.IsEmpty() ? App.AppConfig.Instance + " v" + Sbm.Version.GetFullVersion() : "v" + Sbm.Version.GetAppVersion(); } } + //------------------------------------------------------------------- + // Text & localisation. + public override String GetText(String textKey, String defaultText) + { + String text = Localiser[textKey]; + if (StringUtil.IsBlank(text) || text.EqualsCI(textKey)) + return defaultText; + return text; + } + //------------------------------------------------------------------- // Business components. // NB Keep these accessors protected to avoid them being called by the model binding logic before the session data is ready. diff --git a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs index e1334f4..65e092e 100644 --- a/SaBusMgrStandardBase/Base/App/Sbm-Version.cs +++ b/SaBusMgrStandardBase/Base/App/Sbm-Version.cs @@ -15,7 +15,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App //------------------------------------------------------------------- public static class Version { - private static String version { get; } = "3.0.1.1"; + private static String version { get; } = "3.0.1.2"; // Retrieve version. public static String GetFullVersion() { return version; } public static String GetAppVersion() @@ -39,6 +39,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App //------------------------------------------------------------------- // 3.0.1 19-Feb-25 Portal Transactions. // 3.0.1.1 19-Feb-25 Portal tidy. + // 3.0.1.2 26-Feb-25 Requirements & tidy. //------------------------------------------------------------------- // 3.0.0 Jul-2021 Initial demo test version. // 02-Feb-25 Initial live deployment. diff --git a/SaBusMgrStandardBase/Base/App/Sbm.cs b/SaBusMgrStandardBase/Base/App/Sbm.cs index ea53b29..80bc04c 100644 --- a/SaBusMgrStandardBase/Base/App/Sbm.cs +++ b/SaBusMgrStandardBase/Base/App/Sbm.cs @@ -1754,18 +1754,18 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App Any = -1, Unknown = 0, // NB Do not change the positive values, as tied to the database. - Project = 10, // 'PRO' - SalesLead = 20, // 'SLD' - SalesQuote = 21, // 'SQT' - SalesOrder = 22, // 'SAL' - SalesPO = 23, // 'SPO' - ProformaSalesOrder = 24, // 'SAP' - PurchaseQuote = 30, // 'PQT' - PurchaseOrder = 31, // 'PUR' - PurchaseSO = 32, // 'PSO' - ProformaPurchaseOrder = 33, // 'PUP' - SalesDispatch = 40, // 'SDP' - PurchaseDelivery = 41, // 'PDL' + Project = 10, // 'PRO' + SalesLead = 20, // 'SLD' + SalesQuote = 21, // 'SQT' + SalesOrder = 22, // 'SAL' + SalesPO = 23, // 'SPO' + ProformaSalesOrder = 24, // 'SAP' + PurchaseQuote = 30, // 'PQT' + PurchaseOrder = 31, // 'PUR' + PurchaseSO = 32, // 'PSO' + ProformaPurchaseOrder = 33, // 'PUP' + SalesDispatch = 40, // 'SDP' + PurchaseDelivery = 41, // 'PDL' ProformaSalesInvoice = 50, // 'PSI' SalesInvoice = 51, // 'SAI' PurchaseInvoice = 52, // 'PUV' @@ -1783,6 +1783,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.App public enum RequirementType { Any = 0, + Unknown = Any, Detail = 1, Job = 2, } diff --git a/SaBusMgrStandardBase/Base/Bus/SbmRequirement.cs b/SaBusMgrStandardBase/Base/Bus/SbmRequirement.cs index c7fcb5e..5145952 100644 --- a/SaBusMgrStandardBase/Base/Bus/SbmRequirement.cs +++ b/SaBusMgrStandardBase/Base/Bus/SbmRequirement.cs @@ -21,10 +21,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus Unknown, Pos, Id, - //Requirement. - TransId, Owner_Name, - // Requirement code + // Association. Assoc_Code, Assoc_AccountManagerCode, Assoc_AccountManagerDesc, Assoc_AccountHandlerCode, Assoc_AccountHandlerDesc, @@ -32,7 +30,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus Assoc_Target_PhoneMain, Assoc_Target_PhoneAlt, // Transaction details - Trans_TypeDesc, Trans_Ref, Trans_RefExt, Trans_DescBrief, + TransId, + Trans_Type, Trans_TypeDesc, Trans_Ref, Trans_RefExt, Trans_DescBrief, Trans_ContactName, Trans_Likelihood, Trans_Raised, @@ -89,9 +88,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus Trans_DeliveryAddress_Line1, Trans_DeliveryAddress_Line2, Trans_DeliveryAddress_Line3, Trans_DeliveryAddress_City, Trans_DeliveryAddress_Province, Trans_DeliveryAddress_Postcode, Trans_DeliveryAddress_Phone, Trans_DeliveryAddress_Email, - Trans_SourceTrans_Ref, // Source transaction reference. - //Relation to items - Seq, + Trans_SourceTrans_Ref, /* Source transaction reference. */ + // Requirement. + Type, + Sequence, Started, StartedTime, Started_Day, Required, RequiredTime, Required_Fmt, // Formatted 'Required' date (eg. square brackets around defaulted date). Completed, CompletedTime, @@ -1147,7 +1147,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus { case Column.Id: return new DataValue((long)SysId.ToInt(data.Id)); - case Column.Seq: + case Column.Sequence: return new DataValue(data.Seq); case Column.Required: return new DataValue(data.Required); @@ -1235,22 +1235,22 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus public SysId CommodityId { get; set; } public SysId AssetId { get; set; } // Requirement. - public HashSet RequirementIdsIncluded { get; } = new HashSet(); - public HashSet RequirementIdsExcluded { get; } = new HashSet(); + public HashSet IdsIncluded { get; } = new HashSet(); + public HashSet IdsExcluded { get; } = new HashSet(); public HashSet RequirementIdsSource { get; } = new HashSet(); - public String RequirementProductCodeFull { get; set; } - public String RequirementProductCodePartial { get; set; } + public String Search { get; set; } + public String ProductCodeFull { get; set; } + public String ProductCodePartial { get; set; } // Stored as product code for 'Project' transactions (populating this value will force the transaction type). - public String RequirementProjectTaskCodeFull { get; set; } - public String RequirementProjectTaskCodePartial { get; set; } - public String RequirementJobNumberFull { get; set; } - public String RequirementJobNumberPartial { get; set; } - public String RequirementAssetSerialFull { get; set; } - public String RequirementAssetSerialPartial { get; set; } - public String RequirementDescBrief { get; set; } - public String RequirementPromotionCode { get; set; } + public String ProjectTaskCodeFull { get; set; } + public String ProjectTaskCodePartial { get; set; } + public String JobNumberFull { get; set; } + public String JobNumberPartial { get; set; } + public String AssetSerialFull { get; set; } + public String AssetSerialPartial { get; set; } + public String DescBrief { get; set; } + public String PromotionCode { get; set; } // Transaction. - public String AliasTransaction { get; set; } public HashSet TransactionIdsIncluded { get; } = new HashSet(); public HashSet TransactionIdsExcluded { get; } = new HashSet(); public SysId TransactionRequirementSourceId { get; set; } // Identifies the transaction to which the source requirement belongs. @@ -1283,7 +1283,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus // Stock by Sales Locations. public SysId SalesLocationIdStock01 { get; set; } public SysId SalesLocationIdStock02 { get; set; } - public SysId SalesLocationIdStock03; + public SysId SalesLocationIdStock03 { get; set; } // Required date. public DateTime RequirementRequiredFrom { get; set; } public DateTime RequirementRequiredTo { get; set; } @@ -1293,6 +1293,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus public String NotesPartial { get; set; } /// Requirement status. public StatusCat StatusCat { get; set; } = StatusCat.Default; + // Table aliases joined in query. + public String AliasTransaction { get; set; } + public String AliasCommodity { get; set; } + public String AliasAsset { get; set; } } //------------------------------------------------------------------- diff --git a/SaBusMgrStandardBase/Base/Bus/SbmTransaction.cs b/SaBusMgrStandardBase/Base/Bus/SbmTransaction.cs index 3faa117..cf1ee5f 100644 --- a/SaBusMgrStandardBase/Base/Bus/SbmTransaction.cs +++ b/SaBusMgrStandardBase/Base/Bus/SbmTransaction.cs @@ -1001,54 +1001,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Bus return false; } - //------------------------------------------------------------------- - public bool RefreshTotals(List requirements) - { - return RefreshTotals(requirements.ToDataList()); - } - public bool RefreshTotals(List requirements) - { - // Recalculate the amounts stored against the transaction in line with the list of requirements. - ClearErrorState(); - if (this == null) return SetErrorState("transaction not specified"); - if (!HasErrorState()) - { - // Total weight. - decimal totalWeight = requirements.GetTotalWeight(UomIdWeight); - Weight = totalWeight; - - // Set the allocation status. - ClearAllocationStatus(); - if (requirements.Count > 0) - { - if (requirements.IsFullAllocation()) FullAllocation = true; - else if (requirements.IsPartialAllocation()) PartialAllocation = true; - } - - // Calculate the totals from the list of requirements.; - decimal newAmountNet = 0.0m; - decimal newAmountTax = 0.0m; - decimal newAmountTot = 0.0m; - decimal newTimeEst = 0.0m; - decimal newTimeAct = 0.0m; - if (requirements.Count > 0) - requirements.CalculateTotals(ref newAmountNet, ref newAmountTax, ref newAmountTot, ref newTimeEst, ref newTimeAct); - - // Include delivery amounts. - newAmountNet += DeliveryAmountNet; - newAmountTax += DeliveryAmountTax; - newAmountTot += DeliveryAmountTot; - - // Store amounts: - AmountNet = newAmountNet; - AmountTax = newAmountTax; - AmountTot = newAmountTot; - TimeEst = newTimeEst; - TimeAct = newTimeAct; - } - return OK; - } - //------------------------------------------------------------------- public bool RefreshRequiredDate(List requirements, ISacsMessageConsole messageConsole) { diff --git a/SaBusMgrStandardBase/Base/Consoles/SbmCoreInstanceConsole.cs b/SaBusMgrStandardBase/Base/Consoles/SbmCoreInstanceConsole.cs index e169115..add898e 100644 --- a/SaBusMgrStandardBase/Base/Consoles/SbmCoreInstanceConsole.cs +++ b/SaBusMgrStandardBase/Base/Consoles/SbmCoreInstanceConsole.cs @@ -610,7 +610,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles //------------------------------------------------------------------- /// - /// POpulate reference data. + /// Populate reference data. ///
- Code Types. ///
public bool PopulateReferenceData() @@ -618,15 +618,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Consoles ClearErrorState(); // Code types. - List codeTypeDfns = Internals.CodeTypeConsole.CodeTypeDefinitions; - foreach (SaCodeTypeDfn codeTypeDfn in codeTypeDfns) - { - if (Internals.CodeTypeConsole.PopulateCodeType(codeTypeDfn.Code, DbUpdateInfo)) - { - //foreach (var code in codeTypeDfn.Codes) - // Internals.CodeTypeConsole.PopulateCode(codeTypeDfn.sCode, code.Code, code.Desc); - } - } + String codeTypePopulationErrorMessage = ""; + if (!Internals.CodeTypeConsole.Populate(DbUpdateInfo)) + codeTypePopulationErrorMessage = Internals.CodeTypeConsole.ErrorStateMessage; return OK; } diff --git a/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Requirement.cs b/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Requirement.cs index 9bd9307..1f0bbdd 100644 --- a/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Requirement.cs +++ b/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Requirement.cs @@ -86,7 +86,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr ClearErrorState(); if (!SysId.IsValid(id)) return false; SbmRequirement.Params prmRequirement = new SbmRequirement.Params(); - prmRequirement.RequirementIdsIncluded.Add(id); + prmRequirement.IdsIncluded.Add(id); prmRequirement.StatusCat = SbmRequirement.StatusCat.Any; return GetRequirementCount(prmRequirement) == 1; } @@ -102,7 +102,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr ClearErrorState(); if (!SysId.IsValid(id)) return null; SbmRequirement.Params prmRequirement = new SbmRequirement.Params(); - prmRequirement.RequirementIdsIncluded.Add(id); + prmRequirement.IdsIncluded.Add(id); prmRequirement.StatusCat = SbmRequirement.StatusCat.Any; return GetRequirement(prmRequirement); } diff --git a/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Transaction.cs b/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Transaction.cs index 3079095..2e9f938 100644 --- a/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Transaction.cs +++ b/SaBusMgrStandardBase/Base/Mgr/SbmTransactionMgr_Transaction.cs @@ -25,25 +25,8 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr public abstract bool TransactionIsReadOnly(SbmTransaction transaction); public abstract bool TransactionDetailsAreReadOnly(SbmTransaction transaction); - public abstract bool RefreshTransactionTotals(SbmTransaction transaction, IEnumerable requirements); - - // Labour cost. - public abstract decimal GetTransCostLabourRateHourDefault(); - public abstract decimal GetTransCostLabourRateHour(SysId transactionId); - public abstract bool DeliveryFinancialsAreAvailable(); - - /// Change Transaction Association. - public abstract bool ChangeTransactionsAssociation(SbmTransaction transaction, SysId associationId); - - /// - /// Refresh associated data: - /// - Refresh Stock Allocations. - /// - - /// - - /// - - /// - public abstract bool RefreshAssociatedData(SbmTransaction transaction, List requirements, DbUpdateInfo dbUpdateInfo); - public abstract bool RefreshAssociatedTransactions(SbmTransaction transaction, List requirements, DbUpdateInfo dbUpdateInfo); + // Transaction properties. + public abstract Sbm.TransactionType GetTransactionType(SysId transactionId); public DateTime GetTransactionTaxEffectiveDate(SbmTransaction transaction) { @@ -62,6 +45,24 @@ namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr return DateTime.Today; } + // Labour cost. + public abstract decimal GetTransCostLabourRateHourDefault(); + public abstract decimal GetTransCostLabourRateHour(SysId transactionId); + public abstract bool DeliveryFinancialsAreAvailable(); + + /// Change Transaction Association. + public abstract bool ChangeTransactionsAssociation(SbmTransaction transaction, SysId associationId); + + public abstract bool RefreshTransactionTotals(SbmTransaction transaction, IEnumerable requirements); + + /// + /// Refresh associated data: + /// - Refresh Stock Allocations. + /// - Refresh totals. + /// + public abstract bool RefreshAssociatedData(SbmTransaction transaction, List requirements, DbUpdateInfo dbUpdateInfo); + public abstract bool RefreshAssociatedTransactions(SbmTransaction transaction, List requirements, DbUpdateInfo dbUpdateInfo); + //------------------------------------------------------------------- // Associated data. public abstract bool TransactionIsReferencedByOtherTransactions(SysId transactionId/*, Sbm.TransactionStatusCat transactionStatusCat*/); diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs index ca13f5b..e0ab5fd 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmAccountMgr_Dbas-Affiliate.cs @@ -739,14 +739,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr String searchValue = DbQuery.FormatForLike(StringUtil.TrimAll(rawSearchValue)); if (StringUtil.IsEmpty(searchValue)) continue; List searchValueFilter = new List(); - searchValueFilter.Add(colAffiliate_Name + " LIKE '%" + searchValue + "%'"); - searchValueFilter.Add(colAffiliate_FirstName + " LIKE '%" + searchValue + "%'"); - searchValueFilter.Add(colAffiliate_LastName + " LIKE '%" + searchValue + "%'"); - searchValueFilter.Add(colAffiliate_PhoneMain + " LIKE '%" + searchValue + "%'"); - searchValueFilter.Add(colAffiliate_PhoneAlt + " LIKE '%" + searchValue + "%'"); - searchValueFilter.Add(colAffiliate_Website + " LIKE '%" + searchValue + "%'"); - searchValueFilter.Add(colAffiliate_Email + " LIKE '%" + searchValue + "%'"); - searchValueFilter.Add(colAffiliate_Notes + " LIKE '%" + searchValue + "%'"); + searchValueFilter.Add($"{colAffiliate_Name} LIKE '%{searchValue}%'"); + searchValueFilter.Add($"{colAffiliate_FirstName} LIKE '%{searchValue}%'"); + searchValueFilter.Add($"{colAffiliate_LastName} LIKE '%{searchValue}%'"); + searchValueFilter.Add($"{colAffiliate_PhoneMain} LIKE '%{searchValue}%'"); + searchValueFilter.Add($"{colAffiliate_PhoneAlt} LIKE '%{searchValue}%'"); + searchValueFilter.Add($"{colAffiliate_Website} LIKE '%{searchValue}%'"); + searchValueFilter.Add($"{colAffiliate_Email} LIKE '%{searchValue}%'"); + searchValueFilter.Add($"{colAffiliate_Notes} LIKE '%{searchValue}%'"); searchFilter.Add(searchValueFilter.Concat(" OR ", "(", ")")); } if (searchFilter.Any()) filter.AddRange(searchFilter); @@ -755,7 +755,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //--------------------------------------------------------------- // Name. if (!StringUtil.IsEmpty(prm.Name)) - filter.Add(colAffiliate_Name + "='" + DbQuery.FormatForCondition(prm.Name) + "'"); + filter.Add(colAffiliate_Name + " ='" + DbQuery.FormatForCondition(prm.Name) + "'"); // Partial Name with FirstName & LastName. if (!StringUtil.IsEmpty(prm.NamePartial)) filter.Add(colAffiliate_Name + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%' OR " + colAffiliate_FirstName + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%' OR " + colAffiliate_LastName + " LIKE '%" + DbQuery.FormatForLike(prm.NamePartial) + "%'"); @@ -853,42 +853,37 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (SysId.IsValid(prm.AffiliateIdAssocOwner)) { // Restrict to affiliates that are the target of an association with the specified owner. - subFilter = colAffiliate_Id + "=" + colAssociation_AffTarget + " AND " + colAssociation_AffOwner + "=" + prm.AffiliateIdAssocOwner.ToString(); + subFilter = $"{colAffiliate_Id}={colAssociation_AffTarget} AND {colAssociation_AffOwner}={SysId.ToInt(prm.AffiliateIdAssocOwner)}"; } else if (SysId.IsValid(prm.AffiliateIdAssocTarget)) { // Restrict to affiliates that are the owner of an association with the specified target. - subFilter = colAffiliate_Id + "=" + colAssociation_AffOwner + " AND " + colAssociation_AffTarget + "=" + prm.AffiliateIdAssocTarget.ToString(); + subFilter = $"{colAffiliate_Id}={colAssociation_AffOwner} AND {colAssociation_AffTarget}={SysId.ToInt(prm.AffiliateIdAssocTarget)}"; } - else if (prm.AssociationType > 0) - { - // Restrict to affiliates that have an association of the specified type. - subFilter = colAffiliate_Id + "=" + colAssociation_AffOwner + " OR " + colAffiliate_Id + "=" + colAssociation_AffTarget; - } - else if (prm.AssociationTypeExclude > 0) + else if (prm.AssociationType > 0 || prm.AssociationTypeExclude > 0) { // Restrict to affiliates that don't have an association of the specified type. - subFilter = colAffiliate_Id + "=" + colAssociation_AffOwner + " OR " + colAffiliate_Id + "=" + colAssociation_AffTarget; + subFilter = $"({colAffiliate_Id}={colAssociation_AffOwner} OR {colAffiliate_Id}={colAssociation_AffTarget})"; } // Restrict to associations of the specified type. if (prm.AssociationType > 0) - subFilter += " AND " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffAssocRef) + "=" + ((int)prm.AssociationType).ToString(); + subFilter += $" AND {SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffAssocRef)}={(int)prm.AssociationType}"; // Exclude associations of the specified type: if (prm.AssociationTypeExclude > 0) - subFilter += " AND " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffAssocRef) + "<>" + prm.AssociationTypeExclude.ToString(); + subFilter += $" AND {SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, aliasAffAssocRef)}<>{(int)prm.AssociationTypeExclude}"; // Should these associations also be retricted to those that are 'supervisory': if (prm.TargetSupervised != SbmAffiliate.Params.Supervised.Any) { bool superMatch = prm.TargetSupervised == SbmAffiliate.Params.Supervised.Yes; - subFilter += " AND " + GetFlagFilter(SbmAssociation.Flag_Supervised, superMatch, aliasAffAssocRef); + subFilter += $" AND {GetFlagFilter(SbmAssociation.Flag_Supervised, superMatch, aliasAffAssocRef)}"; } DbQuery qryAssociationTarget = new DbQuery(Database.DbmsType); qryAssociationTarget.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasAffAssocRef); qryAssociationTarget.Columns.Add(colAssociation_Id); qryAssociationTarget.Filters.Add(subFilter); - if (!DateUtil.IsValid(prm.AssociationEffectiveOn)) + if (DateUtil.IsValid(prm.AssociationEffectiveOn)) { // NB 'Association.Terminated' column is a long value (not a date). String colAssociation_Terminated = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Terminated, aliasAffAssocRef); diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs index d646168..0ec4ad5 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Requirement.cs @@ -16,6 +16,7 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Text.RegularExpressions; using System.Transactions; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr @@ -775,6 +776,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr requirement.QuantityProd = (decimal)dbRequirement._QuantityProd; requirement.UomId = new SysId(dbRequirement._UomId ?? 0); requirement.MaterialSourceCode = dbRequirement._MaterialSourceCode; + requirement.AmountUnit = (decimal)dbRequirement._AmountUnit; + requirement.AmountAct = (decimal)dbRequirement._AmountAct; + requirement.AmountDisc = (decimal)dbRequirement._AmountDisc; requirement.AmountNet = (decimal)dbRequirement._AmountNet; requirement.TaxCodeId = new SysId(dbRequirement._TaxCodeId ?? 0); requirement.TaxRate = (decimal)dbRequirement._TaxRate; @@ -910,7 +914,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr case SbmRequirement.Column.TransId: SetRequirementColDfn(columnDfn, "Trans Id", 80, SbmDbDfn.ColumnIdx.Requirement_TransId, ColumnAlignment.Right, DataValue.DataType.Long); break; - case SbmRequirement.Column.Seq: + case SbmRequirement.Column.Type: + SetRequirementColDfn(columnDfn, "Type", 50, SbmDbDfn.ColumnIdx.Requirement_Type, ColumnAlignment.Center, DataValue.DataType.Long); + break; + case SbmRequirement.Column.Sequence: SetRequirementColDfn(columnDfn, "Seq", 50, SbmDbDfn.ColumnIdx.Requirement_Seq, ColumnAlignment.Right, DataValue.DataType.String); break; case SbmRequirement.Column.Started: @@ -1215,6 +1222,9 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr break; //----------------------------------------------------------------- // Transaction details. + case SbmRequirement.Column.Trans_Type: + SetRequirementColDfn(columnDfn, "Trans type", 70, SbmDbDfn.ColumnIdx.Transaction_Type, ColumnAlignment.Center, DataValue.DataType.Long, aliasRequirement_Transaction, prefixRequirement_Transaction); + break; case SbmRequirement.Column.Trans_TypeDesc: SetRequirementColDfn(columnDfn, "Trans type", 70, SbmDbDfn.ColumnIdx.Transaction_Type, ColumnAlignment.Left, DataValue.DataType.String, aliasRequirement_Transaction, prefixRequirement_Transaction); break; @@ -1934,15 +1944,33 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //--------------------------------------------------------------- // Validate the parameters. #if DEBUG - if (!SysId.IsValid(AffiliateId_Owner) && !SysId.IsValid(prm.AssociationId) && !SysId.IsValid(prm.CommodityId) && !SysId.IsValid(prm.TransactionRequirementSourceId) && !prm.TransactionIdsIncluded.HasValidIds() && !prm.RequirementIdsIncluded.HasValidIds() && !prm.RequirementIdsSource.HasValidIds()) - SaLogger.Trace("\t### " + GetType().Name + ".GetRequirementQueryFilter - Owner/association/transaction not specified."); + if (!SysId.IsValid(AffiliateId_Owner) && !SysId.IsValid(prm.AssociationId) && !SysId.IsValid(prm.CommodityId) && !SysId.IsValid(prm.TransactionRequirementSourceId) && !prm.TransactionIdsIncluded.HasValidIds() && !prm.IdsIncluded.HasValidIds() && !prm.RequirementIdsSource.HasValidIds()) + SaLogger.Debug($"{SysUtil.Fn} ### Owner/association/transaction not specified."); #endif //--------------------------------------------------------------- // Affiliate Owner - only need to be filtered if no significant Ids specified. - bool filterByOwner = !SysId.IsValid(prm.AssociationId) && !SysId.IsValid(prm.CommodityId) && !SysId.IsValid(prm.TransactionRequirementSourceId) && !prm.TransactionIdsIncluded.HasValidIds() && !prm.RequirementIdsIncluded.HasValidIds() && !prm.RequirementIdsSource.HasValidIds(); + bool filterByOwner = + !SysId.IsValid(prm.AssociationId) && !SysId.IsValid(prm.CommodityId) && + !SysId.IsValid(prm.TransactionRequirementSourceId) && !prm.TransactionIdsIncluded.HasValidIds() && + !prm.IdsIncluded.HasValidIds() && !prm.RequirementIdsSource.HasValidIds(); if (filterByOwner) - filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_AffIdOwner, tableAlias, false) + "=" + SysId.ToString(AffiliateId_Owner)); + filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_AffIdOwner, tableAlias, false)}={SysId.ToLong(AffiliateId_Owner)}"); + + //--------------------------------------------------------------- + // Requirement. + + // Requirement Id. + String colRequirement_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, tableAlias); + if (prm.IdsIncluded.HasValidIds()) + filter.Add($"{colRequirement_Id} IN ({prm.IdsIncluded.Concat(",")})"); + if (prm.IdsExcluded.HasValidIds()) + filter.Add($"{colRequirement_Id} NOT IN ({prm.IdsExcluded.Concat(",")})"); + + // Source Requirement. + String colRequirement_ReqntIdSource = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ReqntIdSource, tableAlias, false); + if (prm.RequirementIdsSource.HasValidIds()) + filter.Add($"{colRequirement_ReqntIdSource} IN ({prm.RequirementIdsSource.Concat(",")})"); //--------------------------------------------------------------- // Association Details. @@ -2048,20 +2076,6 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } //--------------------------------------------------------------- - // Requirement Details: - // IncludeIds & ExcludeIds. - String includedIds = prm.RequirementIdsIncluded.Concat(","); - String colRequirement_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, tableAlias); - if (!StringUtil.IsEmpty(includedIds)) - filter.Add(colRequirement_Id + " IN (" + includedIds + ")"); - String excludedIds = prm.RequirementIdsExcluded.Concat(","); - if (!StringUtil.IsEmpty(excludedIds)) - filter.Add(colRequirement_Id + " NOT IN (" + excludedIds + ")"); - - // Source Requirement. - String colRequirement_ReqntIdSource = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ReqntIdSource, tableAlias, false); - if (prm.RequirementIdsSource.HasValidIds()) - filter.Add(colRequirement_ReqntIdSource + " IN (" + prm.RequirementIdsSource.Concat(",") + ")"); // Source Requirment Transaction. if (SysId.IsValid(prm.TransactionRequirementSourceId)) @@ -2078,15 +2092,45 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr filter.Add("EXISTS(" + qryTrans.BuildQuery() + ")"); } + String colRequirement_JobNumber = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_JobNumber, tableAlias, false); + String colRequirement_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_DescBrief, tableAlias, false); + String colRequirement_ProductCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ProductCode, tableAlias, false); + String colRequirement_Notes = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Notes, tableAlias, false); + + // Generic Search. + if (!StringUtil.IsBlank(prm.Search)) + { + foreach (String search in Regex.Split(prm.Search, "[\\s,;\\-+]+")) + { + if (StringUtil.IsBlank(search)) continue; + String searchForLike = DbQuery.FormatForLike(search, true); + List searchFilter = new List(); + searchFilter.Add($"{colRequirement_JobNumber} LIKE '%{searchForLike}%'"); + searchFilter.Add($"{colRequirement_DescBrief} LIKE '%{searchForLike}%'"); + searchFilter.Add($"{colRequirement_ProductCode} LIKE '%{searchForLike}%'"); + searchFilter.Add($"{colRequirement_Notes} LIKE '%{searchForLike}%'"); + if (!StringUtil.IsBlank(prm.AliasTransaction)) + { + searchFilter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, prm.AliasTransaction)} LIKE '%{searchForLike}%'"); + } + if (!StringUtil.IsBlank(prm.AliasCommodity)) + { + searchFilter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Code, prm.AliasCommodity)} LIKE '%{searchForLike}%'"); + searchFilter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DescBrief, prm.AliasCommodity)} LIKE '%{searchForLike}%'"); + } + if (searchFilter.Any()) + filter.Add(searchFilter.Concat(" OR ", "(", ")")); + } + } + // Requirement DescBrief. - String reqntDescBrief = DbQuery.FormatForCondition(prm.RequirementDescBrief); - String Requirement_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_DescBrief, tableAlias, false); + String reqntDescBrief = DbQuery.FormatForCondition(prm.DescBrief); if (!reqntDescBrief.IsEmpty()) - filter.Add(DbQuery.FormatFn_Left(Requirement_DescBrief, reqntDescBrief.Length) + "='" + reqntDescBrief + "'"); + filter.Add(DbQuery.FormatFn_Left(colRequirement_DescBrief, reqntDescBrief.Length) + "='" + reqntDescBrief + "'"); // Promotion Code. - if (!StringUtil.IsEmpty(prm.RequirementPromotionCode)) - filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_PromotionCode, tableAlias, false) + "='" + DbQuery.FormatForCondition(prm.RequirementPromotionCode) + "'"); + if (!StringUtil.IsEmpty(prm.PromotionCode)) + filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_PromotionCode, tableAlias, false) + "='" + DbQuery.FormatForCondition(prm.PromotionCode) + "'"); //--------------------------------------------------------------- @@ -2096,11 +2140,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_CommodityId, tableAlias, false) + "=" + prm.CommodityId.ToString()); // Product Code. - if (!prm.RequirementProductCodeFull.IsEmpty() || !prm.RequirementProductCodePartial.IsEmpty()) + if (!prm.ProductCodeFull.IsEmpty() || !prm.ProductCodePartial.IsEmpty()) { - String reqntProductCodeFull = DbQuery.FormatForCondition(prm.RequirementProductCodeFull); - String reqntProductCodePartial = DbQuery.FormatForCondition(prm.RequirementProductCodePartial); - String colRequirement_ProductCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ProductCode, tableAlias); + String reqntProductCodeFull = DbQuery.FormatForCondition(prm.ProductCodeFull); + String reqntProductCodePartial = DbQuery.FormatForCondition(prm.ProductCodePartial); if (!reqntProductCodeFull.IsEmpty()) { filter.Add(colRequirement_ProductCode + "='" + reqntProductCodeFull + "'"); @@ -2109,7 +2152,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { if (SessionConsole != null && AllowConfigOption(Sbm.ConfigOption.CommodityPartialCodeFilter)) filter.Add(colRequirement_ProductCode + " LIKE '%" + DbQuery.FormatForLike(reqntProductCodePartial) + "%'"); - else filter.Add(DbQuery.FormatFn_Left(colRequirement_ProductCode, prm.RequirementProductCodePartial.Length) + "='" + reqntProductCodePartial + "'"); + else filter.Add(DbQuery.FormatFn_Left(colRequirement_ProductCode, prm.ProductCodePartial.Length) + "='" + reqntProductCodePartial + "'"); } } @@ -2143,15 +2186,14 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //------------------------------------------------------------------ // Project Task Code. - if (!StringUtil.IsEmpty(prm.RequirementProjectTaskCodeFull) || !StringUtil.IsEmpty(prm.RequirementProjectTaskCodePartial)) + if (!StringUtil.IsEmpty(prm.ProjectTaskCodeFull) || !StringUtil.IsEmpty(prm.ProjectTaskCodePartial)) { - String colRequirement_ProductCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_ProductCode, tableAlias, false); - if (!StringUtil.IsEmpty(prm.RequirementProjectTaskCodeFull)) - filter.Add(colRequirement_ProductCode + "='" + DbQuery.FormatForCondition(prm.RequirementProjectTaskCodeFull) + "'"); - else if (!StringUtil.IsEmpty(prm.RequirementProjectTaskCodePartial)) + if (!StringUtil.IsEmpty(prm.ProjectTaskCodeFull)) + filter.Add(colRequirement_ProductCode + "='" + DbQuery.FormatForCondition(prm.ProjectTaskCodeFull) + "'"); + else if (!StringUtil.IsEmpty(prm.ProjectTaskCodePartial)) { - String reqntProjectTaskCodePartial = DbQuery.FormatForCondition(prm.RequirementProjectTaskCodePartial); - filter.Add(DbQuery.FormatFn_Left(colRequirement_ProductCode, prm.RequirementProjectTaskCodePartial.Length) + "='" + reqntProjectTaskCodePartial + "'"); + String reqntProjectTaskCodePartial = DbQuery.FormatForCondition(prm.ProjectTaskCodePartial); + filter.Add(DbQuery.FormatFn_Left(colRequirement_ProductCode, prm.ProjectTaskCodePartial.Length) + "='" + reqntProjectTaskCodePartial + "'"); } // Force the transaction type of 'Project'. if (prm.TransactionType != Sbm.TransactionType.Project) @@ -2170,13 +2212,12 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr //--------------------------------------------------------------- // Job Number. - if (!StringUtil.IsEmpty(prm.RequirementJobNumberFull) || !StringUtil.IsEmpty(prm.RequirementJobNumberPartial)) + if (!StringUtil.IsEmpty(prm.JobNumberFull) || !StringUtil.IsEmpty(prm.JobNumberPartial)) { - String colRequirement_JobNumber = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_JobNumber, tableAlias, false); - if (!StringUtil.IsEmpty(prm.RequirementJobNumberFull)) - filter.Add(colRequirement_JobNumber + "='" + DbQuery.FormatForCondition(prm.RequirementJobNumberFull) + "'"); - else if (!StringUtil.IsEmpty(prm.RequirementJobNumberPartial)) - filter.Add(DbQuery.FormatFn_Left(colRequirement_JobNumber, prm.RequirementJobNumberPartial.Length) + "='" + DbQuery.FormatForCondition(prm.RequirementJobNumberPartial) + "'"); + if (!StringUtil.IsEmpty(prm.JobNumberFull)) + filter.Add($"{colRequirement_JobNumber}='{DbQuery.FormatForCondition(prm.JobNumberFull)}'"); + else if (!StringUtil.IsEmpty(prm.JobNumberPartial)) + filter.Add($"{colRequirement_JobNumber} Like '{DbQuery.FormatForLike(prm.JobNumberPartial)}'"); } @@ -2358,7 +2399,10 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasRequirement); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasRequirement)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasRequirement)); - if (columns.HasId(SbmRequirement.Column.Seq)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Seq, aliasRequirement)); + if (columns.HasId(SbmRequirement.Column.Type)) + query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Type, aliasRequirement)); + if (columns.HasId(SbmRequirement.Column.Sequence)) + query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Seq, aliasRequirement)); if (columns.HasId(SbmRequirement.Column.Required) || columns.HasId(SbmRequirement.Column.RequiredTime) || columns.HasId(SbmRequirement.Column.Required_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Required, aliasRequirement)); if (columns.HasId(SbmRequirement.Column.Started) || columns.HasId(SbmRequirement.Column.StartedTime) || columns.HasId(SbmRequirement.Column.Started_Day)) @@ -2385,7 +2429,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_AmountNet, aliasRequirement)); if (columns.HasId(SbmRequirement.Column.TaxCodeId)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TaxCodeId, aliasRequirement)); if (columns.HasId(SbmRequirement.Column.TaxRate)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TaxRate, aliasRequirement)); - if (columns.HasId(SbmRequirement.Column.AmountTax) || columns.HasId(SbmRequirement.Column.AmountTax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_AmountTax)); + if (columns.HasId(SbmRequirement.Column.AmountTax) || columns.HasId(SbmRequirement.Column.AmountTax_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_AmountTax, aliasRequirement)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_AmountTot, aliasRequirement)); } // Common Properties @@ -2529,6 +2573,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Transaction Details. prm.AliasTransaction = ""; bool hasTransCols = columns.HasId(SbmRequirement.Column.Trans_TypeDesc); + if (!hasTransCols) hasTransCols = columns.HasId(SbmRequirement.Column.Trans_Type); if (!hasTransCols) hasTransCols = columns.HasId(SbmRequirement.Column.Trans_Ref); if (!hasTransCols) hasTransCols = columns.HasId(SbmRequirement.Column.Trans_RefExt); if (!hasTransCols) hasTransCols = columns.HasId(SbmRequirement.Column.Trans_DescBrief); @@ -2591,7 +2636,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Add the transaction columns. List transactionCols = new List(); if (columns.HasId(SbmRequirement.Column.TransId)) transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_Id); - if (columns.HasId(SbmRequirement.Column.Trans_TypeDesc)) transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_Type); + if (columns.HasId(SbmRequirement.Column.Trans_Type) || columns.HasId(SbmRequirement.Column.Trans_TypeDesc)) transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_Type); if (columns.HasId(SbmRequirement.Column.Trans_Ref)) transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_Ref); if (columns.HasId(SbmRequirement.Column.Trans_RefExt)) transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_RefExt); if (columns.HasId(SbmRequirement.Column.Trans_DescBrief)) transactionCols.Add(SbmDbDfn.ColumnIdx.Transaction_DescBrief); @@ -3335,7 +3380,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr // Populate filter. query.Filters.AddRange(GetRequirementQueryFilter(prm)); - if (prm.RequirementIdsIncluded.Count != 1) + if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetRequirementSortColumns(prm)) diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction-Utils.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction-Utils.cs index c29dc33..b6c7615 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction-Utils.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction-Utils.cs @@ -69,16 +69,43 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr return detailsAreReadOnly; } + //------------------------------------------------------------------- + // Transaction properties. + public override Sbm.TransactionType GetTransactionType(SysId transactionId) + { + if (SysId.IsValid(transactionId)) + { + // Construct the query. + String colType = "TransType"; + DbQuery qry = new DbQuery(Database.DbmsType); + qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction)); + qry.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Type), colType); + qry.Filters.Add($"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Transaction_Id)}={SysId.ToLong(transactionId)}"); + using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery())) + { + if (dbResultSet != null && dbResultSet.NextRecord()) + { + NamedValue.Map values = dbResultSet.GetRecordValues(); + return (Sbm.TransactionType)values.GetLong(colType); + } + } + } + return Sbm.TransactionType.Unknown; + } + //------------------------------------------------------------------- public override bool RefreshTransactionTotals(SbmTransaction transaction, IEnumerable requirements) { + // Recalculate the amounts stored against the transaction in line with the list of requirements. ClearErrorState(); - if (transaction == null) return SetErrorState(ErrorMessage.InvalidStatus); + if (transaction == null) return SetErrorState(ErrorMessage.ItemNotSpecified); if (requirements == null) requirements = new List(); // Total weight. - decimal totalWeight = requirements.GetTotalWeight(Internals.GetDefaultUnitOfMeasureByCategory(SaUomCategory.Weight)?.Id); - transaction.Weight = totalWeight; + SysId uomIdWeight = transaction.UomIdWeight; + if (!SysId.IsValid(uomIdWeight)) + uomIdWeight = Internals.GetDefaultUnitOfMeasureByCategory(SaUomCategory.Weight)?.Id; + transaction.Weight = requirements.GetTotalWeight(uomIdWeight); // Set the allocation status: transaction.ClearAllocationStatus(); diff --git a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs index d895d47..bd36ecd 100644 --- a/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs +++ b/SaBusMgrStandardDbas/Dbas/Mgr/SbmTransactionMgr_Dbas-Transaction.cs @@ -136,17 +136,17 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr } // Any requirements left in the 'Not Updated' list must be new. - foreach (SbmRequirement requirementNotUpdate in requirementsNotUpdated) + foreach (SbmRequirement requirementNotUpdated in requirementsNotUpdated) { - if (requirementNotUpdate != null) + if (requirementNotUpdated != null) { - if (!SysId.IsValid(requirementNotUpdate.Id)) + if (!SysId.IsValid(requirementNotUpdated.Id)) { // Requirement does not yet exist - create it: - if (InsertRequirement(requirementNotUpdate, dbUpdateInfo)) + if (InsertRequirement(requirementNotUpdated, dbUpdateInfo)) { - if (!CommitRequirementData(requirementNotUpdate, dbUpdateInfo)) - SetErrorState("Failed to update requirement's data: " + requirementNotUpdate.ErrorStateMessage); + if (!CommitRequirementData(requirementNotUpdated, dbUpdateInfo)) + SetErrorState("Failed to update requirement's data: " + requirementNotUpdated.ErrorStateMessage); } else SetErrorState("Failed to create requirement: " + ErrorStateMessage); } @@ -178,7 +178,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr requirements = GetRequirementsForTransaction(transaction.Id); } // Refresh totals. - if (transaction.RefreshTotals(requirements)) + if (RefreshTransactionTotals(transaction, requirements)) UpdateTransaction(transaction, dbUpdateInfo); else SetErrorState(transaction.ErrorStateMessage); } @@ -217,7 +217,7 @@ namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr if (requirementsAssociation.Count > 0) { RefreshAssociatedData(transactionAssociation, null, dbUpdateInfo); - transactionAssociation.RefreshTotals(requirementsAssociation); + TransactionMgr.RefreshTransactionTotals(transactionAssociation, requirementsAssociation); UpdateTransaction(transactionAssociation, dbUpdateInfo); requirementsAssociation.Clear(); } diff --git a/SaBusinessMgrCoreWebControl/Views/Common/SelectItem.cshtml b/SaBusinessMgrCoreWebControl/Views/Common/SelectItem.cshtml index 61b397a..da8ece8 100644 --- a/SaBusinessMgrCoreWebControl/Views/Common/SelectItem.cshtml +++ b/SaBusinessMgrCoreWebControl/Views/Common/SelectItem.cshtml @@ -2,7 +2,7 @@ @inject SbmLocaliser Localiser @{ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Common/SelectItem")) return; + if (!Model.RegisterView(Html.ViewContext)) return; // Scripts. Model.AdditionalFiles_JS.Add("js/sbc-sel-itm.js"); } diff --git a/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-main.css b/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-main.css index 5954171..60b3330 100644 --- a/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-main.css +++ b/SaBusinessMgrCoreWebControl/wwwroot/css/sbc-main.css @@ -275,7 +275,7 @@ a:focus { display: none; position: absolute; - top: 7px; + top: 5px; right: 48px; min-width: 180px; z-index: 1000; diff --git a/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-db.js b/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-db.js index 8ec6f9d..b1a7292 100644 --- a/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-db.js +++ b/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-db.js @@ -96,8 +96,8 @@ let env = cd.env.init = { mode: { search: 1 }, data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} }; env.$pnl.items = $('.sbc-panel.Tables'); - env.$pnl.header = env.$pnl.items.find('.sbc-panel-header'); - env.$pnl.bgr = env.$pnl.header.find('.sbc-burger').invisible(); + env.$pnl.hdr = env.$pnl.items.find('.sbc-panel-header'); + env.$pnl.bgr = env.$pnl.hdr.find('.sbc-burger').invisible(); env.$pnl.mnu = env.$pnl.bgr.find('ul.sbc-dropdown-menu'); env.$pnl.table = env.$pnl.items.find('.sbc-panel-item-table'); env.$pnl.msgs = env.$pnl.table.find('.sbc-panel-messages'); diff --git a/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-sch.js b/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-sch.js index 10795cd..f4b266f 100644 --- a/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-sch.js +++ b/SaBusinessMgrCoreWebControl/wwwroot/js/sbc-ins-rep-sch.js @@ -106,8 +106,8 @@ let env = { mode: { search: 1 }, data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} }; env.$pnl.items = $('.sbc-panel.Schema'); - env.$pnl.header = env.$pnl.items.find('.sbc-panel-header'); - env.$pnl.bgr = env.$pnl.header.find('.sbc-burger').invisible(); + env.$pnl.hdr = env.$pnl.items.find('.sbc-panel-header'); + env.$pnl.bgr = env.$pnl.hdr.find('.sbc-burger').invisible(); env.$pnl.mnu = env.$pnl.bgr.find('ul.sbc-dropdown-menu'); env.$frm.filter = env.$pnl.items.find('#frmSchemaFilter'); env.$frm.filter.on('change', '.FilterContext', function () { rs.refreshDbSchema(env); }); diff --git a/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx b/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx index 83ed4b9..ba8daff 100644 --- a/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx +++ b/SaBusinessMgrCoreWebPortal/Localisation/SbmPortalProperties.resx @@ -129,7 +129,7 @@ Associations - + Commodity @@ -837,4 +837,58 @@ {0} Items + + Amount unit + + + Ext ref. + + + Total amount + + + Quantity + + + Total + + + Unit amount + + + Seq + + + Populate + + + Items populated. + + + Notification + + + Error + + + Warning + + + Code len + + + Code length + + + Item + + + Discount + + + Actual amount + + + Detail desc + \ No newline at end of file diff --git a/SaBusinessMgrCoreWebPortal/Portal/App/SbmSessionData_Portal.cs b/SaBusinessMgrCoreWebPortal/Portal/App/SbmSessionData_Portal.cs index a3caad9..4c5de61 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/App/SbmSessionData_Portal.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/App/SbmSessionData_Portal.cs @@ -280,6 +280,19 @@ namespace Sarand.BusinessMgr.Web.Portal.App } /// Transaction filter properties. 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(); + } + /// ProductionControl filter properties. + public ProductionControlData ProductionControl { get; } = new ProductionControlData(); } public UserProfileData Profile { get; protected set; } = new UserProfileData(); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Consoles/SbmDemoInstanceConsole_Portal.cs b/SaBusinessMgrCoreWebPortal/Portal/Consoles/SbmDemoInstanceConsole_Portal.cs index 7303db7..2184e6d 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Consoles/SbmDemoInstanceConsole_Portal.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Consoles/SbmDemoInstanceConsole_Portal.cs @@ -410,6 +410,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles SysId affilliateIdOwner = data.AffiliateIdOrganisation; Dictionary taxCodes = Internals.GetTaxCodesEffectiveOn(DateTime.Today).ToDictionary(item => item.Code, item => item); SaTaxCode taxCodeDefault = taxCodes.Values.FirstOrDefault(item => item.Code.EqualsCI(Internals.GetDefaultTaxCode())); + Dictionary 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 { diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs index b06bf2d..1bb189e 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetCategoryController-Ajax.cs @@ -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(); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController-Ajax.cs index 919e7e6..adb10ad 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Assets/AssetController-Ajax.cs @@ -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(); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeController-Ajax.cs index 50646b9..7184b8b 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeController-Ajax.cs @@ -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 CodeTypes { get; } = new List(); public List Statuses { get; } = new List(); @@ -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(); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeTypeController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeTypeController-Ajax.cs index 145d441..e5f1ca9 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeTypeController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Codes/CodeTypeController-Ajax.cs @@ -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 CodeTypes { get; } = new List(); // Reference data. public List Statuses { get; } = new List(); @@ -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 columns = new List() { - 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(); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController-Ajax.cs index 973f76c..7f77178 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Commodities/CommodityController-Ajax.cs @@ -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(); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs index 40ae837..60978ef 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController-Ajax.cs @@ -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(); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController.cs index 3ad612d..b1d7df3 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/AssociationController.cs @@ -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; diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs index 327e695..eaaa314 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Contacts/ContactController-Ajax.cs @@ -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; diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController-Ajax.cs new file mode 100644 index 0000000..355f131 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController-Ajax.cs @@ -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 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 RequirementTypes { get; } = new List(); + public List TaxCodes { get; } = new List(); + public String taxCodeDefault { get; set; } + public List UomCats { get; } = new List(); + public List UomTypes { get; } = new List(); + public String uomTypeDefault { get; set; } + public List Uoms { get; set; } = new List(); + public List Statuses { get; } = new List(); + 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 uomCategories = SbmSystem.GetSystemCodes(Sbm.SystemCode.UnitMeasureCategory); + List 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 Requirements { get; } = new List(); + } + // 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 columns = new List() + { + 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); + } + + //------------------------------------------------------------------- + /// + /// Bring associated data into line with the transaction. + /// + /// + /// + private bool UpdateAssociatedData(SbmTransaction transaction, SbmRequirement requirement) + { + // Update transaction totals. + List 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; + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController.cs new file mode 100644 index 0000000..727b562 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Requirements/RequirementController.cs @@ -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 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); + } + + //------------------------------------------------------------------- + } + //======================================================================= +} diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController-Ajax.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController-Ajax.cs index ebd2807..a49a11c 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController-Ajax.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController-Ajax.cs @@ -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; } /// Status Cats to refresh caption with transaction count. @@ -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('.')}."); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController.cs b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController.cs index 57072db..7ba6265 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Controllers/Transactions/TransactionController.cs @@ -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 { diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Codes/Model_CodeType.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Codes/Model_CodeType.cs index c252b83..49e7e91 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Codes/Model_CodeType.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Codes/Model_CodeType.cs @@ -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"]); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs index 7ca6cab..b857ce7 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity-Config.cs @@ -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. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs index 965e344..8037ba9 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Commodities/Model_Commodity.cs @@ -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; } } diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact.cs index 419fae7..9123a0a 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Contacts/Model_Contact.cs @@ -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. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs index ce0bcdd..106680c 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement-Config.cs @@ -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 /// 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); } /// /// Populate item configuration for new or existing requirement. /// - 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. diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement.cs index 714c566..7cfcf80 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Requirements/Model_Requirement.cs @@ -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); diff --git a/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs b/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs index 634ea28..5d036fc 100644 --- a/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs +++ b/SaBusinessMgrCoreWebPortal/Portal/Models/Transactions/Model_Transaction-Config.cs @@ -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; } //------------------------------------------------------------------- diff --git a/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj b/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj index 0cb98b8..454d3fc 100644 --- a/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj +++ b/SaBusinessMgrCoreWebPortal/SaBusinessMgrCoreWebPortal.csproj @@ -80,9 +80,4 @@ - - - - - diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetDialog.cshtml index d6f357a..e17d75e 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetDialog.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetDialog.cshtml @@ -4,7 +4,7 @@ @inject SbmLocaliser Localiser @{ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Assets/Asset/Panel-AssetSelect")) return; + if (!Model.RegisterView(Html.ViewContext)) return; Model.AdditionalFiles_JS.Add("js/sbm-asset.js"); } diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetMaintain.cshtml index e6dc9ae..6b34666 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetMaintain.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetMaintain.cshtml @@ -4,7 +4,7 @@ @inject SbmLocaliser Localiser @{ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Assets/Asset/Panel-AssetMaintain")) return; + if (!Model.RegisterView(Html.ViewContext)) return; Model.AdditionalFiles_JS.Add("js/sbm-asset.js"); } diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetSelect.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetSelect.cshtml index 2390f6b..ce3c565 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetSelect.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/Asset/Panel-AssetSelect.cshtml @@ -4,7 +4,7 @@ @inject SbmLocaliser Localiser @{ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Assets/Asset/Panel-AssetSelect")) return; + if (!Model.RegisterView(Html.ViewContext)) return; Model.AdditionalFiles_JS.Add("js/sbm-asset.js"); } diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryDialog.cshtml index a3d7310..45c5f2f 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryDialog.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryDialog.cshtml @@ -4,7 +4,7 @@ @inject SbmLocaliser Localiser @{ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Assets/AssetCategory/Panel-AssetCategoryDialog")) return; + if (!Model.RegisterView(Html.ViewContext)) return; Model.AdditionalFiles_JS.Add("js/sbm-asset-cat.js"); } diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml index 856d750..aa66d2b 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategoryMaintain.cshtml @@ -4,7 +4,7 @@ @inject SbmLocaliser Localiser @{ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Assets/AssetCategory/Panel-AssetCategoryMaintain")) return; + if (!Model.RegisterView(Html.ViewContext)) return; Model.AdditionalFiles_JS.Add("js/sbm-asset-cat.js"); } diff --git a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml index 46f9bdb..e1ec063 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Assets/AssetCategory/Panel-AssetCategorySelect.cshtml @@ -4,7 +4,7 @@ @inject SbmLocaliser Localiser @{ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Assets/AssetCategory/Panel-AssetCategorySelect")) return; + if (!Model.RegisterView(Html.ViewContext)) return; Model.AdditionalFiles_JS.Add("js/sbm-asset-cat.js"); } diff --git a/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationDialog.cshtml index a03a161..b02e448 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationDialog.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Association/Panel-AssociationDialog.cshtml @@ -4,7 +4,7 @@ @{ /* Association dialog panel */ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Association/Panel-AssociationDialog")) return; + if (!Model.RegisterView(Html.ViewContext)) return; } @@ -56,6 +57,7 @@ @Localiser["label.code"] @Localiser["label.name"] @Localiser["label.codes"] + @Localiser["label.code.len"] @Localiser["label.status"] @@ -77,6 +79,7 @@
+
@@ -116,9 +119,9 @@
-
+
- @Html.TextBoxFor(model => model.CodeType.Code, new { @id = "ifCodeTypeCode", @class = "CodeTypeCode sbm-input upper", @maxlength = @Model.GetControlMaxLength(SaCodeTypeDbDfn.ColumnIdx.SaCodeType_Code) }) + @Html.TextBoxFor(model => model.CodeType.Code, new { @id = "ifCodeTypeCode", @class = "CodeTypeCode sbm-input", @maxlength = @Model.GetControlMaxLength(SaCodeTypeDbDfn.ColumnIdx.SaCodeType_Code) })
@@ -133,7 +136,7 @@
-
+
@Html.TextBoxFor(model => model.CodeType.Name, new { @id = "ifCodeTypeName", @class = "CodeTypeName sbm-input", @maxlength = @Model.GetControlMaxLength(SaCodeTypeDbDfn.ColumnIdx.SaCodeType_Name) })
@@ -142,6 +145,23 @@
+ @* Code Length *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBoxFor(model => model.CodeType.MaxCodeLength, new { @id = "ifCodeTypeCodeLength", @class = "CodeTypeCodeLength sbm-input", @readonly = true, @maxlength = 3 }) +
+
+
+
+
+ @* Status *@
@@ -150,7 +170,7 @@
-
+
diff --git a/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityDialog.cshtml index 4f09ba3..b99fc88 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityDialog.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Commodity/Panel-CommodityDialog.cshtml @@ -4,7 +4,7 @@ @{ /* Commodity - Dialog panel */ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Commodity/Panel-CommodityDialog")) return; + if (!Model.RegisterView(Html.ViewContext)) return; } + +@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmRequirementId", @class = "sbm-form" })) +{ + @Html.Hidden("Requirement.Id", "", new { @id = "", @class = "RequirementId" }) + @Html.Hidden("Requirement.DataGroups", "", new { @id = "", @class = "RequirementDataGroups" }) +} + +
+ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmRequirement", @class = "sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Requirement.Id", "", new { @id = "", @class = "RequirementId sbm-input" }) + @Html.Hidden("Requirement.Exists", "", new { @id = "", @class = "RequirementExists sbm-input" }) + @Html.Hidden("Requirement.SupersededStatusConfirmed", "", new { @id = "", @class = "SupersededStatusConfirmed sbm-input" }) +
+ + @* Commodity *@ +
+
+
+
+ +
+
+
+
+
+ @Html.Hidden("Requirement.CommodityId", "", new { @id = "", @class = "ReqntCommodityId sbm-input" }) + +
+
+
+
+
+
+
+
+
+ + @* Requirement Narrative *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.DescBrief", "", new { @id = "ifReqntDesc", @class = "ReqntDesc sbm-input sbm-auto-val", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_DescBrief) }) +
+
+
+
+
+ +
+
+ + @* Sales Unit *@ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+ +
+
+ + @* Sales Unit *@ +
+ @Html.Hidden("Requirement.SalesUomId") +
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + @* Sales Price *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.AmountUnit", "", new { @id = "ifReqntAmountUnit", @class = "ReqntAmountUnit sbm-input sbm-auto-val right sbm-format-currency", @readonly = true, @maxlength = 12 }) +
+
+
+
+
+ +
+
+ +
+
+ + @* Quantity *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.Quantity", "", new { @id = "ifReqntQuantity", @class = "ReqntQuantity sbm-input sbm-auto-val right", @maxlength = 8 }) +
+
+
+
+
+ +
+
+ + @* Actual Amount *@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.AmountAct", "", new { @id = "ifReqntAmountAct", @class = "ReqntAmountAct sbm-input sbm-auto-val right sbm-format-currency", @readonly = true, @maxlength = 12 }) +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + @* Amount Disc*@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.AmountDisc", "", new { @id = "ifReqntAmountDisc", @class = "ReqntAmountDisc sbm-input sbm-auto-val right sbm-format-currency", @readonly = true, @maxlength = 12 }) +
+
+
+
+
+ +
+
+ +
+
+ +
+
+ + @* Amount Net*@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.AmountNet", "", new { @id = "ifReqntAmountNet", @class = "ReqntAmountNet sbm-input sbm-auto-val right sbm-format-currency", @readonly = true, @maxlength = 12 }) +
+
+
+
+
+ +
+
+ +
+
+ + @* Tax *@ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ + @* Amount Tax*@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.AmountTax", "", new { @id = "ifReqntAmountTax", @class = "ReqntAmountTax sbm-input sbm-auto-val right sbm-format-currency", @readonly = true, @maxlength = 12 }) +
+
+
+
+
+ +
+
+ +
+
+ + @* Required *@ +
+
+
+
+ +
+
+
+
+
@Html.TextBox("Requirement.Required", "", new { @id = "ifRequirementRequired", @class = "RequirementRequired sbm-input sbm-calendar sbm-auto-val", @maxlen = 10 })
+
+
+
+
+
+
+ +
+
+ + @* Amount Tot*@ +
+
+
+
+ +
+
+
+
+ @Html.TextBox("Requirement.AmountTot", "", new { @id = "ifReqntAmountTot", @class = "ReqntAmountTot sbm-input sbm-auto-val right sbm-format-currency", @readonly = true, @maxlength = 12 }) +
+
+
+
+
+ +
+
+ +
+
+ + @* Requirement status *@ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+ + @* Requirement Notes *@ +
+
+
+
+ +
+
+
+
+ @Html.TextArea("Requirement.Notes", "", new { @id = "ifRequirementNotes", @class = "RequirementNotes sbm-textarea sbm-auto-val", @rows = "3", @maxlength = @Model.GetControlMaxLength(SbmDbDfn.ColumnIdx.Requirement_Notes) }) +
+
+
+
+
+ + } + +
diff --git a/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml new file mode 100644 index 0000000..4096a96 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementList.cshtml @@ -0,0 +1,74 @@ +@* View is decoupled from Requirement model as it may be included in other views, eg. Transactions. *@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Requirement - List panel */ + /* NB Can potentially appear more than once on a page. */ +} + +@* Item list *@ +
+ + + + + + + + @if (Model.UserCanViewFinancials()) + { + + + } + + + + + + + +
@Localiser["label.seq"]@Localiser["label.code"]@Localiser["label.description"]@Localiser["label.quantity"]@Localiser["label.amount.unit"]@Localiser["label.amount.net"]@Localiser["label.notes"]@Localiser["label.status"]
+
+ +@* Element templates *@ +
+ + @* List burger dropdown template - ul is ignored *@ +
    +
  • XXX
  • +
+ + @* Item row template - table is ignored. *@ + + + + + + + @if (Model.UserCanViewFinancials()) + { + + + } + + + + +
+
+ @* Burger menu *@ + +
+
+ + @* Item burger dropdown template - ul is ignored *@ +
    +
  • XXX
  • +
+ +
\ No newline at end of file diff --git a/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementMaintain.cshtml b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementMaintain.cshtml new file mode 100644 index 0000000..c3bad03 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementMaintain.cshtml @@ -0,0 +1,66 @@ +@* View is decoupled from Requirement model as it may be included in other views, eg. Transactions. *@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Requirement - Maintain panel */ + // Ensure view is only included once in page. + if (!Model.RegisterView(Html.ViewContext)) return; + Model.AdditionalFiles_JS.Add("js/sbm-req.js"); +} + +
+ + + +
+ + @* Filter form - wrap header to include paging controls. *@ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmRequirementFilter sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Filter.Mode", Model_Requirement.ViewMode.Maintain, new { @id = "" }) + + @* Header - Page caption, paging controls, actions. *@ +
+
+
+
@Localiser["label.Requirements"]
+
+ @* Burger menu *@ + +
+
+
+ + @* Filter Panel *@ +
+
+
+ @* Requirement filter - code, description etc *@ +
@Localiser["label.search"]
+
+ @Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" }) +
+
+
+
+
+
+ } + + + +
+ + + +
+ +@* Commodity panels. *@ + + diff --git a/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementSelect.cshtml b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementSelect.cshtml new file mode 100644 index 0000000..cc8a6c7 --- /dev/null +++ b/SaBusinessMgrCoreWebPortal/Views/Requirement/Panel-RequirementSelect.cshtml @@ -0,0 +1,37 @@ +@* View is decoupled from Requirement model as it may be included in other views, eg. Transactions. *@ +@model SbmModel_Portal +@inject SbmLocaliser Localiser +@{ + /* Requirement - Select panel */ + // Ensure view is only included once in page. + if (!Model.RegisterView(Html.ViewContext)) return; + Model.AdditionalFiles_JS.Add("js/sbm-req.js"); +} + + + +
+ + @using (@Html.BeginForm(FormMethod.Post, new { @id = "", @class = "frmRequirementFilter sbm-form", @onSubmit = "return false;" })) + { + @Html.Hidden("Filter.Mode", Model_Requirement.ViewMode.Search, new { @id = "", @class = "FilterMode" }) + @Html.Hidden("Filter.TransactionId", "", new { @id = "", @class = "FilterTransactionId" }) + + @* Filter Panel *@ +
+
+
+ @* Requirement filter - name etc. *@ +
@Localiser["label.search"]
+
+ @Html.TextBox("Filter.Search", "", new { @type = "search", @id = "", @class = "FilterSearch sbm-input", @maxlength = "32" }) +
+
+
+
+ } + + + +
diff --git a/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml b/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml index fb8a7fa..3aa3d9c 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Shared/_Layout.cshtml @@ -64,6 +64,8 @@ sbm.lbl.refresh = '@(Localiser.GetJavascriptText("label.refresh"))'; sbm.lbl.create = '@(Localiser.GetJavascriptText("label.create"))'; sbm.lbl.edit = '@(Localiser.GetJavascriptText("label.edit"))'; + sbm.lbl.populate = '@(Localiser.GetJavascriptText("label.populate"))'; + sbm.lbl.items = '@(Localiser.GetJavascriptText("label.items"))'; sbm.lbl.calendar = '@Localiser.GetJavascriptText("label.calendar")'; sbm.lbl.yes = '@Localiser["label.yes"]'; sbm.lbl.no = '@Localiser["label.no"]'; diff --git a/SaBusinessMgrCoreWebPortal/Views/Transaction/Panel-TransactionDialog.cshtml b/SaBusinessMgrCoreWebPortal/Views/Transaction/Panel-TransactionDialog.cshtml index 0dd4661..857ec8f 100644 --- a/SaBusinessMgrCoreWebPortal/Views/Transaction/Panel-TransactionDialog.cshtml +++ b/SaBusinessMgrCoreWebPortal/Views/Transaction/Panel-TransactionDialog.cshtml @@ -4,7 +4,7 @@ @{ /* Transaction - Dialog panel */ // Ensure view is only included once in page. - if (!Model.RegisterView("Views/Transaction/Panel-TransactionDialog")) return; + if (!Model.RegisterView(Html.ViewContext)) return; }