create activity
This commit is contained in:
parent
a234d22f5a
commit
eba3a2bdc8
15 changed files with 554 additions and 319 deletions
|
@ -17,7 +17,7 @@
|
||||||
<span class="version">@Name</span> <span class="version">@Version</span>@if(IsBeta){<span class="version">-beta</span>}
|
<span class="version">@Name</span> <span class="version">@Version</span>@if(IsBeta){<span class="version">-beta</span>}
|
||||||
@code
|
@code
|
||||||
{
|
{
|
||||||
private const string Version = "0.2.31";
|
private const string Version = "0.2.33";
|
||||||
private const string Name = "wwo";
|
private const string Name = "wwo";
|
||||||
private const bool IsBeta = true;
|
private const bool IsBeta = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
namespace Wonky.Client.Helpers;
|
namespace Wonky.Client.Helpers;
|
||||||
|
|
||||||
public static class VatUtils
|
public class VatUtils
|
||||||
{
|
{
|
||||||
// https://ec.europa.eu/taxation_customs/vies/faqvies.do#item_11
|
// https://ec.europa.eu/taxation_customs/vies/faqvies.do#item_11
|
||||||
// https://ec.europa.eu/taxation_customs/vies/
|
// https://ec.europa.eu/taxation_customs/vies/
|
||||||
|
|
||||||
public static bool ValidateFormat(string countryCode, string vatNumber)
|
public bool ValidateFormat(string countryCode, string vatNumber)
|
||||||
{
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(vatNumber) || string.IsNullOrWhiteSpace(countryCode))
|
||||||
|
return false;
|
||||||
|
|
||||||
return countryCode.ToUpperInvariant() switch
|
return countryCode.ToUpperInvariant() switch
|
||||||
{
|
{
|
||||||
"DK" => ValidateFormatDk(vatNumber),
|
"DK" => ValidateFormatDk(vatNumber),
|
||||||
|
@ -16,7 +19,7 @@ public static class VatUtils
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ValidateFormatDk(string vatNumber)
|
private bool ValidateFormatDk(string vatNumber)
|
||||||
{
|
{
|
||||||
// https://wiki.scn.sap.com/wiki/display/CRM/Denmark
|
// https://wiki.scn.sap.com/wiki/display/CRM/Denmark
|
||||||
// 8 digits 0 to 9
|
// 8 digits 0 to 9
|
||||||
|
@ -32,7 +35,7 @@ public static class VatUtils
|
||||||
return ValidateMod11(vatToCheck);
|
return ValidateMod11(vatToCheck);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ValidateFormatNo(string vatNumber)
|
private bool ValidateFormatNo(string vatNumber)
|
||||||
{
|
{
|
||||||
// https://wiki.scn.sap.com/wiki/display/CRM/Norway
|
// https://wiki.scn.sap.com/wiki/display/CRM/Norway
|
||||||
// 12 digits
|
// 12 digits
|
||||||
|
@ -45,7 +48,7 @@ public static class VatUtils
|
||||||
return long.Parse(vatToCheck) != 0 && ValidateMod11(vatNumber);
|
return long.Parse(vatToCheck) != 0 && ValidateMod11(vatNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ValidateFormatSe(string vatNumber)
|
private bool ValidateFormatSe(string vatNumber)
|
||||||
{
|
{
|
||||||
// https://wiki.scn.sap.com/wiki/display/CRM/Sweden
|
// https://wiki.scn.sap.com/wiki/display/CRM/Sweden
|
||||||
// 12 digits 0 to 9
|
// 12 digits 0 to 9
|
||||||
|
@ -70,7 +73,7 @@ public static class VatUtils
|
||||||
return $"{vatToCheck[..9]}{c10}01" == vatNumber;
|
return $"{vatToCheck[..9]}{c10}01" == vatNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ValidateMod11(string number)
|
private bool ValidateMod11(string number)
|
||||||
{
|
{
|
||||||
if (long.Parse(number) == 0)
|
if (long.Parse(number) == 0)
|
||||||
return false;
|
return false;
|
||||||
|
@ -84,7 +87,7 @@ public static class VatUtils
|
||||||
return sum % 11 == 0;
|
return sum % 11 == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static string SanitizeVatNumber(string vatNumber)
|
private string SanitizeVatNumber(string vatNumber)
|
||||||
{
|
{
|
||||||
vatNumber = vatNumber.ToUpperInvariant();
|
vatNumber = vatNumber.ToUpperInvariant();
|
||||||
return vatNumber
|
return vatNumber
|
||||||
|
@ -94,6 +97,5 @@ public static class VatUtils
|
||||||
.Replace("NO", "")
|
.Replace("NO", "")
|
||||||
.Replace("SE","")
|
.Replace("SE","")
|
||||||
.Replace("MVA", "");
|
.Replace("MVA", "");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
101
Wonky.Client/HttpRepository/ActivityHttpRepository.cs
Normal file
101
Wonky.Client/HttpRepository/ActivityHttpRepository.cs
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Affero GNU General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Affero GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Affero GNU General Public License
|
||||||
|
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||||
|
//
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net.Http.Json;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Wonky.Client.Features;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Microsoft.AspNetCore.WebUtilities;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using Wonky.Entity.Configuration;
|
||||||
|
using Wonky.Entity.DTO;
|
||||||
|
using Wonky.Entity.Requests;
|
||||||
|
|
||||||
|
namespace Wonky.Client.HttpRepository;
|
||||||
|
|
||||||
|
public class ActivityHttpRepository : IActivityHttpRepository
|
||||||
|
{
|
||||||
|
private readonly JsonSerializerOptions _options = new JsonSerializerOptions
|
||||||
|
{
|
||||||
|
PropertyNameCaseInsensitive = true
|
||||||
|
};
|
||||||
|
|
||||||
|
private readonly NavigationManager _navigation;
|
||||||
|
private ILogger<SalesItemHttpRepository> _logger;
|
||||||
|
private readonly HttpClient _client;
|
||||||
|
private readonly ApiConfig _apiConfig;
|
||||||
|
|
||||||
|
public ActivityHttpRepository(HttpClient client,
|
||||||
|
ILogger<SalesItemHttpRepository> logger,
|
||||||
|
NavigationManager navigation, IOptions<ApiConfig> configuration)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
_logger = logger;
|
||||||
|
_navigation = navigation;
|
||||||
|
_apiConfig = configuration.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<PagingResponse<DtoNgActivity>> GetActivityPaged(ActivityPagingParams pagingParameters)
|
||||||
|
{
|
||||||
|
var queryString = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
["pageNumber"] = pagingParameters.PageNumber.ToString(),
|
||||||
|
["pageSize"] = pagingParameters.PageSize.ToString(),
|
||||||
|
["orderBy"] = pagingParameters.OrderBy,
|
||||||
|
["searchColumn"] = pagingParameters.SearchColumn,
|
||||||
|
["searchTerm"] = pagingParameters.SearchTerm,
|
||||||
|
};
|
||||||
|
var response = await _client
|
||||||
|
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.ActivityEndpoint}/page", queryString));
|
||||||
|
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
|
var pagingResponse = new PagingResponse<DtoNgActivity>
|
||||||
|
{
|
||||||
|
Items = JsonSerializer.Deserialize<List<DtoNgActivity>>(content, _options),
|
||||||
|
MetaData = JsonSerializer.Deserialize<MetaData>(
|
||||||
|
response.Headers.GetValues("X-Pagination").First(), _options)
|
||||||
|
};
|
||||||
|
return pagingResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ActivityResponseView> CreateActivity(DtoNgActivity model)
|
||||||
|
{
|
||||||
|
var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityEndpoint}", model).ConfigureAwait(true);
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
var result = JsonSerializer.Deserialize<ActivityResponseView>(content);
|
||||||
|
return result!;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<DtoNgActivity> GetActivity(string id)
|
||||||
|
{
|
||||||
|
var salesItem = await _client
|
||||||
|
.GetFromJsonAsync<DtoNgActivity>($"{_apiConfig.ActivityEndpoint}/{id}").ConfigureAwait(true);
|
||||||
|
return salesItem ?? new DtoNgActivity();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<ActivityResponseView> AcceptOffer(string id)
|
||||||
|
{
|
||||||
|
var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityEndpoint}/{id}/accept", id)
|
||||||
|
.ConfigureAwait(true);
|
||||||
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
var result = JsonSerializer.Deserialize<ActivityResponseView>(content);
|
||||||
|
return result!;
|
||||||
|
}
|
||||||
|
}
|
|
@ -66,7 +66,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
|
||||||
["isHidden"] = pagingParameters.IsHidden.ToString(),
|
["isHidden"] = pagingParameters.IsHidden.ToString(),
|
||||||
["hasFolded"] = pagingParameters.HasFolded.ToString()
|
["hasFolded"] = pagingParameters.HasFolded.ToString()
|
||||||
};
|
};
|
||||||
var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CrmCompanies}/page", queryString));
|
var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CustomerEndpoint}/page", queryString));
|
||||||
|
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
|
@ -80,19 +80,19 @@ public class CompanyHttpRepository : ICompanyHttpRepository
|
||||||
|
|
||||||
public async Task<DtoNgCompany> GetCompanyByAccount(string accountNumber)
|
public async Task<DtoNgCompany> GetCompanyByAccount(string accountNumber)
|
||||||
{
|
{
|
||||||
var company = await _client.GetFromJsonAsync<DtoNgCompany>($"{_apiConfig.CrmCompanies}/account/{accountNumber}");
|
var company = await _client.GetFromJsonAsync<DtoNgCompany>($"{_apiConfig.CustomerEndpoint}/account/{accountNumber}");
|
||||||
return company ?? new DtoNgCompany();
|
return company ?? new DtoNgCompany();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<DtoNgCompany> GetCompanyById(string companyId)
|
public async Task<DtoNgCompany> GetCompanyById(string companyId)
|
||||||
{
|
{
|
||||||
var company = await _client.GetFromJsonAsync<DtoNgCompany>($"{_apiConfig.CrmCompanies}/{companyId}");
|
var company = await _client.GetFromJsonAsync<DtoNgCompany>($"{_apiConfig.CustomerEndpoint}/{companyId}");
|
||||||
return company ?? new DtoNgCompany();
|
return company ?? new DtoNgCompany();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> CreateCompany(DtoNgCompany dtoNgCompany)
|
public async Task<string> CreateCompany(DtoNgCompany dtoNgCompany)
|
||||||
{
|
{
|
||||||
var response = await _client.PostAsJsonAsync($"{_apiConfig.CrmCompanies}", dtoNgCompany);
|
var response = await _client.PostAsJsonAsync($"{_apiConfig.CustomerEndpoint}", dtoNgCompany);
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
var result = JsonSerializer.Deserialize<DtoNgCompany>(content);
|
var result = JsonSerializer.Deserialize<DtoNgCompany>(content);
|
||||||
Console.WriteLine(content);
|
Console.WriteLine(content);
|
||||||
|
@ -101,11 +101,11 @@ public class CompanyHttpRepository : ICompanyHttpRepository
|
||||||
|
|
||||||
public async Task UpdateCompany(DtoNgCompany dtoNgCompany)
|
public async Task UpdateCompany(DtoNgCompany dtoNgCompany)
|
||||||
{
|
{
|
||||||
await _client.PutAsJsonAsync($"{_apiConfig.CrmCompanies}/{dtoNgCompany.CompanyId}", dtoNgCompany);
|
await _client.PutAsJsonAsync($"{_apiConfig.CustomerEndpoint}/{dtoNgCompany.CompanyId}", dtoNgCompany);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DeleteCompany(string companyId)
|
public async Task DeleteCompany(string companyId)
|
||||||
{
|
{
|
||||||
await _client.DeleteAsync($"{_apiConfig.CrmCompanies}/{companyId}");
|
await _client.DeleteAsync($"{_apiConfig.CustomerEndpoint}/{companyId}");
|
||||||
}
|
}
|
||||||
}
|
}
|
29
Wonky.Client/HttpRepository/IActivityHttpRepository.cs
Normal file
29
Wonky.Client/HttpRepository/IActivityHttpRepository.cs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Affero GNU General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Affero GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Affero GNU General Public License
|
||||||
|
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||||
|
//
|
||||||
|
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Wonky.Client.Features;
|
||||||
|
using Wonky.Entity.DTO;
|
||||||
|
using Wonky.Entity.Requests;
|
||||||
|
|
||||||
|
namespace Wonky.Client.HttpRepository;
|
||||||
|
|
||||||
|
public interface IActivityHttpRepository
|
||||||
|
{
|
||||||
|
Task<PagingResponse<DtoNgActivity>> GetActivityPaged(ActivityPagingParams pagingParameters);
|
||||||
|
Task<DtoNgActivity> GetActivity(string id);
|
||||||
|
Task<ActivityResponseView> CreateActivity(DtoNgActivity model);
|
||||||
|
Task<ActivityResponseView> AcceptOffer(string id);
|
||||||
|
}
|
|
@ -63,7 +63,7 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository
|
||||||
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
|
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
|
||||||
};
|
};
|
||||||
var response = await _client
|
var response = await _client
|
||||||
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.PriceCatalog}/page", queryString));
|
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CatalogEndpoint}/page", queryString));
|
||||||
|
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository
|
||||||
public async Task<NgSalesItemView> GetSalesItem(string id)
|
public async Task<NgSalesItemView> GetSalesItem(string id)
|
||||||
{
|
{
|
||||||
var salesItem = await _client
|
var salesItem = await _client
|
||||||
.GetFromJsonAsync<NgSalesItemView>($"{_apiConfig.PriceCatalog}/{id}");
|
.GetFromJsonAsync<NgSalesItemView>($"{_apiConfig.CatalogEndpoint}/{id}");
|
||||||
return salesItem ?? new NgSalesItemView();
|
return salesItem ?? new NgSalesItemView();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -47,10 +47,12 @@ namespace Wonky.Client.Pages
|
||||||
private VirkRegInfo _virkRegInfo = new();
|
private VirkRegInfo _virkRegInfo = new();
|
||||||
private EditContext _createCompany;
|
private EditContext _createCompany;
|
||||||
private bool _formInvalid = true;
|
private bool _formInvalid = true;
|
||||||
|
private VatUtils _vatUtils { get; set; }
|
||||||
private string RegState { get; set; } = "";
|
private string RegState { get; set; } = "";
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
_vatUtils = new VatUtils();
|
||||||
_createCompany = new EditContext(_dtoNgCompany);
|
_createCompany = new EditContext(_dtoNgCompany);
|
||||||
_createCompany.OnFieldChanged += HandleFieldChanged;
|
_createCompany.OnFieldChanged += HandleFieldChanged;
|
||||||
|
|
||||||
|
@ -108,7 +110,7 @@ namespace Wonky.Client.Pages
|
||||||
|
|
||||||
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
|
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
|
||||||
{
|
{
|
||||||
if (!VatUtils.ValidateFormat(_dtoNgCompany.CountryCode, _dtoNgCompany.VatNumber))
|
if (!_vatUtils.ValidateFormat(_dtoNgCompany.CountryCode, _dtoNgCompany.VatNumber))
|
||||||
{
|
{
|
||||||
_formInvalid = false;
|
_formInvalid = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
using Blazored.LocalStorage;
|
||||||
using Blazored.Toast.Services;
|
using Blazored.Toast.Services;
|
||||||
using Wonky.Client.HttpInterceptors;
|
using Wonky.Client.HttpInterceptors;
|
||||||
using Wonky.Client.HttpRepository;
|
using Wonky.Client.HttpRepository;
|
||||||
|
@ -37,6 +38,7 @@ public partial class CompanyUpdate : IDisposable
|
||||||
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
|
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public VatInfoLookupService VatInfoLookupService { get; set; }
|
[Inject] public VatInfoLookupService VatInfoLookupService { get; set; }
|
||||||
|
[Inject] public ILocalStorageService StorageService { get; set; }
|
||||||
[Parameter] public string Account { get; set; } = "";
|
[Parameter] public string Account { get; set; } = "";
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
private DtoNgCompany DtoNgCompany { get; set; }
|
private DtoNgCompany DtoNgCompany { get; set; }
|
||||||
|
@ -46,9 +48,11 @@ public partial class CompanyUpdate : IDisposable
|
||||||
private DateTime LastVisit { get; set; }
|
private DateTime LastVisit { get; set; }
|
||||||
private DateTime NextVisit { get; set; }
|
private DateTime NextVisit { get; set; }
|
||||||
private string _vatState { get; set; } = "the-ugly";
|
private string _vatState { get; set; } = "the-ugly";
|
||||||
|
private VatUtils _vatUtils { get; set; }
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
_vatUtils = new VatUtils();
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
DtoNgCompany = await CompanyRepo.GetCompanyById(CompanyId);
|
DtoNgCompany = await CompanyRepo.GetCompanyById(CompanyId);
|
||||||
|
@ -56,6 +60,12 @@ public partial class CompanyUpdate : IDisposable
|
||||||
LastVisit = DateTime.Parse(DtoNgCompany.LastVisit);
|
LastVisit = DateTime.Parse(DtoNgCompany.LastVisit);
|
||||||
NextVisit = DateTime.Parse(DtoNgCompany.NextVisit);
|
NextVisit = DateTime.Parse(DtoNgCompany.NextVisit);
|
||||||
_updateCompany = new EditContext(DtoNgCompany);
|
_updateCompany = new EditContext(DtoNgCompany);
|
||||||
|
var ux = await StorageService.GetItemAsync<UserInfoView>("_xu");
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(DtoNgCompany.CountryCode))
|
||||||
|
{
|
||||||
|
DtoNgCompany.CountryCode = ux.CountryCode;
|
||||||
|
}
|
||||||
|
|
||||||
if(DtoNgCompany.HasFolded == 1)
|
if(DtoNgCompany.HasFolded == 1)
|
||||||
{
|
{
|
||||||
|
@ -63,13 +73,13 @@ public partial class CompanyUpdate : IDisposable
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_vatState = VatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber) ? "the-good" : "the-draw";
|
_vatState = _vatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber) ? "the-good" : "the-draw";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task Update()
|
private async Task Update()
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace(DtoNgCompany.VatNumber) && !VatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber))
|
if (!string.IsNullOrWhiteSpace(DtoNgCompany.VatNumber) && !_vatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber))
|
||||||
{
|
{
|
||||||
ToastService.ShowError($"CVR/VAT/ORG nummer er ugyldig.");
|
ToastService.ShowError($"CVR/VAT/ORG nummer er ugyldig.");
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
|
@ -85,7 +95,7 @@ public partial class CompanyUpdate : IDisposable
|
||||||
}
|
}
|
||||||
private async Task GetInfoFromVat(string vatNumber)
|
private async Task GetInfoFromVat(string vatNumber)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(vatNumber) || !VatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber))
|
if (string.IsNullOrWhiteSpace(vatNumber) || !_vatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber))
|
||||||
{
|
{
|
||||||
ToastService.ShowError($"CVR er ugyldigt eller mangler");
|
ToastService.ShowError($"CVR er ugyldigt eller mangler");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -38,9 +38,11 @@ public partial class CompanyView : IDisposable
|
||||||
private DtoNgCompany DtoNgCompany { get; set; } = new ();
|
private DtoNgCompany DtoNgCompany { get; set; } = new ();
|
||||||
private string _vatState { get; set; } = "the-dead";
|
private string _vatState { get; set; } = "the-dead";
|
||||||
private bool _hasFolded { get; set; }
|
private bool _hasFolded { get; set; }
|
||||||
|
private VatUtils _vatUtils { get; set; }
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
_vatUtils = new VatUtils();
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
DtoNgCompany = await CompanyRepo.GetCompanyById(CompanyId);
|
DtoNgCompany = await CompanyRepo.GetCompanyById(CompanyId);
|
||||||
|
@ -51,7 +53,7 @@ public partial class CompanyView : IDisposable
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_vatState = VatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber) ? "the-good" : "the-draw";
|
_vatState = _vatUtils.ValidateFormat(DtoNgCompany.CountryCode, DtoNgCompany.VatNumber) ? "the-good" : "the-draw";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,329 +24,354 @@
|
||||||
<h2>@_poDraft.Name</h2>
|
<h2>@_poDraft.Name</h2>
|
||||||
<EditForm EditContext="DraftContext" OnValidSubmit="CreateActivity">
|
<EditForm EditContext="DraftContext" OnValidSubmit="CreateActivity">
|
||||||
<DataAnnotationsValidator/>
|
<DataAnnotationsValidator/>
|
||||||
|
|
||||||
<div class="accordion-flush" id="crmActivity">
|
<div class="accordion-flush" id="crmActivity">
|
||||||
<div class="accordion-item">
|
<div class="accordion-item">
|
||||||
<h2 class="accordion-header" id="activityHeader">
|
<h2 class="accordion-header" id="activityHeader">
|
||||||
<button class="accordion-button bg-light" type="button"
|
<button class="accordion-button bg-light" type="button"
|
||||||
data-bs-toggle="collapse" data-bs-target="#activityBody"
|
data-bs-toggle="collapse" data-bs-target="#activityBody"
|
||||||
aria-expanded="true" aria-controls="activityBody">
|
aria-expanded="true" aria-controls="activityBody">
|
||||||
Aktivitet
|
Aktivitet
|
||||||
</button>
|
</button>
|
||||||
</h2>
|
</h2>
|
||||||
<div id="activityBody" class="accordion-collapse collapse show"
|
<div id="activityBody" class="accordion-collapse collapse show"
|
||||||
aria-labelledby="activityHeader" data-bs-parent="#crmActivity">
|
aria-labelledby="activityHeader" data-bs-parent="#crmActivity">
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
<div class="row mb-1">
|
<div class="row mb-1">
|
||||||
<label for="account" class="col-md-2 col-form-label">Konto</label>
|
<label for="account" class="col-md-2 col-form-label">Konto</label>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<InputText id="account" class="form-control" @bind-Value="_poDraft.Account" readonly/>
|
<InputText id="account" class="form-control" @bind-Value="_poDraft.Account" readonly/>
|
||||||
<ValidationMessage For="@(() => _poDraft.Account)"></ValidationMessage>
|
<ValidationMessage For="@(() => _poDraft.Account)"></ValidationMessage>
|
||||||
</div>
|
|
||||||
<label for="salesRep" class="col-md-2 col-form-label">Sælger</label>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<InputText id="salesRep" class="form-control" @bind-Value="_poDraft.SalesRep" readonly/>
|
|
||||||
<ValidationMessage For="@(() => _poDraft.SalesRep)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<label for="salesRep" class="col-md-2 col-form-label">Sælger</label>
|
||||||
<div class="row mb-1">
|
<div class="col-md-4">
|
||||||
<label for="activityType" class="col-md-2 col-form-label">Kontakt</label>
|
<InputText id="salesRep" class="form-control" @bind-Value="_poDraft.SalesRep" readonly/>
|
||||||
<div class="col-md-4">
|
<ValidationMessage For="@(() => _poDraft.SalesRep)"></ValidationMessage>
|
||||||
<select id="activityType" class="form-select" @bind-Value="@_poDraft.ActivityTypeEnum" @bind-Value:event="oninput" @onchange="CheckActivity">
|
|
||||||
<option value="" selected>VÆLG</option>
|
|
||||||
<option value="onSite">Besøg</option>
|
|
||||||
<option value="phone">Telefon</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<label for="statusType" class="col-md-2 col-form-label">Status</label>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<select id="statusType" class="form-select" @bind-Value="@_poDraft.ActivityStatusEnum" @bind-Value:event="oninput" @onchange="CheckStatus">
|
|
||||||
<option value="" selected>VÆLG</option>
|
|
||||||
<option value="order">Ordre</option>
|
|
||||||
<option value="quote">Tilbud</option>
|
|
||||||
<option value="canvas">Kanvas</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1">
|
</div>
|
||||||
<label for="activityDate" class="col-md-2 col-form-label">Dato</label>
|
|
||||||
<div class="col-md-4">
|
<div class="row mb-1">
|
||||||
<InputDate id="activityDate" class="form-control" @bind-Value="@(_poDraft.ActivityDate)"/>
|
<label for="activityType" class="col-md-2 col-form-label">Kontakt</label>
|
||||||
</div>
|
<div class="col-md-4">
|
||||||
<label for="checkDate" class="col-md-2 form-check-label">Bekræft dato?</label>
|
<select id="activityType" class="form-select" @bind-Value="@_poDraft.ActivityTypeEnum" @bind-Value:event="oninput" @onchange="CheckActivity">
|
||||||
<div class="col-md-4">
|
<option value="" selected>VÆLG</option>
|
||||||
<InputCheckbox id="checkDate" class="form-check-input" @bind-Value="@_poDraft.CheckDate" @onclick="CheckDate"/>
|
<option value="onSite">Besøg</option>
|
||||||
</div>
|
<option value="phone">Telefon</option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1">
|
<label for="statusType" class="col-md-2 col-form-label">Status</label>
|
||||||
<label for="demo" class="col-md-4 col-form-label">Demo</label>
|
<div class="col-md-4">
|
||||||
<div class="col-md-8">
|
<select id="statusType" class="form-select" @bind-Value="@_poDraft.ActivityStatusEnum" @bind-Value:event="oninput" @onchange="CheckStatus">
|
||||||
<InputText id="demo" class="form-control" @bind-Value="_poDraft.Demo"/>
|
<option value="" selected>VÆLG</option>
|
||||||
</div>
|
<option value="order">Ordre</option>
|
||||||
|
<option value="offer">Tilbud</option>
|
||||||
|
<option value="canvas">Kanvas</option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1">
|
</div>
|
||||||
<label for="referenceNumber" class="col-md-2 col-form-label">Rekvisition</label>
|
|
||||||
<div class="col-md-10">
|
<div class="row mb-1">
|
||||||
<InputText id="referenceNumber" class="form-control" @bind-Value="_poDraft.ReferenceNumber"v/>
|
<label for="vatNumber" class="col-md-2 col-form-label">Momsnr.</label>
|
||||||
<ValidationMessage For="@(() => _poDraft.ReferenceNumber)"></ValidationMessage>
|
<div class="col-md-4">
|
||||||
</div>
|
<InputText id="vatNumber" class="form-control" @bind-Value="_poDraft.VatNumber"/>
|
||||||
|
<ValidationMessage For="@(() => _poDraft.VatNumber)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1">
|
<label for="email" class="col-md-2 col-form-label">EMail</label>
|
||||||
<label for="yourRef" class="col-md-2 col-form-label">Indkøber</label>
|
<div class="col-md-4">
|
||||||
<div class="col-md-10">
|
<InputText id="email" class="form-control" @bind-Value="_poDraft.EMail"/>
|
||||||
<InputText id="yourRef" class="form-control" @bind-Value="_poDraft.YourRef"/>
|
<ValidationMessage For="@(() => _poDraft.EMail)"></ValidationMessage>
|
||||||
<ValidationMessage For="@(() => _poDraft.YourRef)"></ValidationMessage>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1">
|
</div>
|
||||||
<label for="orderMessage" class="col-md-2 col-form-label">Eksp. note</label>
|
<div class="row mb-1">
|
||||||
<div class="col-md-10">
|
<label for="activityDate" class="col-md-2 col-form-label">Dato</label>
|
||||||
<InputText id="orderMessage" class="form-control" @bind-Value="_poDraft.OrderMessage"/>
|
<div class="col-md-4">
|
||||||
<ValidationMessage For="@(() => _poDraft.OrderMessage)"></ValidationMessage>
|
<InputDate id="activityDate" class="form-control" @bind-Value="@(_poDraft.ActivityDate)"/>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row mb-1">
|
<label for="checkDate" class="col-md-2 form-check-label">Bekræft dato?</label>
|
||||||
<label for="crmNote" class="col-md-2 col-form-label">CRM note</label>
|
<div class="col-md-4">
|
||||||
<div class="col-md-10">
|
<InputCheckbox id="checkDate" class="form-check-input" @bind-Value="@_poDraft.CheckDate" @onclick="CheckDate"/>
|
||||||
<InputText id="crmNote" class="form-control" @bind-Value="_poDraft.CrmNote"/>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="demo" class="col-md-2 col-form-label">Demo</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="demo" class="form-control" @bind-Value="_poDraft.Demo"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="referenceNumber" class="col-md-2 col-form-label">Rekvisition</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="referenceNumber" class="form-control" @bind-Value="_poDraft.ReferenceNumber"v/>
|
||||||
|
<ValidationMessage For="@(() => _poDraft.ReferenceNumber)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="yourRef" class="col-md-2 col-form-label">Indkøber</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="yourRef" class="form-control" @bind-Value="_poDraft.YourRef"/>
|
||||||
|
<ValidationMessage For="@(() => _poDraft.YourRef)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="orderMessage" class="col-md-2 col-form-label">Eksp. note</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="orderMessage" class="form-control" @bind-Value="_poDraft.OrderMessage"/>
|
||||||
|
<ValidationMessage For="@(() => _poDraft.OrderMessage)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="crmNote" class="col-md-2 col-form-label">CRM note</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="crmNote" class="form-control" @bind-Value="_poDraft.CrmNote"/>
|
||||||
|
<ValidationMessage For="@(() => _poDraft.CrmNote)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="attention" class="col-md-2 col-form-label">Att.</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="attention" class="form-control" @bind-Value="_poDraft.Attention"/>
|
||||||
|
<ValidationMessage For="@(() => _poDraft.Attention)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="accordion-item">
|
|
||||||
<h2 class="accordion-header" id="catalogHeader">
|
|
||||||
<button class="accordion-button collapsed bg-light" type="button"
|
|
||||||
data-bs-toggle="collapse" data-bs-target="#catalogBody"
|
|
||||||
aria-expanded="false" aria-controls="catalogBody">
|
|
||||||
Produkt søgning
|
|
||||||
</button>
|
|
||||||
</h2>
|
|
||||||
<div id="catalogBody" class="accordion-collapse collapse"
|
|
||||||
aria-labelledby="catalogHeader" data-bs-parent="#crmActivity">
|
|
||||||
<div class="accordion-body">
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col">
|
|
||||||
<ItemGroupDropdown OnChanged="SetItemGroup"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<ItemSearchDropdown OnChanged="SetSearchCol"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<SearchPhrase OnChanged="SetSortCol"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
|
|
||||||
|
|
||||||
|
@* Leverings adresse *@
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="deliveryHeader">
|
||||||
|
<button class="accordion-button collapsed bg-light" type="button"
|
||||||
|
data-bs-toggle="collapse" data-bs-target="#deliveryBody"
|
||||||
|
aria-expanded="false" aria-controls="deliveryBody">
|
||||||
|
Leveringsadresse
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="deliveryBody" class="accordion-collapse collapse"
|
||||||
|
aria-labelledby="deliveryHeader" data-bs-parent="#crmActivity">
|
||||||
|
<div class="accordion-body">
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="dlvName" class="col-md-2 col-form-label">Lev. Navn</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvName" class="form-control" @bind-Value="_poDraft.DlvName"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="dlvAddress1" class="col-md-2 col-form-label">Lev. Adresse</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvAddress1" class="form-control" @bind-Value="_poDraft.DlvAddress"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="dlvAddress2" class="col-md-2 col-form-label">Lev. Adresse</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvAddress2" class="form-control" @bind-Value="_poDraft.DlvAddress2"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="dlvZipCode" class="col-md-2 col-form-label">Lev. Postnr</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvZipCode" class="form-control" @bind-Value="_poDraft.DlvZipCode"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
|
<label for="dlvCity" class="col-md-2 col-form-label">Lev. Bynavn</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvCity" class="form-control" @bind-Value="_poDraft.DlvCity"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* Ordder lines *@
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="catalogHeader">
|
||||||
|
<button class="accordion-button collapsed bg-light" type="button"
|
||||||
|
data-bs-toggle="collapse" data-bs-target="#catalogBody"
|
||||||
|
aria-expanded="false" aria-controls="catalogBody">
|
||||||
|
Varelinjer
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div id="catalogBody" class="accordion-collapse collapse"
|
||||||
|
aria-labelledby="catalogHeader" data-bs-parent="#crmActivity">
|
||||||
|
<div class="accordion-body">
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col">
|
||||||
|
<ItemGroupDropdown OnChanged="SetItemGroup"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<ItemSearchDropdown OnChanged="SetSearchCol"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<SearchPhrase OnChanged="SetSortCol"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if (SalesItems.Any())
|
||||||
|
{
|
||||||
|
<table class="table table-hover table-striped justify-content-center">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Navn</th>
|
||||||
|
<th scope="col" class="text-nowrap">Varenr</th>
|
||||||
|
<th scope="col" class="text-nowrap">Fork</th>
|
||||||
|
<th scope="col">Stk / Pris</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach (var item in SalesItems)
|
||||||
|
{
|
||||||
|
<tr>
|
||||||
|
<td>@item.Name</td>
|
||||||
|
<td>@item.Sku</td>
|
||||||
|
<td>@item.ShortName</td>
|
||||||
|
<td>
|
||||||
|
<ul class="list-group">
|
||||||
|
@foreach (var rate in item.Rates)
|
||||||
|
{
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-end">
|
||||||
|
<div class="text-sm-start px-2">@rate.Quantity</div>
|
||||||
|
<div class="text-sm-end">@rate.Rate</div>
|
||||||
|
<button class="btn btn-primary" @onclick="@(() => SelectItem(item.ItemId, rate.Quantity, rate.Rate))">Vælg</button>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<AppSpinner/>
|
||||||
|
}
|
||||||
|
@if (_selectedItem != null && ShowItem)
|
||||||
|
{
|
||||||
|
<div class="card mb-3 mt-3">
|
||||||
|
<div class="card-header bg-dark fw-bold text-white">Kladdelinje</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col col-md-4 fw-bold">
|
||||||
|
Varenavn
|
||||||
|
</div>
|
||||||
|
<div class="col fw-bold">
|
||||||
|
Varenr
|
||||||
|
</div>
|
||||||
|
<div class="col fw-bold">
|
||||||
|
Antal
|
||||||
|
</div>
|
||||||
|
<div class="col fw-bold">
|
||||||
|
Pris
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
Rabat
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
SAS
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col col-md-4">
|
||||||
|
@_selectedItem.Name
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
@_selectedItem.Sku
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<input type="number" class="form-control" @bind-value="@Quantity"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<input type="number" class="form-control" @bind-value="@Price"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<input type="number" class="form-control" @bind-value="@Discount"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<input type="checkbox" class="form-check" @bind-value="@Sas"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<button class="btn btn-info" @onclick="@(() => AddItem(_selectedItem))">Læg til</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@if (SalesItems.Any())
|
}
|
||||||
{
|
@* Ordrekladde *@
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
Kladdelinjer <span class="mx-2 draft-expires-msg">Global kladde (udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds / 60)m inaktivitet)</span>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
<table class="table table-hover table-striped justify-content-center">
|
<table class="table table-hover table-striped justify-content-center">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">Navn</th>
|
<th scope="col">Navn</th>
|
||||||
<th scope="col" class="text-nowrap">Varenr</th>
|
<th scope="col" class="text-nowrap">Varenr</th>
|
||||||
<th scope="col">Stk / Pris</th>
|
<th scope="col" class="text-end">Antal</th>
|
||||||
|
<th scope="col" class="text-end">Enhedspris</th>
|
||||||
|
<th scope="col" class="text-end">Linjesum</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach (var item in SalesItems)
|
@if (DraftStateProvider != null && DraftStateProvider.Draft.Items.Count > 0)
|
||||||
{
|
{
|
||||||
|
@foreach (var cItem in DraftStateProvider.Draft.Items)
|
||||||
|
{
|
||||||
|
<tr>
|
||||||
|
<td>@cItem.Item.Name</td>
|
||||||
|
<td>@cItem.Item.Sku</td>
|
||||||
|
<td class="text-end">@cItem.Quantity</td>
|
||||||
|
<td class="text-end">@cItem.Price</td>
|
||||||
|
<td class="text-end">@cItem.LineTotal</td>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" checked="@cItem.Sas" disabled/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<button class="btn btn-warning" @onclick="@(() => RemoveItem(@cItem))">Slet</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
<tr>
|
<tr>
|
||||||
<td>@item.Name</td>
|
<td></td>
|
||||||
<td>@item.Sku</td>
|
<td></td>
|
||||||
<td>
|
<td></td>
|
||||||
<ul class="list-group">
|
<td class="text-black text-end fw-bold">Total</td>
|
||||||
@foreach (var rate in item.Rates)
|
<td class="text-black text-end fw-bold">@DraftStateProvider.Draft.Total</td>
|
||||||
{
|
<td></td>
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-end">
|
|
||||||
<div class="text-sm-start px-2">@rate.Quantity</div>
|
|
||||||
<div class="text-sm-end">@rate.Rate</div>
|
|
||||||
<button class="btn btn-primary" @onclick="@(() => SelectItem(item.ItemId, rate.Quantity, rate.Rate))">Vælg</button>
|
|
||||||
</li>
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
}
|
</div>
|
||||||
else
|
<div class="card-footer">
|
||||||
{
|
<div class="row">
|
||||||
<AppSpinner/>
|
<div class="col">
|
||||||
}
|
<button class="btn btn-danger" @onclick="@DeleteDraft" disabled="@(DraftStateProvider.Draft.Items.Count == 0)">Slet kladde</button>
|
||||||
@if (_selectedItem != null && ShowItem)
|
|
||||||
{
|
|
||||||
<div class="card mb-3 mt-3">
|
|
||||||
<div class="card-header bg-dark fw-bold text-white">Kladdelinje</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col-md-4 fw-bold">
|
|
||||||
Varenavn
|
|
||||||
</div>
|
|
||||||
<div class="col fw-bold">
|
|
||||||
Varenr
|
|
||||||
</div>
|
|
||||||
<div class="col fw-bold">
|
|
||||||
Antal
|
|
||||||
</div>
|
|
||||||
<div class="col fw-bold">
|
|
||||||
Pris
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
Rabat
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
SAS
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col-md-4">
|
|
||||||
@_selectedItem.Name
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
@_selectedItem.Sku
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<input type="number" class="form-control" @bind-value="@Quantity"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<input type="number" class="form-control" @bind-value="@Price"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<input type="number" class="form-control" @bind-value="@Discount"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<input type="checkbox" class="form-check" @bind-value="@Sas"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<button class="btn btn-info" @onclick="@(() => AddItem(_selectedItem))">Læg til</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
|
||||||
@* Ordrekladde *@
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-header">
|
|
||||||
Kladdelinjer <span class="mx-2 draft-expires-msg">Global kladde (udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds / 60)m inaktivitet)</span>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<table class="table table-hover table-striped justify-content-center">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Navn</th>
|
|
||||||
<th scope="col" class="text-nowrap">Varenr</th>
|
|
||||||
<th scope="col" class="text-end">Antal</th>
|
|
||||||
<th scope="col" class="text-end">Enhedspris</th>
|
|
||||||
<th scope="col" class="text-end">Linjesum</th>
|
|
||||||
<th scope="col"> </th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@if (DraftStateProvider != null && DraftStateProvider.Draft.Items.Count > 0)
|
|
||||||
{
|
|
||||||
@foreach (var cItem in DraftStateProvider.Draft.Items)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td>@cItem.Item.Name</td>
|
|
||||||
<td>@cItem.Item.Sku</td>
|
|
||||||
<td class="text-end">@cItem.Quantity</td>
|
|
||||||
<td class="text-end">@cItem.Price</td>
|
|
||||||
<td class="text-end">@cItem.LineTotal</td>
|
|
||||||
<td><input type="checkbox" checked="@cItem.Sas" disabled/></td>
|
|
||||||
<td>
|
|
||||||
<button class="btn btn-warning" @onclick="@(() => RemoveItem(@cItem))">Slet</button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td class="text-black text-end fw-bold">Total</td>
|
|
||||||
<td class="text-black text-end fw-bold">@DraftStateProvider.Draft.Total</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="card-footer">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col">
|
|
||||||
<button class="btn btn-danger" @onclick="@DeleteDraft" disabled="@(DraftStateProvider.Draft.Items.Count == 0)">Slet kladde</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
@* Leverings adresse *@
|
|
||||||
<div class="accordion-item">
|
|
||||||
<h2 class="accordion-header" id="deliveryHeader">
|
|
||||||
<button class="accordion-button collapsed bg-light" type="button"
|
|
||||||
data-bs-toggle="collapse" data-bs-target="#deliveryBody"
|
|
||||||
aria-expanded="false" aria-controls="deliveryBody">
|
|
||||||
Leveringsadresse
|
|
||||||
</button>
|
|
||||||
</h2>
|
|
||||||
<div id="deliveryBody" class="accordion-collapse collapse"
|
|
||||||
aria-labelledby="deliveryHeader" data-bs-parent="#crmActivity">
|
|
||||||
<div class="accordion-body">
|
|
||||||
<div class="row mb-1">
|
|
||||||
<label for="dlvName" class="col-md-2 col-form-label">Lev. Navn</label>
|
|
||||||
<div class="col-md-10">
|
|
||||||
<InputText id="dlvName" class="form-control" @bind-Value="_poDraft.DlvName"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mb-1">
|
|
||||||
<label for="dlvAddress1" class="col-md-2 col-form-label">Lev. Adresse</label>
|
|
||||||
<div class="col-md-10">
|
|
||||||
<InputText id="dlvAddress1" class="form-control" @bind-Value="_poDraft.DlvAddress1"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mb-1">
|
|
||||||
<label for="dlvAddress2" class="col-md-2 col-form-label">Lev. Adresse</label>
|
|
||||||
<div class="col-md-10">
|
|
||||||
<InputText id="dlvAddress2" class="form-control" @bind-Value="_poDraft.DlvAddress2"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mb-1">
|
|
||||||
<label for="dlvZipCode" class="col-md-2 col-form-label">Lev. Postnr</label>
|
|
||||||
<div class="col-md-10">
|
|
||||||
<InputText id="dlvZipCode" class="form-control" @bind-Value="_poDraft.DlvZipCode"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mb-1">
|
|
||||||
<label for="dlvCity" class="col-md-2 col-form-label">Lev. Bynavn</label>
|
|
||||||
<div class="col-md-10">
|
|
||||||
<InputText id="dlvCity" class="form-control" @bind-Value="_poDraft.DlvCity"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mt-2 mb-2" >
|
<div class="row mt-2 mb-2">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<a class="btn btn-primary" href="/company/@NgCompany.CompanyId">Tilbage</a>
|
<a class="btn btn-primary" href="/company/@NgCompany.CompanyId">Tilbage</a>
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
@* <button type="submit" class="btn btn-success" disabled="@InvalidActivity">Gem</button> *@
|
|
||||||
<button type="submit" class="btn btn-success" disabled="@InvalidActivity">OK</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
@* <button type="submit" class="btn btn-success" disabled="@InvalidActivity">Gem</button> *@
|
||||||
|
<button type="submit" class="btn btn-success">OK</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</EditForm>
|
</EditForm>
|
||||||
}
|
}
|
|
@ -43,7 +43,7 @@ public partial class CrmActivityCreate : IDisposable
|
||||||
private List<NgSalesItemView> SalesItems { get; set; } = new();
|
private List<NgSalesItemView> SalesItems { get; set; } = new();
|
||||||
// private MetaData _meta { get; set; } = new();
|
// private MetaData _meta { get; set; } = new();
|
||||||
private Preferences _prefs { get; set; } = new();
|
private Preferences _prefs { get; set; } = new();
|
||||||
private DtoNgSalesRepActivity _poDraft { get; set; } = new();
|
private DtoNgActivity _poDraft { get; set; } = new();
|
||||||
private DtoNgCompany NgCompany = new();
|
private DtoNgCompany NgCompany = new();
|
||||||
private CatalogPagingParams _paging = new();
|
private CatalogPagingParams _paging = new();
|
||||||
private EditContext DraftContext { get; set; }
|
private EditContext DraftContext { get; set; }
|
||||||
|
@ -60,6 +60,7 @@ public partial class CrmActivityCreate : IDisposable
|
||||||
private bool InvalidCanvas { get; set; } = true;
|
private bool InvalidCanvas { get; set; } = true;
|
||||||
private bool InvalidDate { get; set; } = true;
|
private bool InvalidDate { get; set; } = true;
|
||||||
private UserInfoView Ux { get; set; } = new();
|
private UserInfoView Ux { get; set; } = new();
|
||||||
|
private VatUtils _vatUtils { get; set; }
|
||||||
|
|
||||||
protected override void OnParametersSet()
|
protected override void OnParametersSet()
|
||||||
{
|
{
|
||||||
|
@ -68,6 +69,7 @@ public partial class CrmActivityCreate : IDisposable
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
_vatUtils = new VatUtils();
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
_prefs = await UserPrefs.GetPreferences();
|
_prefs = await UserPrefs.GetPreferences();
|
||||||
|
@ -100,7 +102,7 @@ public partial class CrmActivityCreate : IDisposable
|
||||||
_poDraft.City = NgCompany.City;
|
_poDraft.City = NgCompany.City;
|
||||||
|
|
||||||
_poDraft.DlvName = NgCompany.Name;
|
_poDraft.DlvName = NgCompany.Name;
|
||||||
_poDraft.DlvAddress1 = NgCompany.Address1;
|
_poDraft.DlvAddress = NgCompany.Address1;
|
||||||
_poDraft.DlvAddress2 = NgCompany.Address2;
|
_poDraft.DlvAddress2 = NgCompany.Address2;
|
||||||
_poDraft.DlvZipCode = NgCompany.ZipCode;
|
_poDraft.DlvZipCode = NgCompany.ZipCode;
|
||||||
_poDraft.DlvCity = NgCompany.City;
|
_poDraft.DlvCity = NgCompany.City;
|
||||||
|
@ -232,14 +234,18 @@ public partial class CrmActivityCreate : IDisposable
|
||||||
{
|
{
|
||||||
_poFormInvalid = !DraftContext.Validate();
|
_poFormInvalid = !DraftContext.Validate();
|
||||||
InvalidCanvas = InvalidActivityType || InvalidDate;
|
InvalidCanvas = InvalidActivityType || InvalidDate;
|
||||||
InvalidActivity = InvalidActivityType || _poFormInvalid || DraftStateProvider.Draft.Items.Count == 0 || InvalidDate;
|
InvalidActivity = InvalidActivityType
|
||||||
|
|| _poFormInvalid
|
||||||
|
|| DraftStateProvider.Draft.Items.Count == 0
|
||||||
|
|| InvalidDate
|
||||||
|
|| (_poDraft.ActivityStatusEnum == "offer" && string.IsNullOrWhiteSpace(_poDraft.EMail));
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
|
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(_poDraft.VatNumber))
|
if (!string.IsNullOrEmpty(_poDraft.VatNumber))
|
||||||
{
|
{
|
||||||
if(!VatUtils.ValidateFormat(NgCompany.CountryCode, _poDraft.VatNumber))
|
if(!_vatUtils.ValidateFormat(NgCompany.CountryCode, _poDraft.VatNumber))
|
||||||
ToastService.ShowWarning("CVR / ORG nummer er ikke et gyldigt registreringsnummer");
|
ToastService.ShowWarning("CVR / ORG nummer er ikke et gyldigt registreringsnummer");
|
||||||
}
|
}
|
||||||
if (string.IsNullOrEmpty(_poDraft.ActivityTypeEnum))
|
if (string.IsNullOrEmpty(_poDraft.ActivityTypeEnum))
|
||||||
|
|
|
@ -17,10 +17,10 @@ namespace Wonky.Entity.Configuration;
|
||||||
public class ApiConfig
|
public class ApiConfig
|
||||||
{
|
{
|
||||||
public string BaseAddress { get; set; } = "";
|
public string BaseAddress { get; set; } = "";
|
||||||
public string CrmCompanies { get; set; } = "";
|
public string CustomerEndpoint { get; set; } = "";
|
||||||
public string PriceCatalog { get; set; } = "";
|
public string CatalogEndpoint { get; set; } = "";
|
||||||
public string KrvVariants { get; set; } = "";
|
public string KrvVariantEndpoint { get; set; } = "";
|
||||||
public string KrvProducts { get; set; } = "";
|
public string KrvProductEndpoint { get; set; } = "";
|
||||||
public string ImageUpload { get; set; } = "";
|
public string ImageUpload { get; set; } = "";
|
||||||
public string UserRegistration { get; set; } = "";
|
public string UserRegistration { get; set; } = "";
|
||||||
public string UserInfo { get; set; } = "";
|
public string UserInfo { get; set; } = "";
|
||||||
|
@ -28,4 +28,5 @@ public class ApiConfig
|
||||||
public string TokenPath { get; set; } = "";
|
public string TokenPath { get; set; } = "";
|
||||||
public string GlsTrackUrl { get; set; } = "";
|
public string GlsTrackUrl { get; set; } = "";
|
||||||
public string GlsId { get; set; } = "";
|
public string GlsId { get; set; } = "";
|
||||||
|
public string ActivityEndpoint { get; set; } = "";
|
||||||
}
|
}
|
27
Wonky.Entity/DTO/ActivityResponse.cs
Normal file
27
Wonky.Entity/DTO/ActivityResponse.cs
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Affero GNU General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Affero GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Affero GNU General Public License
|
||||||
|
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||||
|
//
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
namespace Wonky.Entity.DTO;
|
||||||
|
|
||||||
|
public class ActivityResponseView
|
||||||
|
{
|
||||||
|
public bool IsSuccessStatusCode { get; set; }
|
||||||
|
public HttpStatusCode Code { get; set; }
|
||||||
|
public string Message { get; set; } = "";
|
||||||
|
public string Id { get; set; } = "";
|
||||||
|
}
|
|
@ -17,7 +17,7 @@ using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace Wonky.Entity.DTO
|
namespace Wonky.Entity.DTO
|
||||||
{
|
{
|
||||||
public class DtoNgSalesRepActivity
|
public class DtoNgActivity
|
||||||
{
|
{
|
||||||
public string SalesHeadId { get; set; } = "";
|
public string SalesHeadId { get; set; } = "";
|
||||||
public string CompanyId { get; set; } = "";
|
public string CompanyId { get; set; } = "";
|
||||||
|
@ -45,7 +45,7 @@ namespace Wonky.Entity.DTO
|
||||||
[MaxLength(255, ErrorMessage = "Du kan højst bruge 255 tegn")] public string CrmNote { get; set; } = "";
|
[MaxLength(255, ErrorMessage = "Du kan højst bruge 255 tegn")] public string CrmNote { get; set; } = "";
|
||||||
// Delivery address form entries
|
// Delivery address form entries
|
||||||
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")] public string DlvName { get; set; } = "";
|
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")] public string DlvName { get; set; } = "";
|
||||||
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")] public string DlvAddress1 { get; set; } = "";
|
[MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")] public string DlvAddress { get; set; } = "";
|
||||||
[MaxLength(50, ErrorMessage = "Du kan højst bruge 50 tegn")] public string DlvAddress2 { get; set; } = "";
|
[MaxLength(50, ErrorMessage = "Du kan højst bruge 50 tegn")] public string DlvAddress2 { get; set; } = "";
|
||||||
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")] public string DlvZipCode { get; set; } = "";
|
[MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")] public string DlvZipCode { get; set; } = "";
|
||||||
[MaxLength(30, ErrorMessage = "Du kan højst bruge 30 tegn")] public string DlvCity { get; set; } = "";
|
[MaxLength(30, ErrorMessage = "Du kan højst bruge 30 tegn")] public string DlvCity { get; set; } = "";
|
||||||
|
|
30
Wonky.Entity/Requests/ActivityPagingParams.cs
Normal file
30
Wonky.Entity/Requests/ActivityPagingParams.cs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
// Copyright (C) 2022 FCS Frede's Computer Services.
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the Affero GNU General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// Affero GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the Affero GNU General Public License
|
||||||
|
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||||
|
//
|
||||||
|
namespace Wonky.Entity.Requests;
|
||||||
|
|
||||||
|
public class ActivityPagingParams
|
||||||
|
{
|
||||||
|
private int _pageSize = 5;
|
||||||
|
private const int MaxPageSize = 50;
|
||||||
|
public int PageNumber { get; set; } = 1;
|
||||||
|
public int PageSize
|
||||||
|
{
|
||||||
|
get => _pageSize;
|
||||||
|
set => _pageSize = (value > MaxPageSize) ? MaxPageSize : value;
|
||||||
|
}
|
||||||
|
public string SearchTerm { get; set; } = "";
|
||||||
|
public string SearchColumn { get; set; } = "name";
|
||||||
|
public string OrderBy { get; set; } = "name";
|
||||||
|
}
|
Loading…
Reference in a new issue