using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using gehGassi.Domain.Common;
namespace gehGassi.Core.Interfaces
{
///
/// Schnittestellenbeschreibung für einen Service der die Preise eines Produktes berechnet
///
public interface IShopCalculationService
{
///
/// Berechnet den Preis einer Produktes für einen Kunden.
/// Berücksichtigt die Länder- und Kundeneinstellungen
///
/// Id des Produktes
/// Id des Kunden
/// Anzahl - Stück
/// Preis-Kalkulation
Task CalculatePriceAsync(int productId, long customerId, int quantity);
///
/// Berechnet den Preis einer Produktes für einen Kunden.
/// Berücksichtigt die Länder- und Kundeneinstellungen
///
/// Id des Produktes
/// Id des Kunden
/// Iso2 Land für die Rechnung
/// Anzahl - Stück
/// Preis-Kalkulation
Task CalculatePriceAsync(int productId, long customerId, string billingCountry, int quantity);
///
/// Berechnet den Preis einer Produktes für einen Kunden.
/// Berücksichtigt die Länder- und Kundeneinstellungen
///
/// Id des Produktes
/// Id des Kunden
/// Iso2 Land für die Rechnung
/// Anzahl - Stück
/// Budget für Banner
/// Preis-Kalkulation
Task CalculatePriceBannerAsync(int productId, long customerId, string billingCountry, int quantity, decimal budget);
///
/// Berechnet den Preis einer Produktes für einen Kunden.
/// Berücksichtigt die Länder- und Kundeneinstellungen
///
/// Id des Produktes
/// Id des Kunden
/// Preistype
/// Typ der aliquoten Berechnung
/// Startdatum
/// Enddatum
/// Anzahl - Stück
/// Preis-Kalkulation
Task CalculatePriceAsync(int productId, long customerId, PriceType priceType, PriceAliquotType priceAliquotType, DateTimeOffset startDate, DateTimeOffset endDate, int quantity);
///
/// Berechnet den Preis einer Produktes für einen Kunden.
/// Berücksichtigt die Länder- und Kundeneinstellungen
///
/// Id des Produktes
/// Id des Kunden
/// Preistype
/// Typ der aliquoten Berechnung
/// Startdatum
/// Enddatum
/// Iso2 Land für die Rechnung
/// Anzahl - Stück
/// Preis-Kalkulation
Task CalculatePriceAsync(int productId, long customerId, PriceType priceType, PriceAliquotType priceAliquotType, DateTimeOffset startDate, DateTimeOffset endDate, string billingCountry, int quantity);
///
/// Aufschlagen von X Prozent auf eine Preis-Kalkulation
///
/// Preis-Kalkulation
/// Aufschlag in Prozent
/// Id des Produktes
/// Iso2 Land für die Rechnung
/// Preis-Kalkulation
Task AddMarkupAsync(PriceCalculation priceCalculation, decimal markup, int productId, string billingCountry);
}
///
/// Ergebnis einer Preis-Kalkulation
///
public class PriceCalculation
{
///
/// Preis netto
///
public decimal Price { get; set; }
///
/// Preis brutto
///
public decimal PriceGross { get; set; }
///
/// Vorheriger Preis netto
///
public decimal OldPrice{ get; set; }
///
/// Vorheriger Preis brutto
///
public decimal OldPriceGross { get; set; }
///
/// Preis2 netto
///
public decimal Price2 { get; set; }
///
/// Preis2 brutto
///
public decimal Price2Gross { get; set; }
///
/// Vorheriger Preis2 netto
///
public decimal OldPrice2 { get; set; }
///
/// Vorheriger Preis2 brutto
///
public decimal OldPrice2Gross { get; set; }
///
/// Angewandte Steuer - z.B. 10%, 20%
///
public decimal TaxRate { get; set; }
///
/// Kalkulierte Steuer
///
public decimal TaxValue { get; set; }
///
/// Gesamtwert Netto (Preis + Preis2)
///
public decimal Total { get; set; }
///
/// Gesamtwert Brutto (Preis + Preis2)
///
public decimal TotalGross { get; set; }
///
/// Gesamtwert Vorherig Netto (Preis + Preis2)
///
public decimal TotalOld { get; set; }
///
/// Gesamtwert vorherig Brutto (Preis + Preis2)
///
public decimal TotalOldGross { get; set; }
///
/// Stückzahl
///
public int Quantity { get; set; }
}
}