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; } } }