using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Advertisements; using gehGassi.Domain.Common; using Microsoft.EntityFrameworkCore; namespace gehGassi.Core.Services { /// /// Service der die Verwaltung von Pins realisiert /// public class PinService : ServiceBase, IPinService { private readonly IRepository _namesRepository; /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork public PinService(IUnitOfWork unitOfWork) : base(unitOfWork) { _namesRepository = unitOfWork.GetRepository(); } /// /// Gibt eine gefilterte Liste von Pins zurück /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener Pins public IQueryable Filter(string filter) { return Repository.Query(c => c.NameLocalized.Contains(filter)); } /// /// Erstellen eines Pins /// /// Pin public Pin Create() { var item = new Pin() { Id = Guid.NewGuid().ToString("N"), Created = DateTimeOffset.UtcNow }; return item; } /// /// Gibt eine gefilterte Liste von Pins zurück. /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener Pins public async Task> SearchAsync(string filter) { return (await Repository.FindAsync(c => c.NameLocalized.Contains(filter))).ToList(); } /// /// Gibt eine gefilterte Liste von Pins mit Namen zurück in einer gewählten Sprache /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// Gewünschte Sprache /// Fallback Sprache /// Sollen gelöschte inkludiert werden? /// Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden? /// Liste betroffener Pins public IQueryable FilterWithNames(string filter, string language, string fallback, bool includeDeleted, bool excludeDraft) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_PinsWithNames({0},{1})", c => c.Name.Contains(filter) || c.CustomerName.Contains(filter), language, fallback); if (!includeDeleted) baseQuery = baseQuery.Where(c => c.Deleted == false); if (excludeDraft) baseQuery = baseQuery.Where(c => c.Status != PinStatus.Draft); return baseQuery; } /// /// Gibt eine gefilterte Liste von Pins mit Namen für Kunden zurück in einer gewählten Sprache /// /// Id des Kunden /// Filterbegriff der in bestimmten Feldern gesucht wird /// Gewünschte Sprache /// Fallback Sprache /// Sollen gelöschte inkludiert werden? /// Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden? /// Liste betroffener Pins public IQueryable FilterWithNamesCustomer(long customerId, string filter, string language, string fallback, bool includeDeleted, bool excludeDraft) { language = language.ToUpperInvariant(); fallback = fallback.ToUpperInvariant(); var baseQuery = _namesRepository.QueryStoredProcedure("SELECT * FROM tv_PinsWithNames({0},{1})", c => c.CustomerId == customerId && (c.Name.Contains(filter) || c.CustomerName.Contains(filter)), language, fallback); if (!includeDeleted) baseQuery = baseQuery.Where(c => c.Deleted == false); if (excludeDraft) baseQuery = baseQuery.Where(c => c.Status != PinStatus.Draft); return baseQuery; } /// /// Zurücksetzen der Zuordnung zu einer Listung /// /// Id der Listung /// Task public async Task ResetListingAsync(string listingId) { var items = (await Repository.FindAsync(c => c.ListingId == listingId).ConfigureAwait(false)).ToList(); foreach (var item in items) { item.ListingId = string.Empty; } return items.Count; } /// /// Stornieren eines Pins basierend auf einer Listung /// /// Id der Listung /// Task public async Task CancelByListingAsync(string listingId) { var items = (await Repository.FindAsync(c => c.ListingId == listingId).ConfigureAwait(false)).ToList(); foreach (var item in items) { item.Status = PinStatus.Cancelled; } return items.Count; } /// /// Gibt die Anzahl von Pins zurück /// /// Sollen gelöschte inkludiert werden? /// Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden? /// Anzahl Pins public async Task CountAsync(bool includeDeleted, bool excludeDraft) { var query = Repository.Query(c => c.Id != ""); if (!includeDeleted) query = query.Where(c => c.Deleted == false); if (excludeDraft) query = query.Where(c => c.Status != PinStatus.Draft); return await query.CountAsync().ConfigureAwait(false); } /// /// Gibt die Anzahl von Pins in einem Status zurück /// /// Gesuchter Status /// Sollen gelöschte inkludiert werden? /// Anzahl Pins public async Task CountAsync(PinStatus status, bool includeDeleted) { var query = Repository.Query(c => c.Status == status); if (!includeDeleted) query = query.Where(c => c.Deleted == false); return await query.CountAsync().ConfigureAwait(false); } /// /// Gibt einen Pin für einen Artikel im Warenkorb zurück /// /// Id des Artikels im Warenkorb /// Pin oder null, wenn nicht gefunden public async Task GetByCartItemAsync(long cartItemId) { return await Repository.FirstOrDefaultAsync(c => c.CartItemId == cartItemId && c.Status == PinStatus.Draft); } /// /// Gibt einen Pin für einen Artikel in einer Bestellung zurück /// /// Id des Artikels in der Bestellung /// Pin oder null, wenn nicht gefunden public async Task GetByOrderItemAsync(long orderItemId) { return await Repository.FirstOrDefaultAsync(c => c.OrderItemId == orderItemId); } /// /// Setzen des Status von Pins nach Bestellung /// /// Id der Bestellung /// Zu setzender Status /// Anzahl betroffener Pins public async Task SetStatusByOrderAsync(long orderId, PinStatus status) { var items = await Repository.FindAsync(c => c.OrderId == orderId); foreach (var item in items) { item.Status = status; } return items.Count(); } /// /// Setzen des Bezahlstatus von Pins nach Bestellung /// /// Id der Bestellung /// Zu setzender Status /// Anzahl betroffener Pins public async Task SetPaymentStatusByOrderAsync(long orderId, PaymentStatus status) { var items = await Repository.FindAsync(c => c.OrderId == orderId); foreach (var item in items) { item.PaymentStatus = status; } return items.Count(); } /// /// Starten von gebuchten Pins wenn diese das Start-Datum erreicht haben /// /// Anzahl gestartete Pins public async Task StartBookedAsnyc() { var items = await Repository.FindAsync(c => c.Status == PinStatus.Booked && c.Deleted == false && c.StartDate <= DateTimeOffset.UtcNow && c.EndDate.Value >= DateTimeOffset.UtcNow); foreach (var item in items) { item.Status = PinStatus.Running; } return items.Count(); } /// /// Stoppen von abgelaufenen Pins wenn diese das Enddatum erreicht haben /// /// Anzahl gestoppte Pins public async Task StopRunningAsync() { var items = await Repository.FindAsync(c => c.Status == PinStatus.Running && c.Deleted == false && c.EndDate.Value <= DateTimeOffset.UtcNow); foreach (var item in items) { item.Status = PinStatus.Ended; } return items.Count(); } } }