3.0.1.5 Refresh Transaction. Assets tidy.
This commit is contained in:
+30
-21
@@ -10,6 +10,7 @@ using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using static Sarand.BusinessMgr.Web.Portal.Models.Requirements.Model_Requirement.RequirementData;
|
||||
|
||||
namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
{
|
||||
@@ -34,8 +35,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
}
|
||||
private void PopulateAssetCategoryResponseListData(SbmModel_Portal model, AssetCategoryListData data, SbmAssetCategory assetCategory)
|
||||
{
|
||||
data.Id = SysId.ToString(assetCategory.Id);
|
||||
// Prominent properties for selecting and editing.
|
||||
data.Id = SysId.ToString(assetCategory.Id);
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.Id}", data.Id);
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.Exists}", "1");
|
||||
data.Code = assetCategory.Code;
|
||||
data.Caption = assetCategory.DescBrief;
|
||||
// Asset count.
|
||||
@@ -48,14 +51,14 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
// Asset type - populate for list ('Type' property populated with desc) and form (Type Code & Desc).
|
||||
data.TypeCode = Internals.AssetTypeCodes.GetCodeForType(assetCategory.AssetType);
|
||||
data.TypeDesc = Internals.AssetTypeCodes.GetDescForType(assetCategory.AssetType);
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.Type}", Internals.AssetTypeCodes.GetDescForType(assetCategory.AssetType));
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.Type}", Internals.AssetTypeCodes.GetCodeForType(assetCategory.AssetType));
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.TypeDesc}", Internals.AssetTypeCodes.GetDescForType(assetCategory.AssetType));
|
||||
// Asset Category properties.
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.Code}", assetCategory.Code);
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.Caption}", assetCategory.DescBrief);
|
||||
// Common properties.
|
||||
data.StatusCode = assetCategory.StatusCode;
|
||||
data.StatusDesc = assetCategory.StatusDesc;
|
||||
data.Field.Value.Add($"{Model_AssetCategory.ItemField.Status}", assetCategory.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.
|
||||
@@ -70,15 +73,20 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_AssetCategoryConfig(SbmModel_Portal model) : base(model) { }
|
||||
// Configuration.
|
||||
public Model_AssetCategory.ListConfigData Config { get; } = new Model_AssetCategory.ListConfigData();
|
||||
public Model_AssetCategory.ItemConfigData ConfigItemNew { get; } = new Model_AssetCategory.ItemConfigData();
|
||||
// Reference data.
|
||||
public List<ItemCodeDesc> AssetTypes { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> IncomeTypes { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
|
||||
public String StatusCodeDefault { get; set; }
|
||||
// Configuration data - object copied directly to env.datain script.
|
||||
public class ConfigData
|
||||
{
|
||||
// Configuration.
|
||||
public Model_AssetCategory.ListConfigData CfgList { get; } = new Model_AssetCategory.ListConfigData();
|
||||
public Model_AssetCategory.ItemConfigData CfgItemNew { get; } = new Model_AssetCategory.ItemConfigData();
|
||||
// Reference data.
|
||||
public List<ItemCodeDesc> AssetTypes { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> IncomeTypes { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
|
||||
public String StatusCodeDefault { get; set; }
|
||||
}
|
||||
public ConfigData Data { get; set; } = new ConfigData();
|
||||
}
|
||||
// Ajax request.
|
||||
[HttpPost]
|
||||
@@ -104,23 +112,23 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
private void PopulateAssetCategoryConfig(Model_AssetCategory model, AjaxResponse_AssetCategoryConfig responseData)
|
||||
{
|
||||
// Configuration.
|
||||
model.PopulateListConfig(responseData.Config);
|
||||
model.PopulateItemConfig(responseData.ConfigItemNew, null, Sbm.AssetType.Unknown);
|
||||
model.PopulateListConfig(responseData.Data.CfgList);
|
||||
model.PopulateItemConfig(responseData.Data.CfgItemNew, null, Sbm.AssetType.Unknown);
|
||||
|
||||
// Reference data - select lists.
|
||||
foreach (TypeCodeDesc assetType in GetSystemCodes(Sbm.SystemCode.AssetType))
|
||||
responseData.AssetTypes.Add(new AjaxResponse_Data.ItemCodeDesc(assetType.Code, assetType.Desc));
|
||||
responseData.Data.AssetTypes.Add(new AjaxResponse_Data.ItemCodeDesc(assetType.Code, assetType.Desc));
|
||||
foreach (TypeCodeDesc incomeType in GetSystemCodes(Sbm.SystemCode.AssetIncomeType))
|
||||
responseData.IncomeTypes.Add(new AjaxResponse_Data.ItemCodeDesc(incomeType.Code, incomeType.Desc));
|
||||
responseData.Data.IncomeTypes.Add(new AjaxResponse_Data.ItemCodeDesc(incomeType.Code, incomeType.Desc));
|
||||
|
||||
// Reference data - statuses.
|
||||
foreach (SaStatus status in SbmAssetCategory.ValidStatuses)
|
||||
{
|
||||
responseData.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
if (status != SaStatus.Deleted)
|
||||
responseData.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
responseData.Data.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
}
|
||||
responseData.StatusCodeDefault = SacsSystem.GetStatusCode(SbmAssetCategory.DefaultStatus);
|
||||
responseData.Data.StatusCodeDefault = SacsSystem.GetStatusCode(SbmAssetCategory.DefaultStatus);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -137,7 +145,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
public ushort? Maintain { get; set; }
|
||||
}
|
||||
public ModeData Mode { get; set; }
|
||||
// AssetCategory list.
|
||||
// Item list.
|
||||
public List<AssetCategoryListData> AssetCategories { get; } = new List<AssetCategoryListData>();
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
@@ -203,7 +211,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
TypeDesc = Localiser.GetAssetTypeCaption(assetType),
|
||||
StatusCode = values.GetString(colStatus.DataName),
|
||||
};
|
||||
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.Type}", Internals.AssetTypeCodes.GetDescForType(assetType));
|
||||
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.Type}", Internals.AssetTypeCodes.GetCodeForType(assetType));
|
||||
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.TypeDesc}", Internals.AssetTypeCodes.GetDescForType(assetType));
|
||||
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.Code}", assetCategoryData.Code);
|
||||
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.Caption}", assetCategoryData.Caption);
|
||||
assetCategoryData.Field.Value.Add($"{Model_AssetCategory.ItemField.Notes}", AssetMgr.GetAssetCategoryDataValue(colNotes, values).ToString());
|
||||
|
||||
@@ -35,12 +35,16 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
}
|
||||
private void PopulateAssetResponseListData(SbmModel_Portal model, AssetListData data, SbmAssetCategory assetCategory, SbmAsset asset)
|
||||
{
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.SerialNumber}", asset.SerialNumber);
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.ReferenceExt}", asset.RefExt);
|
||||
// Prominent properties for selecting and editing.
|
||||
data.Id = SysId.ToString(asset.Id);
|
||||
data.CategoryDesc = assetCategory.DescBrief;
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.Id}", data.Id);
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.Exists}", "1");
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.CategoryId}", $"{asset.AssetCategoryId}");
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.Category}", assetCategory.DescBrief);
|
||||
data.Caption = asset.DescBrief;
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.Caption}", data.Caption);
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.SerialNumber}", asset.SerialNumber);
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.ReferenceExt}", asset.RefExt);
|
||||
}
|
||||
private void PopulateAssetResponseItemData(SbmModel_Portal model, AssetItemData data, SbmAssetCategory assetCategory, SbmAsset asset)
|
||||
{
|
||||
@@ -61,7 +65,6 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
// Common properties.
|
||||
data.StatusCode = asset.StatusCode;
|
||||
data.StatusDesc = asset.StatusDesc;
|
||||
data.Field.Value.Add($"{Model_Asset.ItemField.Status}", asset.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.
|
||||
@@ -76,13 +79,18 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
{
|
||||
// Construction.
|
||||
public AjaxResponse_AssetConfig(SbmModel_Portal model) : base(model) { }
|
||||
// Configuration.
|
||||
public Model_Asset.ListConfigData Config { get; } = new Model_Asset.ListConfigData();
|
||||
public Model_Asset.ItemConfigData ConfigItemNew { get; } = new Model_Asset.ItemConfigData();
|
||||
// Reference data.
|
||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
|
||||
public String StatusCodeDefault { get; set; }
|
||||
// Configuration data - object copied directly to env.datain script.
|
||||
public class ConfigData
|
||||
{
|
||||
// Configuration.
|
||||
public Model_Asset.ListConfigData CfgList { get; } = new Model_Asset.ListConfigData();
|
||||
public Model_Asset.ItemConfigData CfgItemNew { get; } = new Model_Asset.ItemConfigData();
|
||||
// Reference data.
|
||||
public List<ItemCodeDesc> Statuses { get; } = new List<ItemCodeDesc>();
|
||||
public List<ItemCodeDesc> StatusesCreate { get; } = new List<ItemCodeDesc>();
|
||||
public String StatusCodeDefault { get; set; }
|
||||
}
|
||||
public ConfigData Data { get; set; } = new ConfigData();
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
@@ -108,17 +116,17 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Assets
|
||||
private void PopulateAssetConfig(Model_Asset model, AjaxResponse_AssetConfig responseData)
|
||||
{
|
||||
// Configuration.
|
||||
model.PopulateListConfig(responseData.Config);
|
||||
model.PopulateItemConfig(responseData.ConfigItemNew, null, Sbm.AssetType.Unknown);
|
||||
model.PopulateListConfig(responseData.Data.CfgList);
|
||||
model.PopulateItemConfig(responseData.Data.CfgItemNew, null, Sbm.AssetType.Unknown);
|
||||
|
||||
// Reference data - statuses.
|
||||
foreach (SaStatus status in SbmAsset.ValidStatuses)
|
||||
{
|
||||
responseData.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
responseData.Data.Statuses.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
if (status != SaStatus.Deleted)
|
||||
responseData.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
responseData.Data.StatusesCreate.Add(new AjaxResponse_Data.ItemCodeDesc(SacsSystem.GetStatusCode(status), Localiser.GetStatusCaption(status)));
|
||||
}
|
||||
responseData.StatusCodeDefault = SacsSystem.GetStatusCode(SbmAsset.DefaultStatus);
|
||||
responseData.Data.StatusCodeDefault = SacsSystem.GetStatusCode(SbmAsset.DefaultStatus);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
+1
-1
@@ -472,7 +472,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Requirements
|
||||
decimal unitAmount = commodity.SalesPrice;
|
||||
if (SbmTransaction.IsPurchaseType(transactionType))
|
||||
unitAmount = commodity.CostPrice;
|
||||
unitAmount = SbmRequirementHelper.Round(unitAmount, currencyDecimals);
|
||||
unitAmount = SbmRequirementHelper.RoundMoney(unitAmount, currencyDecimals);
|
||||
|
||||
// Populate response.
|
||||
responseData.Requirement.Field.Value[$"{Model_Requirement.ItemField.AmountUnit}"] = model.FormatMoneyForDisplay(unitAmount, currencyDecimals);
|
||||
|
||||
+15
-4
@@ -1,6 +1,7 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Helpers;
|
||||
using Sarand.BusinessMgr.Web.Portal.Components;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Contacts;
|
||||
using Sarand.BusinessMgr.Web.Portal.Models.Transactions;
|
||||
@@ -79,6 +80,13 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
data.Field.Value.Add($"{Model_Transaction.ItemField.InProgress}", model.FormatDateForForm(transaction.InProgress));
|
||||
data.Field.Value.Add($"{Model_Transaction.ItemField.Required}", model.FormatDateForForm(transaction.Required));
|
||||
data.Field.Value.Add($"{Model_Transaction.ItemField.Closed}", model.FormatDateForForm(transaction.Closed));
|
||||
if (model.UserCanViewFinancials())
|
||||
{
|
||||
ushort currencyDecimals = SbmTransactionHelper.GetCurrencyDecimals(Internals, transaction);
|
||||
data.Field.Value.Add($"{Model_Transaction.ItemField.AmountNet}", model.FormatMoneyForDisplay(transaction.AmountNet, currencyDecimals));
|
||||
data.Field.Value.Add($"{Model_Transaction.ItemField.AmountTax}", model.FormatMoneyForDisplay(transaction.AmountTax, currencyDecimals));
|
||||
data.Field.Value.Add($"{Model_Transaction.ItemField.AmountTotal}", model.FormatMoneyForDisplay(transaction.AmountTot, currencyDecimals));
|
||||
}
|
||||
if (dataGroups != null && dataGroups.Contains(TransactionDataGroup.Core))
|
||||
{
|
||||
// Core.
|
||||
@@ -240,6 +248,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
ColumnDfn colRef = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.Ref);
|
||||
ColumnDfn colRefExt = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RefExt);
|
||||
ColumnDfn colDescBrief = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.DescBrief);
|
||||
ColumnDfn colCurrencyId = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.CurrencyId);
|
||||
ColumnDfn colItemCount = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.ReqntCount);
|
||||
ColumnDfn colRaisedOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RaisedOn);
|
||||
ColumnDfn colRequiredOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.RequiredOn);
|
||||
@@ -254,7 +263,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
ColumnDfn colUpdatedOn = TransactionMgr.GetTransactionColumnDfn(SbmTransaction.Column.UpdateOn_Date);
|
||||
List<ColumnDfn> columns = new List<ColumnDfn>()
|
||||
{
|
||||
colId, colTargetName, colType, colRef, colRefExt, colDescBrief, colItemCount,
|
||||
colId, colTargetName, colType, colRef, colRefExt, colDescBrief, colCurrencyId, colItemCount,
|
||||
colRaisedOn, colRequiredOn, colInProgressOn, colClosedOn,
|
||||
colNotes, colStatus, colCreatedOn, colUpdatedOn
|
||||
};
|
||||
@@ -268,6 +277,8 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
{
|
||||
NamedValue.Map values = resultSet.GetRecordValues();
|
||||
Sbm.TransactionType transactionType = (Sbm.TransactionType)values.GetLong(colType.DataName);
|
||||
SysId currencyId = new SysId(values.GetLong(colCurrencyId.DataName));
|
||||
ushort currencyDecimals = Internals.GetCurrencyDecimalsById(currencyId);
|
||||
DateTime transactionRaisedOn = values.GetDate(colRaisedOn.DataName);
|
||||
DateTime transactionInProgressOn = values.GetDate(colInProgressOn.DataName);
|
||||
SaStatus transactionStatus = SacsSystem.GetStatusForCode(values.GetString(colStatus.DataName));
|
||||
@@ -294,9 +305,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Transactions
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.ClosedFmt}", model.FormatDateForDisplay(values.GetDate(colClosedOn.DataName)));
|
||||
if (model.UserCanViewFinancials())
|
||||
{
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountNet}", colAmountNet.FormatValue(values));
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountTax}", colAmountTax.FormatValue(values));
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountTotal}", colAmountTot.FormatValue(values));
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountNet}", model.FormatMoneyForDisplay(values.GetDecimal(colAmountNet.DataName), currencyDecimals));
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountTax}", model.FormatMoneyForDisplay(values.GetDecimal(colAmountTax.DataName), currencyDecimals));
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.AmountTotal}", model.FormatMoneyForDisplay(values.GetDecimal(colAmountTot.DataName), currencyDecimals));
|
||||
}
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.Notes}", TransactionMgr.GetTransactionDataValue(colNotes, values).ToString());
|
||||
transactionData.Field.Value.Add($"{Model_Transaction.ItemField.Status}", SacsSystem.GetStatusDescForCode(SacsSystem.GetStatusCode(transactionStatus)));
|
||||
|
||||
@@ -14,15 +14,17 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
/// <summary>Prefix for field names.</summary>
|
||||
public const String FieldNamePrefix = "AssetCat";
|
||||
public const String FieldNamePrefix = "Asset";
|
||||
|
||||
/// <summary>Item fields.</summary>
|
||||
public enum ItemField
|
||||
{
|
||||
// Asset properties.
|
||||
Id,
|
||||
Exists,
|
||||
// Identity.
|
||||
Category,
|
||||
CategoryId,
|
||||
SerialNumber,
|
||||
ReferenceExt,
|
||||
Caption,
|
||||
|
||||
@@ -21,8 +21,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
|
||||
{
|
||||
// AssetCategory properties.
|
||||
Id,
|
||||
Exists,
|
||||
// Identity.
|
||||
Type,
|
||||
TypeDesc,
|
||||
Code,
|
||||
Caption,
|
||||
// Defaults.
|
||||
@@ -107,7 +109,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Assets
|
||||
// List columns.
|
||||
|
||||
if (GetFilterAssetType() > 0)
|
||||
config.Column.Hide.Add($"{ItemField.Type}");
|
||||
config.Column.Hide.Add($"{ItemField.TypeDesc}");
|
||||
|
||||
// Asset Category Assets.
|
||||
if (!modeIsMaintain || !SessionConsole.AllowOption(Sbm.ConfigOption.Assets))
|
||||
|
||||
Reference in New Issue
Block a user