Skip to content

Commit 5c571b1

Browse files
revert: remove opening hours from create merchant
Agent-Logs-Url: https://github.com/TransactionProcessing/EstateManagementUI/sessions/777a9e6b-f398-46b9-b1f2-107e23254e9c Co-authored-by: StuartFerguson <16325469+StuartFerguson@users.noreply.github.com>
1 parent 30e0b2a commit 5c571b1

4 files changed

Lines changed: 1 addition & 212 deletions

File tree

EstateManagementUI.BlazorServer.Tests/Pages/Merchants/MerchantsNewPageTests.cs

Lines changed: 0 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,6 @@ private System.Reflection.FieldInfo GetErrorMessageField(object instance)
3333
return field;
3434
}
3535

36-
private System.Reflection.FieldInfo GetModelField()
37-
{
38-
return typeof(MerchantsNew).GetField("model",
39-
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
40-
}
41-
4236
[Fact]
4337
public void MerchantsNew_RendersCorrectly()
4438
{
@@ -295,75 +289,4 @@ await cut.InvokeAsync(async () =>
295289
cut.Markup.ShouldNotContain("Previous error");
296290
cut.Markup.ShouldContain("Merchant created successfully");
297291
}
298-
299-
[Fact]
300-
public void MerchantsNew_RendersOpeningHoursSection()
301-
{
302-
var cut = RenderComponent<MerchantsNew>();
303-
304-
cut.Markup.ShouldContain("Opening Hours");
305-
cut.Markup.ShouldContain("Monday");
306-
cut.Markup.ShouldContain("Sunday");
307-
}
308-
309-
[Fact]
310-
public async Task HandleSubmit_WithOpeningHours_CreatesMerchantAndSavesOpeningHours()
311-
{
312-
Guid createdMerchantId = Guid.Empty;
313-
314-
this.MerchantUIService.Setup(m => m.CreateMerchant(
315-
It.IsAny<CorrelationId>(),
316-
It.IsAny<Guid>(),
317-
It.IsAny<Guid>(),
318-
It.IsAny<MerchantModels.CreateMerchantModel>()))
319-
.Callback<CorrelationId, Guid, Guid, MerchantModels.CreateMerchantModel>((_, _, merchantId, _) => createdMerchantId = merchantId)
320-
.ReturnsAsync(Result.Success);
321-
322-
this.MerchantUIService.Setup(m => m.UpdateMerchantOpeningHours(
323-
It.IsAny<CorrelationId>(),
324-
It.IsAny<Guid>(),
325-
It.IsAny<Guid>(),
326-
It.IsAny<MerchantModels.MerchantOpeningHoursModel>()))
327-
.ReturnsAsync(Result.Success);
328-
329-
var cut = RenderComponent<MerchantsNew>();
330-
cut.Instance.SetDelayOverride(0);
331-
332-
var modelField = GetModelField();
333-
modelField.ShouldNotBeNull();
334-
var model = (MerchantModels.CreateMerchantModel)modelField.GetValue(cut.Instance);
335-
model.OpeningHours.Monday.Opening = "8:00";
336-
model.OpeningHours.Monday.Closing = "17:00";
337-
model.OpeningHours.Tuesday.Opening = "0800";
338-
model.OpeningHours.Tuesday.Closing = "1700";
339-
model.OpeningHours.Wednesday.Opening = "0800";
340-
model.OpeningHours.Wednesday.Closing = "1700";
341-
model.OpeningHours.Thursday.Opening = "0800";
342-
model.OpeningHours.Thursday.Closing = "1700";
343-
model.OpeningHours.Friday.Opening = "0800";
344-
model.OpeningHours.Friday.Closing = "1700";
345-
model.OpeningHours.Saturday.Opening = "0900";
346-
model.OpeningHours.Saturday.Closing = "1600";
347-
model.OpeningHours.Sunday.Opening = "1000";
348-
model.OpeningHours.Sunday.Closing = "1500";
349-
350-
var handleSubmitMethod = GetHandleSubmitMethod();
351-
handleSubmitMethod.ShouldNotBeNull();
352-
353-
await cut.InvokeAsync(async () =>
354-
{
355-
var task = (Task)handleSubmitMethod.Invoke(cut.Instance, null);
356-
await task;
357-
});
358-
359-
this.MerchantUIService.Verify(m => m.UpdateMerchantOpeningHours(
360-
It.IsAny<CorrelationId>(),
361-
It.IsAny<Guid>(),
362-
createdMerchantId,
363-
It.Is<MerchantModels.MerchantOpeningHoursModel>(hours =>
364-
hours.Monday.Opening == "0800" &&
365-
hours.Monday.Closing == "1700" &&
366-
hours.Sunday.Opening == "1000" &&
367-
hours.Sunday.Closing == "1500")), Times.Once);
368-
}
369292
}

EstateManagementUI.BlazorServer/Components/Pages/Merchants/New.razor

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -158,32 +158,6 @@
158158
</div>
159159
</div>
160160

161-
<div class="mb-6">
162-
<h3 class="text-lg font-semibold text-gray-900 mb-4">Opening Hours</h3>
163-
<div class="rounded-lg bg-blue-50 border border-blue-100 p-4 mb-4">
164-
<p class="text-sm text-blue-800">Enter merchant opening and closing times in HHmm format, for example 0800 and 1700. Leave all fields blank to set opening hours later.</p>
165-
</div>
166-
167-
<div class="space-y-3">
168-
@foreach (var day in GetOpeningHoursRows()) {
169-
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 items-end rounded-lg border border-gray-200 p-4">
170-
<div>
171-
<label class="block text-sm font-medium text-gray-700 mb-1">@day.DayName</label>
172-
<p class="text-sm text-gray-500">Opening and closing times</p>
173-
</div>
174-
<div>
175-
<label class="block text-sm font-medium text-gray-700 mb-1">Opening</label>
176-
<InputText id="@($"{day.DayName.ToLowerInvariant()}Opening")" @bind-Value="day.Hours.Opening" class="input w-full" maxlength="4" placeholder="0800" />
177-
</div>
178-
<div>
179-
<label class="block text-sm font-medium text-gray-700 mb-1">Closing</label>
180-
<InputText id="@($"{day.DayName.ToLowerInvariant()}Closing")" @bind-Value="day.Hours.Closing" class="input w-full" maxlength="4" placeholder="1700" />
181-
</div>
182-
</div>
183-
}
184-
</div>
185-
</div>
186-
187161
<!-- Submit Button -->
188162
<div class="flex justify-end space-x-4 pt-4 border-t">
189163
<button type="button" class="btn btn-secondary" @onclick="Cancel" disabled="@isSaving">
@@ -203,4 +177,4 @@
203177
</div>
204178
</EditForm>
205179
</div>
206-
</div>
180+
</div>

EstateManagementUI.BlazorServer/Components/Pages/Merchants/New.razor.cs

Lines changed: 0 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,11 @@
44
using EstateManagementUI.BlazorServer.Common;
55
using EstateManagementUI.BlazorServer.Models;
66
using SimpleResults;
7-
using System.Globalization;
8-
using System.Linq;
97

108
namespace EstateManagementUI.BlazorServer.Components.Pages.Merchants
119
{
1210
public partial class New
1311
{
14-
private static readonly string[] OpeningHoursFormats = ["HHmm", "Hmm", "HH:mm", "H:mm"];
1512
private readonly MerchantModels.CreateMerchantModel model = new();
1613
private bool isSaving = false;
1714

@@ -32,15 +29,6 @@ protected override async Task OnAfterRenderAsync(bool firstRender) {
3229
private async Task HandleSubmit() {
3330
isSaving = true;
3431
errorMessage = null;
35-
successMessage = null;
36-
37-
bool hasOpeningHoursValues = HasOpeningHoursValues();
38-
if (hasOpeningHoursValues && TryNormaliseAndValidateOpeningHours(out string validationError) == false) {
39-
errorMessage = validationError;
40-
isSaving = false;
41-
StateHasChanged();
42-
return;
43-
}
4432

4533
var correlationId = new CorrelationId(Guid.NewGuid());
4634
var estateId = await this.GetEstateId();
@@ -51,16 +39,6 @@ private async Task HandleSubmit() {
5139
var result = await this.MerchantUiService.CreateMerchant(correlationId, estateId, merchantId, this.model);
5240

5341
if (result.IsSuccess) {
54-
if (hasOpeningHoursValues) {
55-
Result openingHoursResult = await this.MerchantUiService.UpdateMerchantOpeningHours(correlationId, estateId, merchantId, this.model.OpeningHours);
56-
if (openingHoursResult.IsFailed) {
57-
this.errorMessage = "Merchant created but opening hours could not be saved";
58-
isSaving = false;
59-
StateHasChanged();
60-
return;
61-
}
62-
}
63-
6442
successMessage = "Merchant created successfully";
6543

6644
StateHasChanged();
@@ -79,89 +57,5 @@ private async Task HandleSubmit() {
7957
}
8058

8159
private void Cancel() => NavigationManager.NavigateToMerchantList();
82-
83-
private IReadOnlyList<OpeningHoursRow> GetOpeningHoursRows() =>
84-
[
85-
new("Monday", model.OpeningHours.Monday),
86-
new("Tuesday", model.OpeningHours.Tuesday),
87-
new("Wednesday", model.OpeningHours.Wednesday),
88-
new("Thursday", model.OpeningHours.Thursday),
89-
new("Friday", model.OpeningHours.Friday),
90-
new("Saturday", model.OpeningHours.Saturday),
91-
new("Sunday", model.OpeningHours.Sunday)
92-
];
93-
94-
private bool HasOpeningHoursValues() =>
95-
this.GetOpeningHoursRows().Any(row => string.IsNullOrWhiteSpace(row.Hours.Opening) == false ||
96-
string.IsNullOrWhiteSpace(row.Hours.Closing) == false);
97-
98-
private bool TryNormaliseAndValidateOpeningHours(out string validationError) {
99-
foreach (OpeningHoursRow row in this.GetOpeningHoursRows()) {
100-
if (TryValidateOpeningHoursRow(row, out validationError) == false) {
101-
return false;
102-
}
103-
}
104-
105-
validationError = string.Empty;
106-
return true;
107-
}
108-
109-
private static string? NormaliseOpeningHoursValue(string? value) {
110-
if (string.IsNullOrWhiteSpace(value)) {
111-
return value;
112-
}
113-
114-
string trimmedValue = value.Trim();
115-
116-
if (DateTime.TryParseExact(trimmedValue,
117-
OpeningHoursFormats,
118-
CultureInfo.InvariantCulture,
119-
DateTimeStyles.None,
120-
out DateTime parsed) == false) {
121-
return trimmedValue;
122-
}
123-
124-
return parsed.ToString("HHmm", CultureInfo.InvariantCulture);
125-
}
126-
127-
private static bool TryParseOpeningHoursValue(string? value, out TimeSpan time) {
128-
time = default;
129-
130-
if (string.IsNullOrWhiteSpace(value)) {
131-
return false;
132-
}
133-
134-
if (DateTime.TryParseExact(value, "HHmm", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsed) == false) {
135-
return false;
136-
}
137-
138-
time = parsed.TimeOfDay;
139-
return true;
140-
}
141-
142-
private static bool TryValidateOpeningHoursRow(OpeningHoursRow row, out string validationError) {
143-
row.Hours.Opening = NormaliseOpeningHoursValue(row.Hours.Opening);
144-
row.Hours.Closing = NormaliseOpeningHoursValue(row.Hours.Closing);
145-
146-
if (TryParseOpeningHoursValue(row.Hours.Opening, out TimeSpan openingTime) == false) {
147-
validationError = $"{row.DayName} opening time must be entered in HHmm format.";
148-
return false;
149-
}
150-
151-
if (TryParseOpeningHoursValue(row.Hours.Closing, out TimeSpan closingTime) == false) {
152-
validationError = $"{row.DayName} closing time must be entered in HHmm format.";
153-
return false;
154-
}
155-
156-
if (closingTime <= openingTime) {
157-
validationError = $"{row.DayName} closing time must be later than opening time.";
158-
return false;
159-
}
160-
161-
validationError = string.Empty;
162-
return true;
163-
}
164-
165-
private sealed record OpeningHoursRow(string DayName, MerchantModels.DayOpeningHoursModel Hours);
16660
}
16761
}

EstateManagementUI.BlazorServer/Models/MerchantModels.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,6 @@ public class CreateMerchantModel
127127

128128
[Required(ErrorMessage = "Phone number is required")]
129129
public string? PhoneNumber { get; set; }
130-
131-
public MerchantOpeningHoursModel OpeningHours { get; set; } = new();
132130
}
133131

134132
public class MerchantEditModel

0 commit comments

Comments
 (0)