diff --git a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs index b72e6229..7075420a 100644 --- a/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorActivityCreatePage.razor.cs @@ -175,7 +175,15 @@ public partial class AdvisorActivityCreatePage : IDisposable SelectedDate = string.IsNullOrWhiteSpace(_userPref.WorkDate) ? DateTime.Now : DateTime.Parse(_userPref.WorkDate); - + + // 2023-08-14 - reject orders for past or future dates + if (SelectedDate.Date != DateTime.Now.Date) + { + Toaster.ShowError($"Aktivitetsdato er ikke dagens dato. Dato ændres til {DateTime.Now.Date}"); + SelectedDate = DateTime.Now; + await PreferenceService.SetWorkDate(SelectedDate); + } + // raise flag if report is closed ReportClosed = await ReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}"); diff --git a/Wonky.Client/Pages/AdvisorReportCreatePage.razor b/Wonky.Client/Pages/AdvisorReportCreatePage.razor index 712b1a20..94877d1c 100644 --- a/Wonky.Client/Pages/AdvisorReportCreatePage.razor +++ b/Wonky.Client/Pages/AdvisorReportCreatePage.razor @@ -19,7 +19,7 @@ @attribute [Authorize(Roles = "Advisor,Supervisor")] @page "/advisor/reports/new" -Opret Dagsrapport for @ThisWorkDate +Opret Dagsrapport for @_thisWorkDate @* report header *@
@@ -54,7 +54,7 @@ - @if (IsSupervisor) + @if (_isSupervisor) { } @@ -62,39 +62,38 @@ - @if (Report.DayTypeEnum.ToLower().Contains("leave")) { Report.Figures.KmMorning = 0; - + - + } else { - Report.Figures.KmMorning = KmMorning; + Report.Figures.KmMorning = _kmMorning; + @bind-Value="_checkIn" @bind-Value:event="oninput" onchange="@OnTimeChanged"/> + @bind-Value="_checkOut" @bind-Value:event="oninput" onchange="@OnTimeChanged"/> } @@ -145,11 +144,11 @@ + disabled="@(_noFigures)"/> + disabled="@(_noFigures)"/> + disabled="@(_noFigures)"/>
- @if (Activities.Any()) + @if (_activities.Any()) {
- +
} } @@ -196,9 +195,9 @@ -@if (Working) +@if (_working) { } - \ No newline at end of file + \ No newline at end of file diff --git a/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs b/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs index b01e3324..9560e29d 100644 --- a/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs +++ b/Wonky.Client/Pages/AdvisorReportCreatePage.razor.cs @@ -44,24 +44,24 @@ public partial class AdvisorReportCreatePage : IDisposable // ########################################################################## private EditContext ReportContext { get; set; } private ReportDto Report { get; set; } = new(); - private List Activities { get; set; } = new(); - private ReportFiguresDto InitialValues { get; set; } = new(); - private UserPreference Preference { get; set; } = new(); - private bool FormInvalid { get; set; } = true; - private bool NoFigures { get; set; } = true; - private bool Working { get; set; } - private DateTime ThisWorkDate { get; set; } - private TimeOnly CheckIn { get; set; } = new(12, 0); - private TimeOnly CheckOut { get; set; } = new(12, 0); - private DateTime BeginLeave { get; set; } = DateTime.Now; - private DateTime EndLeave { get; set; } = DateTime.Now; - private ConfirmationModal ConfirmReportModal { get; set; } - private string Prompt { get; set; } = ""; - private string WorkDate { get; set; } = ""; - private int CurrKmMonth { get; set; } - private int CurrKmPrivate { get; set; } - private bool IsSupervisor { get; set; } - private int KmMorning { get; set; } + private List _activities = new(); + private ReportFiguresDto _initialValues = new(); + private UserPreference _preference = new(); + private bool _formInvalid = true; + private bool _noFigures = true; + private bool _working; + private DateTime _thisWorkDate; + private TimeOnly _checkIn = new(12, 0); + private TimeOnly _checkOut = new(12, 0); + private DateTime _beginLeave = DateTime.Now; + private DateTime _endLeave = DateTime.Now; + private ConfirmationModal _confirmModal; + private string _prompt = ""; + private string _workDate = ""; + private int _currKmMonth; + private int _currKmPrivate; + private bool _isSupervisor; + private int _kmMorning; /// @@ -69,46 +69,46 @@ public partial class AdvisorReportCreatePage : IDisposable /// protected override async Task OnInitializedAsync() { - Interceptor.RegisterEvent(); - Interceptor.RegisterBeforeSendEvent(); - - IsSupervisor = await UserInfo.IsSupervisor(); - ReportContext = new EditContext(Report); ReportContext.OnFieldChanged += HandleFieldChanged; ReportContext.OnValidationStateChanged += ValidationChanged; + + Interceptor.RegisterEvent(); + Interceptor.RegisterBeforeSendEvent(); + + _isSupervisor = await UserInfo.IsSupervisor(); PreferenceService.OnChange += ProfileServiceOnOnChange; - Preference = await PreferenceService.GetPreference(); + _preference = await PreferenceService.GetPreference(); - KmMorning = await PreferenceService.GetKmMorning(); + _kmMorning = await PreferenceService.GetKmMorning(); - Logger.LogDebug("{}", JsonSerializer.Serialize(Preference)); + Logger.LogDebug("{}", JsonSerializer.Serialize(_preference)); - WorkDate = Preference.WorkDate; - if (string.IsNullOrWhiteSpace(WorkDate)) + _workDate = _preference.WorkDate; + if (string.IsNullOrWhiteSpace(_workDate)) { - ThisWorkDate = DateTime.Now; - WorkDate = $"{ThisWorkDate:yyyy-MM-dd}"; - await PreferenceService.SetWorkDate(ThisWorkDate); + _thisWorkDate = DateTime.Now; + _workDate = $"{_thisWorkDate:yyyy-MM-dd}"; + await PreferenceService.SetWorkDate(_thisWorkDate); } else { - ThisWorkDate = DateTime.Parse(WorkDate); + _thisWorkDate = DateTime.Parse(_workDate); } - if (await AdvisorSalesReportRepo.ReportExist(WorkDate)) + if (await AdvisorSalesReportRepo.ReportExist(_workDate)) { - Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}"); + Navigator.NavigateTo($"/advisor/reports/view/{_thisWorkDate:yyyy-MM-dd}"); } - BeginLeave = ThisWorkDate; - EndLeave = ThisWorkDate; + _beginLeave = _thisWorkDate; + _endLeave = _thisWorkDate; - Report.FromDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00:00}"; - Report.ToDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00:00}"; + Report.FromDateTime = $"{_thisWorkDate:yyyy-MM-dd'T'12:00:00}"; + Report.ToDateTime = $"{_thisWorkDate:yyyy-MM-dd'T'12:00:00}"; Report.Figures.KmMorning = 0; Report.Figures.KmEvening = 0; @@ -122,30 +122,30 @@ public partial class AdvisorReportCreatePage : IDisposable private void ProfileServiceOnOnChange(UserPreference userPreference) { - Preference = userPreference; - WorkDate = Preference.WorkDate; + _preference = userPreference; + _workDate = _preference.WorkDate; StateHasChanged(); } private async Task GetKeyFigures() { - if (Working) + if (_working) return; - Working = true; + _working = true; Report.Figures = new ReportFiguresDto(); - InitialValues = new ReportFiguresDto(); - Activities = new List(); + _initialValues = new ReportFiguresDto(); + _activities = new List(); - var data = await AdvisorSalesReportRepo.InitializeReportData(WorkDate); + var data = await AdvisorSalesReportRepo.InitializeReportData(_workDate); if(data.ReportClosed) - Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}"); + Navigator.NavigateTo($"/advisor/reports/view/{_thisWorkDate:yyyy-MM-dd}"); Report.Figures = data.ReportData; - InitialValues = data.ReportData; - Activities = data.ReportItems; - CurrKmMonth = data.ReportData.DistanceMonth; - CurrKmPrivate = data.ReportData.DistancePrivate; + _initialValues = data.ReportData; + _activities = data.ReportItems; + _currKmMonth = data.ReportData.DistanceMonth; + _currKmPrivate = data.ReportData.DistancePrivate; if (Report.DayTypeEnum.ToLower().Contains("leave")) { @@ -156,28 +156,25 @@ public partial class AdvisorReportCreatePage : IDisposable } else { - Report.Figures.KmMorning = KmMorning; + Report.Figures.KmMorning = _kmMorning; } - NoFigures = false; - Working = false; + _noFigures = false; + _working = false; } - /// - /// Field data change event - /// - /// - /// + + private void HandleFieldChanged(object sender, FieldChangedEventArgs e) { // Console.WriteLine($"e FieldName => {e.FieldIdentifier.FieldName}"); - FormInvalid = !ReportContext.Validate(); - if (KmMorning == 0) + _formInvalid = !ReportContext.Validate(); + if (_kmMorning == 0) { - KmMorning = Report.Figures.KmMorning; + _kmMorning = Report.Figures.KmMorning; } Report.Figures.Distance = Report.Figures.KmEvening - Report.Figures.KmMorning; - Report.Figures.DistanceMonth = Report.Figures.Distance + CurrKmMonth; - Report.Figures.DistancePrivateMonth = Report.Figures.DistancePrivate + CurrKmPrivate; + Report.Figures.DistanceMonth = Report.Figures.Distance + _currKmMonth; + Report.Figures.DistancePrivateMonth = Report.Figures.DistancePrivate + _currKmPrivate; if (Report.Figures.Distance is > 1000 or < 0 && Report.Figures.KmMorning > 0) { Toaster.ShowError($"Kørte km for rapporten er '{Report.Figures.Distance}'. Er du sikker på at det er rigtigt?"); @@ -185,14 +182,10 @@ public partial class AdvisorReportCreatePage : IDisposable StateHasChanged(); } - /// - /// Validation change event - /// - /// - /// + private void ValidationChanged(object sender, ValidationStateChangedEventArgs e) { - FormInvalid = false; + _formInvalid = false; ReportContext.OnFieldChanged -= HandleFieldChanged; ReportContext.OnValidationStateChanged -= ValidationChanged; ReportContext = new EditContext(Report); @@ -200,76 +193,88 @@ public partial class AdvisorReportCreatePage : IDisposable ReportContext.OnValidationStateChanged += ValidationChanged; } - /// - /// Save report confirmed callback - /// + private async Task ConfirmReportCallback() { // attempt to eliminate doubled click on submit button - if (Working) + if (_working) return; - Working = true; + _working = true; - var result = await AdvisorSalesReportRepo.CreateReport(WorkDate, Report); + // post report to backend + var result = await AdvisorSalesReportRepo.CreateReport(_workDate, Report); + Logger.LogDebug("CreateReport.result => {}", JsonSerializer.Serialize(result)); // reset km and date confirmation await PreferenceService.SetKmMorning(0); + // reset date confirmed await PreferenceService.SetDateConfirmed(false); - Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}"); + Navigator.NavigateTo($"/advisor/reports/view/{_thisWorkDate:yyyy-MM-dd}"); } - /// - /// Submit report - /// + private void SubmitReport() { // attempt to eliminate doubled click on submit button - if (Working) + if (_working) return; + + // 2023-08-14 - reject report for a future date + if (_endLeave.Date > DateTime.Now.Date) + { + Toaster.ShowError("Du har rod i ferie datoer. Prøver du at lave ferierapport før ferien er færdig?"); + return; + } + // check day type if (string.IsNullOrWhiteSpace(Report.DayTypeEnum)) { Toaster.ShowError("Dagtype skal vælges"); return; } + // distance day check - only if not leave if (Report.Figures.KmMorning > Report.Figures.KmEvening && !Report.DayTypeEnum.ToLower().Contains("leave")) { Toaster.ShowError("Km udregning er negativ - kontroller venligst km tal"); return; } + // local working variables DateTime checkIn; DateTime checkOut; + // create a date time object using workDate and workHour input if (Report.DayTypeEnum.ToLower().Contains("leave")) { - checkIn = new DateTime(BeginLeave.Year, BeginLeave.Month, BeginLeave.Day, 0, 0, 0); - checkOut = new DateTime(EndLeave.Year, EndLeave.Month, EndLeave.Day, 0, 0, 0); + checkIn = new DateTime(_beginLeave.Year, _beginLeave.Month, _beginLeave.Day, 0, 0, 0); + checkOut = new DateTime(_endLeave.Year, _endLeave.Month, _endLeave.Day, 0, 0, 0); } else { - checkIn = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckIn.Hour, CheckIn.Minute, 0); - checkOut = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckOut.Hour, CheckOut.Minute, 0); + checkIn = new DateTime(_thisWorkDate.Year, _thisWorkDate.Month, _thisWorkDate.Day, _checkIn.Hour, _checkIn.Minute, 0); + checkOut = new DateTime(_thisWorkDate.Year, _thisWorkDate.Month, _thisWorkDate.Day, _checkOut.Hour, _checkOut.Minute, 0); } + // assign a workday number if the day is marked as salesDay Report.SalesDayNumber = Report.DayTypeEnum == "sales" ? Report.Figures.SalesDayCount + 1 : 0; + // format report date time input Report.FromDateTime = checkIn.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); Report.ToDateTime = checkOut.ToString("yyyy-MM-dd'T'HH:mm:ss", CultureInfo.InvariantCulture); - Logger.LogDebug("_workDate => {workDate}", $"{ThisWorkDate:yyyy-MM-dd}"); - Logger.LogDebug("_report => {report}", JsonSerializer.Serialize(Report)); + Logger.LogDebug("_workDate => {workDate}", $"{_thisWorkDate:yyyy-MM-dd}"); + Logger.LogDebug("Report => {report}", JsonSerializer.Serialize(Report)); if (Report.DayTypeEnum is "leave" or "sickLeave") { // reset distance calculation Report.Figures.KmEvening = 0; Report.Figures.KmMorning = 0; - Report.Figures.DistanceMonth = CurrKmMonth; - Report.Figures.DistancePrivateMonth = CurrKmPrivate; + Report.Figures.DistanceMonth = _currKmMonth; + Report.Figures.DistancePrivateMonth = _currKmPrivate; } // pop confirmation @@ -278,36 +283,31 @@ public partial class AdvisorReportCreatePage : IDisposable ? $"Kørte km for rapporten er '{Report.Figures.KmEvening - Report.Figures.KmMorning}'. Er du sikker på at det er rigtigt?
" : ""; - Prompt = $"{warning}
Gem rapport for {ThisWorkDate.ToLongDateString()}?"; + _prompt = $"{warning}
Gem rapport for {_thisWorkDate.ToLongDateString()}?"; - ConfirmReportModal.Show(); + _confirmModal.Show(); } - /// - /// On Time changed - update the Report Date fields - /// + private void OnTimeChanged() { - var f = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckIn.Hour, CheckIn.Minute,0); + var f = new DateTime(_thisWorkDate.Year, _thisWorkDate.Month, _thisWorkDate.Day, _checkIn.Hour, _checkIn.Minute,0); Report.FromDateTime = $"{f:yyyy-MM-dd'T'HH:mm}"; - var t = new DateTime(ThisWorkDate.Year, ThisWorkDate.Month, ThisWorkDate.Day, CheckOut.Hour, CheckOut.Minute,0); + var t = new DateTime(_thisWorkDate.Year, _thisWorkDate.Month, _thisWorkDate.Day, _checkOut.Hour, _checkOut.Minute,0); Report.ToDateTime = $"{t:yyyy-MM-dd'T'HH:mm}"; } - /// - /// Set workDate callback - /// - /// + private void SetWorkDateCallback(string workDate) { - WorkDate = workDate; - ThisWorkDate = DateTime.Parse(workDate); + _workDate = workDate; + _thisWorkDate = DateTime.Parse(workDate); - NoFigures = true; + _noFigures = true; Report.Figures = new ReportFiguresDto(); - InitialValues = new ReportFiguresDto(); - Activities = new List(); + _initialValues = new ReportFiguresDto(); + _activities = new List(); Report.Figures.KmEvening = 0; Report.Figures.KmMorning = 0; @@ -315,14 +315,17 @@ public partial class AdvisorReportCreatePage : IDisposable Report.Figures.DistanceMonth = 0; Report.Figures.DistancePrivate = 0; Report.Figures.DistancePrivateMonth = 0; - Report.FromDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00}"; - Report.ToDateTime = $"{ThisWorkDate:yyyy-MM-dd'T'12:00}"; + Report.FromDateTime = $"{_thisWorkDate:yyyy-MM-dd'T'12:00}"; + Report.ToDateTime = $"{_thisWorkDate:yyyy-MM-dd'T'12:00}"; } + private void OnCancelCallback() { - ConfirmReportModal.Hide(); + _confirmModal.Hide(); } + + public void Dispose() { Interceptor.DisposeEvent(); diff --git a/Wonky.Client/wwwroot/appsettings.json b/Wonky.Client/wwwroot/appsettings.json index 338532f2..204e57bc 100644 --- a/Wonky.Client/wwwroot/appsettings.json +++ b/Wonky.Client/wwwroot/appsettings.json @@ -1,8 +1,8 @@ { "appInfo": { "name": "Wonky Online", - "version": "213.0", - "rc": false, + "version": "222.0", + "rc": true, "sandBox": true, "image": "grumpy-coder.png", "sdk": "dotnet 7.0" diff --git a/Wonky.Entity/DTO/WebShopLineDto.cs b/Wonky.Entity/DTO/WebShopLineDto.cs new file mode 100644 index 00000000..fc90f803 --- /dev/null +++ b/Wonky.Entity/DTO/WebShopLineDto.cs @@ -0,0 +1,10 @@ +namespace Wonky.Entity.DTO; + +public class WebShopLineDto +{ + public string Discount { get; set; } = ""; + public string Quantity { get; set; } = ""; + public string Sku { get; set; } = ""; + public string Text { get; set; } = ""; + public string UnitPrice { get; set; } = ""; +} \ No newline at end of file diff --git a/Wonky.Entity/DTO/WebShopOrderDto.cs b/Wonky.Entity/DTO/WebShopOrderDto.cs new file mode 100644 index 00000000..79748d92 --- /dev/null +++ b/Wonky.Entity/DTO/WebShopOrderDto.cs @@ -0,0 +1,11 @@ +using System.ComponentModel.DataAnnotations; + +namespace Wonky.Entity.DTO; + +public class WebShopOrderDto +{ + [MaxLength(20)] public string ReferenceNumber { get; set; } = ""; + [MaxLength(255)] public string OrderNote { get; set; } = ""; + [Required] public bool ConditionsAccepted { get; set; } + [Required] public List Lines { get; set; } = new(); +} \ No newline at end of file diff --git a/Wonky.Entity/Views/WebShopLIneView.cs b/Wonky.Entity/Views/WebShopLIneView.cs new file mode 100644 index 00000000..ce24ff1c --- /dev/null +++ b/Wonky.Entity/Views/WebShopLIneView.cs @@ -0,0 +1,8 @@ +namespace Wonky.Entity.Views; + +public class WebShopLineView +{ + public string Sku { get; set; } = ""; + public string Quantity { get; set; } = ""; + public string Text { get; set; } = ""; +} diff --git a/Wonky.Entity/Views/WebShopOrderListView.cs b/Wonky.Entity/Views/WebShopOrderListView.cs new file mode 100644 index 00000000..c44b18bc --- /dev/null +++ b/Wonky.Entity/Views/WebShopOrderListView.cs @@ -0,0 +1,9 @@ +namespace Wonky.Entity.Views; + +public class WebShorOrderListView +{ + public string SalesHeadId { get; set; } = ""; + public string ReferenceNumber { get; set; } = ""; + public string YourRef { get; set; } = ""; + public string OrderDate { get; set; } = ""; +} \ No newline at end of file diff --git a/Wonky.Entity/Views/WebShopOrderView.cs b/Wonky.Entity/Views/WebShopOrderView.cs new file mode 100644 index 00000000..e05684c4 --- /dev/null +++ b/Wonky.Entity/Views/WebShopOrderView.cs @@ -0,0 +1,13 @@ +namespace Wonky.Entity.Views; + +public class WebShopOrderView +{ + public string OurRef { get; set; } = ""; + public string ReferenceNumber { get; set; } = ""; + public string YourRef { get; set; } = ""; + public string OrderNote { get; set; } = ""; + public bool Closed { get; set; } + public string OrderDate { get; set; } = ""; + public List Lines { get; set; } = new(); +} +