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