-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCustomerService.cs
More file actions
79 lines (69 loc) · 2.72 KB
/
CustomerService.cs
File metadata and controls
79 lines (69 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System.Linq.Expressions;
using System.Security.Cryptography.X509Certificates;
using AppBoot.DependencyInjection;
using Contracts.Sales;
using DataAccess;
using Sales.DataModel.SalesLT;
using Sales.DataModel.Values;
namespace Sales.Services;
[Service(typeof(ICustomerService))]
class CustomerService(IRepository repository) : ICustomerService
{
public CustomerData[] GetCustomersWithOrders()
{
return GetCustomersWithOrdersFilteredBy(x => true);
}
private CustomerData[] GetCustomersWithOrdersFilteredBy(Expression<Func<Customer, bool>> filter)
{
var q = repository.GetEntities<Customer>()
.Where(c => c.SalesOrderHeaders != null && c.SalesOrderHeaders.Any())
.Where(filter)
.OrderBy(c => c.CompanyName)
.Select(c => new CustomerData
{
Id = c.CustomerID,
CompanyName = c.CompanyName,
SalesPerson = c.SalesPerson
});
return q.ToArray();
}
public CustomerData[] GetCustomersWithOrdersStartingWith(string prefix)
{
Expression<Func<Customer, bool>> filter;
if (string.IsNullOrEmpty(prefix))
filter = x => true;
else
filter = c => c.CompanyName != null && c.CompanyName.StartsWith(prefix);
return GetCustomersWithOrdersFilteredBy(filter);
}
public CustomerData[] GetCustomersWithOrdersContaining(string fragment)
{
Expression<Func<Customer, bool>> filter;
if (string.IsNullOrEmpty(fragment))
filter = x => true;
else
filter = c => c.CompanyName != null && c.CompanyName.Contains(fragment);
return GetCustomersWithOrdersFilteredBy(filter);
}
public CustomerWithOverdueOrdersData[] GetCustomersWithOverdueOrders()
{
var today = DateTime.Today;
var closedStatuses = new[] { SalesOrderHeaderStatusValues.Shipped, SalesOrderHeaderStatusValues.Cancelled };
return repository.GetEntities<Customer>()
.Where(c => c.SalesOrderHeaders.Any(o =>
o.DueDate < today &&
!closedStatuses.Contains(o.Status)))
.Select(c => new CustomerWithOverdueOrdersData
{
CustomerName = c.CompanyName ?? $"{c.FirstName} {c.LastName}",
OverdueOrdersCount = c.SalesOrderHeaders
.Where(o => o.DueDate < today && !closedStatuses.Contains(o.Status))
.Count(),
OldestDueDate = c.SalesOrderHeaders
.Where(o => o.DueDate < today && !closedStatuses.Contains(o.Status))
.Min(o => o.DueDate)
})
.OrderBy(x => x.OldestDueDate)
.ToArray();
}
}