This commit is contained in:
Frede Hundewadt 2022-06-29 13:25:45 +02:00
parent d4eb8f94a8
commit 6685aad32d
19 changed files with 53 additions and 104 deletions

View file

@ -23,6 +23,7 @@
<th scope="col">Besøg</th> <th scope="col">Besøg</th>
<th scope="col">Demo</th> <th scope="col">Demo</th>
<th scope="col">Salg</th> <th scope="col">Salg</th>
<th scope="col">Notat</th>
<th></th> <th></th>
<th class="text-end" scope="col">Beløb</th> <th class="text-end" scope="col">Beløb</th>
</tr> </tr>
@ -34,6 +35,7 @@
<td>@activity.Company.Name, @activity.Company.ZipCity</td> <td>@activity.Company.Name, @activity.Company.ZipCity</td>
<td>@activity.Demo</td> <td>@activity.Demo</td>
<td>@activity.SalesResume</td> <td>@activity.SalesResume</td>
<td>@activity.OfficeNote</td>
<td>@(activity.StatusTypeEnum == "Quote" ? "Tilbud" : "Salg")</td> <td>@(activity.StatusTypeEnum == "Quote" ? "Tilbud" : "Salg")</td>
<td class="text-end">@(activity.Closed ? @activity.OrderAmount : 0)</td> <td class="text-end">@(activity.Closed ? @activity.OrderAmount : 0)</td>
</tr> </tr>

View file

@ -5,5 +5,5 @@ namespace Wonky.Client.Components;
public partial class ActivityTableComponent public partial class ActivityTableComponent
{ {
[Parameter] public List<NgReportActivityView> Activities { get; set; } [Parameter] public List<NgActivityReportView> Activities { get; set; }
} }

View file

@ -83,7 +83,7 @@ namespace Wonky.Client.HttpInterceptors
if (e.Response == null || e.Response.IsSuccessStatusCode) if (e.Response == null || e.Response.IsSuccessStatusCode)
return; return;
string message; string message = "An error happened";
var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri); var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri);
if (currDoc.Contains("login")) if (currDoc.Contains("login"))
currDoc = "/"; currDoc = "/";
@ -91,7 +91,6 @@ namespace Wonky.Client.HttpInterceptors
switch (e.Response.StatusCode) switch (e.Response.StatusCode)
{ {
case HttpStatusCode.NotFound: case HttpStatusCode.NotFound:
//_navigation.NavigateTo("/404");
message = "Der var ingen data ..."; message = "Der var ingen data ...";
_toast.ShowInfo(message); _toast.ShowInfo(message);
break; break;
@ -102,66 +101,7 @@ namespace Wonky.Client.HttpInterceptors
message = "Login info skal fornyes ..."; message = "Login info skal fornyes ...";
_toast.ShowInfo(message); _toast.ShowInfo(message);
break; break;
case HttpStatusCode.Continue:
case HttpStatusCode.SwitchingProtocols:
case HttpStatusCode.Processing:
case HttpStatusCode.EarlyHints:
case HttpStatusCode.OK:
case HttpStatusCode.Created:
case HttpStatusCode.Accepted:
case HttpStatusCode.NonAuthoritativeInformation:
case HttpStatusCode.NoContent:
case HttpStatusCode.ResetContent:
case HttpStatusCode.PartialContent:
case HttpStatusCode.MultiStatus:
case HttpStatusCode.AlreadyReported:
case HttpStatusCode.IMUsed:
case HttpStatusCode.Ambiguous:
case HttpStatusCode.Moved:
case HttpStatusCode.Found:
case HttpStatusCode.RedirectMethod:
case HttpStatusCode.NotModified:
case HttpStatusCode.UseProxy:
case HttpStatusCode.Unused:
case HttpStatusCode.RedirectKeepVerb:
case HttpStatusCode.PermanentRedirect:
case HttpStatusCode.PaymentRequired:
case HttpStatusCode.Forbidden:
case HttpStatusCode.MethodNotAllowed:
case HttpStatusCode.NotAcceptable:
case HttpStatusCode.ProxyAuthenticationRequired:
case HttpStatusCode.RequestTimeout:
case HttpStatusCode.Conflict:
case HttpStatusCode.Gone:
case HttpStatusCode.LengthRequired:
case HttpStatusCode.PreconditionFailed:
case HttpStatusCode.RequestEntityTooLarge:
case HttpStatusCode.RequestUriTooLong:
case HttpStatusCode.UnsupportedMediaType:
case HttpStatusCode.RequestedRangeNotSatisfiable:
case HttpStatusCode.ExpectationFailed:
case HttpStatusCode.MisdirectedRequest:
case HttpStatusCode.UnprocessableEntity:
case HttpStatusCode.Locked:
case HttpStatusCode.FailedDependency:
case HttpStatusCode.UpgradeRequired:
case HttpStatusCode.PreconditionRequired:
case HttpStatusCode.TooManyRequests:
case HttpStatusCode.RequestHeaderFieldsTooLarge:
case HttpStatusCode.UnavailableForLegalReasons:
case HttpStatusCode.InternalServerError: case HttpStatusCode.InternalServerError:
case HttpStatusCode.NotImplemented:
case HttpStatusCode.BadGateway:
case HttpStatusCode.ServiceUnavailable:
case HttpStatusCode.GatewayTimeout:
case HttpStatusCode.HttpVersionNotSupported:
case HttpStatusCode.VariantAlsoNegotiates:
case HttpStatusCode.InsufficientStorage:
case HttpStatusCode.LoopDetected:
case HttpStatusCode.NotExtended:
case HttpStatusCode.NetworkAuthenticationRequired:
default: _navigation.NavigateTo("/500");
message = "500 - Intern server fejl";
break; break;
} }
throw new HttpResponseException(message); throw new HttpResponseException(message);

View file

@ -54,14 +54,14 @@ public class ActivityHttpRepository : IActivityHttpRepository
_apiConfig = configuration.Value; _apiConfig = configuration.Value;
} }
public async Task<NgActivityListView> GetActivities(string activityDate) public async Task<NgActivityListReportView> GetActivities(string activityDate)
{ {
var response = await _client var response = await _client
.GetAsync($"{_apiConfig.ActivityUri}/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 NgActivityListReportView()
: JsonSerializer.Deserialize<NgActivityListView>(content, _options); : JsonSerializer.Deserialize<NgActivityListReportView>(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<NgActivityListView> GetActivities(string activityDate); Task<NgActivityListReportView> GetActivities(string activityDate);
} }

View file

@ -44,5 +44,5 @@
</div> </div>
</div> </div>
<div class="card-body"> <div class="card-body">
<ActivityTableComponent Activities="_view.Activities"></ActivityTableComponent> <ActivityTableComponent Activities="ReportView.Activities"></ActivityTableComponent>
</div> </div>

View file

@ -17,7 +17,7 @@ public partial class ActivityToday
[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 IToastService _toast { get; set; } [Inject] private IToastService _toast { get; set; }
private NgActivityListView _view { get; set; } = new(); private NgActivityListReportView ReportView { get; set; } = new();
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}";
private bool _reportExist = false; private bool _reportExist = false;
@ -38,8 +38,8 @@ public partial class ActivityToday
{ {
_toast.ShowInfo("Vent nogle sekunder for data"); _toast.ShowInfo("Vent nogle sekunder for data");
_workDate = workDate; _workDate = workDate;
_view = new NgActivityListView(); ReportView = new NgActivityListReportView();
_view = await _activityRepo.GetActivities(workDate); ReportView = await _activityRepo.GetActivities(workDate);
} }
public void Dispose() public void Dispose()

View file

@ -52,7 +52,7 @@
<div class="col-md-4"> <div class="col-md-4">
<InputSelect id="statusType" class="form-select" @bind-Value="@_draft.ActivityStatusEnum"> <InputSelect id="statusType" class="form-select" @bind-Value="@_draft.ActivityStatusEnum">
<option value="noSale" selected>Ingen salg</option> <option value="noSale" selected>Ingen salg</option>
@if (!string.IsNullOrEmpty(_draft.VatNumber)) @if (!string.IsNullOrEmpty(_draft.VatNumber) && !string.IsNullOrEmpty(_draft.Account) && _draft.Account != "NY")
{ {
<option value="order">Bestilling</option> <option value="order">Bestilling</option>
<option value="quote">Tilbud</option> <option value="quote">Tilbud</option>

View file

@ -46,7 +46,7 @@ public partial class Login
else else
{ {
Logger.LogInformation($"returnUrl={ReturnUrl}"); Logger.LogInformation($"returnUrl={ReturnUrl}");
var returnUrl = string.IsNullOrWhiteSpace(ReturnUrl) ? "/companies" : ReturnUrl; var returnUrl = string.IsNullOrWhiteSpace(ReturnUrl) ? "/" : ReturnUrl;
NavigationManager.NavigateTo(returnUrl); NavigationManager.NavigateTo(returnUrl);
} }
} }

View file

@ -25,12 +25,4 @@
</div> </div>
</div> </div>
</div> </div>
<div class="card-body">
<div class="row">
<div class="col">
Der er opstået en fejl - det hjælper ikke at prøve igen.
</div>
</div>
</div>
</div> </div>

View file

@ -78,11 +78,11 @@
{ {
<td> <td>
<input type="time" id="checkIn" class="form-control" <input type="time" id="checkIn" class="form-control"
@bind-Value="_timestampIn" @bind-Value:event="oninput" @onchange="OnTimeChanged"/> @bind-Value="_checkIn" @bind-Value:event="oninput" @onchange="OnTimeChanged"/>
</td> </td>
<td> <td>
<input type="time" id="checkOut" class="form-control" <input type="time" id="checkOut" class="form-control"
@bind-Value="_timestampOut" @bind-Value:event="oninput" @onchange="OnTimeChanged"/> @bind-Value="_checkOut" @bind-Value:event="oninput" @onchange="OnTimeChanged"/>
</td> </td>
} }
<th> <th>

View file

@ -46,13 +46,14 @@ public partial class SalesReportNew : IDisposable
private bool _noFigures = true; private bool _noFigures = true;
private bool _working = false; private bool _working = false;
private DateTime _workDate { get; set; } = DateTime.Now; private DateTime _workDate { get; set; } = DateTime.Now;
private TimeOnly _timestampIn { get; set; } = new(12, 0); private TimeOnly _checkIn { get; set; } = new(12, 0);
private TimeOnly _timestampOut { get; set; } = new(12, 0); private TimeOnly _checkOut { get; set; } = new(12, 0);
private DateTime _leaveBegin { get; set; } = DateTime.Now; private DateTime _leaveBegin { get; set; } = DateTime.Now;
private DateTime _leaveEnd { get; set; } = DateTime.Now; private DateTime _leaveEnd { get; set; } = DateTime.Now;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
_working = true;
_interceptor.RegisterEvent(); _interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent(); _interceptor.RegisterBeforeSendEvent();
_editContext = new EditContext(_report); _editContext = new EditContext(_report);
@ -62,6 +63,9 @@ public partial class SalesReportNew : IDisposable
_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);
_working = false;
if(await _reportRepo.ReportExist(_prefs.WorkDate)) if(await _reportRepo.ReportExist(_prefs.WorkDate))
_navigator.NavigateTo($"/sales-reports/view/{_prefs.WorkDate}"); _navigator.NavigateTo($"/sales-reports/view/{_prefs.WorkDate}");
@ -98,6 +102,8 @@ public partial class SalesReportNew : IDisposable
return; return;
} }
_working = true;
DateTime checkIn; DateTime checkIn;
DateTime checkOut; DateTime checkOut;
if (_report.DayTypeEnum.ToLower().Contains("leave")) if (_report.DayTypeEnum.ToLower().Contains("leave"))
@ -107,30 +113,35 @@ public partial class SalesReportNew : IDisposable
} }
else else
{ {
checkIn = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _timestampIn.Hour, _timestampIn.Minute, 0); checkIn = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkIn.Hour, _checkIn.Minute, 0);
checkOut = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _timestampOut.Hour, _timestampOut.Minute, 0); checkOut = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkOut.Hour, _checkOut.Minute, 0);
} }
_report.FromDateTime = $"{checkIn:yyyy-MM-dd hh:mm}"; _report.FromDateTime = $"{checkIn:yyyy-MM-dd hh:mm}";
_report.ToDateTime = $"{checkOut:yyyy-MM-dd hh:mm}"; _report.ToDateTime = $"{checkOut:yyyy-MM-dd hh:mm}";
_report.Figures.Distance = _report.Figures.KmEvening - _report.Figures.KmMorning; _report.Figures.Distance = _report.Figures.KmEvening - _report.Figures.KmMorning;
_report.Figures.DistanceMonth += _report.Figures.Distance; _report.Figures.DistanceMonth += _report.Figures.Distance;
_report.Figures.DistancePrivateMonth += _report.Figures.DistancePrivate; _report.Figures.DistancePrivateMonth += _report.Figures.DistancePrivate;
_working = true; _logger.LogDebug("_workDate => {workDate}", $"{_workDate:yyyyy-MM-dd}");
_logger.LogDebug("_report => {report}", JsonSerializer.Serialize(_report));
var result = await _reportRepo.PostReport($"{_workDate:yyyy-MM-dd}", _report); var result = await _reportRepo.PostReport($"{_workDate:yyyy-MM-dd}", _report);
_toast.ShowInfo($"Rapport oprettet {_workDate}"); _toast.ShowInfo($"Rapport oprettet {_workDate}");
_working = false;
_navigator.NavigateTo("/home"); _navigator.NavigateTo("/home");
} }
private void OnTimeChanged() private void OnTimeChanged()
{ {
var x = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _timestampIn.Hour, _timestampIn.Minute,0); var f = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkIn.Hour, _checkIn.Minute,0);
_report.FromDateTime = $"{x:yyyy-MM-dd hh:mm}"; _report.FromDateTime = $"{f:yyyy-MM-dd hh:mm}";
x = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _timestampOut.Hour, _timestampOut.Minute,0);
_report.ToDateTime = $"{x:yyyy-MM-dd hh:mm}"; var t = new DateTime(_workDate.Year, _workDate.Month, _workDate.Day, _checkOut.Hour, _checkOut.Minute,0);
_report.ToDateTime = $"{t:yyyy-MM-dd hh:mm}";
} }
private void SetWorkDate(string workDate) private void SetWorkDate(string workDate)

View file

@ -43,7 +43,7 @@
<AuthorizeView Roles="Admin"> <AuthorizeView Roles="Admin">
<div class="nav-item px-3"> <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/advisers">
<span class="oi oi-people" aria-hidden="true"></span> Sælgere <span class="oi oi-people" aria-hidden="true"></span> Sælgere
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">

View file

@ -1,7 +1,7 @@
{ {
"appInfo": { "appInfo": {
"name": "Wonky Client", "name": "Wonky Client",
"version": "0.8.51", "version": "0.8.57",
"isBeta": true, "isBeta": true,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },

View file

@ -2,15 +2,18 @@
<html lang="da"> <html lang="da">
<head> <head>
<title>Inno Web CRM</title>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<!-- <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />-->
<!-- <meta http-equiv="Pragma" content="no-cache" />-->
<!-- <meta http-equiv="Expires" content="3600" />-->
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png"> <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="favicon-32x32.png"> <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="icon" type="image/png" sizes="16x16" href="favicon-16x16.png">
<link rel="mask-icon" href="safari-pinned-tab.svg" color="#5bbad5"> <link rel="mask-icon" href="safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#ffaa00"> <meta name="msapplication-TileColor" content="#ffaa00">
<meta name="theme-color" content="#000"> <meta name="theme-color" content="#000">
<title>Inno Web CRM</title>
<base href="/" /> <base href="/" />
<link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="css/app.css" rel="stylesheet" /> <link href="css/app.css" rel="stylesheet" />

View file

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

View file

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

View file

@ -1,9 +1,10 @@
namespace Wonky.Entity.Views; namespace Wonky.Entity.Views;
public class NgReportActivityView public class NgActivityReportView
{ {
public ActivityCompanyView Company { get; set; } = new(); public ActivityCompanyView Company { get; set; } = new();
public string SalesHeadId { get; set; } = ""; public string SalesHeadId { get; set; } = "";
public string OfficeNote { get; set; } = "";
public string StatusTypeEnum { get; set; } = ""; public string StatusTypeEnum { get; set; } = "";
public bool Closed { get; set; } public bool Closed { get; set; }
public string OrderDate { get; set; } = ""; public string OrderDate { get; set; } = "";

View file

@ -3,5 +3,5 @@ namespace Wonky.Entity.Views;
public class NgSalesReportView public class NgSalesReportView
{ {
public NgSalesReport Report { get; set; } = new(); public NgSalesReport Report { get; set; } = new();
public List<NgReportActivityView> Activities { get; set; } = new (); public List<NgActivityReportView> Activities { get; set; } = new ();
} }