Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 64 additions & 3 deletions PhoneAssistant.Model.Tests/Repositories/SimRepositoryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public async Task GetLatestBillingPeriod_should_return_Latest_when_Sims_exist()

_helper.DbContext.Sims.Add(sim1);
_helper.DbContext.Sims.Add(sim2);
_helper.DbContext.Sims.Add(sim3);
await _helper.DbContext.SaveChangesAsync();

var actual = await _repository.GetLatestBillingPeriod();
Expand All @@ -35,18 +36,78 @@ public async Task GetLatestBillingPeriod_should_return_Unknown_when_no_Sims_exis
}

[Test]
public async Task GetSimNumberAsync_should_return_Sims_for_given_phoneNumber()
public async Task GetSimNumberAsync_should_return_latest_SimNumber_for_given_phoneNumber()
{
Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 };
Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 };
Sim sim3 = new() { BillingPeriod = "202501", SIMNumber = "8944122605563572207", PhoneNumber = "07814209744", UserName = "Bob Johnson", BroadbandData = 200, TextMessages = 100, VoiceCalls = 40 };
_helper.DbContext.Sims.Add(sim1);
_helper.DbContext.Sims.Add(sim2);
_helper.DbContext.Sims.Add(sim3);

await _helper.DbContext.SaveChangesAsync();

string? simNumber = await _repository.GetSimNumberAsync("07814209742");
string? simNumber = await _repository.GetSimNumber("07814209742");
await Assert.That(simNumber).IsEqualTo("8944122605563572206");
}

[Test]
public async Task GetSimsForPhoneNumber_should_return_Sims_for_given_phoneNumber()
{
Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 };
Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 };
Sim sim3 = new() { BillingPeriod = "202501", SIMNumber = "8944122605563572207", PhoneNumber = "07814209744", UserName = "Bob Johnson", BroadbandData = 200, TextMessages = 100, VoiceCalls = 40 };
_helper.DbContext.Sims.Add(sim1);
_helper.DbContext.Sims.Add(sim2);
_helper.DbContext.Sims.Add(sim3);
await _helper.DbContext.SaveChangesAsync();

IEnumerable<Sim> sims = await _repository.GetSimsForPhoneNumber("07814209742");

Sim? firstSim = sims.FirstOrDefault();
await Assert.That(sims).Count().IsEqualTo(2);
await Assert.That(firstSim).IsNotNull();
await Assert.That(firstSim.BillingPeriod).IsEqualTo("202602");
}

[Test]
public async Task GetSimsForSimNumber_should_return_latest_Sims_for_given_SimNumber()
{
Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 };
Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 };
Sim sim3 = new() { BillingPeriod = "202603", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 50, TextMessages = 5, VoiceCalls = 3 };
Sim sim4 = new() { BillingPeriod = "202501", SIMNumber = "8944122605563572207", PhoneNumber = "07814209744", UserName = "Bob Johnson", BroadbandData = 200, TextMessages = 100, VoiceCalls = 40 };
_helper.DbContext.Sims.Add(sim1);
_helper.DbContext.Sims.Add(sim2);
_helper.DbContext.Sims.Add(sim3);
_helper.DbContext.Sims.Add(sim4);
await _helper.DbContext.SaveChangesAsync();

IEnumerable<Sim> simsFullNumber = await _repository.GetSimsForSimNumber("8944122605563572206");

Sim? firstSim = simsFullNumber.FirstOrDefault();
await Assert.That(simsFullNumber).Count().IsEqualTo(2);
await Assert.That(firstSim).IsNotNull();
await Assert.That(firstSim.BillingPeriod).IsEqualTo("202603");
}

[Test]
public async Task GetSimsForUserName_should_return_latest_Sims_for_given_SimNumber()
{
Sim sim1 = new() { BillingPeriod = "202601", SIMNumber = "8944122605563572205", PhoneNumber = "07814209742", UserName = "John Doe", BroadbandData = 100, TextMessages = 50, VoiceCalls = 20 };
Sim sim2 = new() { BillingPeriod = "202602", SIMNumber = "8944122605563572206", PhoneNumber = "07814209742", UserName = "Jane Smith", BroadbandData = 150, TextMessages = 75, VoiceCalls = 30 };
Sim sim3 = new() { BillingPeriod = "202603", SIMNumber = "8944122605563572206", PhoneNumber = "07814209744", UserName = "Jane Smith", BroadbandData = 50, TextMessages = 5, VoiceCalls = 3 };
Sim sim4 = new() { BillingPeriod = "202501", SIMNumber = "8944122605563572207", PhoneNumber = "07814209744", UserName = "Bob Johnson", BroadbandData = 200, TextMessages = 100, VoiceCalls = 40 };
_helper.DbContext.Sims.Add(sim1);
_helper.DbContext.Sims.Add(sim2);
_helper.DbContext.Sims.Add(sim3);
_helper.DbContext.Sims.Add(sim4);
await _helper.DbContext.SaveChangesAsync();

IEnumerable<Sim> simsFullNumber = await _repository.GetSimsForUserName("Jane Smith");

Sim? firstSim = simsFullNumber.FirstOrDefault();
await Assert.That(simsFullNumber).Count().IsEqualTo(2);
await Assert.That(firstSim).IsNotNull();
await Assert.That(firstSim.BillingPeriod).IsEqualTo("202603");
}
}
49 changes: 37 additions & 12 deletions PhoneAssistant.Model/Repositories/SimRepository.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
using Microsoft.EntityFrameworkCore;
using System.Numerics;

using Microsoft.EntityFrameworkCore;

namespace PhoneAssistant.Model;

public interface ISimRepository
{
Task CreateAsync(Sim sim);
Task<string> GetLatestBillingPeriod();
Task<IEnumerable<Sim>> GetSim(string phoneNumber);
Task<string?> GetSimNumberAsync(string phoneNumber);
Task<IEnumerable<Sim>> GetSimsForPhoneNumber(string phoneNumber);
Task<IEnumerable<Sim>> GetSimsForSimNumber(string simNumber);
Task<IEnumerable<Sim>> GetSimsForUserName(string userName);

Task<string?> GetSimNumber(string phoneNumber);
}

public sealed class SimRepository(PhoneAssistantDbContext dbContext) : ISimRepository
Expand All @@ -27,25 +32,45 @@ public async Task<string> GetLatestBillingPeriod()
return latestBillingPeriod ?? "Unknown";
}

public async Task<IEnumerable<Sim>> GetSim(string phoneNumber)
public async Task<string?> GetSimNumber(string phoneNumber)
{
IEnumerable<Sim> sims = await dbContext.Sims
string? simNumber = await dbContext.Sims
.Where(p => p.PhoneNumber == phoneNumber)
.OrderByDescending(p => p.BillingPeriod)
.AsNoTracking()
.Select(s => s.SIMNumber)
.FirstOrDefaultAsync();

return simNumber;
}

public async Task<IEnumerable<Sim>> GetSimsForPhoneNumber(string phoneNumber)
{
IEnumerable<Sim> sims = await dbContext.Sims
.Where(p => p.PhoneNumber.Contains(phoneNumber))
.OrderByDescending(p => p.BillingPeriod)
.AsNoTracking()
.ToListAsync();
return sims;
}

public async Task<string?> GetSimNumberAsync(string phoneNumber)
public async Task<IEnumerable<Sim>> GetSimsForSimNumber(string simNumber)
{
string? simNumber = await dbContext.Sims
.Where(p => p.PhoneNumber == phoneNumber)
.OrderByDescending(p => p.BillingPeriod)
IEnumerable<Sim> sims = await dbContext.Sims
.Where(s => s.SIMNumber.Contains(simNumber))
.OrderByDescending(s => s.BillingPeriod)
.AsNoTracking()
.Select(s => s.SIMNumber)
.FirstOrDefaultAsync();
.ToListAsync();
return sims;
}

return simNumber;
public async Task<IEnumerable<Sim>> GetSimsForUserName(string userName)
{
IEnumerable<Sim> sims = await dbContext.Sims
.Where(s => s.UserName.Contains(userName))
.OrderByDescending(s => s.BillingPeriod)
.AsNoTracking()
.ToListAsync();
return sims;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public async Task CanSavePhone_ShouldBeEnabled_WhenNoErrors_WithPhoneHasSim()
{
Mock<ISimRepository> sims = _mocker.GetMock<ISimRepository>();
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type.
sims.Setup(r => r.GetSimNumberAsync("07123456789")).ReturnsAsync((string)null);
sims.Setup(r => r.GetSimNumber("07123456789")).ReturnsAsync((string)null);
#pragma warning restore CS8600 // Converting null literal or possible null value to non-nullable type.
_ = MockValidator();
AddItemViewModel sut = _mocker.CreateInstance<AddItemViewModel>();
Expand Down Expand Up @@ -117,7 +117,7 @@ public async Task OEM_should_change_Model(Manufacturer oem, string model)
public async Task OnPhoneNumberChanged_ShouldSetSimNumber_WhenSimExistsAsync()
{
Mock<ISimRepository> repository = _mocker.GetMock<ISimRepository>();
repository.Setup(r => r.GetSimNumberAsync("07123456789")).ReturnsAsync("sim number");
repository.Setup(r => r.GetSimNumber("07123456789")).ReturnsAsync("sim number");
_ = MockValidator();
AddItemViewModel sut = _mocker.CreateInstance<AddItemViewModel>();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public async Task PhoneNumber_changed_should_set_SimNumber_when_SIM_exists()
{
MockValidator();
Mock<ISimRepository> baseRepository = _mocker.GetMock<ISimRepository>();
baseRepository.Setup(r => r.GetSimNumberAsync("01234567890")).ReturnsAsync("sim number");
baseRepository.Setup(r => r.GetSimNumber("01234567890")).ReturnsAsync("sim number");
var vm = _mocker.CreateInstance<SimsMainViewModel>();

vm.NewUser = "Alice";
Expand Down
2 changes: 1 addition & 1 deletion PhoneAssistant.WPF/Features/AddItem/AddItemViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ async partial void OnPhoneNumberChanged(string? value)

await ValidatePropertyAsync(nameof(PhoneNumber));

string? simNumber = await _simRepository.GetSimNumberAsync(value);
string? simNumber = await _simRepository.GetSimNumber(value);

if (simNumber is null) return;

Expand Down
67 changes: 52 additions & 15 deletions PhoneAssistant.WPF/Features/BaseReport/BaseReportMainView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,48 @@
Text="{Binding LatestImport}"
TextAlignment="Right" />
</Grid>
<TextBox x:Name="Search"
Grid.Row="1"
Width="250"
Margin="0,5,0,5"
HorizontalAlignment="Left"
materialDesign:HintAssist.Hint="Phone Number"
materialDesign:TextFieldAssist.HasClearButton="True"
Style="{StaticResource MaterialDesignOutlinedTextBox}"
Text="{Binding SearchPhoneNumber, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding EnterKeyCommand}" />
</TextBox.InputBindings>
</TextBox>
<StackPanel Grid.Row="1" Orientation="Horizontal">
<TextBox x:Name="SearchPhoneNumber"
Width="160"
Margin="10,5,0,5"
HorizontalAlignment="Left"
materialDesign:HintAssist.Hint="Phone Number"
materialDesign:TextFieldAssist.CharacterCounterVisibility="Hidden"
materialDesign:TextFieldAssist.HasClearButton="True"
MaxLength="12"
Style="{StaticResource MaterialDesignOutlinedTextBox}"
Text="{Binding SearchPhoneNumber, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding PhoneNumberSearchCommand}" />
</TextBox.InputBindings>
</TextBox>
<TextBox x:Name="SearchSimNumber"
Width="160"
Margin="10,5,0,5"
HorizontalAlignment="Left"
materialDesign:HintAssist.Hint="SIM Number"
materialDesign:TextFieldAssist.CharacterCounterVisibility="Hidden"
materialDesign:TextFieldAssist.HasClearButton="True"
MaxLength="19"
Style="{StaticResource MaterialDesignOutlinedTextBox}"
Text="{Binding SearchSimNumber, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding SimNumberSearchCommand}" />
</TextBox.InputBindings>
</TextBox>
<TextBox x:Name="SearchUserName"
Width="160"
Margin="10,5,0,5"
HorizontalAlignment="Left"
materialDesign:HintAssist.Hint="User Name"
materialDesign:TextFieldAssist.HasClearButton="True"
Style="{StaticResource MaterialDesignOutlinedTextBox}"
Text="{Binding SearchUserName, UpdateSourceTrigger=PropertyChanged}">
<TextBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding UserNameSearchCommand}" />
</TextBox.InputBindings>
</TextBox>
</StackPanel>

<DataGrid x:Name="BaseReportDataGrid"
Grid.Row="2"
Expand All @@ -77,8 +106,16 @@
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding BillingPeriod}"
Header="Billing Period"
IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding SIMNumber}" Header="SIM Number">
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding SIMNumber}"
Header="SIM Number"
IsReadOnly="True">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
Expand Down
41 changes: 33 additions & 8 deletions PhoneAssistant.WPF/Features/BaseReport/BaseReportMainView.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace PhoneAssistant.WPF.Features.BaseReport;
/// <summary>
Expand All @@ -10,18 +11,42 @@ public partial class BaseReportMainView : UserControl
public BaseReportMainView()
{
InitializeComponent();
DataObject.AddPastingHandler(Search, OnPaste);
DataObject.AddPastingHandler(SearchPhoneNumber, OnPastePhoneNumber);
DataObject.AddPastingHandler(SearchSimNumber, OnPasteSimNumber);
DataObject.AddPastingHandler(SearchUserName, OnPasteUserName);
}

private void OnPaste(object sender, DataObjectPastingEventArgs e)
private static void HandlePaste(object sender, DataObjectPastingEventArgs e, string expectedTextBoxName, ICommand searchCommand)
{
BaseReportMainViewModel vm = (BaseReportMainViewModel)DataContext;

bool isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true);
if (!isText) return;
if (sender is not TextBox textBox ||
textBox.Name != expectedTextBoxName ||
!e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true))
{
return;
}

Search.Text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string;
vm.EnterKeyCommand.Execute(null);
textBox.Text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string;

searchCommand.Execute(null);
e.CancelCommand();
}

private void OnPastePhoneNumber(object sender, DataObjectPastingEventArgs e)
{
var vm = (BaseReportMainViewModel)DataContext;
HandlePaste(sender, e, "SearchPhoneNumber", vm.PhoneNumberSearchCommand);
}

private void OnPasteSimNumber(object sender, DataObjectPastingEventArgs e)
{
var vm = (BaseReportMainViewModel)DataContext;
HandlePaste(sender, e, "SearchSimNumber", vm.SimNumberSearchCommand);
}

private void OnPasteUserName(object sender, DataObjectPastingEventArgs e)
{
var vm = (BaseReportMainViewModel)DataContext;
HandlePaste(sender, e, "SearchUserName", vm.UserNameSearchCommand);
}

}
38 changes: 32 additions & 6 deletions PhoneAssistant.WPF/Features/BaseReport/BaseReportMainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,50 @@ public partial class BaseReportMainViewModel(ISimRepository repository) : ViewMo
[ObservableProperty]
public partial string SearchPhoneNumber { get; set; } = string.Empty;

[ObservableProperty]
public partial string SearchSimNumber { get; set; } = string.Empty;

[ObservableProperty]
public partial string SearchUserName { get; set; } = string.Empty;

[RelayCommand]
private async Task EnterKey()
private async Task PhoneNumberSearch()
{
if (string.IsNullOrEmpty(SearchPhoneNumber)) return;
if (string.IsNullOrEmpty(SearchPhoneNumber) && string.IsNullOrEmpty(SearchSimNumber)) return;

BaseReportSims.Clear();
IEnumerable<Sim> sims = await _repository.GetSimsForPhoneNumber(SearchPhoneNumber);
LoadSimsIntoCollection(sims);
}

[RelayCommand]
private async Task SimNumberSearch()
{
if (string.IsNullOrEmpty(SearchSimNumber)) return;

IEnumerable<Sim> sims = await _repository.GetSimsForSimNumber(SearchSimNumber);
LoadSimsIntoCollection(sims);
}

[RelayCommand]
private async Task UserNameSearch()
{
if (string.IsNullOrEmpty(SearchUserName)) return;

IEnumerable<Sim> sims = await _repository.GetSimsForUserName(SearchUserName);
LoadSimsIntoCollection(sims);
}

IEnumerable<Sim> sims = await _repository.GetSim(SearchPhoneNumber);
private void LoadSimsIntoCollection(IEnumerable<Sim> sims)
{
BaseReportSims.Clear();
if (!sims.Any())
return;

ulong maxBoadbandData = sims.Max(s => s.BroadbandData);
foreach (var sim in sims)
{
BaseReportSim baseReportSim = new(sim, maxBoadbandData);
BaseReportSims.Add(baseReportSim);
}

}

public override async Task LoadAsync()
Expand Down
Loading
Loading