Przejdź do głównej zawartości

Napiwki i Darowizny

Dodawanie Napiwków

Do dodawania napiwków używana jest następująca metoda:

IOperationService.AddDonation

IPaymentItem AddDonation([NotNull] ICredentials credentials, [NotNull] IOrder order, [NotNull] IDonationType donationType, [NotNull] IPaymentType paymentType, [CanBeNull] IPaymentItemAdditionalData additionalData, bool isProcessed, decimal donationSum);
  • Typ napiwków IDonationType jest przekazywany jako parametr. Listę dostępnych typów napiwków można uzyskać wywołując metodę IOperationService.GetDonationTypesCompatibleWith i przekazując do niej zamówienie jako parametr.
  • Metoda płatności IPaymentType używana do przetwarzania napiwków jest również jednym z parametrów. Można sprawdzić, które metody płatności są dostępne dla wybranego typu napiwków, korzystając z wcześniej wybranego typu napiwków — IDonationType.PaymentTypes.
  • Parametr isProcessed informuje, czy napiwki powinny zostać zaksięgowane w Syrve POS, czy zostały już zaksięgowane z zewnątrz.
Przykłady
  • Dodawanie napiwków gotówkowych do otwartego zamówienia.
const bool isProcessed = true;
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var donationType = PluginContext.Operations.GetDonationTypesCompatibleWith(order).Last(dt => dt.PaymentTypes.Any(pt => pt.Kind == PaymentTypeKind.Cash));
var paymentType = donationType.PaymentTypes.First(x => x.Kind == PaymentTypeKind.Cash);
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddDonation(credentials, order, donationType, paymentType, null, isProcessed, order.ResultSum / 10);
order = PluginContext.Operations.GetOrderById(order.Id);
Debug.Assert(order.Donations.Contains(paymentItem));
  • Dodawanie napiwków kartą bankową do zamkniętego zamówienia.
const bool isProcessed = true;
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.Closed);
var donationType = PluginContext.Operations.GetDonationTypesCompatibleWith(order).First(dt => dt.PaymentTypes.Any(pt => pt.Kind == PaymentTypeKind.Card));
var paymentType = donationType.PaymentTypes.First(x => x.Kind == PaymentTypeKind.Card && x.Name.ToUpper() == "VISA");
var additionalData = new CardPaymentItemAdditionalData { CardNumber = "123456" };
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddDonation(credentials, order, donationType, paymentType, additionalData, isProcessed, order.ResultSum / 4);
order = PluginContext.Operations.GetOrderById(order.Id);
Debug.Assert(order.Donations.Contains(paymentItem));
  • Dodawanie napiwków pluginowych do otwartego zamówienia.
const bool isProcessed = false;
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var donationType = PluginContext.Operations.GetDonationTypesCompatibleWith(order).Last(dt => dt.PaymentTypes.Any(pt => pt.Kind == PaymentTypeKind.Cash));
var paymentType = donationType.PaymentTypes.First(x => x.Kind == PaymentTypeKind.Cash);
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddDonation(credentials, order, donationType, paymentType, null, isProcessed, order.ResultSum / 10);
order = PluginContext.Operations.GetOrderById(order.Id);
Debug.Assert(order.Donations.Contains(paymentItem));
  • Dodawanie napiwków gotówkowych do otwartego zamówienia, które mają być przetworzone w Syrve POS.
const bool isProcessed = false;
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var donationType = PluginContext.Operations.GetDonationTypesCompatibleWith(order).Last(dt => dt.PaymentTypes.Any(pt => pt.Kind == PaymentTypeKind.Cash));
var paymentType = donationType.PaymentTypes.First(x => x.Kind == PaymentTypeKind.Cash);
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddDonation(credentials, order, donationType, paymentType, null, isProcessed, order.ResultSum / 10);
order = PluginContext.Operations.GetOrderById(order.Id);
Debug.Assert(order.Donations.Contains(paymentItem));
  • Dodawanie napiwków kartą bankową do zamkniętego zamówienia, które mają być przetworzone w Syrve POS.
const bool isProcessed = false;
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.Closed);
var donationType = PluginContext.Operations.GetDonationTypesCompatibleWith(order).First(dt => dt.PaymentTypes.Any(pt => pt.Kind == PaymentTypeKind.Card));
var paymentType = donationType.PaymentTypes.First(x => x.Kind == PaymentTypeKind.Card && x.Name.ToUpper() == "VISA");
var additionalData = new CardPaymentItemAdditionalData { CardNumber = "123456" };
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddDonation(credentials, order, donationType, paymentType, additionalData, isProcessed, order.ResultSum / 4);
order = PluginContext.Operations.GetOrderById(order.Id);
Debug.Assert(order.Donations.Contains(paymentItem));
  • Dodawanie nieprzetworzonych napiwków pluginowych do otwartego zamówienia. Należy zauważyć, że aby obsłużyć nieprzetworzone metody płatności, plugin powinien obsługiwać płatność Silent.
const bool isProcessed = false;
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New);
var donationType = PluginContext.Operations.GetDonationTypesCompatibleWith(order).First(dt => dt.PaymentTypes.Any(pt => pt.Kind == PaymentTypeKind.External));
var paymentType = donationType.PaymentTypes.First(x => x.Kind == PaymentTypeKind.External && x.Name == "SampleApiPayment");
var additionalData = new ExternalPaymentItemAdditionalData { CustomData = Serializer.Serialize(new PaymentAdditionalData { SilentPay = true }) };
var credentials = PluginContext.Operations.GetCredentials();
var paymentItem = PluginContext.Operations.AddDonation(credentials, order, donationType, paymentType, additionalData, isProcessed, order.ResultSum / 2);
order = PluginContext.Operations.GetOrderById(order.Id);
Debug.Assert(order.Donations.Contains(paymentItem));
  • Dodawanie napiwków podczas przetwarzania zewnętrznych płatności pluginowych. W tym przykładzie należy zmienić implementację metody IExternalPaymentProcessor.Pay.
public void Pay(decimal sum, [NotNull] IOrder order, Guid paymentTypeId, Guid transactionId, [NotNull] IPointOfSale pointOfSale, [NotNull] IUser cashier,
[NotNull] IOperationService operations, IReceiptPrinter printer, IViewManager viewManager, IPaymentDataContext context)
{
var donationType = operations.GetDonationTypesCompatibleWith(order).FirstOrDefault(dt => dt.PaymentTypes.Any(pt => pt.Kind == PaymentTypeKind.External));
if (donationType != null)
{
var paymentType = donationType.PaymentTypes.First(x => x.Kind == PaymentTypeKind.External && x.Name == "SampleApiPayment");
var additionalData = new ExternalPaymentItemAdditionalData { CustomData = Serializer.Serialize(new PaymentAdditionalData { SilentPay = true }) };
var credentials = operations.GetCredentials();

operations.AddDonation(credentials, order, donationType, paymentType, additionalData, false, order.ResultSum / 2);
}
}

Komentarze:

  • Wyrażenie PluginContext.Operations.GetOrders().Last(...) jest używane w przykładach, co oznacza pobranie jednego z najnowszych zamówień z listy. Podobne wyrażenia są używane do pobierania typów napiwków i płatności. Aby rozwiązać zadania biznesowe, należy użyć odpowiedniego kryterium wyboru.
  • PluginContext.Operations.GetCredentials() — w dalszej części przykłady pokazują metodę rozszerzającą udostępnioną wyłącznie w celu pokazania, że najnowsze napiwki powinny znajdować się na liście napiwków zamówienia (chyba że ktoś je usunął w czasie między dodaniem a sprawdzeniem).

Uwaga:

  • Szczegóły dotyczące płatności Silent można znaleźć w artykule External Payment Types.
  • Szczegóły dotyczące płatności, zaliczek i przedpłat znajdują się w artykule Payment Actions.

Usuwanie Napiwków

Do usuwania napiwków z zamówienia używana jest następująca metoda:

IOperationService.DeleteDonation

void DeleteDonation([NotNull] ICredentials credentials, [NotNull] IOrder order, [NotNull] Data.Payments.IPaymentItem paymentItem);
Przykłady
  • Próba usunięcia napiwków z zamówienia.
var order = PluginContext.Operations.GetOrders().Last(o => o.Status == OrderStatus.New || o.Status == OrderStatus.Bill || o.Status == OrderStatus.Closed);
var donationItem = order.Donations.LastOrDefault();
if (donationItem != null)
{
PluginContext.Operations.DeleteDonation(PluginContext.Operations.GetCredentials(), order, donationItem);
}