wip
This commit is contained in:
parent
62fe86c403
commit
8ea978668d
28 changed files with 488 additions and 477 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
@ -38,19 +38,15 @@
|
|||
@salesItem.Sku
|
||||
</td>
|
||||
<td>
|
||||
<ul class="list-group">
|
||||
@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 != "")
|
||||
<ul class="list-group">
|
||||
@foreach (var rate in salesItem.Rates)
|
||||
{
|
||||
<button class="btn btn-info" @onclick="AddToDraft">Læg til</button>
|
||||
<li class="list-group-item d-flex justify-content-between align-items-end">
|
||||
<div class="pe-2">@rate.Quantity</div>
|
||||
<div class="text-end pe-2">@rate.Rate</div>
|
||||
</li>
|
||||
}
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -14,15 +14,13 @@
|
|||
//
|
||||
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; }
|
||||
public decimal Price { get; set; }
|
||||
public decimal Discount { get; set; }
|
||||
public decimal LineAmount { get; set; }
|
||||
public int LineNumber { get; set; }
|
||||
public int LineNumber { get; set; }
|
||||
}
|
|
@ -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">
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -21,326 +21,325 @@
|
|||
@using Wonky.Client.Components
|
||||
@if (_company != null)
|
||||
{
|
||||
<h2>@_purchaseOrder.Name</h2>
|
||||
<EditForm EditContext="_editContext" 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"
|
||||
data-bs-toggle="collapse" data-bs-target="#activityBody"
|
||||
aria-expanded="true" aria-controls="activityBody">
|
||||
Aktivitet
|
||||
</button>
|
||||
</h2>
|
||||
<div id="activityBody" class="accordion-collapse collapse show"
|
||||
aria-labelledby="activityHeader" data-bs-parent="#crmActivity">
|
||||
<div class="accordion-body">
|
||||
<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>
|
||||
<option value="" selected>--type--</option>
|
||||
<option value="onSite">Besøg</option>
|
||||
<option value="phone">Telefon</option>
|
||||
<option value="canvas">Kanvas</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-3 col-md-3">
|
||||
<InputDate id="activityDate" class="form-control" @bind-Value="@(_purchaseOrder.ActivityDate)"/>
|
||||
</div>
|
||||
<div class="col-sm-2 col-md-2">
|
||||
<InputCheckbox id="checkDate" class="form-check-input" @bind-Value="@_purchaseOrder.CheckDate"></InputCheckbox>
|
||||
<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>
|
||||
</div>
|
||||
<h2>@_poDraft.Name</h2>
|
||||
<EditForm EditContext="_createActivity" OnValidSubmit="CreateActivity">
|
||||
<DataAnnotationsValidator/>
|
||||
<div class="accordion-flush" id="crmActivity">
|
||||
|
||||
<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>
|
||||
</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"/>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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"/>
|
||||
</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"
|
||||
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">
|
||||
@* ---------------------------------------------- *@
|
||||
@* collapse product selection and draft line *@
|
||||
@* ---------------------------------------------- *@
|
||||
@* display product filter options *@
|
||||
<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>
|
||||
@* ---------------------------------------------- *@
|
||||
@* display catalog *@
|
||||
@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">Stk / Pris</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in SalesItems)
|
||||
{
|
||||
<tr>
|
||||
<td>@item.Name</td>
|
||||
<td>@item.Sku</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/>
|
||||
}
|
||||
@* ---------------------------------------------- *@
|
||||
@* Display draft line *@
|
||||
@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">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="activityHeader">
|
||||
<button class="accordion-button bg-light" type="button"
|
||||
data-bs-toggle="collapse" data-bs-target="#activityBody"
|
||||
aria-expanded="true" aria-controls="activityBody">
|
||||
Aktivitet
|
||||
</button>
|
||||
</h2>
|
||||
<div id="activityBody" class="accordion-collapse collapse show"
|
||||
aria-labelledby="activityHeader" data-bs-parent="#crmActivity">
|
||||
<div class="accordion-body">
|
||||
<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="@_poDraft.ActivityType" @bind-Value:event="oninput" @onchange="CheckActivity">
|
||||
<option value="" selected>--type--</option>
|
||||
<option value="onSite">Besøg</option>
|
||||
<option value="phone">Telefon</option>
|
||||
<option value="canvas">Kanvas</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col col-md-4">
|
||||
@_selectedItem.Name
|
||||
</div>
|
||||
<div class="col">
|
||||
@_selectedItem.Sku
|
||||
</div>
|
||||
<div class="col">
|
||||
<input class="form-control" type="number" @bind-value="@Quantity"/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<input class="form-control" type="number" @bind-value="@Price"/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<input class="form-control" type="number" @bind-value="@Discount"/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button class="btn btn-info" @onclick="@(() => AddItem(_selectedItem))">Læg til</button>
|
||||
</div>
|
||||
<div class="col-sm-3 col-md-3">
|
||||
<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="@_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="_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="_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="_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"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@* Draft lines *@
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="draftHeader">
|
||||
<button class="accordion-button collapsed bg-light" type="button"
|
||||
data-bs-toggle="collapse" data-bs-target="#draftBody"
|
||||
aria-expanded="false" aria-controls="draftBody">
|
||||
Kladdelinjer <span class="mx-2 draft-expires-msg">Global kladde (udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds / 60)m inaktivitet)</span>
|
||||
</button>
|
||||
</h2>
|
||||
<div id="draftBody" class="accordion-collapse collapse"
|
||||
aria-labelledby="draftHeader">
|
||||
<div class="accordion-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>
|
||||
@* ---------------------------------------------- *@
|
||||
@* Display draft content *@
|
||||
@if (DraftStateProvider != null && DraftStateProvider.Draft.Items.Count > 0)
|
||||
{
|
||||
@foreach (var cItem in DraftStateProvider.Draft.Items)
|
||||
|
||||
|
||||
<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">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@if (SalesItems.Any())
|
||||
{
|
||||
<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.Total</td>
|
||||
<td>
|
||||
<button class="btn btn-warning" @onclick="@(() => RemoveItem(@cItem))">Slet</button>
|
||||
</td>
|
||||
</tr>
|
||||
<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">Stk / Pris</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in SalesItems)
|
||||
{
|
||||
<tr>
|
||||
<td>@item.Name</td>
|
||||
<td>@item.Sku</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>
|
||||
}
|
||||
<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 class="row">
|
||||
<div class="col">
|
||||
<button class="btn btn-danger" @onclick="@DeleteDraft" disabled="@(DraftStateProvider.Draft.Items.Count == 0)">Slet kladde</button>
|
||||
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">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col col-md-4">
|
||||
@_selectedItem.Name
|
||||
</div>
|
||||
<div class="col">
|
||||
@_selectedItem.Sku
|
||||
</div>
|
||||
<div class="col">
|
||||
<input class="form-control" type="number" @bind-value="@Quantity"/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<input class="form-control" type="number" @bind-value="@Price"/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<input class="form-control" type="number" @bind-value="@Discount"/>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button class="btn btn-info" @onclick="@(() => AddItem(_selectedItem))">Læg til</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="draftHeader">
|
||||
<button class="accordion-button collapsed bg-light" type="button"
|
||||
data-bs-toggle="collapse" data-bs-target="#draftBody"
|
||||
aria-expanded="false" aria-controls="draftBody">
|
||||
Kladdelinjer <span class="mx-2 draft-expires-msg">Global kladde (udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds / 60)m inaktivitet)</span>
|
||||
</button>
|
||||
</h2>
|
||||
<div id="draftBody" class="accordion-collapse collapse"
|
||||
aria-labelledby="draftHeader">
|
||||
<div class="accordion-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.Total</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 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 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>
|
||||
@* Section for delivery address *@
|
||||
<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="_purchaseOrder.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"/>
|
||||
</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"/>
|
||||
</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"/>
|
||||
</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"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row mt-2 mb-2">
|
||||
<div class="col">
|
||||
<a class="btn btn-primary" href="/company/@_company.CompanyId">Tilbage</a>
|
||||
</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>
|
||||
</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>
|
||||
</EditForm>
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -45,6 +45,6 @@
|
|||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<ItemTable SalesItems="SalesItemList"></ItemTable>
|
||||
<ItemTable SalesItems="SalesItems"></ItemTable>
|
||||
</div>
|
||||
</div>
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="AuthProviders" />
|
||||
<Folder Include="wwwroot\scripts" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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; } = "";
|
Loading…
Reference in a new issue