wip
This commit is contained in:
parent
e4947a9b62
commit
77b54a5e40
15 changed files with 147 additions and 32 deletions
|
@ -27,8 +27,9 @@
|
|||
<th scope="col">Note</th>
|
||||
<th class="text-end" scope="col">sas</th>
|
||||
<th class="text-end" scope="col">Beløb</th>
|
||||
<th class="text-center" scope="col">T</th>
|
||||
<th class="text-center" scope="col">H</th>
|
||||
<th class="text-center" scope="col"><i class="oi oi-phone"></i></th>
|
||||
<th class="text-center" scope="col"><i class="oi oi-flash"></i></th>
|
||||
<th class="text-center" scope="col"><i class="oi oi-calculator"></i></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
@ -44,12 +45,13 @@
|
|||
<td class="text-end">@(activity.StatusTypeEnum == "Quote" ? 0 : activity.OrderAmount)</td>
|
||||
<td class="text-center">@if(activity.OurRef.Contains("T:")){<i class="oi oi-phone"></i>}</td>
|
||||
<td class="text-center">@if(activity.Express){<i class="oi oi-flash"></i>}</td>
|
||||
<td class="text-end">@if(activity.StatusTypeEnum == "Quote"){<i class="oi oi-calculator"></i>}</td>
|
||||
</tr>
|
||||
}
|
||||
<tr>
|
||||
<td colspan="5"></td>
|
||||
<td class="text-end">Total</td>
|
||||
<td class="text-end">@Activities.Sum(x => x.OrderAmount)</td>
|
||||
<td class="text-end">@Activities.Where(x => x.StatusTypeEnum == "Order").Sum(x => x.OrderAmount)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
25
Wonky.Client/Components/KmMorningComponent.razor
Normal file
25
Wonky.Client/Components/KmMorningComponent.razor
Normal file
|
@ -0,0 +1,25 @@
|
|||
@using Wonky.Client.Services
|
||||
|
||||
<div class="input-group">
|
||||
<label class="col-form-label me-2" for="kmMorning">Morgen</label>
|
||||
<input type="number" id="kmMorning" class="form-control" @bind-Value="KmMorning" @bind-Value:event="oninput" @onchange="OnKmChanged"/>
|
||||
</div>
|
||||
|
||||
@code {
|
||||
|
||||
[Inject] private UserPreferenceService PreferenceService { get; set; }
|
||||
private int KmMorning { get; set; }
|
||||
private Preferences Preferences { get; set; } = new();
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
Preferences = await PreferenceService.GetPreferences();
|
||||
KmMorning = Preferences.KmMorning;
|
||||
}
|
||||
|
||||
private async Task OnKmChanged()
|
||||
{
|
||||
await PreferenceService.SetKmMorning(KmMorning);
|
||||
}
|
||||
|
||||
}
|
|
@ -20,3 +20,42 @@
|
|||
|
||||
<PageTitle>Inno Web CRM</PageTitle>
|
||||
|
||||
<div class="py-5">
|
||||
<div class="container">
|
||||
<div class="row row-cols-1 row-cols-md-2 g-4">
|
||||
<div class="col">
|
||||
<div class="card">
|
||||
<img src="..." class="card-img-left" alt="..." />
|
||||
<div class="card-body">
|
||||
danske sælgere
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="card">
|
||||
<img src="..." class="card-img-left" alt="..." />
|
||||
<div class="card-body">
|
||||
norske sælgere
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="card">
|
||||
<img src="..." class="card-img-left" alt="..." />
|
||||
<div class="card-body">
|
||||
svenske sælgere
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="card">
|
||||
<img src="..." class="card-img-left" alt="..." />
|
||||
<div class="card-body">
|
||||
Produkt prisliste
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
|
||||
.workDate {
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
|
|
|
@ -54,7 +54,9 @@ public class UserHttpRepository : IUserHttpRepository
|
|||
|
||||
public async Task<UserInfoDto> GetAdvisorInfo(string userId)
|
||||
{
|
||||
return await _client.GetFromJsonAsync<UserInfoDto>($"{_api.AdminUser}/{userId}");
|
||||
var user = await _client.GetFromJsonAsync<UserInfoDto>($"{_api.AdminUser}/{userId}");
|
||||
Console.WriteLine(JsonSerializer.Serialize(user));
|
||||
return user;
|
||||
}
|
||||
|
||||
public async Task UpdateAdvisor(string userId, UserUpdateDto model)
|
||||
|
@ -64,12 +66,16 @@ public class UserHttpRepository : IUserHttpRepository
|
|||
|
||||
public async Task<List<UserListAdminView>> GetAdminUsers()
|
||||
{
|
||||
return await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminOffice);
|
||||
var users =await _client.GetFromJsonAsync<List<UserListAdminView>>(_api.AdminOffice);
|
||||
Console.WriteLine(JsonSerializer.Serialize(users));
|
||||
return users;
|
||||
}
|
||||
|
||||
public async Task<UserInfoDto> GetAdminUserInfo(string userId)
|
||||
{
|
||||
return await _client.GetFromJsonAsync<UserInfoDto>($"{_api.AdminOffice}/{userId}");
|
||||
var user = await _client.GetFromJsonAsync<UserInfoDto>($"{_api.AdminOffice}/{userId}");
|
||||
Console.WriteLine(JsonSerializer.Serialize(user));
|
||||
return user;
|
||||
}
|
||||
|
||||
public async Task UpdateAdminUser(string userId, UserUpdateDto model)
|
||||
|
|
|
@ -21,11 +21,14 @@
|
|||
@page "/activity-today"
|
||||
|
||||
<div class="row mb-1 align-items-center">
|
||||
<div class="col-md-6">
|
||||
<h2 class="workDate">@(string.IsNullOrWhiteSpace(_workDate) ? "" : $"{DateTime.Parse(_workDate).ToLongDateString()}")</h2>
|
||||
<div class="col-md-5">
|
||||
<h3 class="workDate">@(string.IsNullOrWhiteSpace(_workDate) ? "" : $"{DateTime.Parse(_workDate).ToLongDateString()}")</h3>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<WorkDateComponent OnChanged="GetActivities"></WorkDateComponent>
|
||||
<div class="col-md-2">
|
||||
<WorkDateComponent OnChanged="GetActivities" />
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<KmMorningComponent />
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
@if (_reportExist)
|
||||
|
@ -41,7 +44,7 @@
|
|||
|
||||
@if (ReportItemListView.ReportItems.Any())
|
||||
{
|
||||
<ActivityTableComponent Activities="ReportItemListView.ReportItems"></ActivityTableComponent>
|
||||
<ActivityTableComponent Activities="ReportItemListView.ReportItems" />
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -45,7 +45,7 @@ public partial class ReportNewPageAdvisor : IDisposable
|
|||
private Preferences _prefs { get; set; } = new();
|
||||
private bool _formInvalid = true;
|
||||
private bool _noFigures = true;
|
||||
private bool _working = false;
|
||||
private bool _working;
|
||||
private DateTime _workDate { get; set; } = DateTime.Now;
|
||||
private TimeOnly _checkIn { get; set; } = new(12, 0);
|
||||
private TimeOnly _checkOut { get; set; } = new(12, 0);
|
||||
|
@ -54,7 +54,6 @@ public partial class ReportNewPageAdvisor : IDisposable
|
|||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
_working = true;
|
||||
_interceptor.RegisterEvent();
|
||||
_interceptor.RegisterBeforeSendEvent();
|
||||
_editContext = new EditContext(_report);
|
||||
|
@ -65,8 +64,6 @@ public partial class ReportNewPageAdvisor : IDisposable
|
|||
if (!string.IsNullOrWhiteSpace(_prefs.WorkDate))
|
||||
_workDate = DateTime.Parse(_prefs.WorkDate);
|
||||
|
||||
_working = false;
|
||||
|
||||
if(await _reportRepo.ReportExist(_prefs.WorkDate))
|
||||
_navigator.NavigateTo($"/sales-reports/view/{_prefs.WorkDate}");
|
||||
|
||||
|
@ -103,6 +100,12 @@ public partial class ReportNewPageAdvisor : IDisposable
|
|||
return;
|
||||
}
|
||||
|
||||
if (_report.Figures.KmMorning > _report.Figures.KmEvening)
|
||||
{
|
||||
_toast.ShowError("Km udregning er negativ - kontroller venligst km tal");
|
||||
return;
|
||||
}
|
||||
|
||||
_working = true;
|
||||
|
||||
DateTime checkIn;
|
||||
|
@ -130,7 +133,7 @@ public partial class ReportNewPageAdvisor : IDisposable
|
|||
_logger.LogDebug("_report => {report}", JsonSerializer.Serialize(_report));
|
||||
|
||||
var result = await _reportRepo.PostReport($"{_workDate:yyyy-MM-dd}", _report);
|
||||
|
||||
await _userPrefs.SetKmMorning(0);
|
||||
|
||||
_toast.ShowInfo($"Rapport oprettet {_workDate}");
|
||||
_working = false;
|
||||
|
@ -173,6 +176,7 @@ public partial class ReportNewPageAdvisor : IDisposable
|
|||
_report.Figures = data.ReportData;
|
||||
_init = data.ReportData;
|
||||
_activities = data.ReportItems;
|
||||
_report.Figures.KmMorning = _prefs.KmMorning;
|
||||
_working = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,6 +43,8 @@ public partial class ReportViewPageAdvisor
|
|||
if(workDate != ReportDate)
|
||||
_navigator.NavigateTo($"/sales-reports/view/{workDate}");
|
||||
_report = await _reportRepo.GetReport(workDate);
|
||||
_items = _report.ReportItems.Where(x => x.OrderAmount > 0).ToList();
|
||||
|
||||
_items = _report.ReportItems.Where(x => x.Lines.Any()).ToList();
|
||||
|
||||
}
|
||||
}
|
|
@ -80,7 +80,8 @@ public partial class ReportViewPageOffice : IDisposable
|
|||
_items = new List<ReportItemView>();
|
||||
|
||||
Report = await GetUserReport(UserId, workDate);
|
||||
_items = Report.ReportItems.Where(x => x.OrderAmount > 0).ToList();
|
||||
//_items = Report.ReportItems.Where(x => x.OrderAmount > 0).ToList();
|
||||
_items = Report.ReportItems.Where(x => x.Lines.Any()).ToList();
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
|
|
|
@ -33,15 +33,17 @@ namespace Wonky.Client.Services
|
|||
private readonly AuthenticationStateProvider _authStateProvider;
|
||||
private readonly ILocalStorageService _localStorage;
|
||||
private readonly IOptions<ApiConfig> _apiConfig;
|
||||
private readonly ILogger<AuthenticationService> _logger;
|
||||
|
||||
public AuthenticationService(HttpClient client,
|
||||
AuthenticationStateProvider authStateProvider,
|
||||
ILocalStorageService localStorage, IOptions<ApiConfig> apiConfig)
|
||||
ILocalStorageService localStorage, IOptions<ApiConfig> apiConfig, ILogger<AuthenticationService> logger)
|
||||
{
|
||||
_client = client;
|
||||
_authStateProvider = authStateProvider;
|
||||
_localStorage = localStorage;
|
||||
_apiConfig = apiConfig;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<AuthResponseView> Login(CredentialDto credentials)
|
||||
|
@ -111,13 +113,17 @@ namespace Wonky.Client.Services
|
|||
{
|
||||
((AuthStateProvider)_authStateProvider).NotifyUserLogout();
|
||||
_client.DefaultRequestHeaders.Authorization = null;
|
||||
await _localStorage.ClearAsync();
|
||||
await _localStorage.RemoveItemsAsync(new List<string> {"_xa", "_xe", "_xr", "_xu"});
|
||||
|
||||
}
|
||||
|
||||
public async Task<UserInfoView> UserInfo(bool write = false)
|
||||
{
|
||||
var infoResponse = await _client.GetAsync(_apiConfig.Value.CrmUser);
|
||||
var infoContent = await infoResponse.Content.ReadAsStringAsync();
|
||||
|
||||
_logger.LogDebug("UserInfo <= {}", infoContent);
|
||||
|
||||
var userInfo = JsonSerializer.Deserialize<UserInfoView>(infoContent, _options);
|
||||
if(write)
|
||||
await _localStorage.SetItemAsync("_xu", userInfo);
|
||||
|
|
|
@ -25,6 +25,7 @@ public record Preferences
|
|||
public string? ItemSort { get; set; } = "name";
|
||||
public string PageSize { get; set; } = "10";
|
||||
public string WorkDate { get; set; } = "";
|
||||
public int KmMorning { get; set; }
|
||||
}
|
||||
public class UserPreferenceService
|
||||
{
|
||||
|
@ -35,6 +36,18 @@ public class UserPreferenceService
|
|||
_localStorageService = localStorageService;
|
||||
}
|
||||
|
||||
public async Task SetKmMorning(int kmMorning)
|
||||
{
|
||||
var preferences = await GetPreferences();
|
||||
var newPreferences = preferences
|
||||
with
|
||||
{
|
||||
KmMorning = kmMorning
|
||||
};
|
||||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
||||
OnChange?.Invoke(newPreferences);
|
||||
}
|
||||
|
||||
public async Task SetCompanyFilterPhrase(string filterPhrase)
|
||||
{
|
||||
var preferences = await GetPreferences();
|
||||
|
@ -46,6 +59,7 @@ public class UserPreferenceService
|
|||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
||||
OnChange?.Invoke(newPreferences);
|
||||
}
|
||||
|
||||
public async Task SetWorkDate(DateTime workDate)
|
||||
{
|
||||
var preferences = await GetPreferences();
|
||||
|
@ -57,6 +71,7 @@ public class UserPreferenceService
|
|||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
||||
OnChange?.Invoke(newPreferences);
|
||||
}
|
||||
|
||||
public async Task SetCompanySearch(string companySearch)
|
||||
{
|
||||
var preferences = await GetPreferences();
|
||||
|
@ -92,6 +107,7 @@ public class UserPreferenceService
|
|||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
||||
OnChange?.Invoke(newPreferences);
|
||||
}
|
||||
|
||||
public async Task SetPageSize(string pageSize)
|
||||
{
|
||||
var preferences = await GetPreferences();
|
||||
|
@ -100,6 +116,7 @@ public class UserPreferenceService
|
|||
await _localStorageService.SetItemAsync("preferences", newPreferences);
|
||||
OnChange?.Invoke(newPreferences);
|
||||
}
|
||||
|
||||
public async Task<Preferences> GetPreferences()
|
||||
{
|
||||
return await _localStorageService.GetItemAsync<Preferences>("preferences").ConfigureAwait(true)
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"appInfo": {
|
||||
"name": "Wonky Client",
|
||||
"version": "0.10.125",
|
||||
"rc": true,
|
||||
"sandBox": false,
|
||||
"version": "0.11.30",
|
||||
"rc": false,
|
||||
"sandBox": true,
|
||||
"image": "grumpy-coder.png"
|
||||
},
|
||||
"apiConfig": {
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png" />
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="favicon-16x16.png" />
|
||||
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#5bbad5" />
|
||||
<meta name="msapplication-TileColor" content="#ffaa00" />
|
||||
<meta name="application-TileColor" content="#ffaa00" />
|
||||
<meta name="theme-color" content="#000" />
|
||||
<base href="/" />
|
||||
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" />
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Collections.Concurrent;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Wonky.Entity.DTO;
|
||||
|
@ -61,15 +62,20 @@ public class UserInfoDto
|
|||
public string Advisor { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Country name
|
||||
/// User Id
|
||||
/// </summary>
|
||||
public string CountryName { get; set; } = "";
|
||||
public string UserId { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Lockout flag
|
||||
/// </summary>
|
||||
public bool LockoutEnabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Country name
|
||||
/// </summary>
|
||||
public string CountryName { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Email confirmed flag
|
||||
/// </summary>
|
||||
|
@ -85,8 +91,11 @@ public class UserInfoDto
|
|||
/// </summary>
|
||||
public bool IsAdmin { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// User Id
|
||||
/// </summary>
|
||||
public string UserId { get; set; } = "";
|
||||
public bool IsEDoc { get; set; }
|
||||
public bool IsEShop { get; set; }
|
||||
public bool IsSupervisor { get; set; }
|
||||
public bool IsOffice { get; set; }
|
||||
public bool IsWarehouse { get; set; }
|
||||
public string Roles { get; set; } = "";
|
||||
public string ReferenceId { get; set; } = "";
|
||||
}
|
|
@ -21,7 +21,7 @@ public class UserInfoView
|
|||
{
|
||||
[JsonPropertyName("id")] public string Id { get; set; } = "";
|
||||
[JsonPropertyName("advisor")] public string Advisor { get; set; } = "";
|
||||
[JsonPropertyName("companyId")] public string CrmCompanyKey { get; set; } = "";
|
||||
[JsonPropertyName("companyId")] public string ReferenceId { get; set; } = "";
|
||||
[JsonPropertyName("countryCode")] public string CountryCode { get; set; } = "";
|
||||
[JsonPropertyName("countryName")] public string CountryName { get; set; } = "";
|
||||
[JsonPropertyName("email")] public string Email { get; set; } = "";
|
||||
|
|
Loading…
Reference in a new issue