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 Gutschriften ermöglicht /// public class CreditNoteService : ServiceBase, ICreditNoteService { /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork public CreditNoteService(IUnitOfWork unitOfWork) : base(unitOfWork) { } /// /// Erstellen einer Gutschrift /// /// Gutschrift public CreditNote Create() { var item = new CreditNote() { UniqueId = Guid.NewGuid(), Created = DateTime.UtcNow }; return item; } /// /// Erstellen einer Gutschrift /// /// Id der Bestellung /// Rechnungsnummer /// Gutschrift public async Task CreateAsync(long orderId, string invoiceNumber) { var item = Create(); item.OrderId = orderId; item.InvoiceNumber = invoiceNumber; item.Number = await GetNextNumberAsync(); item.Counter = await GetNextCounterAsync(); return item; } /// /// Gibt eine Gutschrift basierend auf der Bestellung zurück /// /// Id der Bestellung /// Gutschrift public async Task GetByOrderAsync(long orderId) { var item = await Repository.FirstOrDefaultAsync(c => c.OrderId == orderId).ConfigureAwait(false); return item; } /// /// Gibt den nächsten freien Gutschrift-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 Gutschrift als Gutschriftennummer zurück /// /// Gutschrift-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}"; } } }