wip - salesReport - prevent creating activity when report exist

This commit is contained in:
Frede Hundewadt 2022-06-16 11:03:28 +02:00
parent 3bde1eb06a
commit 6c3f3c74b9
12 changed files with 72 additions and 36 deletions

View file

@ -42,9 +42,9 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@if (Activities != null) @if (_view != null)
{ {
foreach (var activity in Activities) foreach (var activity in _view.Activities)
{ {
<tr> <tr>
<td> <td>

View file

@ -25,6 +25,7 @@ using Wonky.Client.Services;
using Wonky.Client.Shared; using Wonky.Client.Shared;
using Wonky.Entity.DTO; using Wonky.Entity.DTO;
using Wonky.Entity.Models; using Wonky.Entity.Models;
using Wonky.Entity.Views;
namespace Wonky.Client.Components; namespace Wonky.Client.Components;
public partial class Home : IDisposable public partial class Home : IDisposable
@ -36,7 +37,7 @@ public partial class Home : IDisposable
[Inject] private NavigationManager Navigator { get; set; } [Inject] private NavigationManager Navigator { get; set; }
[Inject] private IActivityHttpRepository ActivityRepo { get; set; } [Inject] private IActivityHttpRepository ActivityRepo { get; set; }
[Inject] private IToastService _toast { get; set; } [Inject] private IToastService _toast { get; set; }
private List<ReportActivityDto> Activities { get; set; } private NgActivityListView _view { get; set; }
private Preferences _prefs { get; set; } = new(); private Preferences _prefs { get; set; } = new();
private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}"; private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
@ -56,8 +57,8 @@ public partial class Home : IDisposable
{ {
_toast.ShowInfo("Vent nogle sekunder for data"); _toast.ShowInfo("Vent nogle sekunder for data");
_workDate = workDate; _workDate = workDate;
Activities = new List<ReportActivityDto>(); _view = new NgActivityListView();
Activities = await ActivityRepo.GetActivities(workDate); _view = await ActivityRepo.GetActivities(workDate);
} }
public void Dispose() public void Dispose()

View file

@ -54,15 +54,14 @@ public class ActivityHttpRepository : IActivityHttpRepository
_apiConfig = configuration.Value; _apiConfig = configuration.Value;
} }
public async Task<List<ReportActivityDto>?> 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.ActivityEndpoint}/date/{activityDate}");
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
_logger.LogInformation("GetActivities => {content}", content);
return string.IsNullOrWhiteSpace(content) return string.IsNullOrWhiteSpace(content)
? new List<ReportActivityDto>() ? new NgActivityListView()
: JsonSerializer.Deserialize<List<ReportActivityDto>>(content, _options); : JsonSerializer.Deserialize<NgActivityListView>(content, _options);
} }
public async Task<PagingResponse<ActivityDto>> GetActivityPaged(ActivityPagingParams pagingParameters) public async Task<PagingResponse<ActivityDto>> GetActivityPaged(ActivityPagingParams pagingParameters)
{ {

View file

@ -28,5 +28,5 @@ public interface IActivityHttpRepository
Task<ActivityDto> GetActivity(string id); Task<ActivityDto> GetActivity(string id);
Task<ApiResponse> CreateActivity(ActivityDto model); Task<ApiResponse> CreateActivity(ActivityDto model);
Task<ApiResponse> AcceptOffer(string id); Task<ApiResponse> AcceptOffer(string id);
Task<List<ReportActivityDto>?> GetActivities(string activityDate); Task<NgActivityListView> GetActivities(string activityDate);
} }

View file

@ -6,6 +6,7 @@ namespace Wonky.Client.HttpRepository;
public interface IReportHttpRepository public interface IReportHttpRepository
{ {
Task<bool> ReportExist(string workDate);
Task<NgSalesReportView> GetReport(string workDate); Task<NgSalesReportView> GetReport(string workDate);
Task<ReportInitDto> InitializeReportData(string workDate); Task<ReportInitDto> InitializeReportData(string workDate);
Task<ApiResponse> PostReport(string workDate, ReportDto reportDto); Task<ApiResponse> PostReport(string workDate, ReportDto reportDto);

View file

@ -30,6 +30,14 @@ public class ReportHttpRepository :IReportHttpRepository
_apiConfig = configuration.Value; _apiConfig = configuration.Value;
} }
public async Task<bool> ReportExist(string workDate)
{
var result =
await _client
.GetFromJsonAsync<NgActivityListView>($"{_apiConfig.ReportEndpoint}/exist/{workDate}");
return result.ReportClosed || true;
}
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.ReportEndpoint}/{workDate}");

View file

@ -28,6 +28,16 @@
</div> </div>
</div> </div>
@if (_reportClosdd)
{
<div class="row">
<div class="col">
<h5>Der kan ikke oprettes aktiviteter for den valgte dato</h5>
</div>
</div>
}
else
{
@if (DraftContext != null) @if (DraftContext != null)
{ {
<EditForm EditContext="DraftContext"> <EditForm EditContext="DraftContext">
@ -177,7 +187,9 @@
<div class="text-sm-start px-2">@rate.Quantity</div> <div class="text-sm-start px-2">@rate.Quantity</div>
<div class="text-sm-end">@rate.Rate</div> <div class="text-sm-end">@rate.Rate</div>
<button type="button" class="btn btn-primary btn-sm" <button type="button" class="btn btn-primary btn-sm"
@onclick="@(() => SelectItem(item.ItemId, rate.Quantity, rate.Rate))">Vælg</button> @onclick="@(() => SelectItem(item.ItemId, rate.Quantity, rate.Rate))">
Vælg
</button>
</li> </li>
} }
</ul> </ul>
@ -367,3 +379,4 @@
</div> </div>
</EditForm> </EditForm>
} }
}

View file

@ -33,15 +33,16 @@ namespace Wonky.Client.Pages;
public partial class ActivityCreate : IDisposable public partial class ActivityCreate : IDisposable
{ {
// todo: prevent creating activity for workDate with closed report // todo: prevent creating activity for workDate with closed report
[Inject] public ILogger<ActivityCreate> _logger { get; set; } [Inject] private ILogger<ActivityCreate> _logger { get; set; }
[Inject] public IToastService ToastService { get; set; } [Inject] private IToastService _toast { get; set; }
[Inject] public NavigationManager NavigationManager { get; set; } [Inject] private NavigationManager _navigator { get; set; }
[Inject] public ILocalStorageService StorageService { get; set; } [Inject] private ILocalStorageService _storage { get; set; }
[Inject] private ISalesItemHttpRepository ItemRepo { get; set; } [Inject] private ISalesItemHttpRepository _itemRepo { get; set; }
[Inject] private ICompanyHttpRepository CompanyRepo { get; set; } [Inject] private ICompanyHttpRepository _companyRepo { get; set; }
[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; }
[CascadingParameter] DraftStateProvider DraftStateProvider { get; set; } [CascadingParameter] DraftStateProvider DraftStateProvider { get; set; }
[Parameter] public string CompanyId { get; set; } [Parameter] public string CompanyId { get; set; }
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
@ -67,28 +68,31 @@ public partial class ActivityCreate : IDisposable
private bool InvalidStatusType { get; set; } = true; private bool InvalidStatusType { get; set; } = true;
private bool InvalidActivity { get; set; } = true; private bool InvalidActivity { get; set; } = true;
private bool InvalidCanvas { get; set; } = true; private bool InvalidCanvas { get; set; } = true;
private bool _reportClosdd { get; set; } = false;
private UserInfoView Ux { get; set; } = new(); private UserInfoView Ux { get; set; } = new();
private DateTime _workDate { get; set; } = DateTime.Now; private DateTime _workDate { get; set; } = DateTime.Now;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Interceptor.RegisterEvent(); _interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); _interceptor.RegisterBeforeSendEvent();
_prefs = await UserPrefs.GetPreferences(); _prefs = await _userPrefs.GetPreferences();
if (!string.IsNullOrWhiteSpace(_prefs.WorkDate)) if (!string.IsNullOrWhiteSpace(_prefs.WorkDate))
_workDate = DateTime.Parse(_prefs.WorkDate); _workDate = DateTime.Parse(_prefs.WorkDate);
_poDraft.ActivityDate = $"{_workDate:yyyy-MM-dd}" ; _poDraft.ActivityDate = $"{_workDate:yyyy-MM-dd}" ;
// check if report is closed
_reportClosdd = await _reportRepo.ReportExist(_poDraft.ActivityDate);
_paging.SearchColumn = _prefs.ItemSearch ?? "name"; _paging.SearchColumn = _prefs.ItemSearch ?? "name";
_paging.PageSize = Convert.ToInt32(_prefs.PageSize); _paging.PageSize = Convert.ToInt32(_prefs.PageSize);
await GetSalesItems(); await GetSalesItems();
Ux = await StorageService.GetItemAsync<UserInfoView>("_xu"); Ux = await _storage.GetItemAsync<UserInfoView>("_xu");
NgCompany = await CompanyRepo.GetCompanyById(CompanyId); NgCompany = await _companyRepo.GetCompanyById(CompanyId);
// set up identification // set up identification
_poDraft.CompanyId = NgCompany.CompanyId; _poDraft.CompanyId = NgCompany.CompanyId;
@ -163,11 +167,11 @@ public partial class ActivityCreate : IDisposable
} }
_poDraft.Lines = lines; _poDraft.Lines = lines;
await StorageService.SetItemAsync(CompanyId, _poDraft); await _storage.SetItemAsync(CompanyId, _poDraft);
Console.WriteLine(JsonSerializer.Serialize(_poDraft)); Console.WriteLine(JsonSerializer.Serialize(_poDraft));
var result = await ActivityRepo.CreateActivity(_poDraft); var result = await _activityRepo.CreateActivity(_poDraft);
ToastService.ShowSuccess($"{result.Message}."); _toast.ShowSuccess($"{result.Message}.");
NavigationManager.NavigateTo($"/companies"); _navigator.NavigateTo($"/companies");
} }
private void CheckActivity() private void CheckActivity()
@ -261,7 +265,7 @@ public partial class ActivityCreate : IDisposable
private async Task GetSalesItems() private async Task GetSalesItems()
{ {
var response = await ItemRepo.GetSalesItemsPaged(_paging); var response = await _itemRepo.GetSalesItemsPaged(_paging);
SalesItems = response.Items!; SalesItems = response.Items!;
MetaData = response.MetaData; MetaData = response.MetaData;
} }
@ -286,7 +290,7 @@ public partial class ActivityCreate : IDisposable
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e) private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{ {
if (string.IsNullOrEmpty(_poDraft.ActivityTypeEnum)) if (string.IsNullOrEmpty(_poDraft.ActivityTypeEnum))
ToastService.ShowWarning("Aktivitet type kan ikke være tom"); _toast.ShowWarning("Aktivitet type kan ikke være tom");
_poFormInvalid = false; _poFormInvalid = false;
@ -298,7 +302,7 @@ public partial class ActivityCreate : IDisposable
public void Dispose() public void Dispose()
{ {
Interceptor.DisposeEvent(); _interceptor.DisposeEvent();
DraftContext.OnFieldChanged -= HandleFieldChanged; DraftContext.OnFieldChanged -= HandleFieldChanged;
DraftContext.OnValidationStateChanged -= ValidationChanged; DraftContext.OnValidationStateChanged -= ValidationChanged;
} }

View file

@ -19,7 +19,8 @@
@page "/index" @page "/index"
@page "/home" @page "/home"
@using Wonky.Client.Components; @using Wonky.Client.Components;
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Adviser,Admin,Supervisor")]
<Home></Home> <Home></Home>
@code{ @code{

View file

@ -1,5 +1,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@page "/sales-report/view/{reportDate}" @page "/sales-report/view/{reportDate}"
@attribute [Authorize(Roles = "Adviser,Admin,Supervisor")]
<WorkDateComponent OnChanged="GetReport"></WorkDateComponent> <WorkDateComponent OnChanged="GetReport"></WorkDateComponent>

View file

@ -23,7 +23,7 @@
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },
"apiConfig": { "apiConfig": {
"baseAddress": "https://staging.innotec.dk", "baseAddress": "https://dev.innotec.dk",
"tokenPath": "token", "tokenPath": "token",
"userInfo": "api/auth/userinfo", "userInfo": "api/auth/userinfo",
"customerEndpoint": "api/v2/crm/companies", "customerEndpoint": "api/v2/crm/companies",

View file

@ -0,0 +1,7 @@
namespace Wonky.Entity.Views;
public class NgActivityListView
{
public bool ReportClosed { get; set; }
public List<NgReportActivityView> Activities { get; set; } = new();
}