built v0.8.36

This commit is contained in:
Frede Hundewadt 2022-06-25 15:32:36 +02:00
parent b114eaa969
commit cda4db4f51
31 changed files with 186 additions and 110 deletions

View file

@ -19,6 +19,9 @@
<Router AppAssembly="@typeof(App).Assembly"> <Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData"> <Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<text>Venligst login</text>
</NotAuthorized>
<Authorizing> <Authorizing>
<text>Checker autorisation ...</text> <text>Checker autorisation ...</text>
</Authorizing> </Authorizing>

View file

@ -17,14 +17,17 @@
@if (Enabled == 1) @if (Enabled == 1)
{ {
<a type="button" class="btn btn-success" href="/companies/@CompanyId/activities/new">Besøg</a> <a type="button" class="btn btn-@ButtonType" href="@ActionLink">@ButtonText</a>
} }
else else
{ {
<a type="button" class="btn btn-outline-secondary disabled" aria-disabled="true">Besøg</a> <a type="button" class="btn btn-outline-secondary disabled" aria-disabled="true">@ButtonText</a>
} }
@code { @code {
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public int Enabled { get; set; }
[Parameter]public int Enabled { get; set; } [Parameter] public string ButtonType { get; set; } = "primary";
[Parameter] public string ButtonText { get; set; } = "Tag Mig";
[Parameter] public string ActionLink { get; set; } = "#";
} }

View file

@ -21,8 +21,30 @@
@if (Companies.Any()) @if (Companies.Any())
{ {
<div class="list-group list-group-flush"> <div class="list-group list-group-flush">
@foreach (var company in Companies) <div class="list-group-item px-3 bg-dark text-white">
{ <div class="row">
<div class="col-sm-1">
Besøg
</div>
<div class="col">
Navn
</div>
<div class="col">
Konto
</div>
<div class="col">
Telefon
</div>
<div class="col">
Bynavn
</div>
<div class="col">
</div>
</div>
</div>
@foreach (var company in Companies)
{
<a class="list-group-item list-group-item-action" href="/companies/@company.CompanyId"> <a class="list-group-item list-group-item-action" href="/companies/@company.CompanyId">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-sm-1"> <div class="col-sm-1">
@ -35,16 +57,18 @@
<div class="col"> <div class="col">
@company.Account @company.Account
</div> </div>
<div class="col">
@company.Phone
</div>
<div class="col"> <div class="col">
@company.City @company.City
</div> </div>
<div class="col"> <div class="col">
<ActivityButton CompanyId="@company.CompanyId" Enabled="@company.ValidVat"></ActivityButton> <ActivityButton CompanyId="@company.CompanyId" Enabled="@company.ValidVat"></ActivityButton>
</div> </div>
</div> </div>
</a> </a>
} }
</div> </div>
} }
else else

View file

@ -19,7 +19,7 @@
{ {
<table class="table table-hover table-striped justify-content-center"> <table class="table table-hover table-striped justify-content-center">
<thead> <thead>
<tr> <tr class="bg-dark text-white">
<th scope="col">Navn</th> <th scope="col">Navn</th>
<th scope="col">Fork</th> <th scope="col">Fork</th>
<th scope="col" class="text-nowrap">Varenr</th> <th scope="col" class="text-nowrap">Varenr</th>

View file

@ -1,7 +1,7 @@
@if (Inventory.Any()) @if (Inventory.Any())
{ {
<div class="list-group list-group-flush"> <div class="list-group list-group-flush">
<div class="list-group-item"> <div class="list-group-item px-2 bg-dark text-white rounded-2">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<h4>Produkt</h4> <h4>Produkt</h4>

View file

@ -2,7 +2,7 @@
{ {
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr class="bg-dark text-white rounded-2">
<th scope="col"> <th scope="col">
Dato Dato
</th> </th>

View file

@ -1,7 +1,7 @@
@if (ReportList != null) @if (ReportList != null)
{ {
<div class="list-group list-group-flush"> <div class="list-group list-group-flush">
<div class="list-group-item "> <div class="list-group-item px-3 bg-dark text-white">
<div class="row"> <div class="row">
<div class="fw-bold col"> <div class="fw-bold col">
Dato Dato

View file

@ -57,7 +57,7 @@ public class ActivityHttpRepository : IActivityHttpRepository
public async Task<NgActivityListView> GetActivities(string activityDate) public async Task<NgActivityListView> GetActivities(string activityDate)
{ {
var response = await _client var response = await _client
.GetAsync($"{_apiConfig.ActivityEndpoint}/date/{activityDate}"); .GetAsync($"{_apiConfig.ActivityUri}/date/{activityDate}");
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
return string.IsNullOrWhiteSpace(content) return string.IsNullOrWhiteSpace(content)
? new NgActivityListView() ? new NgActivityListView()
@ -74,7 +74,7 @@ public class ActivityHttpRepository : IActivityHttpRepository
["searchTerm"] = pagingParameters.SearchTerm, ["searchTerm"] = pagingParameters.SearchTerm,
}; };
var response = await _client var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.ActivityEndpoint}/page", queryString)); .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.ActivityUri}/page", queryString));
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
_logger.LogInformation("GetActivityPages => {content}", content); _logger.LogInformation("GetActivityPages => {content}", content);
@ -91,7 +91,7 @@ public class ActivityHttpRepository : IActivityHttpRepository
public async Task<ApiResponse> CreateActivity(ActivityDto model) public async Task<ApiResponse> CreateActivity(ActivityDto model)
{ {
Console.WriteLine(JsonSerializer.Serialize(model, _options)); Console.WriteLine(JsonSerializer.Serialize(model, _options));
var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityEndpoint}", model, _options); var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityUri}", model, _options);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApiResponse>(content); var result = JsonSerializer.Deserialize<ApiResponse>(content);
return result!; return result!;
@ -100,13 +100,13 @@ public class ActivityHttpRepository : IActivityHttpRepository
public async Task<ActivityDto> GetActivity(string id) public async Task<ActivityDto> GetActivity(string id)
{ {
var salesItem = await _client var salesItem = await _client
.GetFromJsonAsync<ActivityDto>($"{_apiConfig.ActivityEndpoint}/{id}"); .GetFromJsonAsync<ActivityDto>($"{_apiConfig.ActivityUri}/{id}");
return salesItem ?? new ActivityDto(); return salesItem ?? new ActivityDto();
} }
public async Task<ApiResponse> AcceptOffer(string id) public async Task<ApiResponse> AcceptOffer(string id)
{ {
var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityEndpoint}/{id}/accept", id) var response = await _client.PostAsJsonAsync($"{_apiConfig.ActivityUri}/{id}/accept", id)
; ;
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApiResponse>(content); var result = JsonSerializer.Deserialize<ApiResponse>(content);

View file

@ -68,7 +68,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
["isHidden"] = pagingParameters.IsHidden.ToString(), ["isHidden"] = pagingParameters.IsHidden.ToString(),
["hasFolded"] = pagingParameters.HasFolded.ToString() ["hasFolded"] = pagingParameters.HasFolded.ToString()
}; };
var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CompanyEndpoint}/page", queryString)); var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CompanyUri}/page", queryString));
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
@ -82,13 +82,13 @@ public class CompanyHttpRepository : ICompanyHttpRepository
public async Task<CompanyDto> GetCompanyByAccount(string accountNumber) public async Task<CompanyDto> GetCompanyByAccount(string accountNumber)
{ {
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CompanyEndpoint}/account/{accountNumber}"); var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CompanyUri}/account/{accountNumber}");
return company ?? new CompanyDto(); return company ?? new CompanyDto();
} }
public async Task<CompanyDto> GetCompanyById(string companyId) public async Task<CompanyDto> GetCompanyById(string companyId)
{ {
var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CompanyEndpoint}/{companyId}"); var company = await _client.GetFromJsonAsync<CompanyDto>($"{_apiConfig.CompanyUri}/{companyId}");
return company ?? new CompanyDto(); return company ?? new CompanyDto();
} }
@ -99,7 +99,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
/// <returns>company id</returns> /// <returns>company id</returns>
public async Task<string> CreateCompany(CompanyDto model) public async Task<string> CreateCompany(CompanyDto model)
{ {
var response = await _client.PostAsJsonAsync($"{_apiConfig.CompanyEndpoint}", model); var response = await _client.PostAsJsonAsync($"{_apiConfig.CompanyUri}", model);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<CompanyDto>(content, _options); var result = JsonSerializer.Deserialize<CompanyDto>(content, _options);
return result.CompanyId; return result.CompanyId;
@ -107,13 +107,15 @@ public class CompanyHttpRepository : ICompanyHttpRepository
public async Task<bool> UpdateCompany(string companyId, CompanyDto model) public async Task<bool> UpdateCompany(string companyId, CompanyDto model)
{ {
var response = await _client.PutAsJsonAsync($"{_apiConfig.CompanyEndpoint}/{companyId}", model); var response = await _client.PutAsJsonAsync($"{_apiConfig.CompanyUri}/{companyId}", model);
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
return response.IsSuccessStatusCode; return response.IsSuccessStatusCode;
} }
public async Task<bool> DeleteCompany(string companyId) public async Task<bool> DeleteCompany(string companyId)
{ {
var response = await _client.DeleteAsync($"{_apiConfig.CompanyEndpoint}/{companyId}"); var response = await _client.DeleteAsync($"{_apiConfig.CompanyUri}/{companyId}");
return response.IsSuccessStatusCode; return response.IsSuccessStatusCode;
} }
} }

View file

@ -33,7 +33,7 @@ public class HistoryHttpRepository : IHistoryHttpRepository
} }
public async Task<List<ProductInventoryView>> FetchInventory(string companyId) public async Task<List<ProductInventoryView>> FetchInventory(string companyId)
{ {
var response = await _client.GetAsync($"{_api.CompanyEndpoint}/{companyId}/{_api.InventoryUri}"); var response = await _client.GetAsync($"{_api.CompanyUri}/{companyId}/{_api.InventoryUri}");
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
return response.IsSuccessStatusCode return response.IsSuccessStatusCode
? JsonSerializer.Deserialize<List<ProductInventoryView>>(content, _options) ? JsonSerializer.Deserialize<List<ProductInventoryView>>(content, _options)
@ -44,18 +44,18 @@ public class HistoryHttpRepository : IHistoryHttpRepository
public async Task<List<ProductHistoryView>> FetchHistory(string companyId) public async Task<List<ProductHistoryView>> FetchHistory(string companyId)
{ {
return await _client.GetFromJsonAsync<List<ProductHistoryView>>( return await _client.GetFromJsonAsync<List<ProductHistoryView>>(
$"{_api.CompanyEndpoint}/{companyId}/{_api.ProductUri}"); $"{_api.CompanyUri}/{companyId}/{_api.ProductUri}");
} }
public async Task<List<ProductHistoryView>> FetchHistory(string companyId, string sku) public async Task<List<ProductHistoryView>> FetchHistory(string companyId, string sku)
{ {
return await _client.GetFromJsonAsync<List<ProductHistoryView>>( return await _client.GetFromJsonAsync<List<ProductHistoryView>>(
$"{_api.CompanyEndpoint}/{companyId}/{_api.ProductUri}/{sku}"); $"{_api.CompanyUri}/{companyId}/{_api.ProductUri}/{sku}");
} }
public async Task<string> UpdateProductHistory(string companyId, string syncDate = "2010-01-01") public async Task<string> UpdateProductHistory(string companyId, string syncDate = "2010-01-01")
{ {
return await _client.GetStringAsync($"{_api.CompanyEndpoint}/{companyId}/{_api.UpdateUri}/{syncDate}"); return await _client.GetStringAsync($"{_api.CompanyUri}/{companyId}/{_api.SyncUri}/{syncDate}");
} }
} }

View file

@ -32,32 +32,32 @@ public class ReportHttpRepository :IReportHttpRepository
public async Task<List<NgSalesReportListView>> GetReports() public async Task<List<NgSalesReportListView>> GetReports()
{ {
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.ReportEndpoint}"); return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.ReportUri}");
} }
public async Task<bool> ReportExist(string workDate) public async Task<bool> ReportExist(string workDate)
{ {
var result = var result =
await _client await _client
.GetFromJsonAsync<ReportClosedView>($"{_apiConfig.ReportEndpoint}/exist/{workDate}"); .GetFromJsonAsync<ReportClosedView>($"{_apiConfig.ReportUri}/exist/{workDate}");
return result.ReportClosed; return result.ReportClosed;
} }
public async Task<NgSalesReportView> GetReport(string workDate) public async Task<NgSalesReportView> GetReport(string workDate)
{ {
return await _client.GetFromJsonAsync<NgSalesReportView>($"{_apiConfig.ReportEndpoint}/{workDate}"); return await _client.GetFromJsonAsync<NgSalesReportView>($"{_apiConfig.ReportUri}/{workDate}");
} }
public async Task<ReportInitDto> InitializeReportData(string workDate) public async Task<ReportInitDto> InitializeReportData(string workDate)
{ {
var initData = await _client var initData = await _client
.GetFromJsonAsync<ReportInitDto>($"{_apiConfig.ReportEndpoint}/init/{workDate}"); .GetFromJsonAsync<ReportInitDto>($"{_apiConfig.ReportUri}/init/{workDate}");
return initData ?? new ReportInitDto(); return initData ?? new ReportInitDto();
} }
public async Task<ApiResponse> PostReport(string workDate, ReportDto reportDto) public async Task<ApiResponse> PostReport(string workDate, ReportDto reportDto)
{ {
var response = await _client var response = await _client
.PostAsJsonAsync($"{_apiConfig.ReportEndpoint}/{workDate}", reportDto); .PostAsJsonAsync($"{_apiConfig.ReportUri}/{workDate}", reportDto);
var jsonDate = await response.Content.ReadAsStringAsync(); var jsonDate = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApiResponse>(jsonDate); var result = JsonSerializer.Deserialize<ApiResponse>(jsonDate);

View file

@ -64,7 +64,7 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup, ["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
}; };
var response = await _client var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CatalogEndpoint}/page", queryString)); .GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.CatalogUri}/page", queryString));
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
@ -80,7 +80,7 @@ public class SalesItemHttpRepository : ISalesItemHttpRepository
public async Task<NgSalesItemView> GetSalesItem(string id) public async Task<NgSalesItemView> GetSalesItem(string id)
{ {
var salesItem = await _client var salesItem = await _client
.GetFromJsonAsync<NgSalesItemView>($"{_apiConfig.CatalogEndpoint}/{id}"); .GetFromJsonAsync<NgSalesItemView>($"{_apiConfig.CatalogUri}/{id}");
return salesItem ?? new NgSalesItemView(); return salesItem ?? new NgSalesItemView();
} }
} }

View file

@ -32,16 +32,16 @@ public class TaskItemHttpRepository : ITaskItemHttpRepository
public async Task<List<TaskItemView>> GetTaskList() public async Task<List<TaskItemView>> GetTaskList()
{ {
return await _client.GetFromJsonAsync<List<TaskItemView>>($"{_apiConfig.TaskItemEndpoint}"); return await _client.GetFromJsonAsync<List<TaskItemView>>($"{_apiConfig.TaskUri}");
} }
public async Task CreateTaskItem(TaskItemView taskItem) public async Task CreateTaskItem(TaskItemView taskItem)
{ {
await _client.PostAsJsonAsync($"{_apiConfig.TaskItemEndpoint}", taskItem); await _client.PostAsJsonAsync($"{_apiConfig.TaskUri}", taskItem);
} }
public async Task<TaskItemView> GetTaskItem(string taskItemId) public async Task<TaskItemView> GetTaskItem(string taskItemId)
{ {
return await _client.GetFromJsonAsync<TaskItemView>($"{_apiConfig.TaskItemEndpoint}/{taskItemId}"); return await _client.GetFromJsonAsync<TaskItemView>($"{_apiConfig.TaskUri}/{taskItemId}");
} }
} }

View file

@ -42,7 +42,7 @@
<label for="activityType" class="col-md-2 col-form-label">Ordre Type</label> <label for="activityType" class="col-md-2 col-form-label">Ordre Type</label>
<div class="col-md-4"> <div class="col-md-4">
<InputSelect id="activityType" class="form-select" @bind-Value="@_draft.ActivityTypeEnum"> <InputSelect id="activityType" class="form-select" @bind-Value="@_draft.ActivityTypeEnum">
<option value="">-TAG MIG-</option> <option value="">&rarr; TAG MIG &larr;</option>
<option value="onSite">Besøg</option> <option value="onSite">Besøg</option>
<option value="phone">Telefon</option> <option value="phone">Telefon</option>
</InputSelect> </InputSelect>
@ -234,7 +234,7 @@
@* catalog *@ @* catalog *@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div class="row mb-1"> <div class="row mb-2">
<div class="col"> <div class="col">
<ItemGroupComponent OnChanged="SetItemGroup"/> <ItemGroupComponent OnChanged="SetItemGroup"/>
</div> </div>
@ -260,7 +260,7 @@
{ {
<table class="table table-hover table-striped justify-content-center"> <table class="table table-hover table-striped justify-content-center">
<thead> <thead>
<tr> <tr class="bg-black bg-opacity-50 text-white rounded-2">
<th scope="col">Navn</th> <th scope="col">Navn</th>
<th scope="col" class="text-nowrap">Varenr</th> <th scope="col" class="text-nowrap">Varenr</th>
<th scope="col" class="text-nowrap">Fork</th> <th scope="col" class="text-nowrap">Fork</th>
@ -351,13 +351,13 @@
<div class="card-footer"> <div class="card-footer">
<div class="row mt-2 mb-2"> <div class="row mt-2 mb-2">
<div class="col"> <div class="col">
<a class="btn btn-primary" href="/companies">Til Oversigt</a> <a class="btn btn-info" href="/companies">Til Oversigt</a>
</div> </div>
<div class="col"> <div class="col">
<a class="btn btn-primary" href="/company/@_company.CompanyId">Tilbage</a> <a class="btn btn-warning" href="/companies/@_company.CompanyId">Annuller</a>
</div> </div>
<div class="col"> <div class="col">
<button type="button" class="btn btn-success" @onclick="CreateActivity">Opret besøg</button> <button type="button" class="btn btn-primary" @onclick="CreateActivity">Opret besøg</button>
</div> </div>
</div> </div>
</div> </div>

View file

@ -30,12 +30,12 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class ActivityCompanyCreate : IDisposable public partial class ActivityVisitNew : IDisposable
{ {
[CascadingParameter] DraftStateProvider DraftStateProvider { get; set; } [CascadingParameter] DraftStateProvider DraftStateProvider { get; set; }
[Parameter] public string CompanyId { get; set; } [Parameter] public string CompanyId { get; set; }
// todo: prevent creating activity for workDate with closed report // todo: prevent creating activity for workDate with closed report
[Inject] private ILogger<ActivityCompanyCreate> _logger { get; set; } [Inject] private ILogger<ActivityVisitNew> _logger { get; set; }
[Inject] private IToastService _toast { get; set; } [Inject] private IToastService _toast { get; set; }
[Inject] private NavigationManager _navigator { get; set; } [Inject] private NavigationManager _navigator { get; set; }
[Inject] private ILocalStorageService _storage { get; set; } [Inject] private ILocalStorageService _storage { get; set; }

View file

@ -35,10 +35,10 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages namespace Wonky.Client.Pages
{ {
public partial class CompanyCreate : IDisposable public partial class CompanyNew : IDisposable
{ {
[Inject] private IToastService _toast { get; set; } [Inject] private IToastService _toast { get; set; }
[Inject] private ILogger<CompanyCreate> _logger { get; set; } [Inject] private ILogger<CompanyNew> _logger { get; set; }
[Inject] private ILocalStorageService _storage { get; set; } [Inject] private ILocalStorageService _storage { get; set; }
[Inject] private NavigationManager _navigator { get; set; } [Inject] private NavigationManager _navigator { get; set; }
[Inject] private ICompanyHttpRepository _companyRepo { get; set; } [Inject] private ICompanyHttpRepository _companyRepo { get; set; }

View file

@ -195,19 +195,22 @@
<div class="card-footer"> <div class="card-footer">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<button type="submit" class="btn btn-success">Gem</button> <button type="submit" class="btn btn-warning">Gem</button>
</div> </div>
<div class="col"> <div class="col">
<a class="btn btn-primary" href="/companies">Til Oversigt</a> <a class="btn btn-primary" href="/companies">Til Oversigt</a>
</div> </div>
<div class="col"> <div class="col">
<a class="btn btn-success" href="/companies/@_company.CompanyId/h/i">Produktkøb</a> <a class="btn btn-info" href="/companies/@_company.CompanyId/h/i">Produktkøb</a>
</div> </div>
<div class="col"> <div class="col">
<a class="btn btn-success" href="/companies/@_company.CompanyId/h/p">Varelinjer</a> <a class="btn btn-info" href="/companies/@_company.CompanyId/h/p">Varelinjer</a>
</div> </div>
<div class="col"> <div class="col">
<ActivityButton CompanyId="@_company.CompanyId" Enabled="@_company.ValidVat"></ActivityButton> <ActivityButton ActionLink="@_actionLink"
ButtonText="Besøg"
ButtonType="primary"
Enabled="@_enableActivity"></ActivityButton>
</div> </div>
</div> </div>
</div> </div>

View file

@ -37,7 +37,7 @@ public partial class CompanyView : IDisposable
{ {
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
[Inject] private IToastService _toast { get; set; } [Inject] private IToastService _toast { get; set; }
[Inject] private ILogger<CompanyView> _loger { get; set; } [Inject] private ILogger<CompanyView> _logger { get; set; }
[Inject] private NavigationManager _navigator { get; set; } [Inject] private NavigationManager _navigator { get; set; }
[Inject] private ICompanyHttpRepository _companyRepo { get; set; } [Inject] private ICompanyHttpRepository _companyRepo { get; set; }
[Inject] private IHistoryHttpRepository _historyRepo { get; set; } [Inject] private IHistoryHttpRepository _historyRepo { get; set; }
@ -58,6 +58,9 @@ public partial class CompanyView : IDisposable
private string _orgVat; private string _orgVat;
private string countryCode = "dk"; private string countryCode = "dk";
private string _visitState = "the-ugly"; private string _visitState = "the-ugly";
private int _enableActivity = 0;
private bool _hideButtons = false;
private string _actionLink = "";
private readonly JsonSerializerOptions _options = new () private readonly JsonSerializerOptions _options = new ()
{ {
@ -81,6 +84,8 @@ public partial class CompanyView : IDisposable
_orgVat = _company.VatNumber; _orgVat = _company.VatNumber;
_company.CountryCode = ux.CountryCode.ToLower(); _company.CountryCode = ux.CountryCode.ToLower();
_enableActivity = _company.ValidVat;
vatAddress = PrepareVatAddress(_company); vatAddress = PrepareVatAddress(_company);
if (_company.Interval == 0) if (_company.Interval == 0)
@ -92,7 +97,7 @@ public partial class CompanyView : IDisposable
if (!_company.ValidDateSpan()) if (!_company.ValidDateSpan())
_nextVisit = _lastVisit.AddDays(_company.Interval * 7); _nextVisit = _lastVisit.AddDays(_company.Interval * 7);
_visitState = Utils.GetVisitState($"{_nextVisit:yyyy-MM-dd}"); _visitState = Utils.GetVisitState($"{_nextVisit:yyyy-MM-dd}");
_actionLink = $"/companies/{CompanyId}/activities/new";
if(_company.HasFolded == 1) if(_company.HasFolded == 1)
{ {
_hasFolded = true; _hasFolded = true;
@ -119,8 +124,7 @@ public partial class CompanyView : IDisposable
_company.LastVisit = $"{_lastVisit:yyyy-MM-dd}"; _company.LastVisit = $"{_lastVisit:yyyy-MM-dd}";
_company.NextVisit = $"{_nextVisit:yyyy-MM-dd}"; _company.NextVisit = $"{_nextVisit:yyyy-MM-dd}";
if (!VatUtils.ValidateFormat(_company.CountryCode, _company.VatNumber) || if (!VatUtils.ValidateFormat(_company.CountryCode, _company.VatNumber) || !_company.ValidDateSpan())
!_company.ValidDateSpan())
{ {
_formInvalid = true; _formInvalid = true;
} }
@ -134,21 +138,26 @@ public partial class CompanyView : IDisposable
{ {
_formInvalid = true; _formInvalid = true;
_editContext.OnFieldChanged -= HandleFieldChanged; _editContext.OnFieldChanged -= HandleFieldChanged;
_editContext.OnValidationStateChanged -= ValidationChanged;
_editContext = new EditContext(_company); _editContext = new EditContext(_company);
_formInvalid = _editContext.Validate();
_editContext.OnFieldChanged += HandleFieldChanged; _editContext.OnFieldChanged += HandleFieldChanged;
_editContext.OnValidationStateChanged -= ValidationChanged; _editContext.OnValidationStateChanged += ValidationChanged;
} }
private async Task SubmitUpdate() private async Task SubmitUpdate()
{ {
if (!VatUtils.ValidateFormat(_company.CountryCode, _company.VatNumber)) if (!VatUtils.ValidateFormat(_company.CountryCode, _company.VatNumber))
{ {
_toast.ShowError($"CVR/VAT/ORG nummer er ugyldig."); _toast.ShowError($"CVR/VAT/ORG nummer mangler eller er ugyldig.");
StateHasChanged(); StateHasChanged();
return; return;
} }
_hideButtons = true;
_company.LastVisit = $"{_lastVisit:yyyy-MM-dd}"; _company.LastVisit = $"{_lastVisit:yyyy-MM-dd}";
_company.NextVisit = $"{_nextVisit:yyyy-MM-dd}"; _company.NextVisit = $"{_nextVisit:yyyy-MM-dd}";
_company.IsHidden = 0; _company.IsHidden = 0;
@ -156,13 +165,15 @@ public partial class CompanyView : IDisposable
_company.UpdateErpVat = 1; _company.UpdateErpVat = 1;
var x = JsonSerializer.Serialize(_company, _options); var x = JsonSerializer.Serialize(_company, _options);
_loger.LogInformation(x); _logger.LogInformation(x);
var success = await _companyRepo.UpdateCompany(CompanyId, _company ); var success = await _companyRepo.UpdateCompany(CompanyId, _company );
if (success) if (success)
{ {
_toast.ShowSuccess("Check"); _toast.ShowSuccess("Kunde er opdateret");
_navigator.NavigateTo($"/companies/{CompanyId}"); _company = await _companyRepo.GetCompanyById(_company.CompanyId);
} }
_hideButtons = false;
} }
private async Task GetInfoFromAddress(VatAddress address) private async Task GetInfoFromAddress(VatAddress address)
@ -209,6 +220,7 @@ public partial class CompanyView : IDisposable
private static VatAddress PrepareVatAddress(CompanyDto model) private static VatAddress PrepareVatAddress(CompanyDto model)
{ {
var digits = "123456789".ToCharArray(); var digits = "123456789".ToCharArray();
// process address1
var pos1 = model.Address1.IndexOfAny(digits); var pos1 = model.Address1.IndexOfAny(digits);
if (pos1 > 0) if (pos1 > 0)
{ {
@ -219,6 +231,7 @@ public partial class CompanyView : IDisposable
HouseNumber = Regex.Replace(model.Address1[pos1..], "[^0-9]", "") HouseNumber = Regex.Replace(model.Address1[pos1..], "[^0-9]", "")
}; };
} }
// process address2
var pos2 = model.Address2.IndexOfAny(digits); var pos2 = model.Address2.IndexOfAny(digits);
if (pos2 > 0) if (pos2 > 0)
{ {

View file

@ -2,8 +2,15 @@
@page "/companies/{CompanyId}/h/p/{Sku}" @page "/companies/{CompanyId}/h/p/{Sku}"
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3>@_company.Name</h3> <div class="row">
<div class="col">
<h3>@_company.Name</h3>
</div>
<div class="col align-content-end">
<a class="btn btn-primary" href="/companies/@_company.CompanyId">Tilbage</a>
</div>
</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<ProductLineTableComponent ProductHistory="_lines"></ProductLineTableComponent> <ProductLineTableComponent ProductHistory="_lines"></ProductLineTableComponent>

View file

@ -3,7 +3,14 @@
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3>@_company.Name</h3> <div class="row">
<div class="col">
<h3>@_company.Name</h3>
</div>
<div class="col align-content-end">
<a class="btn btn-primary" href="/companies/@_company.CompanyId">Tilbage</a>
</div>
</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<ProductLineTableComponent ProductHistory="_lines"></ProductLineTableComponent> <ProductLineTableComponent ProductHistory="_lines"></ProductLineTableComponent>

View file

@ -5,7 +5,14 @@
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<h3>@_company.Name</h3> <div class="row">
<div class="col">
<h3>@_company.Name</h3>
</div>
<div class="col align-content-end">
<a class="btn btn-primary" href="/companies/@_company.CompanyId">Tilbage</a>
</div>
</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<ProductInventoryTableComponent CompanyId="@CompanyId" Inventory="_inventory"></ProductInventoryTableComponent> <ProductInventoryTableComponent CompanyId="@CompanyId" Inventory="_inventory"></ProductInventoryTableComponent>

View file

@ -25,7 +25,7 @@
<div class="card-header"> <div class="card-header">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="h5" style="font-variant: small-caps">Dagsrapport @(_workDate.ToLongDateString())</div> <div class="h5" style="font-variant: small-caps">@(_workDate.ToLongDateString())</div>
</div> </div>
<div class="col"> <div class="col">
<WorkDateComponent OnChanged="SetWorkDate"></WorkDateComponent> <WorkDateComponent OnChanged="SetWorkDate"></WorkDateComponent>
@ -54,7 +54,7 @@
<td> <td>
<select id="dayType" class="col-md-3 form-select" <select id="dayType" class="col-md-3 form-select"
@bind-Value="_report.DayTypeEnum" @bind-Value:event="oninput"> @bind-Value="_report.DayTypeEnum" @bind-Value:event="oninput">
<option value="">-UDFYLD MIG-</option> <option value="">&rarr; TAG MIG &larr;</option>
<option value="sales">Salgsdag</option> <option value="sales">Salgsdag</option>
<option value="meeting">Salgsmøde</option> <option value="meeting">Salgsmøde</option>
<option value="office">Kontordag</option> <option value="office">Kontordag</option>
@ -85,13 +85,13 @@
</td> </td>
} }
<th> <th>
<button type="button" class="btn btn-info" <button type="button" class="btn btn-warning"
@onclick="GetKeyFigures" disabled="@(!_noFigures)"> @onclick="GetKeyFigures" disabled="@(!_noFigures)">
Nøgletal Nøgletal
</button> </button>
</th> </th>
<td> <td>
<button type="button" class="btn btn-info" <button type="button" class="btn btn-success"
@onclick="SubmitReport" disabled="@(_noFigures)"> @onclick="SubmitReport" disabled="@(_noFigures)">
Gem Rapport Gem Rapport
</button> </button>

View file

@ -28,14 +28,14 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class ReportCreate : IDisposable public partial class SalesReportNew : IDisposable
{ {
[Inject] private HttpInterceptorService _interceptor { get; set; } [Inject] private HttpInterceptorService _interceptor { get; set; }
[Inject] private UserPreferenceService _userPrefs { get; set; } [Inject] private UserPreferenceService _userPrefs { get; set; }
[Inject] private IActivityHttpRepository _activityRepo { get; set; } [Inject] private IActivityHttpRepository _activityRepo { get; set; }
[Inject] private IReportHttpRepository _reportRepo { get; set; } [Inject] private IReportHttpRepository _reportRepo { get; set; }
[Inject] private NavigationManager _navigator { get; set; } [Inject] private NavigationManager _navigator { get; set; }
[Inject] private ILogger<ReportCreate> _logger { get; set; } [Inject] private ILogger<SalesReportNew> _logger { get; set; }
[Inject] private IToastService _toast { get; set; } [Inject] private IToastService _toast { get; set; }
private EditContext _editContext { get; set; } private EditContext _editContext { get; set; }
private ReportDto _report { get; set; } = new(); private ReportDto _report { get; set; } = new();

View file

@ -26,7 +26,7 @@
<div class="col"> <div class="col">
@if (!string.IsNullOrWhiteSpace(ReportDate)) @if (!string.IsNullOrWhiteSpace(ReportDate))
{ {
<h3 class="workDate">Dagsrapport @DateTime.Parse(ReportDate).ToLongDateString()</h3> <h3 class="workDate">@DateTime.Parse(ReportDate).ToLongDateString()</h3>
} }
</div> </div>
<div class="col"> <div class="col">

View file

@ -5,7 +5,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class ReportView public partial class SalesReportView
{ {
[Parameter] public string ReportDate { get; set; } [Parameter] public string ReportDate { get; set; }
[Inject] private IReportHttpRepository _reportRepo { get; set; } [Inject] private IReportHttpRepository _reportRepo { get; set; }
@ -21,6 +21,7 @@ public partial class ReportView
private async Task GetReport(string workDate) private async Task GetReport(string workDate)
{ {
ReportDate = workDate;
_report = new NgSalesReportView(); _report = new NgSalesReportView();
_report = await _reportRepo.GetReport(workDate); _report = await _reportRepo.GetReport(workDate);
} }

View file

@ -38,7 +38,7 @@ builder.Services.AddScoped(sp => sp.GetService<IHttpClientFactory>().CreateClien
builder.Services.AddHttpClient("InnoAPI", (sp, cl) => builder.Services.AddHttpClient("InnoAPI", (sp, cl) =>
{ {
var apiConfig = sp.GetRequiredService<IOptions<ApiConfig>>(); var apiConfig = sp.GetRequiredService<IOptions<ApiConfig>>();
cl.BaseAddress = new Uri(apiConfig.Value.BaseAddress); cl.BaseAddress = new Uri(apiConfig.Value.BaseUrl);
cl.EnableIntercept(sp); cl.EnableIntercept(sp);
}); });

View file

@ -54,7 +54,7 @@ namespace Wonky.Client.Services
}; };
var response = await _client var response = await _client
.PostAsync(_apiConfig.Value.TokenPath, new FormUrlEncodedContent(credentials)); .PostAsync(_apiConfig.Value.TokenUri, new FormUrlEncodedContent(credentials));
var resContent = await response.Content.ReadAsStringAsync(); var resContent = await response.Content.ReadAsStringAsync();
@ -89,7 +89,7 @@ namespace Wonky.Client.Services
["grant_type"] = "refresh_token", ["grant_type"] = "refresh_token",
["refresh_token"] = refreshToken ["refresh_token"] = refreshToken
}; };
var response = await _client.PostAsync(_apiConfig.Value.TokenPath, new FormUrlEncodedContent(credentials)); var response = await _client.PostAsync(_apiConfig.Value.TokenUri, new FormUrlEncodedContent(credentials));
if (!response.IsSuccessStatusCode) return string.Empty; if (!response.IsSuccessStatusCode) return string.Empty;
var resContent = await response.Content.ReadAsStringAsync(); var resContent = await response.Content.ReadAsStringAsync();
var data = JsonSerializer.Deserialize<AuthResponseView>(resContent, _options); var data = JsonSerializer.Deserialize<AuthResponseView>(resContent, _options);
@ -113,7 +113,7 @@ namespace Wonky.Client.Services
public async Task<UserInfoView> UserInfo(bool write = false) public async Task<UserInfoView> UserInfo(bool write = false)
{ {
var infoResponse = await _client.GetAsync(_apiConfig.Value.UserInfo); var infoResponse = await _client.GetAsync(_apiConfig.Value.UserInfoUri);
var infoContent = await infoResponse.Content.ReadAsStringAsync(); var infoContent = await infoResponse.Content.ReadAsStringAsync();
var userInfo = JsonSerializer.Deserialize<UserInfoView>(infoContent, _options); var userInfo = JsonSerializer.Deserialize<UserInfoView>(infoContent, _options);
if(write) if(write)

View file

@ -51,7 +51,7 @@ public class VatInfoLookupService
["houseNumber"] = $"{query.HouseNumber}", ["houseNumber"] = $"{query.HouseNumber}",
["zipCode"] = $"{query.ZipCode}" ["zipCode"] = $"{query.ZipCode}"
}; };
var endpoint = QueryHelpers.AddQueryString(_config.VirkEndpoint, queryString); var endpoint = QueryHelpers.AddQueryString(_config.VirkUrl, queryString);
var response = await _client.GetAsync(endpoint); var response = await _client.GetAsync(endpoint);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var jsonResult = JsonSerializer.Deserialize<List<VirkRegInfo>>(content, _options); var jsonResult = JsonSerializer.Deserialize<List<VirkRegInfo>>(content, _options);
@ -70,7 +70,7 @@ public class VatInfoLookupService
{ {
["vatNumber"] = $"{vatNumber}" ["vatNumber"] = $"{vatNumber}"
}; };
var endpoint = QueryHelpers.AddQueryString(_config.BrRegEndpoint, queryString); var endpoint = QueryHelpers.AddQueryString(_config.BrRegUrl, queryString);
var response = await _client.GetAsync(endpoint); var response = await _client.GetAsync(endpoint);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
@ -91,7 +91,7 @@ public class VatInfoLookupService
{ {
["vatNumber"] = $"{vatNumber}" ["vatNumber"] = $"{vatNumber}"
}; };
var endpoint = QueryHelpers.AddQueryString(_config.ViesEndpoint, queryString); var endpoint = QueryHelpers.AddQueryString(_config.ViesUrl, queryString);
var response = await _client.GetAsync(endpoint); var response = await _client.GetAsync(endpoint);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();

View file

@ -18,26 +18,26 @@
}, },
"appInfo": { "appInfo": {
"name": "Wonky Client", "name": "Wonky Client",
"version": "0.8.30", "version": "0.8.36",
"isBeta": true, "isBeta": true,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },
"apiConfig": { "apiConfig": {
"baseAddress": "https://staging.innotec.dk",
"tokenPath": "token",
"userInfo": "api/auth/userinfo",
"companyEndpoint": "api/v2/crm/companies",
"catalogEndpoint": "api/v2/crm/catalog",
"virkEndpoint": "api/v2/services/virk",
"brRegEndpoint": "api/v2/services/brReg",
"viesEndpoint": "api/v2/services/vies",
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=", "glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
"glsId": "", "glsId": "",
"activityEndpoint": "api/v2/crm/salesReps/sales", "virkUrl": "api/v2/services/virk",
"reportEndpoint": "api/v2/crm/salesReps/reports", "brRegUrl": "api/v2/services/brReg",
"taskItemEndpoint": "api/v2/crm/salesRps/tasks", "viesUrl": "api/v2/services/vies",
"inventoryUri": "h/i", "baseUrl": "https://staging.innotec.dk",
"productUri": "h/p", "tokenUri": "token",
"updateUri": "h/u" "userInfoUri": "api/auth/userinfo",
"catalogUri": "api/v2/crm/catalog",
"activityUri": "api/v2/crm/salesReps/sales",
"reportUri": "api/v2/crm/salesReps/reports",
"taskUri": "api/v2/crm/salesRps/tasks",
"companyUri": "api/v2/crm/companies",
"inventoryUri": "history/inventory",
"productUri": "history/products",
"syncUri": "history/sync"
} }
} }

View file

@ -16,24 +16,30 @@ namespace Wonky.Entity.Configuration;
public class ApiConfig public class ApiConfig
{ {
public string BaseAddress { get; set; } = ""; // external service
public string CompanyEndpoint { get; set; } = "";
public string CatalogEndpoint { get; set; } = "";
public string KrvVariants { get; set; } = "";
public string KrvProducts { get; set; } = "";
public string ImageUpload { get; set; } = "";
public string UserRegistration { get; set; } = "";
public string UserInfo { get; set; } = "";
public string VirkEndpoint { get; set; } = "";
public string BrRegEndpoint { get; set; } = "";
public string ViesEndpoint { get; set; } = "";
public string TokenPath { get; set; } = "";
public string GlsTrackUrl { get; set; } = ""; public string GlsTrackUrl { get; set; } = "";
public string GlsId { get; set; } = ""; public string GlsId { get; set; } = "";
public string ActivityEndpoint { get; set; } = ""; public string VirkUrl { get; set; } = "";
public string ReportEndpoint { get; set; } = ""; public string BrRegUrl { get; set; } = "";
public string TaskItemEndpoint { get; set; } = ""; public string ViesUrl { get; set; } = "";
// api service
public string BaseUrl { get; set; } = "";
public string CompanyUri { get; set; } = "";
public string CatalogUri { get; set; } = "";
public string UserInfoUri { get; set; } = "";
public string TokenUri { get; set; } = "";
public string ActivityUri { get; set; } = "";
public string ReportUri { get; set; } = "";
public string TaskUri { get; set; } = "";
public string InventoryUri { get; set; } = ""; public string InventoryUri { get; set; } = "";
public string ProductUri { get; set; } = ""; public string ProductUri { get; set; } = "";
public string UpdateUri { get; set; } = ""; public string SyncUri { get; set; } = "";
// public string KrvVariantsUri { get; set; } = "";
// public string KrvProductsUri { get; set; } = "";
// public string ImageUploadUri { get; set; } = "";
// public string UserRegistrationUri { get; set; } = "";
} }