Швидке переміщення по статті:

Що таке Razor
Моделі та шаблони чеків
Моделі та шаблони звітів
- Доступ до POS-об'єктів Syrve
- Доступ до подій Syrve POS
- Доступ до транзакцій Syrve POS
- Доступ до звітів OLAP сервера
Налаштування та параметри Razor-звітів
Допоміжні функції для чеків і звітів
Скасування друку в шаблоні




Що таке Razor

Razor — це синтаксис розмітки ASP.NET, який дозволяє вбудовувати серверний код (Visual Basic і C#) у веб-сторінки. У Syrve Razor вбудовується в XML-код, який потім надсилається на принтери.

Схема друку Razor-шаблонів: Data → Razor template → View XML (наша розмітка для друку) → Друк. 



Моделі та шаблони чеків

Кожен чек має свою модель даних. Моделі даних постачаються разом з дистрибутивом Syrve. Усі моделі та шаблони чеків зберігаються в папці \Resources\Cheques\RazorTemplates. 

Що є в папці: 

  • TemplateModels.xml — у файлі зберігаються моделі чеків. Моделі чеків включають в себе класи Syrve POS і серверні класи. Тут описані тільки класи Syrve POS.
  • RmsEntityWrappers.xml — у файлі описані серверні класи.
  • файли *.cshtml — шаблони чеків, які можна використовувати.

Розберемо, як налаштувати шаблон чека на прикладі чека для закінчення приготування. 

У файлі TemplateModels.xml є модель CookingCompleteCheque:

<Model Name="CookingCompleteCheque" Comment=“Cooking completion ticket" TemplateRootModel="true" CommentEn="Cooking complete ticket">
    <Include PropertiesGroupId="CommonChequeProperties" />
    <Property Name="CookingPlace" Type="RestaurantSection" Nullness="NotNull" Comment=“Ticket cooking place" CommentEn="Production place ticket" />
    <Property Name="Order" Type="KitchenOrder" Nullness="NotNull" Comment=“Order" CommentEn="Order" />
    <Property Name="Item" Type="KitchenOrderItem" Nullness="NotNull" Comment=“Ticket item" CommentEn="Order item ticket" />
    <Property Name="CompoundItemSecondaryComponent" Type="KitchenOrderProductItem" Nullness="CanBeNull"
              Comment=“Right pizza half, for which the ticket is printed"
CommentEn="Right half of divided pizza for which ticket is printed" />
</Model>


У тезі <Model> є атрибут TemplateRootModel = «true». Він показує, що в елементі <Model> описується модель чека.

У шаблоні чека CookingCompleteCheque.cshtml вкажемо, яку модель використовуємо:

@inherits TemplateBase<ICookingCompleteCheque>


У шаблон можна підключити поля та групи полів чека. У прикладі нижче підключена група полів CommonChequeProperties. Описи полів та груп можна знайти в TemplateModels.xml

include PropertiesGroupId="CommonChequeProperties" />


Властивості Order та Item є об'єктами Syrve POS класів KitchenOrder та KitchenOrderItem, які описані в TemplateModels.xml.

Властивість CookingPlace є об'єктом класу RestaurantSection. Цей тип є серверним, тому його опис можна знайти у файлі RmsEntityWrappers.xml.

<Model Name="RestaurantSection" Comment=“Section">
    <Property Name="Name" Type="string" Nullness="NotNull" Comment=“Section name" />
    <Property Name="PrintProductItemCommentInCheque" Type="bool" Comment=“Whether or not a menu item comment should be printed on the receipt" />
    <Property Name="PrintBarcodeInServiceCheque" Type="bool" Comment="Whether or not a menu item barcode should be printed on the service ticket" />
    <Property Name="DisplayGuests" Type="bool" Comment=“Whether or not guests should be displayed in this section" />
    <Property Name="PrintSummaryServiceCheque" Type="bool" Comment=“Whether a consolidated service ticket (true) or section service ticket (false) should be printed in the section" />
</Model>



Моделі та шаблони звітів

Razor-звіти використовують єдину модель даних. Описи об'єктів і шаблони звітів знаходяться в папці \Resources\Reports\Templates.

Що є в папці:

  • CashServerEntityWrappers.xml — опис об'єктів, які створюються в Syrve POS (замовлення, елемент замовлення тощо). Їх можна використовувати в звітах. 
  • RmsEntityWrappers.xml — опис об'єктів, які створюються на сервері (продукт, користувач, група, відділення тощо).
  • EventWrappers.xml — опис подій Syrve POS. 
  • TransactionWrappers.xml — опис транзакцій Syrve POS.
  • CSHTML-файли — шаблони звітів. 

Модель даних Razor-звітів:

Поле моделі
[NotNull/CanBeNull] ТипДаних НазваПоля
Опис
[NotNull] string NameНазва звіту
[CanBeNull] ICashRegister CashRegisterАктивний принтер чеків
[CanBeNull] ICafeSession CafeSessionПоточна касова зміна
DateTime CurrentTimeПоточна дата і час
[CanBeNull] IUser CurrentUserПоточний користувач
[NotNull] IGroup GroupПоточна група
[NotNull] ICafeSetup CafeSetupНалаштування POS
[NotNull] string CurrentTerminalНазва активного терміналу
bool IsOnlyBodyMarkupRequiredЧи достатньо лише розмітки тіла звіту (версії 4.0+)
bool? IsXReportFinalЧи є X-звіт остаточним для касової зміни (Z-звітом):
  • true — так, X-звіт буде Z-звітом;
  • false — ні, X-звіт не буде остаточним для касової зміни;
  • null — звіт не буде вважатися X-звітом.
[CanBeNull] ISettings ReportSettingsНалаштування/параметри звіту
[NotNull] IEntitiesProvider EntitiesПровайдер, що надає доступ до POS-об'єктів Syrve
[NotNull] IEventsProvider EventsПровайдер, що надає доступ до подій Syrve POS 
[NotNull] ITransactionsProvider TransactionsПровайдер, що надає доступ до транзакцій Syrve POS 
[NotNull] IOlapReportsProvider OlapReportsПровайдер, що надає доступ до серверних звітів OLAP



Доступ до POS-об'єктів Syrve

У моделі звіту поле Entities дозволяє отримати списки різних сутностей Syrve POS (замовлення, операції, типи оплати тощо).

// Get all orders that are not deleted and not linked to the reservations/banquets that never got underway per till shift
IEnumerable<IOrder> GetAllNotDeletedNotBoundToNonStartedReservesOrdersBySession([NotNull] ICafeSession session);
// Get all undeleted sections with tables in the group
IEnumerable<IRestaurantSection> GetAllNotDeletedSectionsWithAnyTablesByGroup([NotNull] IGroup group);
// Get all payment methods
IEnumerable<IPaymentType> GetAllPaymentTypes();
// Get all payment systems
IEnumerable<IPaymentSystem> GetAllPaymentSystems();
// Get all undeleted delivery orders
IEnumerable<IDelivery> GetAllNotDeletedDeliveries();
// Get all problematic operations
IEnumerable<ICommonGroup> GetProblemOperationsEvents(bool allTerminalsEvents, DateTime dateBegin, DateTime dateEnd);


Доступ до подій Syrve POS

У моделі звіту поле Events дає можливість отримати списки різних подій Syrve POS.

// Get all item sales events per till shift
IEnumerable<IItemSaleEvent> GetItemSaleEventsBySession([NotNull] ICafeSession session);
// Get all deposit and withdrawal events per till shift
IEnumerable<IPayInOutEvent> GetPayInOutEventsBySession([NotNull] ICafeSession session);


Доступ до транзакцій Syrve POS

У моделі звіту поле Transactions дає можливість отримати списки різних транзакцій Syrve POS.

// Get all order payment transactions
IEnumerable<IOrderPaymentTransaction> GetOrderPaymentTransactions();
// Get all order payment transactions per till shift
IEnumerable<IOrderPaymentTransaction> GetOrderPaymentTransactionsBySession([NotNull] ICafeSession session);
// Get all fiscal deposit and withdrawal transactions per till shift
IEnumerable<IPayInOutFiscalTransaction> GetPayInOutFiscalTransactionsBySession([NotNull] ICafeSession session);
// Get all order payment transactions from the order closing details
IEnumerable<IOrderPaymentTransaction> GetOrderPaymentTransactionsByOrderCloseInfo([NotNull] IOrderCloseInfo orderCloseInfo);


Доступ до OLAP-звітів сервера

У моделі звіту поле OlapReports дає можливість отримати дані з серверного OLAP-звіту і вбудувати їх. У цього поля доступні методи:

// Run the OLAP report according to settings
IOlapReport BuildReport([NotNull] OlapReportSettings reportSettings);
// Run several OLAP reports according to the list of settings
List<IOlapReport> BuildReports([NotNull] IEnumerable<OlapReportSettings> reportsSettings);



Налаштування та параметри Razor-звітів

Деякі параметри впливають на дані та розмітку звіту. За допомогою поля ReportSettings у моделі можна отримувати доступ до параметрів у Syrve Office та Syrve POS.

Щоб отримати значення параметра, потрібно знати його ім'я та тип даних. Від типу даних (перелік, логічна величина, період, рядок, число) залежить те, як значення буде отримано. 

Як отримати значення:

  • Перерахування
  • var settings = Model.ReportSettings;
    // Get the boolean value by the parameter
    if (settings.GetBool("ShowOneDishPrice"))
        // Show item unit price
  • Логічна величина
  • var settings = Model.ReportSettings;
    // Get the boolean value by the parameter
    if (settings.GetBool("ShowOneDishPrice"))
        // Show item unit price
  • Період
  • var settings = Model.ReportSettings;
    // Get the period start date
    var periodBegin = settings.GetPeriodBegin("ReportInterval");
    // Get the period end date
    var periodEnd = settings.GetPeriodEnd("ReportInterval");
  • Рядок
  • var settings = Model.ReportSettings;
    // Get the string parameter “str”
    var myStr = (string)settings.GetValue("str");
  • Число
  • var settings = Model.ReportSettings;
    // Get the numeric parameter “number” (where Format is a fractional number or amount)
    var myNumber = (decimal)settings.GetValue("number");
    // Get the numeric parameter “number” (where Format is an integer number)
    myNumber = (int)settings.GetValue("number");

Додавання та редагування параметрів користувацького звіту описано в статті Звіти Syrve POS.



Допоміжні функції для чеків і звітів

У чеках і звітах часто використовуються однакові блоки коду: округлення грошових одиниць, форматування дат, ваги, отримання всіх елементів замовлення, суми ПДВ, суми передоплати замовлення тощо. Щоб уникнути помилок і повторень, блоки коду були винесені в окремі методи. Деякі методи можна використовувати тільки для чеків або звітів, а деякі — для того й іншого.

СигнатураОписЗастосування
string FormatAmount(decimal amount)Форматування кількості. Ціле значення виводиться без дробової частини, дробове — з точністю до трьох знаків.Чеки, звіти
string FormatFoodValueItem(decimal foodValueItem)Форматування харчової цінності. Ціле значення виводиться без дробової частини, дробове — з точністю до одного знака.Чеки
string FormatMoney(decimal money)Форматування ціни з дробовою частиною. Без роздільників. Довжина дробової частини залежить від (зазначеної в Syrve Office) валюти.Чеки
string FormatPrice(decimal price)Аналог FormatMoney.Звіти
string FormatAmountAndPrice(decimal amount, decimal price)Форматування кількості та ціни у вигляді АхВ, де А - FormatAmount, В - FormatMoneyMin.Звіти
string FormatMoneyMin(decimal money)Форматування ціни. Ціле значення виводиться без дробової частини, дробове — відповідно до довжини дробової частини поточної (зазначеної в Syrve Office) валюти. Без роздільників.Чеки
string FormatMoneyInWords(decimal money)Перетворює число і повертає його в рядковому (друкованому) вигляді. Вказується також повна назва грошових одиниць у правильному відмінюванні.Чеки
string FormatPercent(decimal value)Форматування процентної величини. Ціле значення виводиться без дробової частини, дробове — з точністю до двох знаків. В кінці додається символ «%».Чеки, звіти
string FormatAveragePercent(decimal percent)Форматування процентної величини з точністю до одного знака. В кінці додається символ «%».Звіти
string FormatAverage(decimal amount)Форматування числа. Ціле значення виводиться без дробової частини, дробове — з точністю до двох знаків.     Звіти
string FormatTime(DateTime time)Форматування часу. Виводяться години і хвилини в 24-годинному форматі (HH:mm).Чеки, звіти
string FormatLongTime(DateTime time)Форматування часу. Виводяться години, хвилини і секунди в 24-годинному форматі (HH:mm:ss).Чеки
string FormatLongDateTime(DateTime dateTime)Форматування дати та часу. Виводиться день, місяць, рік, години та хвилини (dd.MM.yyyy HH:mm)Чеки, звіти
string FormatFullDateTime(DateTime dateTime)Форматування дати та часу. Виводяться день, місяць прописом, години та хвилини (d MMM HH:mm).Чеки
string FormatDate(DateTime dateTime)Форматування дати. Виводяться день, місяць і рік (dd.MM.yyyy).Чеки, звіти
string FormatDateTimeCustom(DateTime dateTime, string format)Користувацьке форматування дати/часу. Формат виконується за маскою, що задається другим аргументом функції.Чеки
string FormatTimeSpan(TimeSpan timeSpan, bool displaySeconds)Форматування величини тимчасового інтервалу. Залежно від значення другого параметра секунди відображаються (true) або ні (false) (HH:mm:ss/HH:mm). Якщо секунди не відображаються, то вони округлюються до хвилини в більшу сторону, якщо >=30, інакше в меншу сторону.Чеки, звіти
decimal CalculatePercent(decimal fullValue, decimal partValue)Обчислює частку partValue по відношенню до fullValue у відсотках з точністю до двох знаків. Якщо fullValue дорівнює нулю, то величина відсотка дорівнює нулю.Чеки
decimal CalculateDiscountPercent(decimal fullSum, decimal discountSum)Аналог CalculatePercentЗвіти
decimal RoundMoney(this decimal value)Округлення грошових сум відповідно до довжини дробової частини поточної валюти.Чеки, звіти
decimal RoundWeight(this decimal value)Округлення ваги до третього знака після коми.Чеки, звіти
decimal GetCost([NotNull] this IChequeTaskSale chequeTaskSale)Отримати суму для позиції чека. Спрощена формула: ціна * кількість = сумаЧеки
decimal GetCost([NotNull] this IOrderEntry orderEntry)Отримати суму для позиції замовлення. Спрощена формула: ціна * кількість = сумаЧеки, звіти
IEnumerable<IOrderEntry> GetAllEntries([NotNull] this IOrder order)Отримати список всіх позицій замовлення.Звіти
IEnumerable<IOrderEntry> ExpandAllEntries([NotNull] this IOrderItem orderItem)Отримати список всіх дочірніх позицій для елемента замовлення. Сам елемент теж включений до колекції.Звіти
IEnumerable<IOrderEntry> GetChildren([NotNull] this IOrderItem orderItem)Отримати список всіх дочірніх позицій для елемента замовлення. Сам елемент не включений до колекції.Звіти
IEnumerable<IOrderEntry> GetIncludedEntries([NotNull] this IOrder order)Отримати список всіх невидалених позицій замовлення.Чеки, звіти
IEnumerable<IOrderEntry> ExpandIncludedEntries([NotNull] this IOrderItem orderItem)Отримати список усіх невіддалених дочірніх позицій для елемента замовлення. Сам елемент також включений до колекції. Якщо сам елемент видалено, то повертається порожня колекція.Чеки, звіти
IEnumerable<IOrderEntry> GetNotDeletedChildren([NotNull] this IOrderItem orderItem)Отримати список усіх невіддалених дочірніх позицій для елемента замовлення. Сам елемент не включений до колекції. Якщо сам елемент видалено, то повертається порожня колекція.Чеки, звіти
decimal GetVatSumExcludedFromPriceForOrderEntry
([NotNull] this IOrderEntry orderEntry, [NotNull] IEnumerable<IDiscountItem> discountItems)
Отримати суму ПДВ, не включеного у вартість, для позиції замовлення. Якщо ПДВ включено у вартість, сума = 0. Потрібно передати в метод список знижок замовлення.Чеки, звіти
decimal GetVatSumIncludedInPriceForOrderEntry
([NotNull] this IOrderEntry orderEntry, [NotNull] IEnumerable<IDiscountItem> discountItems)
Отримати суму ПДВ, включеного у вартість, для позиції замовлення. Якщо ПДВ не включено у вартість, сума = 0. У метод потрібно передати список знижок замовлення.Чеки
decimal GetDiscountSumFor([NotNull] this IDiscountItem discountItem, [NotNull] IOrderEntry orderEntry)Отримати суму знижки для зазначеної знижки та позиції замовлення.Чеки
decimal GetDiscountSum([NotNull] this IDiscountItem discountItem)Отримати суму знижки за всіма не видаленими позиціями замовлення для зазначеної знижки.Чеки, звіти
bool IsDiscount([NotNull] this IDiscountItem discountItem)Зазначена знижка є знижкою (а не надбавкою).Чеки, звіти
decimal GetFullSum([NotNull] this IOrder order)Отримати повну суму замовлення без урахування знижок/надбавок, ПДВ, не включеного у вартість.Чеки, звіти
decimal GetResultSum([NotNull] this IOrder order)Отримати суму замовлення з урахуванням знижок/надбавок, ПДВ, не включеного у вартість.Звіти
decimal GetResultSumWithoutExcludedVat([NotNull] this IOrder order)Отримати суму замовлення з урахуванням знижок/надбавок, без урахування ПДВ, що не включений у вартість.Звіти
decimal GetCategorizedDiscountsSum([NotNull] this IOrder order)Отримати суму категорійних знижок для замовлення.Чеки
decimal GetNonCategorizedDiscountsSum([NotNull] this IOrder order)Отримати суму некатегорійних знижок для замовлення.Чеки
decimal GetVatSumExcludedFromPrice([NotNull] this IOrder order)Отримати суму ПДВ, не включеного у вартість, для замовлення. Якщо ПДВ включено у вартість, сума = 0.Чеки, звіти
decimal GetPrepaySum([NotNull] this IOrder order)Отримати суму всіх передоплат за замовлення.Чеки
decimal GetChangeSum([NotNull] this IOrder order, decimal resultSum)Отримати суму здачі для замовлення. У метод потрібно передати кінцеву суму.Чеки
string GetNameOrEmpty([CanBeNull] this IUser user)Повертає ім'я користувача, якщо user не порожній, в іншому випадку повертає порожній рядок Чеки
string StringView([NotNull] this IAddress address)Повертає рядкове представлення адреси.Чеки
string GetKitchenOrDefaultName([NotNull] this IProduct product)Повертає кухонну назву продукту, якщо вона не порожня, в іншому випадку повертає звичайну назву.Чеки
bool IsAmountIndependentOfParentAmount([NotNull] this IModifierEntry modifier)Чи є кількість зазначеного модифікатора незалежною від кількості страви.Чеки
IEnumerable<HashSet<IProductItem>> GetNotDeletedProductItemsByMix([NotNull] this IGuest guest)Повертає список згрупованих за міксом елементів замовлення (страв). У метод потрібно передати гостя.Чеки
DateTime GetPeriodBegin([NotNull] this ISettings settings, [NotNull] string name = "ReportInterval")Повертає «Початок періоду» параметра типу “Період” для налаштувань звіту. Передаване значення name — це ім'я параметра в беку. За замовчуванням name = «ReportInterval».Звіти
DateTime GetPeriodEnd([NotNull] this ISettings settings, [NotNull] string name = "ReportInterval")Повертає «Кінець періоду» параметра типу “Період” для налаштувань звіту. Передаване значення name — це ім'я параметра в беку. За замовчуванням name = «ReportInterval».Звіти
bool GetBool([NotNull] this ISettings settings, [NotNull] string name)Повертає значення логічної величини параметра типу «Логічна величина (так/ні)». Передаване значення name — це ім'я параметра в беку.Звіти
string GetEnum([NotNull] this ISettings settings, [NotNull] string name)Повертає значення перерахування параметра «Перерахування». Передаване значення name — це ім'я параметра в беку.Звіти
IEnumerable<IUser> GetCounteragents([NotNull] this ISettings settings, [NotNull] string name)Повертає список контрагентів параметра «Контрагенти». Передаване значення name — це ім'я параметра в беку.Звіти, 4.2+



Скасування друку в шаблоні

Друк чека або звіту можна скасувати в шаблоні, викинувши OperationCanceledException з текстом винятку. У print-templates.log запишеться повідомлення Template running was canceled. Message: {0}, де {0} — текст винятку, який можна задати в шаблоні.

@inherits TemplateBase<IBillCheque>
@{
    var order = Model.Order;
    if (order.Number % 2 == 0)
    {
        throw new OperationCanceledException(“Even orders don’t need to be printed");
    }
}


@inherits TemplateBase<IServiceChequeBase>
 
@helper ThrowException(string message)
{
    throw new OperationCanceledException(message);
}
 
<doc bell="" formatter="split">
    @if (Model is IServiceCheque)
    {
        if (Model.Order.Number % 2 == 0)
        {
             @ThrowException(“Do not print kitchen ticket for even orders")
        }
        @Service((IServiceCheque)Model)
    }
    else if (Model is IBanquetServiceCheque)
    {
        @Banquet((IBanquetServiceCheque)Model)
    }
    else if (Model is IDeleteProductsServiceCheque)
    {
        @DeleteProducts((IDeleteProductsServiceCheque)Model)
    }
    else if (Model is IDeleteModifiersServiceCheque)
    {
        @DeleteModifiers((IDeleteModifiersServiceCheque)Model)
    }
    else if (Model is IProductsServeCheque)
    {
        @ProductsServe((IProductsServeCheque)Model)
    }
    else if (Model is IWholeCourseServeCheque)
    {
        @WholeCourseServe((IWholeCourseServeCheque)Model)
    }
    else
    {
        throw new NotSupportedException(string.Format("Invalid model type '{0}'", Model.GetType()));
    }
</doc>