This commit is contained in:
Frede Hundewadt 2022-04-03 11:50:33 +02:00
parent e61318864f
commit 0a834ccda4
27 changed files with 288 additions and 66 deletions

View file

@ -30,7 +30,7 @@ namespace Wonky.Client.Components
private Confirmation _confirmation = new ();
private string _companyId = string.Empty;
private string VisitState(string nextVisit)
private static string VisitState(string nextVisit)
{
var theUgly = DateTime.Parse(nextVisit);
var theBad = theUgly.AddDays(-14);
@ -38,6 +38,7 @@ namespace Wonky.Client.Components
return "the-ugly";
return DateTime.Now >= theBad ? "the-bad" : "the-good";
}
private void CallConfirmationModal(string companyId)
{
_companyId = companyId;

View file

@ -15,7 +15,7 @@
//
*@
<img class="img-fluid float-start state rounded-circle @StateClass mx-1" src="state.png" alt="state"/>
<img class="img-fluid float-start state rounded-circle @StateClass mx-3" src="state.png" alt="state"/>
@code{
[Parameter] public string StateClass { get; set; } = "the-ugly";
}

View file

@ -22,9 +22,9 @@
<button class="btn btn-primary text-nowrap" @onclick="GetCvrData" disabled="@CvrInvalid">Vis CVR data</button>
</div>
<div class="col-md-9">
<div style="@(HideMe ? "display:none" : "display:block")">
<div class="alert @(CurrentState == "NORMAL" ? "alert-success" : "alert-warning")">
<strong>CVR status @CurrentState</strong>
<div style="@(_hideMe ? "display:none" : "display:block")">
<div class="alert @(_currentState == "NORMAL" ? "alert-success" : "alert-warning")">
<strong>CVR status @_currentState</strong>
</div>
<ul class="list-group list-group-flush small">
<li class="list-group-item">@VirkRegInfo.Name</li>
@ -34,4 +34,4 @@
</ul>
</div>
</div>
</div>
</div>

View file

@ -22,26 +22,24 @@ namespace Wonky.Client.Components;
public partial class RegInfoCompany
{
[Inject] public VirkRegistryService VirkRegistryService { get; set; }
[Inject] public VirkRegistryService VirkRegistryService { get; set; } = null!;
[Parameter] public string VatNumber { get; set; } = "";
private VirkRegInfo VirkRegInfo { get; set; } = new();
private bool HideMe = true;
private bool _hideMe = true;
private bool CvrInvalid => string.IsNullOrEmpty(VatNumber);
private VirkParams _VirkParams = new();
private string CurrentState = "UKENDT";
private readonly VirkParams _virkParams = new();
private string _currentState = "";
private async Task GetCvrData()
{
_VirkParams.VatNumber = VatNumber;
_virkParams.VatNumber = VatNumber;
if (string.IsNullOrWhiteSpace(VirkRegInfo.VatNumber))
{
var result = await VirkRegistryService.QueryVirkRegistry(_VirkParams);
var result = await VirkRegistryService.QueryVirkRegistry(_virkParams);
if (result.Any())
{
CurrentState = VirkRegInfo.States[^1].State;
_currentState = VirkRegInfo.States[^1].State;
}
}
HideMe = !HideMe;
_hideMe = !_hideMe;
}
}

View file

@ -1,4 +1,19 @@
@*
// 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]
//
*@
<EditForm EditContext="_editAddress" OnValidSubmit="SubmitForm">
<DataAnnotationsValidator/>
<div class="row">

View file

@ -1,3 +1,17 @@
// 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.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;

View file

@ -1,3 +1,19 @@
@*
// 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]
//
*@
<EditForm EditContext="_editVatNumber" OnValidSubmit="SubmitForm">
<DataAnnotationsValidator/>

View file

@ -1,3 +1,17 @@
// 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.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;

View file

@ -0,0 +1,128 @@
namespace Wonky.Client.Helpers;
public class VatUtils
{
public static bool CheckVat(string countryCode, string vatNumber)
{
return countryCode.ToUpperInvariant() switch
{
"DK" => CheckVatNumberDenmark(vatNumber),
"NO" => CheckVatNumberNorway(vatNumber),
"SE" => CheckVatNumberSweden(vatNumber),
_ => false
};
}
private static bool CheckVatNumberNorway(string vatNumber)
{
// https://wiki.scn.sap.com/wiki/display/CRM/Norway
// 12 digits
// C1..C8 random 0 to 9
// C9 Check MOD11
// C10 C11 C12 chars == MVA
return vatNumber.Length >= 9 && CheckModolus11(vatNumber.Substring(0, 8));
}
private static bool CheckVatNumberDenmark(string vatNumber)
{
// https://wiki.scn.sap.com/wiki/display/CRM/Denmark
// 8 digits 0 to 9
// C1..C7
// C8 Modulo 11 check digit
// C1 > 0
// R = (2*C1 + 7*C2 + 6*C3 + 5*C4 + 4*C5 + 3*C6 + 2*C7 + C8)
if ((int)char.GetNumericValue(vatNumber[0]) < 1 || vatNumber.Length > 8)
return false;
return CheckModolus11(vatNumber);
}
private static bool CheckVatNumberSweden(string vatNumber)
{
// https://wiki.scn.sap.com/wiki/display/CRM/Sweden
// 12 digits 0 to 9
// C1 = (10 - (R + C2 + C4 + C6 + C8) modulo 10) modulo 10
// R = S1 + S3 + S5 + S7 + S9
// Si = int(Ci/5) + (Ci*2) modulo 10)
// C11 C12 >= 01 <= 94
//
// Validate full string using Luhn algoritm
// 12 chars
if (vatNumber.Length != 12)
return false;
// validate if number
if (!int.TryParse(vatNumber, out var result))
return false;
//validate char 11 and 12
var valid = int.TryParse(vatNumber.Substring(10, 2), out var v2);
if(valid && v2 is < 1 or > 94 )
return false;
// check vatnumber
return CheckLuhn(vatNumber);
}
private static bool CheckModolus11(string number)
{
int[] factors;
switch (number.Length)
{
case 8:
factors = new [] { 2, 7, 6, 5, 4, 3, 2, 1 };
break;
case 9:
factors = new[] { 3, 2, 7, 6, 5, 4, 3, 2, 1 };
break;
case 10:
factors = new[] { 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 };
break;
default:
return false;
}
var i = 0;
var r = factors.Sum(m => (int)char.GetNumericValue(number[i++]) * m);
return r % 11 == 0;
}
private static bool CheckLuhn(string vatNumber)
{
// https://www.geeksforgeeks.org/luhn-algorithm/
var nDigits = vatNumber.Length;
var nSum = 0;
var isSecond = false;
for (var i = nDigits - 1; i >= 0; i--)
{
var d = (int)char.GetNumericValue(vatNumber[i]) - '0';
if (isSecond)
d *= 2;
// We add two digits to handle
// cases that make two digits
// after doubling
nSum += d / 10;
nSum += d % 10;
isSecond = !isSecond;
}
return (nSum % 10 == 0);
}
private static string AddSelfCheckDigit(string number)
{
// modulus 11
var multi = number.Length;
var sum = 0;
for (int i = number.Length - 1, multiplier = 2; i >= 0; i--)
{
sum += (int)char.GetNumericValue(number[i]) * multiplier;
if (++multiplier == multi) multiplier = 2;
}
var validator = (11 - (sum % 11)).ToString();
validator = validator switch
{
"11" => "0",
"10" => "X",
_ => validator
};
return number + validator;
}
}

View file

@ -54,7 +54,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
_apiConfig = apiConfig.Value;
}
public async Task<PagingResponse<CompanyDto>> GetCompaniesPaged(PagingParams pagingParameters)
public async Task<PagingResponse<CompanyDto>> GetCompaniesPaged(CompanyPagingParams pagingParameters)
{
var queryString = new Dictionary<string, string>
{
@ -62,40 +62,37 @@ public class CompanyHttpRepository : ICompanyHttpRepository
["pageSize"] = pagingParameters.PageSize.ToString(),
["searchTerm"] = pagingParameters.SearchTerm,
["searchColumn"] = pagingParameters.SearchColumn,
["orderBy"] = pagingParameters.OrderBy
["orderBy"] = pagingParameters.OrderBy,
["isHidden"] = pagingParameters.IsHidden.ToString(),
["hasFolder"] = pagingParameters.HasFolded.ToString()
};
var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CrmCompanies}/page", queryString));
var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CrmCompanies}/page", queryString));
var content = await response.Content.ReadAsStringAsync();
var pagingResponse = new PagingResponse<CompanyDto>
{
Items = JsonSerializer.Deserialize<List<CompanyDto>>(content, _options),
MetaData = JsonSerializer.Deserialize<MetaData>(
response.Headers.GetValues("X-Pagination").First(), _options)
MetaData = JsonSerializer.Deserialize<MetaData>(response.Headers.GetValues("X-Pagination").First(), _options)
};
return pagingResponse;
}
public async Task<CompanyDto> GetCompanyByAccount(string accountNumber)
{
var company = await _client.GetFromJsonAsync<CompanyDto>(
$"{_apiConfig.CrmCompanies}/account/{accountNumber}");
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CrmCompanies}/account/{accountNumber}");
return company ?? new CompanyDto();
}
public async Task<CompanyDto> GetCompanyById(string companyId)
{
var company = await _client.GetFromJsonAsync<CompanyDto>(
$"{_apiConfig.CrmCompanies}{companyId}");
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CrmCompanies}/{companyId}");
return company ?? new CompanyDto();
}
public async Task<string> CreateCompany(CompanyDto companyDto)
{
var response = await _client.PostAsJsonAsync(
$"{_apiConfig.CrmCompanies}", companyDto);
var response = await _client.PostAsJsonAsync($"{_apiConfig.CrmCompanies}", companyDto);
var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<CompanyDto>(content);
return result.CompanyId;
@ -103,13 +100,11 @@ public class CompanyHttpRepository : ICompanyHttpRepository
public async Task UpdateCompany(CompanyDto companyDto)
{
await _client.PutAsJsonAsync(
$"{_apiConfig.CrmCompanies}/{companyDto.CompanyId}", companyDto);
await _client.PutAsJsonAsync($"{_apiConfig.CrmCompanies}/{companyDto.CompanyId}", companyDto);
}
public async Task DeleteCompany(string companyId)
{
await _client.DeleteAsync(
$"{_apiConfig.CrmCompanies}/{companyId}");
await _client.DeleteAsync($"{_apiConfig.CrmCompanies}/{companyId}");
}
}

View file

@ -22,7 +22,7 @@ namespace Wonky.Client.HttpRepository;
public interface ICompanyHttpRepository
{
Task<PagingResponse<CompanyDto>> GetCompaniesPaged(PagingParams pagingParameters);
Task<PagingResponse<CompanyDto>> GetCompaniesPaged(CompanyPagingParams pagingParameters);
Task<CompanyDto> GetCompanyByAccount(string accountNumber);
Task<CompanyDto> GetCompanyById(string companyId);
Task<string> CreateCompany(CompanyDto companyDto);

View file

@ -22,6 +22,6 @@ namespace Wonky.Client.HttpRepository;
public interface ISalesItemHttpRepository
{
Task<PagingResponse<SalesItemDto>> GetSalesItemsPaged(PagingParams pagingParameters);
Task<PagingResponse<SalesItemDto>> GetSalesItemsPaged(CatalogPagingParams pagingParameters);
Task<SalesItemDto> GetSalesItem(string id);
}

View file

@ -51,16 +51,16 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository
_apiConfig = configuration.Value;
}
public async Task<PagingResponse<SalesItemDto>> GetSalesItemsPaged(PagingParams pagingParameters)
public async Task<PagingResponse<SalesItemDto>> GetSalesItemsPaged(CatalogPagingParams pagingParameters)
{
var queryString = new Dictionary<string, string>
{
["pageNumber"] = pagingParameters.PageNumber.ToString(),
["pageSize"] = pagingParameters.PageSize.ToString(),
["searchTerm"] = pagingParameters.SearchTerm,
["searchColumn"] = pagingParameters.SearchColumn,
["orderBy"] = pagingParameters.OrderBy,
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup
["searchColumn"] = pagingParameters.SearchColumn,
["searchTerm"] = pagingParameters.SearchTerm,
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
};
var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.PriceCatalog}/page", queryString));

View file

@ -30,7 +30,7 @@ namespace Wonky.Client.Pages
{
public List<CompanyDto>? Companies { get; set; } = new();
public MetaData? MetaData { get; set; } = new();
private PagingParams _paging = new();
private CompanyPagingParams _paging = new();
private Preferences _preferences { get; set; } = new();
[Inject] private UserPreferenceService UserPrefService { get; set; }
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }

View file

@ -21,16 +21,16 @@
@attribute [Authorize(Roles = "Adviser")]
@using Wonky.Client.Components
@if (_companyDto != null)
@if (!string.IsNullOrEmpty(_companyDto.Name))
{
<div class="card">
<div class="card-header">
<div><DisplayStateComponent StateClass="@RegState"></DisplayStateComponent> CVR status</div>
<div>Konto @_companyDto.Account</div>
<div>CompanyId @_companyDto.CompanyId</div>
<div>EDIT Næste besøg @NextVisit</div>
<div>EDIT Næste besøg @NextVisit</div>
<div>EDIT Sidst besøgt @LastVisit</div>
<div>DB Næste besøg @_companyDto.NextVisit</div>
<div>DB Næste besøg @_companyDto.NextVisit</div>
<div>DB Sidst besøgt @_companyDto.LastVisit</div>
</div>
<div class="card-body">
@ -105,7 +105,7 @@
<div class="form-group row mb-2">
<label for="nextVisit" class="col-form-label col-md-2">Næste besøg</label>
<div class="col-md-3">
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
</div>
</div>
<div class="form-group row mb-2">
@ -116,7 +116,7 @@
</div>
<div class="row mb-2">
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-success" >GEM</button>
<button type="submit" class="btn btn-success">GEM</button>
</div>
</div>
</EditForm>

View file

@ -18,7 +18,6 @@ using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Wonky.Client.Helpers;
using Wonky.Client.Models;
using Wonky.Client.Services;
using Wonky.Entity.DTO;
@ -54,7 +53,7 @@ public partial class CompanyUpdate : IDisposable
Interceptor.RegisterBeforeSendEvent();
if(!string.IsNullOrWhiteSpace(_companyDto.VatNumber))
await GetInfoFromVat(_companyDto.VatNumber);
_companyDto.CompanyId = Squid.DecodeSquid(_companyDto.CompanyId).ToString();
//_companyDto.CompanyId = Squid.DecodeSquid(_companyDto.CompanyId).ToString();
}
private async Task Update()
@ -69,7 +68,7 @@ public partial class CompanyUpdate : IDisposable
await CompanyRepo.UpdateCompany(_companyDto);
ToastService.ShowSuccess($"Godt så. Firma '{_companyDto!.Name}' er opdateret.");
Navigation.NavigateTo($"/company/account/{_companyDto.Account}");
Navigation.NavigateTo($"/company/id/{_companyDto.CompanyId}");
}
}
@ -91,17 +90,8 @@ public partial class CompanyUpdate : IDisposable
ToastService.ShowError($"CVR nummer '{vatNumber}' findes ikke.");
return;
}
// ToastService.ShowSuccess($"Data for '{vatNumber}' er hentet.");
// _virkRegInfo = result[0];
// _companyDto.Name = _virkRegInfo.Name;
// _companyDto.Address1 = _virkRegInfo.CoName;
// _companyDto.Address2 = _virkRegInfo.Address;
// _companyDto.ZipCode = _virkRegInfo.ZipCode;
// _companyDto.City = _virkRegInfo.City;
// _companyDto.VatNumber = _virkRegInfo.VatNumber;
}
private async Task GetInfoFromAddress(VatAddress address)
{
VInfos = await VirkRegistryService.QueryVirkRegistry(

View file

@ -35,6 +35,7 @@ public partial class CompanyView : IDisposable
private CompanyDto CompanyDto { get; set; } = new ();
private VirkRegInfo VirkRegInfo { get; set; } = new();
private string VisitState { get; set; } = "the-ugly";
private bool ValidCvr { get; set; } = true;
protected override async Task OnInitializedAsync()
@ -59,6 +60,7 @@ public partial class CompanyView : IDisposable
{
VisitState = DateTime.Now >= theBad ? "the-bad" : "the-good";
}
ValidCvr = string.IsNullOrEmpty(CompanyDto.VatNumber) || CompanyDto.VatNumber.Length <= 2;
}
/// <summary>

View file

@ -20,7 +20,7 @@ public partial class DraftDocument : IDisposable
private SalesItemDto _selectedItem { get; set; } = new();
private List<SalesItemDto> SalesItems { get; set; } = new();
private MetaData _meta { get; set; } = new();
private PagingParams _paging { get; set; } = new();
private CatalogPagingParams _paging { get; set; } = new();
private Preferences _prefs { get; set; } = new();
[Inject] private ISalesItemHttpRepository ItemRepo { get; set; }
[Inject] private ICompanyHttpRepository CompanyRepo { get; set; }

View file

@ -37,7 +37,7 @@ public partial class PurchaseOrderCreate : IDisposable
private EditContext _editContext;
private bool _poFormInvalid = true;
private MetaData? MetaData { get; set; } = new();
private PagingParams _paging = new();
private CatalogPagingParams _paging = new();
[Inject] public IToastService ToastService { get; set; }

View file

@ -32,7 +32,7 @@ public partial class SalesItemCatalog : IDisposable
[Inject] private UserPreferenceService UserPreferenceService { get; set; }
private List<SalesItemDto> SalesItemList { get; set; } = new();
private MetaData? MetaData { get; set; } = new();
private PagingParams _paging = new();
private CatalogPagingParams _paging = new();
private Preferences _preferences = new();
[Inject] public ISalesItemHttpRepository SalesItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }

View file

@ -12,6 +12,8 @@
"userInfo": "api/auth/userinfo",
"crmCompanies": "api/v2/crm/companies",
"priceCatalog": "api/v2/crm/catalog",
"cvrLookup": "/api/v2/services/virk"
"cvrLookup": "/api/v2/services/virk",
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
"glsId": ""
}
}

View file

@ -26,4 +26,6 @@ public class ApiConfig
public string UserInfo { get; set; } = "";
public string CvrLookup { get; set; } = "";
public string TokenPath { get; set; } = "";
public string GlsTrackUrl { get; set; } = "";
public string GlsId { get; set; } = "";
}

View file

@ -38,4 +38,7 @@ public class CompanyDto
public string LastVisit { get; set; } = "";
public string NextVisit { get; set; } = "";
public int Interval { get; set; } = 8;
public int IsHidden { get; set; }
public int HasFolded { get; set; }
public string CountryCode { get; set; } = "";
}

View file

@ -0,0 +1,8 @@
namespace Wonky.Entity.Models;
public class VirkLifeCycle
{
public string LastUpdate { get; set; } = "";
public TimeFrame TimeFrame { get; set; } = new();
}

View file

@ -26,4 +26,5 @@ public class VirkRegInfo
public string City { get; set; } = "";
public string ZipCode { get; set; } = "";
public List<VirkState> States { get; set; } = new ();
public List<VirkLifeCycle> LifeCycles { get; set; } = new ();
}

View file

@ -14,19 +14,18 @@
//
namespace Wonky.Entity.Requests;
public class PagingParams
public class CatalogPagingParams
{
private int _pageSize = 5;
private const int MaxPageSize = 50;
private int _pageSize = 10;
public int PageNumber { get; set; } = 1;
public int PageSize
{
get => _pageSize;
set => _pageSize = (value > MaxPageSize) ? MaxPageSize : value;
}
public string SearchTerm { get; set; } = "";
public string OrderBy { get; set; } = "name";
public string SearchColumn { get; set; } = "name";
public string SelectGroup { get; set; } = "";
public string OrderBy { get; set; } = "name";
public string SelectGroup { get; set; } = "";
}

View file

@ -0,0 +1,34 @@
// 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 CompanyPagingParams
{
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";
public string FromDate { get; set; } = "";
public int IsHidden { get; set; }
public int HasFolded { get; set; }
}