using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Domain.Common;
using gehGassi.Domain.Customers;
namespace gehGassi.Core.Services
{
///
/// Service der die Verwaltung von Kunden realisiert
///
public class CustomerService : ServiceBase, ICustomerService
{
private readonly IRepository _customerWithNamesRepository;
public CustomerService(IUnitOfWork unitOfWork) : base(unitOfWork)
{
_customerWithNamesRepository = unitOfWork.GetRepository();
}
///
/// Gibt eine gefilterte Liste von Kunden zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Kunden
public IQueryable Filter(string filter)
{
return Repository.Query(c => c.Name.Contains(filter) || c.Number.Contains(filter) || c.Comment.Contains(filter));
}
///
/// Erstellen eines Kunden
///
/// Kunde
public Customer Create()
{
var item = new Customer
{
Contact = new Contact(),
Address = new Address(),
UniqueId = Guid.NewGuid()
};
return item;
}
///
/// Gibt eine gefilterte Liste von Kunden zurück. Sucht nur im Namen
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Kunden
public async Task> SearchAsync(string filter)
{
return (await Repository.FindAsync(c => c.Name.Contains(filter))).ToList();
}
///
/// Gibt eine gefilterte Liste von Kunden zurück die ein Mangopay Konto haben. Sucht nur im Namen
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Kunden
public async Task> SearchWithMangopayAccountAsync(string filter)
{
return (await Repository.FindAsync(c => c.Name.Contains(filter) && c.MangopayIdCreated)).ToList();
}
///
/// Gibt ein Kunden zurück
///
/// UniqueId des Kunden
/// Betroffener Kunde
public async Task GetByUniqueIdAsync(Guid uniqueId)
{
return await Repository.FirstOrDefaultAsync(c => c.UniqueId == uniqueId).ConfigureAwait(false);
}
///
/// Gibt eine gefilterte Liste von Kunden mit Namen zurück
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// Gewünschte Sprache
/// Fallback Sprache
/// List betroffener Kunden
public IQueryable FilterWithNames(string filter, string language, string fallback)
{
language = language.ToUpperInvariant();
fallback = fallback.ToUpperInvariant();
var baseQuery = _customerWithNamesRepository.QueryStoredProcedure("SELECT * FROM tv_CustomersWithNames({0},{1})", c => c.Name.Contains(filter) || c.Number.Contains(filter), language, fallback);
return baseQuery;
}
///
/// Gibt die nächste freie Nummer für einen Kunden zurück
///
/// Kunden-Nummer
public string GetNextNumber()
{
long number = 1;
var last = Repository.Query(c => c.Id != -1).OrderByDescending(c => c.Id).FirstOrDefault();
if (last != null)
number = last.Id + 1;
return $"K-{DateTime.UtcNow.Year:0000}{DateTime.UtcNow.Month:00}-{number:00000}";
}
///
/// Zurücksetzen des Kunden-Typs auf null
///
/// Id des Kunden-Typs
/// Anzahl zurückgesetzte Kunden
public async Task ResetTypeAsync(long typeId)
{
var items = (await Repository.FindAsync(c => c.TypeId == typeId).ConfigureAwait(false)).ToList();
foreach (var item in items)
{
item.TypeId = null;
}
return items.Count;
}
///
/// Zurücksetzen der Branche auf null
///
/// Id der Branche
/// Anzahl zurückgesetzte Kunden
public async Task ResetBranchAsync(string branchId)
{
var items = (await Repository.FindAsync(c => c.BranchId == branchId).ConfigureAwait(false)).ToList();
foreach (var item in items)
{
item.TypeId = null;
}
return items.Count;
}
///
/// Zurücksetzen der Branchen-Listungen
///
/// Id der Branche
/// Anzahl zurückgesetzte Kunden
public async Task ResetBranchListingsAsync(string branchId)
{
var items = (await Repository.FindAsync(c => c.BranchesJson.Contains(branchId)).ConfigureAwait(false)).ToList();
foreach (var customer in items)
{
var branches = customer.BranchesJson.Split(',').ToList();
branches.Remove(branchId);
customer.BranchesJson = string.Join(',', branches);
}
return items.Count;
}
}
}