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