This commit is contained in:
Frede Hundewadt 2022-04-15 17:14:14 +02:00
parent 62fe86c403
commit 8ea978668d
28 changed files with 488 additions and 477 deletions

View file

@ -17,7 +17,7 @@
<span class="version">@Name</span> <span class="version">@Version</span>@if(IsBeta){<span class="version">-beta</span>}
@code
{
private const string Version = "0.2.24";
private const string Version = "0.2.25";
private const string Name = "wwo";
private const bool IsBeta = true;
}

View file

@ -20,10 +20,10 @@
<table class="table table-hover table-striped justify-content-center">
<thead>
<tr>
<th scope="col" style="width: 40%;">Navn</th>
<th scope="col" style="width: 10%;">Fork</th>
<th scope="col" style="width: 30%;" class="text-nowrap">Varenr</th>
<th scope="col" style="width: 20%">Stk / Pris</th>
<th scope="col">Navn</th>
<th scope="col">Fork</th>
<th scope="col" class="text-nowrap">Varenr</th>
<th scope="col">Stk / Pris</th>
</tr>
</thead>
<tbody>
@ -42,12 +42,8 @@
@foreach (var rate in salesItem.Rates)
{
<li class="list-group-item d-flex justify-content-between align-items-end">
<div class="px-2">@rate.Quantity</div>
<div class="text-end">@rate.Rate</div>
@if (PoDraftAccount != "")
{
<button class="btn btn-info" @onclick="AddToDraft">Læg til</button>
}
<div class="pe-2">@rate.Quantity</div>
<div class="text-end pe-2">@rate.Rate</div>
</li>
}
</ul>

View file

@ -23,7 +23,6 @@ namespace Wonky.Client.Components;
public partial class ItemTable
{
[Parameter] public List<SalesItemDto> SalesItems { get; set; } = new();
[Parameter] public string PoDraftAccount { get; set; } = "";
[Inject] private IToastService ToastService { get; set; }
private void AddToDraft()
{

View file

@ -22,7 +22,7 @@ namespace Wonky.Client.Components;
public partial class RegInfoCompany
{
[Inject] public VatOwnerLookupService VatOwnerLookupService { get; set; } = null!;
[Inject] public VatInfoLookupService VatInfoLookupService { get; set; } = null!;
[Parameter] public string VatNumber { get; set; } = "";
private VirkRegInfo VirkRegInfo { get; set; } = new();
private bool _hideMe = true;
@ -34,7 +34,7 @@ public partial class RegInfoCompany
_virkParams.VatNumber = VatNumber;
if (string.IsNullOrWhiteSpace(VirkRegInfo.VatNumber))
{
var result = await VatOwnerLookupService.QueryVirkRegistry(_virkParams);
var result = await VatInfoLookupService.QueryVirkRegistry(_virkParams);
if (result.Any())
{
_currentState = VirkRegInfo.States[^1].State;

View file

@ -19,7 +19,7 @@ using Wonky.Entity.DTO;
namespace Wonky.Client.Models
{
public class PurchaseOrder
public class ActivityHead
{
public string ActivityId { get; set; } = "";
public string CrmCompanyKey { get; set; } = "";
@ -50,6 +50,6 @@ namespace Wonky.Client.Models
[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; } = "";
// Lines
public List<CrmSalesLines> Lines { get; set; } = new();
public List<ActivityLine> Lines { get; set; } = new();
}
}

View file

@ -14,10 +14,8 @@
//
namespace Wonky.Client.Models;
public class PurchaseOrderLine
public class ActivityLine
{
public int ActivityLineId { get; set; }
public int ActivityId { get; set; }
public string Sku { get; set; } = "";
public string Text { get; set; } = "";
public int Qty { get; set; }

View file

@ -55,7 +55,7 @@
}
</div>
<div class="card bg-light">
<EditForm EditContext="_editContext" OnValidSubmit="Create" class="card-body">
<EditForm EditContext="_createCompany" OnValidSubmit="Create" class="card-body">
<DataAnnotationsValidator />
<InputText type="hidden" id="salesRepId" @bind-Value="_companyDto.SalesRepId"/>
<table class="table">

View file

@ -35,24 +35,24 @@ namespace Wonky.Client.Pages
{
public partial class CompanyCreate : IDisposable
{
private List<VirkRegInfo> VInfos { get; set; } = new();
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IToastService ToastService { get; set; }
[Inject] public ILogger<CompanyCreate> Logger { get; set; }
[Inject] public VatOwnerLookupService VatOwnerLookupService { get; set; }
[Inject] public ILocalStorageService StorageService { get; set; }
[Inject] public NavigationManager Navigation { get; set; }
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public VatInfoLookupService VatInfoLookupService { get; set; }
private List<VirkRegInfo> VInfos { get; set; } = new();
private CompanyDto _companyDto = new();
private VirkRegInfo _virkRegInfo = new();
private EditContext _editContext;
private EditContext _createCompany;
private bool _formInvalid = true;
private string RegState { get; set; } = "";
protected override async Task OnInitializedAsync()
{
_editContext = new EditContext(_companyDto);
_editContext.OnFieldChanged += HandleFieldChanged;
_createCompany = new EditContext(_companyDto);
_createCompany.OnFieldChanged += HandleFieldChanged;
var ux = await StorageService.GetItemAsync<UserInfo>("_ux");
_companyDto.SalesRepId = ux.Id;
@ -63,7 +63,7 @@ namespace Wonky.Client.Pages
private async Task GetInfoFromAddress(VatAddress address)
{
VInfos = await VatOwnerLookupService.QueryVirkRegistry(
VInfos = await VatInfoLookupService.QueryVirkRegistry(
new VirkParams
{
StreetName = address.StreetName,
@ -77,7 +77,7 @@ namespace Wonky.Client.Pages
}
private async Task GetInfoFromVat(string vatNumber)
{
VInfos = await VatOwnerLookupService
VInfos = await VatInfoLookupService
.QueryVirkRegistry(new VirkParams {VatNumber = vatNumber});
if (!VInfos.Any())
{
@ -113,24 +113,24 @@ namespace Wonky.Client.Pages
}
else
{
_formInvalid = !_editContext.Validate();
_formInvalid = !_createCompany.Validate();
}
StateHasChanged();
}
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{
_formInvalid = true;
_editContext.OnFieldChanged -= HandleFieldChanged;
_editContext = new EditContext(_companyDto);
_editContext.OnFieldChanged += HandleFieldChanged;
_editContext.OnValidationStateChanged -= ValidationChanged;
_createCompany.OnFieldChanged -= HandleFieldChanged;
_createCompany = new EditContext(_companyDto);
_createCompany.OnFieldChanged += HandleFieldChanged;
_createCompany.OnValidationStateChanged -= ValidationChanged;
}
public void Dispose()
{
Interceptor.DisposeEvent();
_editContext.OnFieldChanged -= HandleFieldChanged;
_editContext.OnValidationStateChanged -= ValidationChanged;
_createCompany.OnFieldChanged -= HandleFieldChanged;
_createCompany.OnValidationStateChanged -= ValidationChanged;
}
}
}

View file

@ -28,14 +28,14 @@ namespace Wonky.Client.Pages
{
public partial class CompanyList : IDisposable
{
[Inject] public ILocalStorageService LocalStorage { get; set; }
[Inject] private UserPreferenceService UserPrefService { get; set; }
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
public List<CompanyDto>? Companies { get; set; } = new();
public MetaData? MetaData { get; set; } = new();
private CompanyPagingParams _paging = new();
private Preferences _preferences { get; set; } = new();
[Inject] private UserPreferenceService UserPrefService { get; set; }
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ILocalStorageService LocalStorage { get; set; }
protected override async Task OnInitializedAsync()
{

View file

@ -55,7 +55,7 @@
</div>
}
<div class="card-body">
<EditForm EditContext="_editContext" OnValidSubmit="Update">
<EditForm EditContext="_updateCompany" OnValidSubmit="Update">
<DataAnnotationsValidator/>
<div class="form-group row mb-2">
<label for="vatNumber" class="col-md-2 col-form-label">CVR/ORG</label>
@ -98,13 +98,13 @@
</div>
</div>
<div class="form-group row mb-2">
<label for="phone" class="col-md-2 col-form-label">Telefon nummer</label>
<label for="phone" class="col-md-2 col-form-label">Telefon</label>
<div class="col-md-10">
<InputText id="phone" class="form-control" @bind-Value="_company.Phone"/>
</div>
</div>
<div class="form-group row mb-2">
<label for="mobile" class="col-md-2 col-form-label">Mobil nummer</label>
<label for="mobile" class="col-md-2 col-form-label">Mobil</label>
<div class="col-md-10">
<InputText id="mobile" class="form-control" @bind-Value="_company.Mobile"/>
</div>
@ -134,7 +134,7 @@
</div>
</div>
<div class="form-group row mb-2">
<label for="interval" class="col-form-label col-md-2">Besøgs interval Interval</label>
<label for="interval" class="col-form-label col-md-2">Interval (uger)</label>
<div class="col-md-3">
<InputNumber id="interval" class="form-control" @bind-Value="_company.Interval"/>
</div>

View file

@ -31,16 +31,16 @@ namespace Wonky.Client.Pages;
public partial class CompanyUpdate : IDisposable
{
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IToastService ToastService { get; set; }
[Inject] public ILogger<CompanyCreate> Logger { get; set; }
[Inject] public NavigationManager Navigation { get; set; }
[Inject] public VatOwnerLookupService VatOwnerLookupService { get; set; }
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public VatInfoLookupService VatInfoLookupService { get; set; }
[Parameter] public string Account { get; set; } = "";
[Parameter] public string CompanyId { get; set; } = "";
private CompanyDto _company { get; set; }
private EditContext _editContext { get; set; }
private EditContext _updateCompany { get; set; }
private List<VirkRegInfo> VInfos { get; set; } = new();
private VirkRegInfo _virkRegInfo { get; set; } = new();
private DateTime LastVisit { get; set; }
@ -55,7 +55,7 @@ public partial class CompanyUpdate : IDisposable
LastVisit = DateTime.Parse(_company.LastVisit);
NextVisit = DateTime.Parse(_company.NextVisit);
_editContext = new EditContext(_company);
_updateCompany = new EditContext(_company);
if(_company.HasFolded == 1)
{
@ -90,7 +90,7 @@ public partial class CompanyUpdate : IDisposable
ToastService.ShowError($"CVR er ugyldigt eller mangler");
return;
}
VInfos = await VatOwnerLookupService
VInfos = await VatInfoLookupService
.QueryVirkRegistry(
new VirkParams
{
@ -105,7 +105,7 @@ public partial class CompanyUpdate : IDisposable
private async Task GetInfoFromAddress(VatAddress address)
{
VInfos = await VatOwnerLookupService.QueryVirkRegistry(
VInfos = await VatInfoLookupService.QueryVirkRegistry(
new VirkParams
{
StreetName = address.StreetName,

View file

@ -28,12 +28,12 @@ namespace Wonky.Client.Pages;
public partial class CompanyView : IDisposable
{
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public VatOwnerLookupService VatOwnerLookup { get; set; }
[Inject] public ILogger<CompanyView> Logger { get; set; }
[Inject] public IToastService ToastService { get; set; }
[Inject] public NavigationManager NavManager { get; set; }
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public VatInfoLookupService VatInfoLookup { get; set; }
[Parameter] public string CompanyId { get; set; } = "";
private CompanyDto _company { get; set; } = new ();
private string _vatState { get; set; } = "the-dead";

View file

@ -21,11 +21,12 @@
@using Wonky.Client.Components
@if (_company != null)
{
<h2>@_purchaseOrder.Name</h2>
<EditForm EditContext="_editContext" OnValidSubmit="CreateActivity">
<h2>@_poDraft.Name</h2>
<EditForm EditContext="_createActivity" OnValidSubmit="CreateActivity">
<DataAnnotationsValidator/>
<div class="accordion-flush" id="crmActivity">
@* Section for activity header *@
<div class="accordion-item">
<h2 class="accordion-header" id="activityHeader">
<button class="accordion-button bg-light" type="button"
@ -40,7 +41,7 @@
<div class="row mb-1">
<label for="activityDate" class="col-sm-2 col-md-2 col-form-label">Aktivitet</label>
<div class="col-sm-3 col-md-3">
<select id="activityType" class="form-select" @bind-Value="@_purchaseOrder.ActivityType" @bind-Value:event="oninput" required>
<select id="activityType" class="form-select" @bind-Value="@_poDraft.ActivityType" @bind-Value:event="oninput" @onchange="CheckActivity">
<option value="" selected>--type--</option>
<option value="onSite">Besøg</option>
<option value="phone">Telefon</option>
@ -48,63 +49,64 @@
</select>
</div>
<div class="col-sm-3 col-md-3">
<InputDate id="activityDate" class="form-control" @bind-Value="@(_purchaseOrder.ActivityDate)"/>
<InputDate id="activityDate" class="form-control" @bind-Value="@(_poDraft.ActivityDate)" />
</div>
<div class="col-sm-2 col-md-2">
<InputCheckbox id="checkDate" class="form-check-input" @bind-Value="@_purchaseOrder.CheckDate"></InputCheckbox>
<InputCheckbox id="checkDate" class="form-check-input" @bind-Value="@_poDraft.CheckDate" @onclick="CheckDate" />
<label for="checkDate" class="form-check-label">Godkendt</label>
</div>
</div>
<div class="row mb-1">
<label for="account" class="col-sm-2 col-md-2 col-form-label">Konto</label>
<div class="col-sm-4 col-md-4">
<InputText id="account" class="form-control" @bind-Value="_purchaseOrder.Account" readonly/>
<ValidationMessage For="@(() => _purchaseOrder.Account)"></ValidationMessage>
<InputText id="account" class="form-control" @bind-Value="_poDraft.Account" readonly/>
<ValidationMessage For="@(() => _poDraft.Account)"></ValidationMessage>
</div>
<label for="salesRep" class="col-sm-2 col-md-2 col-form-label">Sælger</label>
<div class="col-sm-4 col-md-4">
<InputText id="salesRep" class="form-control" @bind-Value="_purchaseOrder.SalesRep" readonly/>
<ValidationMessage For="@(() => _purchaseOrder.SalesRep)"></ValidationMessage>
<InputText id="salesRep" class="form-control" @bind-Value="_poDraft.SalesRep" readonly/>
<ValidationMessage For="@(() => _poDraft.SalesRep)"></ValidationMessage>
</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="_purchaseOrder.Demo"/>
<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="_purchaseOrder.ReferenceNumber"v/>
<ValidationMessage For="@(() => _purchaseOrder.ReferenceNumber)"></ValidationMessage>
<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="_purchaseOrder.YourRef"/>
<ValidationMessage For="@(() => _purchaseOrder.YourRef)"></ValidationMessage>
<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="_purchaseOrder.OrderMessage"/>
<ValidationMessage For="@(() => _purchaseOrder.OrderMessage)"></ValidationMessage>
<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="_purchaseOrder.CrmNote"/>
<InputText id="crmNote" class="form-control" @bind-Value="_poDraft.CrmNote"/>
</div>
</div>
</div>
</div>
</div>
@* Catalog selection for draft *@
<div class="accordion-item">
<h2 class="accordion-header" id="catalogHeader">
<button class="accordion-button collapsed bg-light" type="button"
@ -116,10 +118,6 @@
<div id="catalogBody" class="accordion-collapse collapse"
aria-labelledby="catalogHeader" data-bs-parent="#crmActivity">
<div class="accordion-body">
@* ---------------------------------------------- *@
@* collapse product selection and draft line *@
@* ---------------------------------------------- *@
@* display product filter options *@
<div class="row mb-3">
<div class="col">
<ItemGroupDropdown OnChanged="SetItemGroup"/>
@ -134,8 +132,6 @@
</div>
</div>
@* ---------------------------------------------- *@
@* display catalog *@
@if (SalesItems.Any())
{
<table class="table table-hover table-striped justify-content-center">
@ -173,8 +169,6 @@
{
<AppSpinner/>
}
@* ---------------------------------------------- *@
@* Display draft line *@
@if (_selectedItem != null && ShowItem)
{
<div class="card mb-3 mt-3">
@ -226,7 +220,8 @@
</div>
</div>
</div>
@* Draft lines *@
<div class="accordion-item">
<h2 class="accordion-header" id="draftHeader">
<button class="accordion-button collapsed bg-light" type="button"
@ -250,8 +245,6 @@
</tr>
</thead>
<tbody>
@* ---------------------------------------------- *@
@* Display draft content *@
@if (DraftStateProvider != null && DraftStateProvider.Draft.Items.Count > 0)
{
@foreach (var cItem in DraftStateProvider.Draft.Items)
@ -286,7 +279,8 @@
</div>
</div>
</div>
@* Section for delivery address *@
<div class="accordion-item">
<h2 class="accordion-header" id="deliveryHeader">
<button class="accordion-button collapsed bg-light" type="button"
@ -301,45 +295,50 @@
<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="_purchaseOrder.DlvName"/>
<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="_purchaseOrder.DlvAddress1"/>
<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="_purchaseOrder.DlvAddress2"/>
<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="_purchaseOrder.DlvZipCode"/>
<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="_purchaseOrder.DlvCity"/>
<InputText id="dlvCity" class="form-control" @bind-Value="_poDraft.DlvCity"/>
</div>
</div>
</div>
</div>
</div>
</div>
@* ---------------------------------------------- *@
@* Display action buttons *@
<div class="row mt-2 mb-2">
<div class="col">
<a class="btn btn-primary" href="/company/@_company.CompanyId">Tilbage</a>
<button type="button" class="btn btn-dark" @onclick="CreateActivity" disabled="@InvalidCanvas">Kanvas</button>
<button type="button" class="btn btn-warning" @onclick="CreateActivityOffer" disabled="@InvalidActivity">Tilbud</button>
<button type="button" class="btn btn-success" @onclick="CreateActivityOrder" disabled="@InvalidActivity">Bestilling</button>
</div>
<div class="col">
<button type="submit" class="btn btn-dark" disabled="@InvalidCanvas">Kanvas</button>
</div>
<div class="col">
<button type="button" class="btn btn-warning" @onclick="CreateOffer" disabled="@InvalidActivity">Tilbud</button>
</div>
<div class="col">
<button type="button" class="btn btn-success" @onclick="CreateOrder" disabled="@InvalidActivity">Salg</button>
</div>
</div>
</EditForm>

View file

@ -30,33 +30,32 @@ namespace Wonky.Client.Pages;
public partial class CrmActivityCreate : IDisposable
{
[Inject] public IToastService ToastService { get; set; }
[Inject] public NavigationManager NavigationManager { get; set; }
[Inject] public ILocalStorageService StorageService { get; set; }
[Inject] private ISalesItemHttpRepository ItemRepo { get; set; }
[Inject] private ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] private HttpInterceptorService Interceptor { get; set; }
[Inject] private UserPreferenceService UserPrefs { get; set; }
[Inject] public IToastService ToastService { get; set; }
[Inject] public NavigationManager NavigationManager { get; set; }
[Inject] public ILocalStorageService StorageService { get; set; }
[Inject] public ISalesItemHttpRepository SalesItemRepo { get; set; }
[Parameter] public string CompanyId { get; set; }
[CascadingParameter] DraftStateProvider DraftStateProvider { get; set; }
[Parameter] public string CompanyId { get; set; }
private SalesItemDto _selectedItem { get; set; } = new();
private List<SalesItemDto> SalesItems { get; set; } = new();
private MetaData _meta { get; set; } = new();
// private MetaData _meta { get; set; } = new();
private Preferences _prefs { get; set; } = new();
private PurchaseOrder _purchaseOrder = new ();
private ActivityHead _poDraft { get; set; } = new();
private CompanyDto _company = new();
private EditContext _editContext { get; set; }
private MetaData? MetaData { get; set; } = new();
private CatalogPagingParams _paging = new();
private EditContext _createActivity { get; set; }
private bool _poFormInvalid { get; set; } = true;
private bool ShowItem { get; set; }
private bool ShowSearchView { get; set; }
private string Quantity = "1";
private string Price = "0";
private string Discount = "0";
private bool InvalidActivityType { get; set; } = true;
private bool InvalidActivity { get; set; } = true;
private bool InvalidCanvas { get; set; } = true;
private bool InvalidDate { get; set; } = true;
protected override async Task OnInitializedAsync()
{
@ -67,32 +66,81 @@ public partial class CrmActivityCreate : IDisposable
await GetSalesItems();
var ux = await StorageService.GetItemAsync<UserInfo>("_ux");
_company = await CompanyRepo.GetCompanyById(CompanyId);
_editContext = new EditContext(_purchaseOrder);
_editContext.OnFieldChanged += HandleFieldChanged;
_createActivity = new EditContext(_poDraft);
_createActivity.OnFieldChanged += HandleFieldChanged;
// set up indexdb identification
_purchaseOrder.ActivityId = CompanyId;
_purchaseOrder.CrmCompanyKey = CompanyId;
_purchaseOrder.ActivityDate = DateTime.Now;
_poDraft.ActivityId = CompanyId;
_poDraft.CrmCompanyKey = CompanyId;
_poDraft.ActivityDate = string.IsNullOrWhiteSpace(_prefs.WorkDate)
? DateTime.Now
: DateTime.Parse(_prefs.WorkDate);
// permanent identifications
_purchaseOrder.SalesRep = ux.Adviser;
_purchaseOrder.Account = _company.Account;
_purchaseOrder.VatNumber = _company.VatNumber;
_purchaseOrder.EMail = _company.Email;
_purchaseOrder.Phone = _company.Phone;
_purchaseOrder.OurRef = ux.FullName.Split(" ")[0];
_poDraft.SalesRep = ux.Adviser;
_poDraft.Account = _company.Account;
_poDraft.VatNumber = _company.VatNumber;
_poDraft.EMail = _company.Email;
_poDraft.Phone = _company.Phone;
_poDraft.OurRef = ux.FullName.Split(" ")[0];
_purchaseOrder.Name = _company.Name;
_purchaseOrder.Address = _company.Address1;
_purchaseOrder.Address2 = _company.Address2;
_purchaseOrder.ZipCode = _company.ZipCode;
_purchaseOrder.City = _company.City;
_poDraft.Name = _company.Name;
_poDraft.Address = _company.Address1;
_poDraft.Address2 = _company.Address2;
_poDraft.ZipCode = _company.ZipCode;
_poDraft.City = _company.City;
_purchaseOrder.DlvName = _company.Name;
_purchaseOrder.DlvAddress1 = _company.Address1;
_purchaseOrder.DlvAddress2 = _company.Address2;
_purchaseOrder.DlvZipCode = _company.ZipCode;
_purchaseOrder.DlvCity = _company.City;
_poDraft.DlvName = "";
_poDraft.DlvAddress1 = "";
_poDraft.DlvAddress2 = "";
_poDraft.DlvZipCode = "";
_poDraft.DlvCity = "";
}
private async Task CreateOffer()
{
await CreateActivity();
// post to create offer endpoint
}
private async Task CreateOrder()
{
await CreateActivity();
// post to create order endpoint
}
private async Task CreateActivity()
{
// write work date to preference
await UserPrefs.SetWorkDate(_poDraft.ActivityDate);
var ln = 0;
// post to create activity endpoint
foreach (var line in DraftStateProvider.Draft.Items.Select(item => new ActivityLine
{
Price = item.Price,
Discount = item.Discount,
Qty = item.Quantity,
Sku = item.Item.Sku,
Text = item.Item.Name,
LineAmount = item.Total,
LineNumber = ++ln
}))
{
_poDraft.Lines.Add(line);
}
await StorageService.SetItemAsync(CompanyId, _poDraft);
//ToastService.ShowSuccess($"Aktivitet oprettet.");
}
private void CheckActivity()
{
InvalidActivityType = string.IsNullOrWhiteSpace(_poDraft.ActivityType);
Console.WriteLine($"invalidType => {InvalidActivityType}");
}
private void CheckDate()
{
InvalidDate = _poDraft.CheckDate;
Console.WriteLine($"invalidDate => {InvalidDate}");
}
private async Task DeleteDraft()
@ -157,68 +205,37 @@ public partial class CrmActivityCreate : IDisposable
_paging.PageSize = 5;
var response = await ItemRepo.GetSalesItemsPaged(_paging);
SalesItems = response.Items!;
_meta = response.MetaData;
}
private async Task CreateActivity()
{
foreach (var item in DraftStateProvider.Draft.Items)
{
var ln = 1;
var line = new CrmSalesLines
{
Price = item.Price,
Discount = 0,
Qty = item.Quantity,
Sku = item.Item.Sku,
Text = item.Item.Name,
LineAmount = item.Total,
LineNumber = ++ln
};
_purchaseOrder.Lines.Add(line);
}
await StorageService.SetItemAsync(CompanyId, _purchaseOrder);
//ToastService.ShowSuccess($"Aktivitet oprettet.");
}
private async Task CreateActivityOrder()
{
await CreateActivity();
// send to api -> send to bc
}
private async Task CreateActivityOffer()
{
await CreateActivity();
// send to api -> as email
// _meta = response.MetaData;
}
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{
_poFormInvalid = !_editContext.Validate();
InvalidActivity = string.IsNullOrWhiteSpace(_purchaseOrder.ActivityType) || _poFormInvalid || DraftStateProvider.Draft.Items.Count == 0 || !_purchaseOrder.CheckDate;
InvalidCanvas = string.IsNullOrWhiteSpace(_purchaseOrder.ActivityType) || _poFormInvalid || !_purchaseOrder.CheckDate;
_poFormInvalid = !_createActivity.Validate();
InvalidCanvas = InvalidActivityType || InvalidDate;
InvalidActivity = InvalidActivityType || _poFormInvalid || DraftStateProvider.Draft.Items.Count == 0 || InvalidDate;
StateHasChanged();
}
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{
if (!string.IsNullOrEmpty(_purchaseOrder.VatNumber))
if (!string.IsNullOrEmpty(_poDraft.VatNumber))
{
if(!VatUtils.ValidateFormat(_company.CountryCode, _purchaseOrder.VatNumber))
if(!VatUtils.ValidateFormat(_company.CountryCode, _poDraft.VatNumber))
ToastService.ShowWarning("CVR / ORG nummer er ikke et gyldigt registreringsnummer");
}
if (string.IsNullOrEmpty(_purchaseOrder.ActivityType))
if (string.IsNullOrEmpty(_poDraft.ActivityType))
ToastService.ShowWarning("Aktivitet type kan ikke være tom");
_poFormInvalid = false;
_editContext.OnFieldChanged -= HandleFieldChanged;
_editContext = new EditContext(_purchaseOrder);
_editContext.OnFieldChanged += HandleFieldChanged;
_editContext.OnValidationStateChanged -= ValidationChanged;
_createActivity.OnFieldChanged -= HandleFieldChanged;
_createActivity = new EditContext(_poDraft);
_createActivity.OnFieldChanged += HandleFieldChanged;
_createActivity.OnValidationStateChanged -= ValidationChanged;
}
public void Dispose()
{
Interceptor.DisposeEvent();
_editContext.OnFieldChanged -= HandleFieldChanged;
_editContext.OnValidationStateChanged -= ValidationChanged;
_createActivity.OnFieldChanged -= HandleFieldChanged;
_createActivity.OnValidationStateChanged -= ValidationChanged;
}
}

View file

@ -22,14 +22,10 @@ namespace Wonky.Client.Pages;
public partial class Login
{
private UserAuthenticationDto _userAuthenticationDto = new ();
[Inject]
public IAuthenticationService AuthenticationService { get; set; }
[Inject] public NavigationManager NavigationManager { get; set; }
[Inject] public IAuthenticationService AuthenticationService { get; set; }
[Parameter] public string ReturnUrl { get; set; } = "";
private UserAuthenticationDto _userAuthenticationDto = new ();
private bool ShowAuthError { get; set; }
private string? Error { get; set; }
private bool execLogin = false;

View file

@ -19,8 +19,7 @@ namespace Wonky.Client.Pages;
public partial class Page404
{
[Inject]
public NavigationManager NavigationManager { get; set; }
[Inject] public NavigationManager NavigationManager { get; set; }
public void NavigateToHome()
{

View file

@ -45,6 +45,6 @@
</div>
<div class="row">
<div class="col">
<ItemTable SalesItems="SalesItemList"></ItemTable>
<ItemTable SalesItems="SalesItems"></ItemTable>
</div>
</div>

View file

@ -29,14 +29,14 @@ namespace Wonky.Client.Pages;
public partial class SalesItemCatalog : IDisposable
{
[Inject] public ILocalStorageService LocalStorage { get; set; }
[Inject] public ISalesItemHttpRepository SalesItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] private UserPreferenceService UserPreferenceService { get; set; }
private List<SalesItemDto> SalesItemList { get; set; } = new();
private List<SalesItemDto> SalesItems { get; set; } = new();
private MetaData? MetaData { get; set; } = new();
private CatalogPagingParams _paging = new();
private Preferences _preferences = new();
[Inject] public ISalesItemHttpRepository SalesItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ILocalStorageService LocalStorage { get; set; }
protected override async Task OnInitializedAsync()
{
@ -52,7 +52,7 @@ public partial class SalesItemCatalog : IDisposable
private async Task SelectedPage(int page)
{
SalesItemList = new List<SalesItemDto>();
SalesItems = new List<SalesItemDto>();
_paging.PageNumber = page;
await GetSalesItems();
}
@ -60,13 +60,13 @@ public partial class SalesItemCatalog : IDisposable
private async Task GetSalesItems()
{
var pagingResponse = await SalesItemRepo.GetSalesItemsPaged(_paging);
SalesItemList = pagingResponse.Items!;
SalesItems = pagingResponse.Items!;
MetaData = pagingResponse.MetaData;
}
private async Task SetPageSize(string pageSize)
{
SalesItemList = new List<SalesItemDto>();
SalesItems = new List<SalesItemDto>();
_paging.PageSize = Convert.ToInt32(pageSize);
_paging.PageNumber = 1;
await GetSalesItems();
@ -74,21 +74,21 @@ public partial class SalesItemCatalog : IDisposable
private async Task SetItemGroup(string groupFilter)
{
SalesItemList = new List<SalesItemDto>();
SalesItems = new List<SalesItemDto>();
_paging.PageNumber = 1;
_paging.SelectGroup = groupFilter;
await GetSalesItems();
}
private async Task SetSearchCol(string columnName)
{
SalesItemList = new List<SalesItemDto>();
SalesItems = new List<SalesItemDto>();
_paging.PageNumber = 1;
_paging.SearchColumn = columnName;
await GetSalesItems();
}
private async Task SetSearchPhrase(string searchTerm)
{
SalesItemList = new List<SalesItemDto>();
SalesItems = new List<SalesItemDto>();
_paging.PageNumber = 1;
_paging.SearchTerm = searchTerm;
await GetSalesItems();
@ -96,7 +96,7 @@ public partial class SalesItemCatalog : IDisposable
private async Task SetSortCol(string orderBy)
{
SalesItemList = new List<SalesItemDto>();
SalesItems = new List<SalesItemDto>();
_paging.OrderBy = orderBy;
await GetSalesItems();
}

View file

@ -21,9 +21,9 @@ using Toolbelt.Blazor.Extensions.DependencyInjection;
using Blazored.LocalStorage;
using Blazored.Toast;
using Wonky.Client;
using Wonky.Client.AuthProviders;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Client.Providers;
using Wonky.Client.Services;
using Wonky.Entity.Configuration;
@ -57,7 +57,7 @@ builder.Services.AddAuthorizationCore();
builder.Services.AddScoped<AuthenticationStateProvider, AuthStateProvider>();
builder.Services.AddScoped<IAuthenticationService, AuthenticationService>();
builder.Services.AddScoped<RefreshTokenService>();
builder.Services.AddScoped<VatOwnerLookupService>();
builder.Services.AddScoped<VatInfoLookupService>();
builder.Services.AddScoped<UserPreferenceService>();

View file

@ -13,17 +13,13 @@
// 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.Headers;
using System.Security.Claims;
using System.Threading.Tasks;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components.Authorization;
using Wonky.Entity.DTO;
namespace Wonky.Client.AuthProviders
namespace Wonky.Client.Providers
{
public class AuthStateProvider : AuthenticationStateProvider
{

View file

@ -17,9 +17,9 @@ using System.Net.Http.Headers;
using System.Net.Http.Json;
using System.Text.Json;
using Blazored.LocalStorage;
using Wonky.Client.AuthProviders;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.Extensions.Options;
using Wonky.Client.Providers;
using Wonky.Entity.Configuration;
using Wonky.Entity.DTO;

View file

@ -9,6 +9,7 @@ public record Preferences
public string? ItemSearch { get; set; } = "name";
public string? ItemSort { get; set; } = "name";
public string PageSize { get; set; } = "10";
public string WorkDate { get; set; } = "";
}
public class UserPreferenceService
{
@ -18,6 +19,18 @@ public class UserPreferenceService
{
_localStorageService = localStorageService;
}
public async Task SetWorkDate(DateTime workDate)
{
var preferences = await GetPreferences();
var newPreferences = preferences
with
{
WorkDate = $"{workDate:yyyy-MM-dd}"
};
await _localStorageService.SetItemAsync("preferences", newPreferences);
OnChange?.Invoke(newPreferences);
}
public async Task SetCompanySearch(string companySearch)
{
var preferences = await GetPreferences();
@ -66,5 +79,4 @@ public class UserPreferenceService
return await _localStorageService.GetItemAsync<Preferences>("preferences")
?? new Preferences();
}
}

View file

@ -22,14 +22,14 @@ using Wonky.Entity.Requests;
namespace Wonky.Client.Services;
public class VatOwnerLookupService
public class VatInfoLookupService
{
private readonly JsonSerializerOptions _options = new() { PropertyNameCaseInsensitive = true };
private readonly HttpClient _client;
private readonly IOptions<ApiConfig> _apiConfig;
private readonly List<VirkRegInfo> _noData = new() { new VirkRegInfo { Name = "INGEN DATA" } };
public VatOwnerLookupService(HttpClient client, IOptions<ApiConfig> apiConfig)
public VatInfoLookupService(HttpClient client, IOptions<ApiConfig> apiConfig)
{
_client = client;
_apiConfig = apiConfig;

View file

@ -13,11 +13,9 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Threading.Tasks;
using Blazored.LocalStorage;
using Wonky.Client.Models;
using Microsoft.AspNetCore.Components;
using Wonky.Entity.Models;
namespace Wonky.Client.Shared;

View file

@ -33,6 +33,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="AuthProviders" />
<Folder Include="wwwroot\scripts" />
</ItemGroup>

View file

@ -21,7 +21,7 @@ namespace Wonky.Entity.DTO;
public class CompanyDto
{
[Required(ErrorMessage = "Navn skal udyldes")] [MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")] public string Name { get; set; }
[Required(ErrorMessage = "Navn skal udfyldes")] [MaxLength(100, ErrorMessage = "Du kan højst bruge 100 tegn")] public string Name { get; set; }
[Required(ErrorMessage = "Postnummer skal udfyldes")] [MaxLength(20, ErrorMessage = "Du kan højst bruge 20 tegn")] public string ZipCode { get; set; }
[Required(ErrorMessage = "Bynavn skal udfyldes")] [MaxLength(30, ErrorMessage = "Du kan højst bruge 30 tegn")] public string City { get; set; }
[Required(ErrorMessage = "ORG/VAT/CVR er ikke et gyldigt nummer")] public string VatNumber { get; set; }

View file

@ -3,7 +3,7 @@ using System.ComponentModel.DataAnnotations;
namespace Wonky.Entity.DTO;
public class CrmDocumentDto
public class CrmActivityHeadDto
{
// Base account info
public string CompanyId { get; set; } = "";