Що таке Razor
Моделі та шаблони чеків
Моделі та шаблони звітів
- Доступ до POS-об'єктів Syrve
- Доступ до подій Syrve POS
- Доступ до транзакцій Syrve POS
- Доступ до звітів OLAP сервера
Налаштування та параметри Razor-звітів
Допоміжні функції для чеків і звітів
Скасування друку в шаблоні
Razor — це синтаксис розмітки ASP.NET, який дозволяє вбудовувати серверний код (Visual Basic і C#) у веб-сторінки. У Syrve Razor вбудовується в XML-код, який потім надсилається на принтери.
Схема друку Razor-шаблонів: Data → Razor template → View XML (наша розмітка для друку) → Друк.
Кожен чек має свою модель даних. Моделі даних постачаються разом з дистрибутивом Syrve. Усі моделі та шаблони чеків зберігаються в папці \Resources\Cheques\RazorTemplates.
Що є в папці:
Розберемо, як налаштувати шаблон чека на прикладі чека для закінчення приготування.
У файлі 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.
Що є в папці:
Модель даних 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-звітом):
|
| [CanBeNull] ISettings ReportSettings | Налаштування/параметри звіту |
| [NotNull] IEntitiesProvider Entities | Провайдер, що надає доступ до POS-об'єктів Syrve |
| [NotNull] IEventsProvider Events | Провайдер, що надає доступ до подій Syrve POS |
| [NotNull] ITransactionsProvider Transactions | Провайдер, що надає доступ до транзакцій Syrve POS |
| [NotNull] IOlapReportsProvider OlapReports | Провайдер, що надає доступ до серверних звітів OLAP |
У моделі звіту поле 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);
У моделі звіту поле 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);
У моделі звіту поле 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);
У моделі звіту поле 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);
Деякі параметри впливають на дані та розмітку звіту. За допомогою поля ReportSettings у моделі можна отримувати доступ до параметрів у Syrve Office та Syrve POS.
Щоб отримати значення параметра, потрібно знати його ім'я та тип даних. Від типу даних (перелік, логічна величина, період, рядок, число) залежить те, як значення буде отримано.
Як отримати значення:
var settings = Model.ReportSettings;
// Get the boolean value by the parameter
if (settings.GetBool("ShowOneDishPrice"))
// Show item unit pricevar settings = Model.ReportSettings;
// Get the boolean value by the parameter
if (settings.GetBool("ShowOneDishPrice"))
// Show item unit pricevar 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>