Niestandardowe funkcje kasy fiskalnej
Wprowadzenie
Możesz dodać dowolne operacje do listy poleceń kasy fiskalnej. Może to być konieczne na przykład, jeśli potrzebujesz, aby niektóre operacje były wykonywane przed lub po wydruku paragonów. Można to schematycznie przedstawić w następujący sposób:

Jeśli wtyczka musi przejąć kontrolę podczas drukowania paragonu płatności lub zwrotu albo podczas wpłat, wypłat oraz drukowania raportów X i Z, wystarczy zaimplementować interfejs IChequeTaskProcessor i zarejestrować go, wywołując metodę API RegisterChequeTaskProcessor():
var chequeTaskProcessor = new ChequeTaskProcessor()
PluginContext.Operations.RegisterChequeTaskProcessor(chequeTaskProcessor);
Wszystkie polecenia interfejsu IChequeTaskProcessor mogą przerwać główną operację: fiskalizację paragonu, wpłatę, wypłatę, drukowanie raportów X i Z. W tym celu należy wyrzucić dowolny typ wyjątku w ciele polecenia. Na przykład dodajemy warunek zabraniający wirtualnym drukarkom paragonów (FCR) zamykania zamówień:
public BeforeDoCheckActionResult BeforeDoCheckAction(ChequeTask chequeTask, ICashRegisterInfo device, CashRegisterChequeExtensions chequeExtensions, IViewManager viewManager)
{
// Przykład: pozwól na drukowanie paragonów płatności i przedpłat tylko na urządzeniach fizycznych.
if (device.IsVirtual)
throw new Exception("Kasa fiskalna jest wirtualna. Proszę zamknąć zamówienie na rzeczywistym urządzeniu.");
PluginContext.Log.InfoFormat("Przed drukowaniem paragonu: {0} ({1})", device.FriendlyName, device.Id);
...
}
Gdy zamówienie jest opłacone na wirtualnym FCR, Syrve POS wyświetli komunikat o błędzie, a zamówienie pozostanie otwarte:

Przykład implementacji i rejestracji IChequeTaskProcessor znajdziesz w SDK SamplePlugin.
Interfejs IChequeTaskProcessor
Przyjrzyjmy się bliżej poleceniom IChequeTaskProcessor.
1. BeforeDoCheckAction
BeforeDoCheckAction() – polecenie wykonywane przed fiskalizacją paragonu. Może to być zamknięcie zamówienia, zwrot, drukowanie rachunku gościa, anulowanie rachunku gościa oraz zwrot produktu. Głównym celem jest sprawdzenie dostępności operacji oraz dodanie dodatkowych szczegółów do paragonu.
Jak dodać dodatkowe szczegóły do paragonu?
Można to zrobić na dwa sposoby:
- Dodając szablon paragonu w „Syrve Office” > „Administracja” > „Szablony paragonów” > „Dodaj” > „Typ: Dodatek do paragonu fiskalnego”. Szablon zostanie dodany na dole paragonu
chequeTask.TextAfterCheque. To nie jest niestandardowa funkcja FCR, więc nie trzeba rejestrowaćIChequeTaskProcessor.

- Wtyczka może dodać swoje wartości do
chequeTask.TextBeforeCheque,chequeTask.TextAfterChequeoraz zmienić nazwę kasjerachequeTask.cashierName. Dane te zostaną przesłane do FCR do wydruku. W tym celu należy wypełnić odpowiednie pola w zwracanej wartościBeforeDoCheckActionResult. Jeśli pola nie mają być edytowane, zwróćnull.
public BeforeDoCheckActionResult BeforeDoCheckAction(ChequeTask chequeTask, ICashRegisterInfo device, CashRegisterChequeExtensions chequeExtensions, IViewManager viewManager)
{
var beforeCheque = new List<Data.Print.Document>();
var documentBefore = new Data.Print.Document();
documentBefore.Markup.Add(new XElement(Tags.LargeFont, "Witamy"));
documentBefore.Markup.Add(new XElement(Tags.SmallFont, "tel. 555-123456"));
beforeCheque.Add(documentBefore);
var afterCheque = new List<Data.Print.Document>();
var documentAfter = new Data.Print.Document();
documentBefore.Markup.Add(new XElement(Tags.SmallFont, "Dziękujemy za zakupy"));
documentBefore.Markup.Add(new XElement(Tags.QRCode, "en.syrve.help"));
beforeCheque.Add(documentAfter);
return new BeforeDoCheckActionResult
{
BeforeCheque = beforeCheque,
AfterCheque = afterCheque,
CashierName = "NazwaKasjera"
};
}
Argumenty funkcji BeforeDoCheckAction():
chequeTask— szczegóły zamówienia. Wszystkie informacje o pozycjach zamówienia, rabatach/dopłatach, płatnościach itd. (sprawdź artykuł Zewnętrzne kasy fiskalne).device— informacje o kasie fiskalnej użytej do zamknięcia zamówienia.chequeExtensions— dodatkowe informacje do paragonu. Przechowuje markup do dodania na górę lub dół paragonu (chequeExtensions.BeforeCheque,chequeExtensions.AfterCheque). Przechowuje również identyfikatorchequeExtensions.PastOrderIdoraz numerchequeExtensions.PastOrderNumberzamówienia zamkniętego w poprzedniej zmianie kasy. Pola te są wypełniane podczas zwrotów zamówień z poprzedniej zmiany.viewManager— menedżer okien. Umożliwia wyświetlanie gotowych dialogów Syrve POS (sprawdź artykuł Dialogi).
2. AfterDoCheckAction
AfterDoCheckAction() – polecenie wykonywane po operacji fiskalizacji paragonu. Głównym celem jest wykonanie końcowej akcji po wydruku paragonu. Na przykład, aby umieścić w kolejce operację eksportu do systemu zewnętrznego. Argument result opisuje wynik operacji FCR.
result.Success = true — operacja zakończona sukcesem, w przeciwnym razie nie.
Jeśli operacja nie powiodła się result.Success = false, opis błędu zostanie podany w result.Message.
3. BeforeXReport
BeforeXReport() — polecenie wykonywane przed wydrukowaniem raportu X. Przekazywane są następujące parametry: rejestr fiskalny wykonujący operację, IViewManager do wyświetlania komunikatów lub wprowadzania danych oraz użytkownik authUser, który zainicjował drukowanie raportu X.
4. AfterXReport
AfterXReport() — polecenie wykonywane po wydrukowaniu raportu X. Argumenty są podobne do polecenia AfterDoCheckAction.
5. BeforeZReport
BeforeZReport — polecenie wykonywane przed wydrukowaniem raportu Z. Parametry przekazują następujące dane: FCR, użytkownika oraz menedżera okien IViewManager.
6. AfterPayIn
AfterPayIn — polecenie wykonywane po wpłacie pieniędzy do kasy fiskalnej. Funkcja otrzymuje następujące dane: FCR, odpowiedź FCR podczas operacji wpłaty, menedżera okien IViewManager oraz kwotę wpłaconą do kasy fiskalnej.
7. AfterPayOut
AfterPayOut — polecenie wykonywane po wypłacie pieniędzy z kasy fiskalnej. Funkcja otrzymuje następujące dane: FCR, odpowiedź FCR podczas operacji wypłaty, menedżera okien IViewManager oraz kwotę wypłaconą z kasy fiskalnej.
Dodatkowe interfejsy IReadonlyChequeTaskProcessor oraz IEditableChequeTaskProcessor
Obok opisanego powyżej interfejsu IChequeTaskProcessor istnieją także rozszerzające interfejsy IReadonlyChequeTaskProcessor oraz IEditableChequeTaskProcessor, które pozwalają na wykonanie określonych zadań przed wpłatą i wypłatą.
Są one rejestrowane w taki sam sposób jak interfejs nadrzędny. Różnica między nimi polega jedynie na tym, że przy użyciu interfejsu IReadonlyChequeTaskProcessor wtyczka podczas wypłaty nie może edytować kwoty wypłaty, natomiast interfejs IEditableChequeTaskProcessor — może to zrobić za pomocą parametru ref estimatedSum. Zaimplementowano to, aby umożliwić wtyczce kontrolę kwot wypłat na koniec dnia.