This commit is contained in:
Frede Hundewadt 2022-07-17 11:56:28 +02:00
parent e63b04ec22
commit 2d58f0c14f
60 changed files with 550 additions and 96 deletions

View file

@ -24,7 +24,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Components
{
public partial class AdminAdviserCompanyTableComponent
public partial class AdminAdvisorCompanyTableComponent
{
[Parameter] public List<CompanyDto> Companies { get; set; } = new();
[Parameter] public EventCallback<string> OnDelete { get; set; }

View file

@ -44,9 +44,9 @@
<td>@user.FullName</td>
<td>@user.PhoneNumber</td>
<td>@user.Email</td>
<td><a class="btn btn-outline-dark" href="/admin/users/advisers/@user.CountryCode.ToLower()/@user.UserId/reports">Rapporter</a></td>
<td><a class="btn btn-outline-dark" href="/admin/users/advisers/@user.CountryCode.ToLower()/@user.UserId/companies">Kunder</a></td>
<td><a class="btn btn-outline-dark" href="/admin/users/advisers/@user.CountryCode.ToLower()/@user.UserId/view">Rediger</a></td>
<td><a class="btn btn-outline-dark" href="/admin/users/Advisors/@user.CountryCode.ToLower()/@user.UserId/reports">Rapporter</a></td>
<td><a class="btn btn-outline-dark" href="/admin/users/Advisors/@user.CountryCode.ToLower()/@user.UserId/companies">Kunder</a></td>
<td><a class="btn btn-outline-dark" href="/admin/users/Advisors/@user.CountryCode.ToLower()/@user.UserId/view">Rediger</a></td>
</tr>
}
</tbody>

View file

@ -19,7 +19,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Components;
public partial class AdminAdviserTableComponent
public partial class AdminAdvisorTableComponent
{
[Parameter] public List<UserListAdminView> UserList { get; set; }
}

View file

@ -41,7 +41,7 @@
</div>
@foreach (var report in ReportList)
{
<a class="list-group-item list-group-item-action" href="/admin/users/advisers/@CountryCode/@UserId/reports/@report.ReportDate">
<a class="list-group-item list-group-item-action" href="/admin/users/Advisors/@CountryCode/@UserId/reports/@report.ReportDate">
<div class="row">
<div class="col">
@report.ReportDate

View file

@ -19,7 +19,7 @@
@using Wonky.Client.Components
<PageTitle>Inno Web CRM</PageTitle>
<AuthorizeView Roles="Adviser">
<AuthorizeView Roles="Advisor">
<div class="alert bg-light border-dark">
<div class="row">
<div class="col">
@ -32,11 +32,16 @@
</div>
<TaskItemTableComponent TaskItemList="_taskItems" OnCompleteTask="OnCompleteTask"
OnDeleteTask="OnDeleteConfirmed" OnTaskCompleted="OnTaskCompleted" />
</AuthorizeView>
<AuthorizeView Roles="Admin">
<h2>Administrator</h2>
</AuthorizeView>
<AuthorizeView Roles="Warehouse">
<h2>Lager</h2>
</AuthorizeView>
<AuthorizeView Roles="Supervisor">
<h2>Supervisor</h2>
</AuthorizeView>

View file

@ -19,7 +19,7 @@
<AuthorizeView>
<Authorized>
<div class="d-print-none">
<a class="btn btn-outline-light" href="logout">LOG AF</a>
<a class="btn btn-outline-light" href="logout"><i class="oi oi-lock-unlocked"></i> LOG AF</a>
<a class="btn btn-outline-light" href="info">HJÆLP</a>
</div>
</Authorized>

View file

@ -47,12 +47,12 @@ public class AdminReportHttpRepository : IAdminReportHttpRepository
public async Task<List<NgSalesReportListView>> GetReports(string userId)
{
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.AdminAdviserUri}/{userId}/reports");
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.AdminAdvisorUri}/{userId}/reports");
}
public async Task<ReportView> GetReport(string userId, string workDate)
{
return await _client.GetFromJsonAsync<ReportView>($"{_apiConfig.AdminAdviserUri}/{userId}/reports/{workDate}");
return await _client.GetFromJsonAsync<ReportView>($"{_apiConfig.AdminAdvisorUri}/{userId}/reports/{workDate}");
}
}

View file

@ -80,7 +80,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
return pagingResponse;
}
public async Task<PagingResponse<CompanyDto>> GetAdminAdviserCompaniesPaged(string userId, CompanyPagingParams pagingParameters)
public async Task<PagingResponse<CompanyDto>> GetAdminAdvisorCompaniesPaged(string userId, CompanyPagingParams pagingParameters)
{
var queryString = new Dictionary<string, string>
{
@ -93,7 +93,7 @@ public class CompanyHttpRepository : ICompanyHttpRepository
["hasFolded"] = pagingParameters.HasFolded.ToString()
};
var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.AdminAdviserUri}/{userId}/companies", queryString));
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.AdminAdvisorUri}/{userId}/companies", queryString));
var content = await response.Content.ReadAsStringAsync();

View file

@ -24,7 +24,7 @@ namespace Wonky.Client.HttpRepository;
public interface ICompanyHttpRepository
{
Task<PagingResponse<CompanyDto>> GetCompaniesPaged(CompanyPagingParams pagingParameters);
Task<PagingResponse<CompanyDto>> GetAdminAdviserCompaniesPaged(string userId, CompanyPagingParams pagingParameters);
Task<PagingResponse<CompanyDto>> GetAdminAdvisorCompaniesPaged(string userId, CompanyPagingParams pagingParameters);
Task<CompanyDto> GetCompanyByAccount(string accountNumber);
Task<CompanyDto> GetCompanyById(string companyId);
Task<string> CreateCompany(CompanyDto model);

View file

@ -20,9 +20,9 @@ namespace Wonky.Client.HttpRepository;
public interface IUserHttpRepository
{
Task<List<UserListAdminView>> GetAdvisers();
Task<AdminUserInfoDto> GetAdviserInfo(string userId);
Task UpdateAdviser(string userId, UserUpdateDto model);
Task<List<UserListAdminView>> GetAdvisors();
Task<AdminUserInfoDto> GetAdvisorInfo(string userId);
Task UpdateAdvisor(string userId, UserUpdateDto model);
Task<List<UserListAdminView>> GetAdminUsers();
Task<AdminUserInfoDto> GetAdminUserInfo(string userId);
Task UpdateAdminUser(string userId, UserUpdateDto model);

View file

@ -0,0 +1,10 @@
using Wonky.Entity.Views;
namespace Wonky.Client.HttpRepository;
public interface IWarehouseHttpRepository
{
Task<List<WarehouseOrderView>> GetWarehouseOrderListByStatus(string status);
Task<WarehouseOrderView> GetWarehouseOrder(string orderId);
Task UpdateWarehouseOrderStatus(WarehouseProcess process);
}

View file

@ -47,19 +47,19 @@ public class UserHttpRepository : IUserHttpRepository
_api = configuration.Value;
}
public async Task<List<UserListAdminView>> GetAdvisers()
public async Task<List<UserListAdminView>> GetAdvisors()
{
return await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminAdviserUri);
return await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminAdvisorUri);
}
public async Task<AdminUserInfoDto> GetAdviserInfo(string userId)
public async Task<AdminUserInfoDto> GetAdvisorInfo(string userId)
{
return await _client.GetFromJsonAsync<AdminUserInfoDto>($"{_api.AdminAdviserUri}/{userId}");
return await _client.GetFromJsonAsync<AdminUserInfoDto>($"{_api.AdminAdvisorUri}/{userId}");
}
public async Task UpdateAdviser(string userId, UserUpdateDto model)
public async Task UpdateAdvisor(string userId, UserUpdateDto model)
{
await _client.PutAsJsonAsync($"{_api.AdminAdviserUri}/{userId}", model, _options);
await _client.PutAsJsonAsync($"{_api.AdminAdvisorUri}/{userId}", model, _options);
}
public async Task<List<UserListAdminView>> GetAdminUsers()

View file

@ -0,0 +1,52 @@
using System.Net.Http.Json;
using System.Text.Json;
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Options;
using Wonky.Entity.Configuration;
using Wonky.Entity.Views;
namespace Wonky.Client.HttpRepository;
public class WarehouseHttpRepository : IWarehouseHttpRepository
{
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
private readonly NavigationManager _navigation;
private ILogger<WarehouseHttpRepository> _logger;
private readonly HttpClient _client;
private readonly ApiConfig _api;
public WarehouseHttpRepository(HttpClient client,
ILogger<WarehouseHttpRepository> logger,
NavigationManager navigation,
IOptions<ApiConfig> configuration)
{
_client = client;
_logger = logger;
_navigation = navigation;
_api = configuration.Value;
}
public async Task<List<WarehouseOrderView>> GetWarehouseOrderListByDate(string date)
{
return await _client.GetFromJsonAsync<List<WarehouseOrderView>>($"{_api.WarehouseUri}?date={date}", _options);
}
public async Task<List<WarehouseOrderView>> GetWarehouseOrderListByStatus(string status)
{
return await _client.GetFromJsonAsync<List<WarehouseOrderView>>($"{_api.WarehouseUri}?status={status}", _options);
}
public async Task<WarehouseOrderView> GetWarehouseOrder(string orderId)
{
return await _client.GetFromJsonAsync<WarehouseOrderView>($"{_api.WarehouseUri}/{orderId}", _options);
}
public async Task UpdateWarehouseOrderStatus(WarehouseProcess process)
{
_logger.LogDebug("process => {}", JsonSerializer.Serialize(process));
await _client.PutAsJsonAsync($"{_api.WarehouseUri}/{process.OrderId}", process, _options);
}
}

View file

@ -17,7 +17,7 @@
@page "/companies/{companyId}/activities/new"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
@using Wonky.Client.Components
<div class="card">

View file

@ -126,7 +126,7 @@ public partial class ActivityNewVisitPage : IDisposable
_draft.VisitTypeEnum = _company.Account is "" or "NY" ? "new" : "recall";
// permanent identifications
_draft.SalesRep = _ux.Adviser;
_draft.SalesRep = _ux.Advisor;
_draft.Account = _company.Account;
_draft.VatNumber = _company.VatNumber;
_draft.Email = _company.Email;

View file

@ -17,7 +17,7 @@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
@page "/activity-today"
<div class="card">

View file

@ -16,7 +16,7 @@
*@
@using Wonky.Client.Components
@page "/admin/users/advisers/{CountryCode}/{UserId}/companies"
@page "/admin/users/Advisors/{CountryCode}/{UserId}/companies"
<div class="card">
<div class="card-header bg-dark text-white">

View file

@ -23,7 +23,7 @@ using Wonky.Entity.Requests;
namespace Wonky.Client.Pages;
public partial class AdminAdviserCompanyListPage : IDisposable
public partial class AdminAdvisorCompanyListPage : IDisposable
{
[Parameter] public string UserId { get; set; } = "";
[Parameter] public string CountryCode { get; set; } = "";
@ -55,14 +55,14 @@ public partial class AdminAdviserCompanyListPage : IDisposable
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
AdminUserInfo = await _userRepo.GetAdviserInfo(UserId);
AdminUserInfo = await _userRepo.GetAdvisorInfo(UserId);
// get companies
await GetCompanies();
}
private async Task GetCompanies()
{
var pagingResponse = await _companyRepo.GetAdminAdviserCompaniesPaged(UserId, _paging);
var pagingResponse = await _companyRepo.GetAdminAdvisorCompaniesPaged(UserId, _paging);
_companyList = pagingResponse.Items;
_metaData = pagingResponse.MetaData;
}

View file

@ -18,13 +18,13 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin")]
@page "/admin/users/advisers/{CountryCode}"
@page "/admin/users/Advisors/{CountryCode}"
<div class="card">
<div class="card-header bg-dark text-white">
<h3>Sælgere</h3>
</div>
<div class="card-body">
<AdminAdviserTableComponent UserList="_salesReps"></AdminAdviserTableComponent>
<AdminAdvisorTableComponent UserList="_salesReps"></AdminAdvisorTableComponent>
</div>
</div>

View file

@ -21,7 +21,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class AdminAdviserUserListPage : IDisposable
public partial class AdminAdvisorUserListPage : IDisposable
{
[Parameter] public string CountryCode { get; set; } = "";
[Inject] private HttpInterceptorService _interceptor { get; set; }
@ -33,8 +33,8 @@ public partial class AdminAdviserUserListPage : IDisposable
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
var adviserList = await _userRepo.GetAdvisers();
_salesReps = adviserList
var AdvisorList = await _userRepo.GetAdvisors();
_salesReps = AdvisorList
.Where(x => x.CountryCode.ToLower() == CountryCode && Convert.ToInt32(x.SalesRep) < 100)
.ToList();
}

View file

@ -15,7 +15,7 @@
//
*@
@page "/admin/users/advisers/{CountryCode}/{UserId}/view"
@page "/admin/users/Advisors/{CountryCode}/{UserId}/view"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin")]
@ -26,7 +26,7 @@
<div class="card-body">
@if (AdminUserInfo != null)
{
<EditForm EditContext="_editContext" OnValidSubmit="UpdateAdviser">
<EditForm EditContext="_editContext" OnValidSubmit="UpdateAdvisor">
<DataAnnotationsValidator/>
<div class="row">
<div class="col">
@ -69,7 +69,7 @@
Sælgernr.
</th>
<td>
@AdminUserInfo.Adviser
@AdminUserInfo.Advisor
</td>
<th scope="col">
Landekode
@ -96,10 +96,10 @@
<button type="submit" class="btn btn-primary">Gem</button>
</div>
<div class="col">
<a class="btn btn-primary" href="/admin/users/advisers/@CountryCode">Tilbage</a>
<a class="btn btn-primary" href="/admin/users/Advisors/@CountryCode">Tilbage</a>
</div>
<div class="col">
<a class="btn btn-primary" href="/admin/users/advisers/@CountryCode/@UserId/reports">Salg</a>
<a class="btn btn-primary" href="/admin/users/Advisors/@CountryCode/@UserId/reports">Salg</a>
</div>
</div>
</EditForm>

View file

@ -24,13 +24,13 @@ using Wonky.Entity.DTO;
namespace Wonky.Client.Pages;
public partial class AdminAdviserViewPage : IDisposable
public partial class AdminAdvisorViewPage : IDisposable
{
[Parameter] public string UserId { get; set; } = "";
[Parameter] public string CountryCode { get; set; } = "";
[Inject] private HttpInterceptorService _interceptor { get; set; }
[Inject] private IUserHttpRepository _userRepo { get; set; }
[Inject] private ILogger<AdminAdviserViewPage> _logger { get; set; }
[Inject] private ILogger<AdminAdvisorViewPage> _logger { get; set; }
[Inject] private NavigationManager _navigator { get; set; }
[Inject] private IToastService _toast { get; set; }
private AdminUserInfoDto AdminUserInfo { get; set; } = new();
@ -53,7 +53,7 @@ public partial class AdminAdviserViewPage : IDisposable
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
AdminUserInfo = await _userRepo.GetAdviserInfo(UserId);
AdminUserInfo = await _userRepo.GetAdvisorInfo(UserId);
_updateInfo.Email = AdminUserInfo.Email;
_updateInfo.CountryCode = AdminUserInfo.CountryCode;
@ -67,10 +67,10 @@ public partial class AdminAdviserViewPage : IDisposable
}
private async Task UpdateAdviser()
private async Task UpdateAdvisor()
{
_toast.ShowInfo("Sender data til server ...");
await _userRepo.UpdateAdviser(UserId, _updateInfo);
await _userRepo.UpdateAdvisor(UserId, _updateInfo);
}
private void PwHandleFieldChanged(object sender, FieldChangedEventArgs e)

View file

@ -33,8 +33,8 @@ public partial class AdminOfficeUserListPage : IDisposable
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
var adviserList = await _userRepo.GetAdminUsers();
_adminUsers = adviserList
var AdvisorList = await _userRepo.GetAdminUsers();
_adminUsers = AdvisorList
.Where(x => x.CountryCode.ToLower() == CountryCode)
.ToList();
}

View file

@ -30,7 +30,7 @@ public partial class AdminOfficeUserViewPage : IDisposable
[Parameter] public string CountryCode { get; set; } = "";
[Inject] private HttpInterceptorService _interceptor { get; set; }
[Inject] private IUserHttpRepository _userRepo { get; set; }
[Inject] private ILogger<AdminAdviserViewPage> _logger { get; set; }
[Inject] private ILogger<AdminAdvisorViewPage> _logger { get; set; }
[Inject] private NavigationManager _navigator { get; set; }
[Inject] private IToastService _toast { get; set; }
private AdminUserInfoDto AdminUserInfo { get; set; } = new();

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin")]
@page "/admin/users/advisers/{CountryCode}/{UserId}/reports"
@page "/admin/users/Advisors/{CountryCode}/{UserId}/reports"
<div class="card">
<div class="card-header bg-dark text-white">

View file

@ -17,7 +17,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@page "/admin/users/advisers/{CountryCode}/{UserId}/reports/{ReportDate}"
@page "/admin/users/Advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
@attribute [Authorize(Roles = "Admin")]
<div class="report-page">

View file

@ -72,7 +72,7 @@ public partial class AdminReportViewPage : IDisposable
{
if (workDate != ReportDate)
{
_navigator.NavigateTo($"/admin/users/advisers/{CountryCode}/{UserId}/reports/{workDate}");
_navigator.NavigateTo($"/admin/users/Advisors/{CountryCode}/{UserId}/reports/{workDate}");
return;
}

View file

@ -21,7 +21,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class AdviserReportListPage : IDisposable
public partial class AdvisorReportListPage : IDisposable
{
[Inject] private IReportHttpRepository _reportRepo { get; set; }
[Inject] private HttpInterceptorService _interceptor { get; set; }

View file

@ -17,7 +17,7 @@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
@page "/sales-reports/new"
<EditForm EditContext="_editContext">

View file

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

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@page "/sales-reports/view/{ReportDate}"
@attribute [Authorize(Roles = "Adviser,Admin,Supervisor")]
@attribute [Authorize(Roles = "Advisor,Admin,Supervisor")]
<div class="report-page d-print-block">
<div class="row mb-3 d-print-none">

View file

@ -20,7 +20,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class AdviserReportViewPage
public partial class AdvisorReportViewPage
{
[Parameter] public string ReportDate { get; set; }
[Inject] private IReportHttpRepository _reportRepo { get; set; }

View file

@ -19,7 +19,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
<div class="sticky-top bg-success bg-opacity-50 rounded-2 px-3">
<div class="container-fluid pt-3">

View file

@ -19,7 +19,7 @@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@using System.Xml
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
<h2>Opret kunde</h2>

View file

@ -19,7 +19,7 @@
@using Microsoft.AspNetCore.Components
@using Wonky.Client.Components
@using Wonky.Client.Helpers
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
@page "/companies/{CompanyId}"
@if (!string.IsNullOrWhiteSpace(_company.Name))

View file

@ -21,7 +21,7 @@
@using Microsoft.AspNetCore.Authorization
@page "/info"
@attribute [Authorize(Roles = "Adviser,Admin,Office,Warehouse")]
@attribute [Authorize(Roles = "Advisor,Admin,Office,Warehouse")]
<div class="row mb-2">
<div class="col col-md-2">
<img class="grumpy-coder" src="@_app?.Image" alt="Wonky Logo"/>

View file

@ -21,7 +21,7 @@
@using Wonky.Client.Components;
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser,Admin,Supervisor")]
@attribute [Authorize(Roles = "Advisor,Admin,Supervisor,Office,Warehouse")]
<Home></Home>

View file

@ -19,7 +19,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser,Admin")]
@attribute [Authorize(Roles = "Advisor,Admin")]
<div class="sticky-top bg-success bg-opacity-50 rounded-2 px-3">
<div class="container-fluid pt-3">

View file

@ -17,7 +17,7 @@
@page "/sales-item/{salesItemId}"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser,Admin")]
@attribute [Authorize(Roles = "Advisor,Admin")]
<div class="card">

View file

@ -17,7 +17,7 @@
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin")]
@page "/admin/users/advisers"
@page "/admin/users/Advisors"
<div class="card">
<div class="card-header bg-dark text-white">
@ -27,9 +27,9 @@
</div>
<div class="card-body">
<div class="list-group list-group-flush">
<a class="list-group-item list-group-item-action" href="/admin/users/advisers/dk">Danmark</a>
<a class="list-group-item list-group-item-action" href="/admin/users/advisers/no">Norge</a>
<a class="list-group-item list-group-item-action" href="/admin/users/advisers/se">Sverige</a>
<a class="list-group-item list-group-item-action" href="/admin/users/Advisors/dk">Danmark</a>
<a class="list-group-item list-group-item-action" href="/admin/users/Advisors/no">Norge</a>
<a class="list-group-item list-group-item-action" href="/admin/users/Advisors/se">Sverige</a>
</div>
</div>
</div>

View file

@ -17,7 +17,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
@page "/companies/{CompanyId}/h/p/{Sku}"
<div class="card">

View file

@ -17,7 +17,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
@page "/companies/{CompanyId}/h/p"
<div class="card">

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@page "/companies/{CompanyId}/h/i"
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
<div class="card">
<div class="card-header">

View file

@ -17,7 +17,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser")]
@attribute [Authorize(Roles = "Advisor")]
@page "/task-items"
<div class="card">

View file

@ -0,0 +1,78 @@
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Warehouse,Office")]
@page "/warehouse/orders"
<div class="row mb-3">
<div class="col-md-8">
<div class="btn-group-lg" role="group" aria-label="Ordre status">
<input type="radio" class="btn-check" name="btnorder" id="btnorder1" autocomplete="off" checked @onchange="@GetOrderStatusNone" />
<label class="btn btn-danger" for="btnorder1">Ubehandlet</label>
<input type="radio" class="btn-check" name="btnorder" id="btnorder2" autocomplete="off" @onchange="@GetOrderStatusPicked"/>
<label class="btn btn-warning" for="btnorder2">Plukket</label>
<input type="radio" class="btn-check" name="btnorder" id="btnorder3" autocomplete="off" @onchange="@GetOrderStatusPacked" />
<label class="btn btn-success" for="btnorder3">Pakket</label>
</div>
</div>
<div class="col-md-4">
@if (_readyToShip && _orders.Any())
{
<button type="button" class="btn btn-lg btn-primary text-nowrap" @onclick="SetProcessStatusShipped">Sæt alle afsendt</button>
}
</div>
</div>
@if (_orders.Any())
{
<div class="list-group list-group-flush">
<div class="list-group-item">
<div class="row mb-1">
<div class="col-md-2">
<h4>Ordredato</h4>
</div>
<div class="col-md-4">
<h4>Kundenavn</h4>
</div>
<div class="col-md-4">
<h4>Postnr. Bynavn</h4>
</div>
<div class="col-md-2">
<h4>Status</h4>
</div>
</div>
</div>
@foreach (var order in _orders)
{
<a class="list-group-item list-group-item-action" href="warehouse/orders/@order.OrderId">
<div class="row">
<div class="col-md-2">
@order.OrderDate
</div>
<div class="col-md-4">
@order.Company.Name
</div>
<div class="col-md-4">
@order.Company.ZipCode @order.Company.City
</div>
<div class="col-md-2">
@switch (order.ProcessStatusEnum.ToLower())
{
case "none":
<span>Ubehandlet</span>
break;
case "picked":
<span>Plukket</span>
break;
case "packed":
<span>Pakket</span>
break;
case "shipped":
<span>Afsendt</span>
break;
}
</div>
</div>
</a>
}
</div>
}

View file

@ -0,0 +1,66 @@
using System.Text.Json;
using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class WarehouseOrderListPage : IDisposable
{
[Inject] private HttpInterceptorService _interceptor { get; set; }
[Inject] private IWarehouseHttpRepository _warehouseRepo { get; set; }
private string _items { get; set; }
private bool _readyToShip;
private List<WarehouseOrderView> _orders { get; set; }
protected override async Task OnInitializedAsync()
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
await GetOrderStatusNone();
_items = JsonSerializer.Serialize(_orders);
}
private async Task GetOrderStatusNone()
{
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("none");
_readyToShip = false;
}
private async Task GetOrderStatusPicked()
{
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("picked");
_readyToShip = false;
}
private async Task GetOrderStatusPacked()
{
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("packed");
_readyToShip = true;
}
private async Task SetProcessStatusShipped()
{
foreach (var order in _orders)
{
if (order.ProcessStatusEnum.ToLower() != "packed") continue;
var process = new WarehouseProcess
{
OrderId = order.OrderId,
ProcessStatusEnum = "shipped"
};
await _warehouseRepo.UpdateWarehouseOrderStatus(process);
order.ProcessStatusEnum = "shipped";
}
}
public void Dispose()
{
_interceptor.DisposeEvent();
}
}

View file

@ -0,0 +1,103 @@
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Warehouse,Office")]
@page "/warehouse/orders/{OrderId}"
@if (!string.IsNullOrWhiteSpace(_order.OrderDate))
{
<table class="table">
<thead>
<tr>
<th colspan="4">
<h2 class="text-center">@_order.Company.Name</h2>
</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Konto</th>
<td>@_order.Company.Account</td>
<th scope="row">Telefon</th>
<td>@_order.Company.Phone</td>
</tr>
<tr>
<th scope="row">Kunde</th>
<td>@_order.Company.Name</td>
<th scope="row">Lev.Navn</th>
<td>@_order.DlvName</td>
</tr>
<tr>
<th scope="row">Adresse</th>
<td>@_order.Company.Address1</td>
<th scope="row">Lev.Adresse</th>
<td>@_order.DlvAddress1</td>
</tr>
<tr>
<th scope="row">Adresse</th>
<td>@_order.Company.Address2</td>
<th scope="row">Lev.Adresse</th>
<td>@_order.DlvAddress2</td>
</tr>
<tr>
<th scope="row">Postnr By</th>
<td>@_order.Company.ZipCode @_order.Company.City</td>
<th scope="row">Lev.Postnr By</th>
<td>@_order.DlvZipCity</td>
</tr>
</tbody>
</table>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Antal</th>
<th scope="col">Varenr</th>
<th scope="col">Beskrivelse</th>
</tr>
</thead>
<tbody>
@foreach (var line in _order.Lines)
{
<tr>
<td>@line.Quantity</td>
<td>@line.Sku</td>
<td>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="@line.LineNumber"/>
<label class="form-check-label" for="@line.LineNumber">@line.Description</label>
</div>
</td>
</tr>
}
</tbody>
</table>
@if (!string.IsNullOrWhiteSpace(_order.OfficeNote))
{
<div class="alert bg-light border-dark border-2">
<h3 class="text-center">@_order.OfficeNote</h3>
</div>
}
<div class="row">
<div class="col-md-3">
<a class="btn btn-lg btn-primary text-nowrap" href="/warehouse/orders">Oversigt</a>
</div>
<div class="col-md-3">
</div>
<div class="col-md-4">
@if (_order.ProcessStatusEnum.ToLower() == "none")
{
<button class="btn btn-lg btn-primary text-nowrap" type="button" @onclick="SetProcessStatusPicked">Sæt status plukket</button>
}
@if (_order.ProcessStatusEnum.ToLower() == "picked")
{
<button class="btn btn-lg btn-primary text-nowrap" type="button" @onclick="SetProcessStatusPacked">Sæt status pakket</button>
}
@if (_order.ProcessStatusEnum.ToLower() == "packed")
{
<button class="btn btn-lg btn-primary text-nowrap" type="button" @onclick="SetProcessStatusPacked">Sæt status afsendt</button>
}
</div>
</div>
}
else
{
<div>Ingen data</div>
}

View file

@ -0,0 +1,61 @@
using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class WarehouseOrderViewPage : IDisposable
{
[Parameter] public string OrderId { get; set; } = "";
[Inject] private HttpInterceptorService _interceptor { get; set; }
[Inject] private IWarehouseHttpRepository _warehouseRepo { get; set; }
[Inject] private NavigationManager _navigator { get; set; }
private WarehouseOrderView _order { get; set; } = new();
protected override async Task OnParametersSetAsync()
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
if (!string.IsNullOrWhiteSpace(OrderId))
_order = await _warehouseRepo.GetWarehouseOrder(OrderId);
}
private async Task SetProcessStatusPicked()
{
var process = new WarehouseProcess
{
OrderId = _order.OrderId,
ProcessStatusEnum = "picked"
};
await _warehouseRepo.UpdateWarehouseOrderStatus(process);
_navigator.NavigateTo("/warehouse/orders");
}
private async Task SetProcessStatusPacked()
{
var process = new WarehouseProcess
{
OrderId = _order.OrderId,
ProcessStatusEnum = "packed"
};
await _warehouseRepo.UpdateWarehouseOrderStatus(process);
_navigator.NavigateTo("/warehouse/orders");
}
private async Task SetProcessStatusShipped()
{
var process = new WarehouseProcess
{
OrderId = _order.OrderId,
ProcessStatusEnum = "shipped"
};
await _warehouseRepo.UpdateWarehouseOrderStatus(process);
}
public void Dispose()
{
_interceptor.DisposeEvent();
}
}

View file

@ -57,6 +57,7 @@ builder.Services.AddScoped<ITaskItemHttpRepository, TaskItemHttpRepository>();
builder.Services.AddScoped<IHistoryHttpRepository, HistoryHttpRepository>();
builder.Services.AddScoped<IUserHttpRepository, UserHttpRepository>();
builder.Services.AddScoped<IAdminReportHttpRepository, AdminReportHttpRepository>();
builder.Services.AddScoped<IWarehouseHttpRepository, WarehouseHttpRepository>();
builder.Services.AddScoped<HttpInterceptorService>();
builder.Services.AddBlazoredLocalStorage();

View file

@ -102,14 +102,18 @@ namespace Wonky.Client.Shared
var roles = new List<string>();
if (userInfoView.IsAdmin)
roles.Add("Admin");
if (userInfoView.IsAdviser)
roles.Add("Adviser");
if (userInfoView.IsAdvisor)
roles.Add("Advisor");
if (userInfoView.IsSupervisor)
roles.Add("Supervisor");
if(userInfoView.IsEDoc)
roles.Add("EDoc");
if (userInfoView.IsEShop)
roles.Add("EShop");
if (userInfoView.IsOffice)
roles.Add("Office");
if (userInfoView.IsWareHouse)
roles.Add("Warehouse");
return roles;
}
}

View file

@ -45,9 +45,18 @@
</div>
</NotAuthorized>
</AuthorizeView>
<AuthorizeView Roles="Admin,Warehouse,Office">
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/warehouse/orders">
<span class="oi oi-people" aria-hidden="true"></span> Ordrer
</NavLink>
</div>
</AuthorizeView>
<AuthorizeView Roles="Admin">
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/admin/users/advisers">
<NavLink class="nav-link ps-2" href="/admin/users/Advisors">
<span class="oi oi-people" aria-hidden="true"></span> Sælgere
</NavLink>
</div>
@ -62,7 +71,8 @@
</NavLink>
</div>
</AuthorizeView>
<AuthorizeView Roles="Adviser">
<AuthorizeView Roles="Advisor">
<Authorized>
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/home">
@ -95,13 +105,6 @@
<span class="oi oi-question-mark" aria-hidden="true"></span> Hjælp
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/logout">
<span class="oi oi-account-login"></span> Log af
</NavLink>
</div>
</Authorized>
</AuthorizeView>
</nav>

View file

@ -1,13 +1,13 @@
{
"appInfo": {
"name": "Wonky Client",
"version": "0.9.15",
"version": "0.9.17",
"rc": true,
"sandBox": false,
"image": "grumpy-coder.png"
},
"apiConfig": {
"innoBaseUrl": "https://dev.innotec.dk",
"innoBaseUrl": "https://staging.innotec.dk",
"glsTrackUrl": "https://www.gls-group.eu/276-I-PORTAL-WEB/content/GLS/DK01/DA/5004.htm?txtAction=71000&txtRefNo=",
"glsId": "",
"virkUrl": "api/v2/services/virk",
@ -16,14 +16,14 @@
"tokenUri": "token",
"userInfoUri": "api/auth/userinfo",
"catalogUri": "api/v2/crm/catalog",
"activityUri": "api/v2/crm/advisers/sales",
"reportUri": "api/v2/crm/advisers/reports",
"taskUri": "api/v2/crm/advisers/tasks",
"activityUri": "api/v2/crm/Advisors/sales",
"reportUri": "api/v2/crm/Advisors/reports",
"taskUri": "api/v2/crm/Advisors/tasks",
"companyUri": "api/v2/crm/companies",
"inventoryUri": "history/inventory",
"productUri": "history/products",
"syncUri": "history/sync",
"adminAdviserUri": "api/v2/admin/users/advisers",
"adminAdvisorUri": "api/v2/admin/users/Advisors",
"adminUserUri": "api/v2/admin/users/office",
"adminPasswdUri": "api/v2/admin/users/passwd",
"adminReportUri": "reports",

View file

@ -99,7 +99,7 @@ public class ApiConfig
/// <summary>
/// Application uri for administration of sales representatives
/// </summary>
public string AdminAdviserUri { get; set; } = "";
public string AdminAdvisorUri { get; set; } = "";
/// <summary>
/// Application uri for administration of administrative users
@ -111,7 +111,8 @@ public class ApiConfig
/// </summary>
public string AdminPasswdUri { get; set; } = "";
public string WarehouseUri { get; set; } = "";
// public string KrvVariantsUri { get; set; } = "";
// public string KrvProductsUri { get; set; } = "";
// public string ImageUploadUri { get; set; } = "";

View file

@ -58,7 +58,7 @@ public class AdminUserInfoDto
/// </summary>
[Required(ErrorMessage = "Sælger identifikation skal angives.")]
[MaxLength(50,ErrorMessage = "Der kan højst bruges 20 tegn.")]
public string Adviser { get; set; } = "";
public string Advisor { get; set; } = "";
/// <summary>
/// Country name
@ -76,9 +76,9 @@ public class AdminUserInfoDto
public bool EmailConfirmed { get; set; }
/// <summary>
/// Adviser flag
/// Advisor flag
/// </summary>
public bool IsAdviser { get; set; }
public bool IsAdvisor { get; set; }
/// <summary>
/// Admin flag

View file

@ -38,7 +38,15 @@ public class ReportItemLine
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// Line number
/// </summary>
public int LineNumber { get; set; }
/// <summary>
/// Line sum
/// </summary>
public decimal LineSum { get; set; }
/// <summary>
/// Flag line as picked
/// </summary>
public bool Checked { get; set; }
}

View file

@ -20,7 +20,7 @@ namespace Wonky.Entity.Views;
public class UserInfoView
{
[JsonPropertyName("id")] public string Id { get; set; } = "";
[JsonPropertyName("adviser")] public string Adviser { get; set; } = "";
[JsonPropertyName("Advisor")] public string Advisor { get; set; } = "";
[JsonPropertyName("companyId")] public string CrmCompanyKey { get; set; } = "";
[JsonPropertyName("countryCode")] public string CountryCode { get; set; } = "";
[JsonPropertyName("countryName")] public string CountryName { get; set; } = "";
@ -28,8 +28,10 @@ public class UserInfoView
[JsonPropertyName("fullName")] public string FullName { get; set; } = "";
[JsonPropertyName("phoneNumber")] public string PhoneNumber { get; set; } = "";
[JsonPropertyName("isAdmin")] public bool IsAdmin { get; set; }
[JsonPropertyName("isAdviser")] public bool IsAdviser { get; set; }
[JsonPropertyName("isAdvisor")] public bool IsAdvisor { get; set; }
[JsonPropertyName("isEDoc")] public bool IsEDoc { get; set; }
[JsonPropertyName("isEShop")] public bool IsEShop { get; set; }
[JsonPropertyName("isOffice")] public bool IsOffice { get; set; }
[JsonPropertyName("isWarehouse")] public bool IsWareHouse { get; set; }
[JsonPropertyName("isSupervisor")] public bool IsSupervisor { get; set; }
}

View file

@ -0,0 +1,46 @@
namespace Wonky.Entity.Views;
public class WarehouseOrderView
{
/// <summary>
/// Customer company info
/// </summary>
public ReportItemCustomer Company { get; set; } = new();
/// <summary>
/// Lines
/// </summary>
public List<ReportItemLine> Lines { get; set; } = new();
/// <summary>
/// Entity id (reference to SalesHeadId)
/// </summary>
public string OrderId { get; set; } = "";
/// <summary>
/// Order date
/// </summary>
public string OrderDate { get; set; } = "";
/// <summary>
/// Office note
/// </summary>
public string OfficeNote { get; set; } = "";
/// <summary>
/// Customer deliver name
/// </summary>
public string DlvName { get; set; } = "";
/// <summary>
/// Customer delivery address line 1
/// </summary>
public string DlvAddress1 { get; set; } = "";
/// <summary>
/// Customer delivery address line 2
/// </summary>
public string DlvAddress2 { get; set; } = "";
/// <summary>
/// Customer delivery post code and city name
/// </summary>
public string DlvZipCity { get; set; } = "";
/// <summary>
/// Current process status
/// </summary>
public string ProcessStatusEnum { get; set; } = "";
}

View file

@ -0,0 +1,14 @@
namespace Wonky.Entity.Views;
public class WarehouseProcess
{
/// <summary>
/// Entity id
/// </summary>
public string OrderId { get; set; } = "";
/// <summary>
/// Process status enum as string
/// </summary>
public string ProcessStatusEnum { get; set; } = "";
}