using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Shop; using Microsoft.EntityFrameworkCore; namespace gehGassi.Core.Services { /// /// Service der die Verwaltung von Rechnungen ermöglicht /// public class InvoiceService : ServiceBase, IInvoiceService { /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork public InvoiceService(IUnitOfWork unitOfWork) : base(unitOfWork) { } /// /// Erstellen einer Rechnung /// /// Bestellung public Invoice Create() { var item = new Invoice() { UniqueId = Guid.NewGuid(), Created = DateTime.UtcNow }; return item; } /// /// Erstellen einer Rechnung /// /// Id der Bestellung /// Bestellung public async Task CreateAsync(long orderId) { var item = Create(); item.OrderId = orderId; item.Number = await GetNextNumberAsync(); item.Counter = await GetNextCounterAsync(); return item; } /// /// Gibt eine Rechnung basierend auf der Bestellung zurück /// /// Id der Bestellung /// public async Task GetByOrderAsync(long orderId) { var item = await Repository.FirstOrDefaultAsync(c => c.OrderId == orderId).ConfigureAwait(false); return item; } /// /// Gibt den nächsten freien Rechnungs-spezifischen Zähler zurück /// /// Nächste freie Nummer public async Task GetNextCounterAsync() { long number = 1; var last = await Repository.Query(c => c.Id > 0).OrderByDescending(c => c.Counter).FirstOrDefaultAsync().ConfigureAwait(false); if (last != null) number = last.Counter + 1; return number; } /// /// Gibt die nächste freie Nummer für eine Rechnung als Rechnungsnummer zurück /// /// EndKunden-Nummer public async Task GetNextNumberAsync() { long number = 1; var last = await Repository.Query(c => c.Id > 0).OrderByDescending(c => c.Id).FirstOrDefaultAsync().ConfigureAwait(false); if (last != null) number = last.Counter + 1; return $"{DateTime.UtcNow.Year}{DateTime.UtcNow.Month}-{number:000000}"; } } }