Кассовая политика.

Кассовая политика представляет собой класс, реализующий интерфейс ICashDeskCustom (описан в библиотеке CashDeskSysy.dll) при помощи которого можно изменить поведение кассы в ряде предопределенных случаев.

Для того, чтобы кассовая политика использовалась кассой, имя этой политики должно быть указано в соответствующей настройке профиля кассы. Пустое значение вышеупомянутой настройки возвращает кассу к стандартному поведению.

Следует помнить, что кассовая политика является не функционалом или настройкой, а набором достаточно гибких инструментов и возможностей придать кассе требуемое пользователем поведение, зачастую за счет отказа от некоторой универсальности. Разработка кассовой политики представляет собой творческий процесс, требующий от разработчика достаточной квалификации.

Главным преимуществом изменения поведения кассы (если таковое действительно требуется) является возможность сделать это не потеряв совместимости с официальной версией (с большей вероятностью), сохранив возможность получать и применять официальные обновления (обязательно проверяя предварительно совместимость своей кассовой политики с ними на стенде).

Никаких ограничений на имя файла библиотеки кассовой политики не накладывается. Для того, чтобы касса могла обнаружить и использовать пользовательскую кассовую политику, библиотека с ней (и все требуемые для работы кассовой политики библиотеки, если таковые есть) должна находиться в том же каталоге и на том же уровне вложенности что и CashDesk.exe.

Описание интерфейса ICashDeskCustom и его возможностей.

Интерфейс ICashDeskCustom достаточно прост:

public interface ICashDeskCustom
{
string Name { get; }

bool Execute(CashDeskCustomAction action, out object result);
bool Execute(CashDeskCustomAction action, object param, out object result);
bool Execute(CashDeskCustomAction action, object param1, object param2, out object result);
void Init();
}

Name – возвращает имя кассовой политики, то которое требуется указать в профиле кассы; рекомендуется задавать это имя совпадающее с именем библиотеки без расширения (если библиотека называется «CashDeskCustom.dll» то политика называется «CashDeskCustom»).

Init – метод, который вызывается сразу после создания объекта.

Execute – собственно рабочий метод кассовой политики, вызываемый каждый раз, когда касса может переопределить свое поведение.

Каждый раз, когда касса позволяет переопределить свое поведение при помощи кассовой политики, она вызывает один из вариантов метода Execute. Непосредственно переопределяемое действие указывается при помощи перечисления CashDeskCustomAction. При этом в качестве параметров «param», «param1» и «param2» может передаваться дополнительная информация, зависящая от конкретного значения CashDeskCustomAction, а результат переопределения (так же зависит от CashDeskCustomAction) возвращается в параметре «result». Если переопределение поведения произошло, то метод Execute должен вернуть «true», в противном случае значение result будет проигнорировано, а поведение кассы для данной ситуации останется стандартным.

Описание переопределяемых действий.

IsNoFiscalArticle – позволяет переопределить признак того, что товар не попадает в фискальный чек. Параметры:

Имя параметраТип значенияОписание
parametr1ReceiptТекущий чек
parametr2Receipt.ReceiptItemТоварная позиция, для которой запрашивается признак
resultbool«True» – не попадает в фискальный чек

GetFirmIDForReceiptItemSales – позволяет переопределить значение идентификатора фирмы для конкретной товарной позиции (часто используется в качестве альтернативного признака того, что позиция не попала в фискальный чек). Параметры:

Имя параметраТип значенияОписание
parametr1ReceiptТекущий чек
parametr2Receipt.ReceiptItemТоварная позиция, для которой запрашивается идентификатор
resultint?Идентификатор фирмы, назначаемый текущей позиции

PaymentModeEnter – позволяет запретить переход в окно оплаты. Параметры:

Имя параметраТип значенияОписание
parametrReceiptТекущий чек
resultstringСообщение, выдаваемое при запрете перехода в окно оплаты, если переход разрешен – передается пустая строка.

CloseWorkDayCheck – позволяет запретить закрывать рабочий день. Параметры:

Имя параметраТип значенияОписание
parametrISessionСеанс текущего пользователя кассы
resultstringСообщение, выводимое при закрытии рабочего дня, если закрытие разрешено – передается пустая строка

CashierPrinterMenuExtButtonName, CashierPrinterMenuExtButtonImage, CashierPrinterMenuExtButtonAction – позволяют создать пользовательскую кнопку в меню кассы: Кассир->Отчетыи ФР->Принтер, при этом CashierPrinterMenuExtButtonName определяет наименование этой кнопки, CashierPrinterMenuExtButtonImage определяет картинку, размещаемую на кнопке, а CashierPrinterMenuExtButtonAction – выполняемое кнопкой действие (команда принтеру, вызов формы с дополнительными кнопками и т.д.)

Параметры CashierPrinterMenuExtButtonName:

Имя параметраТип значенияОписание
resultstringНазвание пользовательской кнопки

Параметры CashierPrinterMenuExtButtonImage:

Имя параметраТип значенияОписание
resultbyte[]Картинка, которая будет отображаться на кнопке

Параметры CashierPrinterMenuExtButtonAction:

Имя параметраТип значенияОписание
resultobjectЛюбой объект, может быть «null»

InitExtendedServices – вызывается при старте кассы и позволяет проинициализировать другие пользовательские расширения, которые должны быть проинициализированы. Параметры:

Имя параметраТип значенияОписание
parametrISessionСеанс текущего пользователя кассы
resultobjectЛюбой объект, может быть «null»

OrderNumberForPrint – позволяет переопределить номер заказа печатаемый на встречке и счете клиента. Параметры:

Имя параметраТип значенияОписание
parametrRestaurantReceiptТекущий чек (заказ) кассы ресторана
resultstringЗначение, которое будет напечатано как номер заказа

HasSetRefundReceiptCountPermission – позволяет запретить изменение количества для позиции чека возврата. Параметры:

Имя параметраТип значенияОписание
parametr1ReceiptТекущий чек
parametr2Receipt. OfflineReceiptItemТоварная позиция, для которой запрашивается разрешение
resultbool«True» – можно изменить количество

RefundReceiptChoosed – позволяет запретить формирование чека возврата, выдав соответствующее сообщение об ошибке. Параметры:

Имя параметраТип значенияОписание
parametr1ISessionСеанс текущего пользователя кассы
parametr2ReceiptЧек возврата
resultstringСообщение, выводимое при попытке создать чек возврата в качестве ошибки, если пустая строка – чек возврата будет создан.

ReceiptPrinted – вызывается непосредственно перед сохранением чека в БД (после успешной печати чека на всех принтерах). Параметры:

Имя параметраТип значенияОписание
parametrReceiptТекущий чек
resultobjectЛюбой объект, может быть «null»

CreateController – позволяет переопределить один или несколько контроллеров форм, доступных в перечислении CashDeskCustomControllerType, что в свою очередь позволит изменить поведение соответствующей формы. Параметры:

Имя параметраТип значенияОписание
parametr1CashDeskCustomControllerTypeЭлемент перечисления контроллеров, которые могут быть переопределены
parametr2object[]Массив объектов, необходимых для создания соответствующего контроллера
resultISlotItemControllerЭкземпляр альтернативного контроллера

Доступные значения CashDeskCustomControllerType:

Значение перечисленияЗначение «parametr2»
ReceiptPayment{ ISession, Receipt, IReceiptController }

GetPresenterAssemblies – позволяет дополнить список библиотек, в которых будет выполняться поиск презенторов, что позволяет использовать пользовательские презентеры, если требуется в тех или иных обстоятельствах отображать пользовательские формы (в т.ч. при переопределении контроллеров форм). Параметры:

Имя параметраТип значенияОписание
resultAssembly[]Список библиотек, где следует искать пользовательские презентеры.

OpenCashBoxForPaymentType – позволяет переопределить необходимость открывать денежный ящик для того или иного типа оплаты. Параметры:

Имя параметраТип значенияОписание
parametr1ReceiptТекущий чек
parametr2PaymentDataДанные оплаты
resultbool«True» – открывать денежный ящик

CreateSecondaryReceiptTemplate, CreateTotalSecondaryReceiptTemplate – позволяет переопределить процесс формирования на основании шаблона соответственно нефискального чека и общего нефискального чека (актуален при работе по нескольким фирмам). Параметры:

Имя параметраТип значенияОписание
parametr1IReceiptPrintТекущий чек для печати (можно преобразовать к Receipt)
parametr2PrintTemplateШаблон печати
resultIPrintTemplateFactoryКак правило экземпляр класса PrintTemplateFactory

Формирование шаблона заключается в заполнении ReceiptTemplate.ExpressionDS значениями тэгов шаблона, содержащимися в перечислении ServiceItem, для чего предусмотрен специальный ментод ExpressionDS .SetStaticData(ServiceItem, string). При заполнении стандартной фактуры необходимо заполнить лист ExpressionDS .ReceiptItemsGroups экземплярами класса ReceiptItemsGroup (каждый экземпляр – отдельная группа товаров в чеке, в простейшем случае – достаточно одной группы с названием в виде пустой строки). Каждый товар в группе представляет собой экземпляр класса ReceiptGoodItem. Заполнение «универсальной» фактуры необходимо заполнить лист ExpressionDS .BodyStringLines экземплярами класса StringLine, каждый из которых содержит произвольную строку.

GetPrintReceiptInfoForPrimary, GetPrintReceiptInfoForSecondary – позволяет полностью переопределить информацию для печати соответственно на основном и дополнительном чеке (в плоть до предотвращения печати). Параметры:

Имя параметраТип значенияОписание
parametrIReceiptPrintТекущий чек для печати (можно преобразовать к Receipt)
resultPrintReceiptInfoСпециальный класс, содержащий информацию для печати

Класс PrintReceiptInfo имеет следующий вид:

public class PrintReceiptInfo
{
public bool IsNeedPrint { get; set; }
public Receipt.ReceiptItem[] ReceiptItems { get; set; }
public Receipt.OfflineReceiptItem[] RefundReceiptItems { get; set; }
public NoFiscalPosition[] NoFiscalPosition { get; set; }
public Money ReceiptDiscountSum { get; set; }
public string[] BottomReceiptComment { get; set; }
public Money ReceiptSum { get; set; }
public PrinterPayment PrinterPayment { get; set; }
}

Здесь:

— IsNeedPrint – флаг, разрешающий / запрещающий печать чека;

— ReceiptItems – позиции чека продажи (для чека возврата эти данные не используются);

— RefundReceiptItems – позиции чека возврата (для чека продажи эти данные не используются);

— NoFiscalPosition – позиции, которые не попадут в фискальный (основной чек);

— ReceiptDiscountSum – сумма скидки, приходящаяся именно на весь чек (без учета скидок на позиции);

— BottomReceiptComment – произвольные строки, печатаемые между фактурой и оплатой чека;

— ReceiptSum – сумма чека с учетом всех скидок;

— PrinterPayment – оплаты чека (может быть несколько, сумма оплат может быть больше суммы чека, что приведет к печати на чеке информации о сдаче).

Все требуемая для PrintReceiptInfo информация содержится в IReceiptPrint но при этом может быть переопределена разработчиком.

ConvertBonusSumToString — позволяет переопределить значение суммы начисленных бонусов (используется при отображении бонусов в виде балов). Следует помнить, что переопределенное значение никак не влияет на сумму начисленных бонусов, только на форму отображения этой суммы в чеке. Параметры:

Имя параметраТип значенияОписание
parametrMoneyСобственно сумма в валюте кассы
resultstringЧасть строки, которая будет напечатана на чеке вместо суммы начисленных бонусов.

AfterSetRefundReceiptCount – позволяет переопределить установленное количество в позиции чека возврата (например ограничивая максимальное количество). Параметры:

Имя параметраТип значенияОписание
parametr1ReceiptТекущий чек
parametr2Receipt. OfflineReceiptItemТоварная позиция, для которой изменяется количество
resultQuantityКоличество, которое требуется установить

Изначально установленное количество можно получить из свойства SelectedCount товарной позиции (parametr2).

GetCustomItemProperty – позволяет сформировать произвольное свойство товарной позиции (CustomItemProperty), используется в т.ч. для отображения в фактуре чека некой дополнительной информации. Параметры:

Имя параметраТип значенияОписание
parametr1ReceiptТекущий чек
parametr2Receipt.ReceiptItemТоварная позиция, для которой формируется значение свойства CustomItemProperty
resultobjectПроизвольный класс, содержащий требуемую информацию.

BankTeminalAfterCardCodeInput – вызывается драйвером «OpenStrre ПЦ» после получения номера карты. Вызов предназначен для реализации подтверждения оплаты через этот драйвер с использованием SMS, электронной почты и т.д. Параметры:

Имя параметраТип значенияОписание
parametrExtActionCustomInfoЭкземпляр класса содержащего информацию о примененной карте клиента и данные о предстоящей оплате
resultobjectЛюбой объект, может быть «null»

CheckClientForm – вызывается при проверке анкеты клиента перед ее сохранением в БД, позволяет дополнить выполняемую проверку новыми условиями. Параметры:

Имя параметраТип значенияОписание
parametrClientFormInfoЭкземпляр класса содержащего информацию о сохраняемой анкете.
resultstringТекст сообщения о ошибке обнаруженной при проверке анкеты, если пустая строка – анкета коректна

UseCustomButtonForPayment, CustomButtonForPaymentText, CustomButtonForPaymentImage, CustomButtonForPaymentAction – признак, разрешающий использовать пользовательскую кнопку в окне оплаты, название этой кнопки, картинка, размещаемая на кнопке и действие этой кнопки соответсвенно.

Параметры UseCustomButtonForPayment:

Имя параметраТип значенияОписание
resultbool«True» — кнопка доступна к использованию

Параметры CustomButtonForPaymentText:

Имя параметраТип значенияОписание
resultstringНазвание, отображаемое на кнопке

Параметры CustomButtonForPaymentImage:

Имя параметраТип значенияОписание
resultbyte[]Отображаемая на кнопке картинка

Параметры CustomButtonForPaymentAction:

Имя параметраТип значенияОписание
paramtrobject[]  

{

ISession,

Receipt,

Action<ISlotItemController>,

Money,

Money

}

ISession – сессия текущего пользователя кассы; текущий чек; Action<ISlotItemController> — делегат, позволяющий встроить показываемый контроллер в слот; сумма сдачи; сумма оплаты
resultobjectЛюбой объект, может быть «null»

CheckArticle – позволяет предотвратить добавление товара в чек. Параметры:

Имя параметраТип значенияОписание
parametr1ReceiptТекущий чек
parametr2ArticleДобавляемый в чек товар
resultstringТекст ошибки отображаемой при добавлении товара, если пустая строка – товар будет добавлен успешно

CreateReceitSlotFloatWindowController – позволяет создать в слоте плавающую суб-форму, предназначенную для отображения дополнительной информации поверх элементов слота (например таймер, сообщение и т.д.).

Имя параметраТип значенияОписание
parametr1ISessionСессия текущего пользователя кассы
parametr2ReceiptControllerДобавляемый в чек товар
resultIReceiptFloatWindowControllerЭкземпляр контроллера, реализующий соответсвующий интерфейс.

Для корректной работы формы контроллера требуется добавить библиотеку содержащую его презентер при помощи действия GetPresenterAssemblies.

Классы, используемые в качестве параметров.

КлассБиблиотекаПространство имен
QuantityGlobals.dllPhoenix.Globals.Units
MoneyGlobals.dllPhoenix.Globals.Units
ICashDeskCustomCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
ReceiptCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
Receipt.ReceiptItemCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
Receipt. OfflineReceiptItemCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
RestaurantReceiptCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
IReceiptPrintCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
PrintReceiptInfoCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
PaymentDataCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
ArticleCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
CashDeskCustomControllerTypeCashDeskSys.dllPhoenix.OS.CashDesk.CashDeskSys.Domain
ISessionCommonUnits.dllPhoenix.OS.CommonUnits.SessionManagement
ReceiptControllerCashDeskControllers.dllPhoenix.OS.CashDesk.Controllers.ReceiptManagement
IReceiptFloatWindowControllerCashDeskControllers.dllPhoenix.OS.CashDesk.Controllers.ReceiptManagement
ISlotItemControllerCashDeskControllers.dllPhoenix.OS.CashDesk.Controllers.ReceiptManagement
ClientFormInfoCashDeskControllers.dllPhoenix.OS.CashDesk.Controllers.ClientManagement
ExtActionCustomInfoDriverGlobals.dllPhoenix.Devices.BankTerminals