Zero Block
Click "Block Editor" to enter the edit mode. Use layers, shapes and customize adaptability. Everything is in your hands.
Tilda Publishing
create your own block from scratch
Zero Block
Click "Block Editor" to enter the edit mode. Use layers, shapes and customize adaptability. Everything is in your hands.
Tilda Publishing
create your own block from scratch
Базові маніпуляції над шаблонами чеків

ЗМІНА РОЗМІРУ МОДИФІКАТОРІВ І КОМЕНТАРІВ НА СЕРВІСНОМУ ЧЕЦІ

У шаблоні сервісного чеку шукаємо функцію:

@helper ModifiersTable(IProductItem productItem, bool onlyCommonModifiers = false)

У тілі цієї функції, шукаємо цей кусок коду:

 <f1>
        <table>
            <columns>
                <column autowidth="" minwidth="2"/>
                @TableColumns()
            </columns>
            <cells>
              
                @if (commentText != null && (onlyCommonModifiers || productItem.CompoundsInfo == null))
                {
                    <ct />
                    <c>
                        @(Model.CookingPlace == productItem.CookingPlace
                              ? commentText
                              : string.Format(Resources.CookingPlaceTemplate, productItem.CookingPlace.Name, commentText))
                    </c>
                    <ct />
                }
                @Modifiers(modifiers, productItem, onlyCommonModifiers)
                @foreach (var zeroAmountModifier in zeroAmountModifiers)
                {
                    var cookingPlace = zeroAmountModifier.Product.CookWithMainDish ? productItem.CookingPlace : zeroAmountModifier.CookingPlace;
                    <ct />
                    <c>
                        @(Model.CookingPlace == cookingPlace
                              ? zeroAmountModifier.Product.GetKitchenOrDefaultName()
                              : string.Format(Resources.CookingPlaceTemplate, cookingPlace.Name, zeroAmountModifier.Product.GetKitchenOrDefaultName()))
                    </c>
                    <ct>
                        @CalculateModifierAmountString(0, zeroAmountModifier.DefaultAmount, zeroAmountModifier.HideIfDefaultAmount, zeroAmountModifier.AmountIndependentOfParentAmount, showDeltaAmount)
                    </ct>
                }
            </cells>
        </table>
    </f1>
та змінюємо <f1> на <f2> - на початку, та відповідно у кінці.
Є три розміри тексту у всіх шаблонах:
  • <f0> - найменший;
  • <f1> - середній;
  • <f2> - найбільший.

Фото зліва - ДО змін

Фото справа - Після внесення змін

ВИДАЛЕННЯ НАЗВ ЦЕХІВ ІЗ ЗВЕДЕНОГО СЕРВІСНОГО ЧЕКУ

У шаблоні сервісного чеку, шукаємо рядки, які починаються із:

string.Format(Resources.CookingPlaceTemplate, productItem.CookingPlace.Name......)

Текст Resources.CookingPlaceTemplate - буде однаковий, у кожному із рядків.

Текст productItem.CookingPlace.Name - може відрізнятись, але потрібно орієнтуватись на текст "CookingPlace.Name"

Алгоритм дій: щоб легше було знайти ці рядки, скопіюємо шаблон у Блокнот або Notepad++, та за допомогою пошуку, шукаємо "string.Format(Resources.CookingPlaceTemplate".

Після того, як впевнились, що знайшли потрібний рядок разом із "CookingPlace.Name" - видаляємо його. Дані зміни проводимо у всіх рядках, які містять цей текст.

Ось вирізка із коду, як виглядає один із рядків:

<f2>
        <table>
            <columns>
                <column autowidth="" minwidth="2"/>
                @TableColumns()
            </columns>
            <cells>
              
                @if (commentText != null && (onlyCommonModifiers || productItem.CompoundsInfo == null))
                {
                    <ct />
                    <c>
                        @(Model.CookingPlace == productItem.CookingPlace
                              ? commentText
                              : string.Format(Resources.CookingPlaceTemplate, productItem.CookingPlace.Name, commentText))
                    </c>
                    <ct />
                }
                @Modifiers(modifiers, productItem, onlyCommonModifiers)
                @foreach (var zeroAmountModifier in zeroAmountModifiers)
                {
                    var cookingPlace = zeroAmountModifier.Product.CookWithMainDish ? productItem.CookingPlace : zeroAmountModifier.CookingPlace;
                    <ct />
                    <c>
                        @(Model.CookingPlace == cookingPlace
                              ? zeroAmountModifier.Product.GetKitchenOrDefaultName()
                              : string.Format(Resources.CookingPlaceTemplate, cookingPlace.Name, zeroAmountModifier.Product.GetKitchenOrDefaultName()))
                    </c>
                    <ct>
                        @CalculateModifierAmountString(0, zeroAmountModifier.DefaultAmount, zeroAmountModifier.HideIfDefaultAmount, zeroAmountModifier.AmountIndependentOfParentAmount, showDeltaAmount)
                    </ct>
                }
            </cells>
        </table>
    </f2>
Бачимо, що у нас є рядок:

: string.Format(Resources.CookingPlaceTemplate, productItem.CookingPlace.Name, commentText))

та нижче, є ще один рядок:

: string.Format(Resources.CookingPlaceTemplate, cookingPlace.Name, zeroAmountModifier.Product.GetKitchenOrDefaultName()))

Різниця між цими рядками, що у них назва CookingPlace.Name - різна.

Далі потрібно в усіх рядках string.Format видалити текст із дужок - Resources.CookingPlaceTemplate, productItem.CookingPlace.Name та зберегти.


Фото зліва - ДО змін

Фото справа - Після внесення змін

Зміна Шрифту Позиції У Сервісному Чеку

У шаблоні сервісного чеку шукаємо функцію:

@helper ProductTable(IProductItem product)

У тілі цієї функції, шукаємо код:

@helper ProductTable(IProductItem product)
{
    if (product.CompoundsInfo != null && product.CompoundsInfo.IsPrimaryComponent)
    {
        <f1>
            <table>
                <columns>
                    @TableColumns()
                </columns>
                <cells>
                    <ct>@string.Format("{0} {1}", product.CompoundsInfo.ModifierSchemaName, product.ProductSize == null ? string.Empty : product.ProductSize.Name)</ct>
                    <ct>@FormatAmount(product.Amount * 2)</ct>
                </cells>
            </table>
        </f1>
        @ModifiersTable(product, true)
    }
    <f1>
        <table>
            <columns>
                @TableColumns()
            </columns>
            <cells>
                @Product(product)
            </cells>
        </table>
    </f1>
}
та всюди у тегу <f1> замінюємо на <f2>, якщо нам потрібно це поле збільшити.
Є три розміри тексту у всіх шаблонах:
  • <f0> - найменший;
  • <f1> - середній;
  • <f2> - найбільший.

Фото зліва - ДО змін
Фото справа - Після внесення змін

Зробити Відступ Між Рядками На Чеках

За допомогою тегу <np/> можемо у шаблоні чеку зробити інтервал між рядками. У вирізці із шаблону, для прикладу, додамо на початку три теги <np/>, які дадуть нам інтервал

<doc bell="" formatter="split">
<np/>
<np/>
<np/>
    @if (Model is IServiceCheque)
    {
        @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 if (Model is ITableChangeServiceCheque)
    {
        @TableChanged((ITableChangeServiceCheque)Model)
    }
    else if (Model is IProductsMoveServiceCheque)
    {
        @ProductsMove((IProductsMoveServiceCheque)Model)
    }
    else
    {
        throw new NotSupportedException(string.Format("Invalid model type '{0}'", Model.GetType()));
    }
</doc>

Фото зліва - ДО змін

Фото справа - Після змін

Збільшити Текст "Разом До Сплати" І "Суму" На Гостьовому Рахунку

У шаблоні шукаємо функцію @helper Summaries(). У тілі цієї функції, шукаємо код:

  @* -- РАЗОМ ДО СПЛАТИ - BEGIN -- *@

    <c font="f1" colspan="4">
      @(Model.AdditionalServiceChequeInfo == null ? Resources.BillFooterTotal : Resources.AdditionalServiceFooterTotalUpper)
    </c>
    <c font="f1" colspan="4">
      <right>@MyFormatMoney(total)</right>
    </c>
    <linecell />

    @* -- РАЗОМ ДО СПЛАТИ - END -- *@
замість f1, прописуємо f2
Є три розміри тексту у всіх шаблонах:
  • <f0> - найменший;
  • <f1> - середній;
  • <f2> - найбільший.

Фото зліва - ДО змін

Фото справа - Після змін

Вивести на гостьовий рахунок інформацію про контрагентів

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

@СontrAgent()

та розкоментувати його. Щоб закоментувати певну інформацію на чеках, потрібно добавити символи @*----- тут код ----- *@

Ось як виглядає код, коли відображення по контрагентах вимкнено:

@* -- ПО КОНТРАГЕНТАМ - BEGIN (для того щоб включити в чеку опцію "По контрагентам:" потрібно розкоментувати рядок нижче - але до того відповідним чином відредагувати процедуру - @helper @СontrAgent()) -- *@   

   @* @СontrAgent()*@

    @* -- ПО КОНТРАГЕНТАМ - END -- *@ 
Приберемо наші символи @* *@, за допомогою яких ми закоментовуємо наш код. На виході отримаємо код, у якому розкоментували функцію @СontrAgent()
@* -- ПО КОНТРАГЕНТАМ - BEGIN (для того щоб включити в чеку опцію "По контрагентам:" потрібно розкоментувати рядок нижче - але до того відповідним чином відредагувати процедуру - @helper @СontrAgent()) -- *@   

    @СontrAgent()

    @* -- ПО КОНТРАГЕНТАМ - END -- *@ 

Фото зліва - ДО змін

Фото справа - Після змін

Змінити Назву Контрагента На Гостьовому Рахунку

Щоб змінити назву контрагента, потрібно у тілі функції @helper СontrAgent() знайти рядки, які починаються на  IP_OOO_SUMM.Add.

Ось, як виглядає це у коді:

@helper СontrAgent()
{
    @* -- ПО КОНТРАГЕНТАМ - BEGIN (для "Бар" - назва типу місця приготування повинна починатися з символу "_", все інше - "Кухня" ) -- *@

    var order = Model.Order;

    <linecell symbols="." />

    <c colspan="4">По контрагентам:</c>

    var cookingPlaceToSum = new Dictionary<ICookingPlaceType, decimal>();
    decimal ooo =0m;
    decimal ip=0m;

    var IP_OOO_SUMM = new Dictionary<string, decimal>();

    foreach (var productItem in order.Guests.SelectMany(g => g.Items).Where(item => item.DeletionInfo == null).OfType<IProductItem>())
    {
      var productItemSum = productItem.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(productItem)).Sum();
      if (productItem.CookingPlaceType.Name[0]=='_')
      {
        ooo += productItemSum;
      }
      else
      {
        ip += productItemSum;
      }

      foreach (var modifierEntry in productItem.ModifierEntries.Where(entry => entry.DeletionInfo == null))
      {
        var modifierEntrySum = modifierEntry.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(modifierEntry)).Sum();
        if (modifierEntry.CookingPlaceType.Name[0]=='_')
        {
          ooo += modifierEntrySum;
        }
  
       
         
        else
        {
           ip += modifierEntrySum;
        }
      }
    }
    IP_OOO_SUMM.Add("ФОП Петренко П.В :", ip);
    IP_OOO_SUMM.Add("ФОП Іваненко О.Г :", ooo);
  
    foreach (var kvp in IP_OOO_SUMM)
    {
      <c colspan="3" font="f0">
        @kvp.Key
      </c>
      <ct>
        @MyFormatMoney(kvp.Value)
      </ct>
    }
    <linecell symbols="." />
Шукаємо рядки :

IP_OOO_SUMM.Add("ФОП Петренко П.В :", ip);

IP_OOO_SUMM.Add("ФОП Іваненко О.Г :", ooo);

Де, "ФОП Петренко П.В" та "ФОП Іваненко О.Г" - контрагенти.

Щоб змінити назву контрагента на нового, необхідно у цьому рядку знайти потрібного, та вписати нового, наприклад, замість ФОП Петренко П.В - буде новий контрагент - ФОП Шевченко О.О. Код після змін буде виглядати:

@helper СontrAgent()
{
    @* -- ПО КОНТРАГЕНТАМ - BEGIN (для "Бар" - назва типу місця приготування повинна починатися з символу "_", все інше - "Кухня" ) -- *@

    var order = Model.Order;

    <linecell symbols="." />

    <c colspan="4">По контрагентам:</c>

    var cookingPlaceToSum = new Dictionary<ICookingPlaceType, decimal>();
    decimal ooo =0m;
    decimal ip=0m;

    var IP_OOO_SUMM = new Dictionary<string, decimal>();

    foreach (var productItem in order.Guests.SelectMany(g => g.Items).Where(item => item.DeletionInfo == null).OfType<IProductItem>())
    {
      var productItemSum = productItem.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(productItem)).Sum();
      if (productItem.CookingPlaceType.Name[0]=='_')
      {
        ooo += productItemSum;
      }
      else
      {
        ip += productItemSum;
      }

      foreach (var modifierEntry in productItem.ModifierEntries.Where(entry => entry.DeletionInfo == null))
      {
        var modifierEntrySum = modifierEntry.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(modifierEntry)).Sum();
        if (modifierEntry.CookingPlaceType.Name[0]=='_')
        {
          ooo += modifierEntrySum;
        }
  
       
         
        else
        {
           ip += modifierEntrySum;
        }
      }
    }
    IP_OOO_SUMM.Add("ФОП Петренко П.В :", ip);
    IP_OOO_SUMM.Add("ФОП Шевченко О.О :", ooo);
  
    foreach (var kvp in IP_OOO_SUMM)
    {
      <c colspan="3" font="f0">
        @kvp.Key
      </c>
      <ct>
        @MyFormatMoney(kvp.Value)
      </ct>
    }
    <linecell symbols="." />

Фото зліва - ДО змін

Фото справа - Після змін

Добавити +1 контрагента на гостьовому рахунку

Щоб добавити нового контрагента до поточних, у тілі функції @helper СontrAgent() маємо знайти змінні:

decimal ooo =0m;

decimal ip=0m;

Це наші зміни, у які ми записуємо вивід сум по контрагентах.

Вигляд коду до змін:

@helper СontrAgent()
{
    

    var order = Model.Order;

    <linecell symbols="." />

    <c colspan="4">По контрагентам:</c>

    var cookingPlaceToSum = new Dictionary<ICookingPlaceType, decimal>();
    decimal ooo =0m;
    decimal ip=0m;

    var IP_OOO_SUMM = new Dictionary<string, decimal>();

    foreach (var productItem in order.Guests.SelectMany(g => g.Items).Where(item => item.DeletionInfo == null).OfType<IProductItem>())
    {
      var productItemSum = productItem.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(productItem)).Sum();
      if (productItem.CookingPlaceType.Name[0]=='_')
      {
        ooo += productItemSum;
      }
      else
      {
        ip += productItemSum;
      }

      foreach (var modifierEntry in productItem.ModifierEntries.Where(entry => entry.DeletionInfo == null))
      {
        var modifierEntrySum = modifierEntry.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(modifierEntry)).Sum();
        if (modifierEntry.CookingPlaceType.Name[0]=='_')
        {
          ooo += modifierEntrySum;
        }
         
        else
        {
           ip += modifierEntrySum;
        }
      }
    }
    IP_OOO_SUMM.Add("ФОП Петренко П.В :", ip);
    IP_OOO_SUMM.Add("ФОП Шевченко О.О :", ooo);
   
	
    foreach (var kvp in IP_OOO_SUMM)
    {
      <c colspan="3" font="f0">
        @kvp.Key
      </c>
      <ct>
        @MyFormatMoney(kvp.Value)
      </ct>
    }
    <linecell symbols="." />
Щоб добавити 3-ог контрагента, потрібно добавити зміну decimal op=0m;
decimal – тип самої зміни
op – назва зміни
0m – значення змінної , за замовчуванням нуль.

Після того, як добавили нову зміну, нижче у коді маємо добавити новий блок перевірки:
else if (productItem.CookingPlaceType.Name[0]=='+')
      {
        op += productItemSum;
      }
там, де «+», може стояти, будь-який інший символ, який ми задаємо на початок назви Типу місця приготування.
Далі добавляємо блок перевірки до модифікаторів:
else if (modifierEntry.CookingPlaceType.Name[0]=='+')
        {
          op += modifierEntrySum;
        }
У рядку, де виводяться наші контрагента - повинні добавити вивід нового контрагента за допомогою рядка:

IP_OOO_SUMM.Add("ФОП Василенко Н.П :", op);

Вигляд коду, після внесення змін:

@helper СontrAgent()
{
  
    var order = Model.Order;

    <linecell symbols="." />

    <c colspan="4">По контрагентам:</c>

    var cookingPlaceToSum = new Dictionary<ICookingPlaceType, decimal>();
    decimal ooo =0m;
    decimal ip=0m;
    decimal op=0m;

    var IP_OOO_SUMM = new Dictionary<string, decimal>();

    foreach (var productItem in order.Guests.SelectMany(g => g.Items).Where(item => item.DeletionInfo == null).OfType<IProductItem>())
    {
      var productItemSum = productItem.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(productItem)).Sum();
      if (productItem.CookingPlaceType.Name[0]=='_')
      {
        ooo += productItemSum;
      }
      else if (productItem.CookingPlaceType.Name[0]=='+')
      {
        op += productItemSum;
      }
      else
      {
        ip += productItemSum;
      }

      foreach (var modifierEntry in productItem.ModifierEntries.Where(entry => entry.DeletionInfo == null))
      {
        var modifierEntrySum = modifierEntry.GetCost() - order.DiscountItems.Select(di => di.GetDiscountSumFor(modifierEntry)).Sum();
        if (modifierEntry.CookingPlaceType.Name[0]=='_')
        {
          ooo += modifierEntrySum;
        }
          else if (modifierEntry.CookingPlaceType.Name[0]=='+')
        {
          op += modifierEntrySum;
        }
        else
        {
           ip += modifierEntrySum;
        }
      }
    }
    IP_OOO_SUMM.Add("ФОП Петренко П.В :", ip);
    IP_OOO_SUMM.Add("ФОП Шевченко О.О :", ooo);
    IP_OOO_SUMM.Add("ФОП Василенко Н.П :", op);
	
    foreach (var kvp in IP_OOO_SUMM)
    {
      <c colspan="3" font="f0">
        @kvp.Key
      </c>
      <ct>
        @MyFormatMoney(kvp.Value)
      </ct>
    }
    <linecell symbols="." />

}

Фото зліва - ДО змін

Фото справа - Після змін

Прибрати вивід певної інформації на гостьовому рахунку

Для цього потрібно пройтись по шаблону та проаналізувати, який блок, за що відповідає, тут допоможе мінімальне знання англійської, тому що, потрібно перекласти.
Для прикладу, приберемо на гостьовому рахунку рядок, коли було відкрите замовлення.
У тілі функції @helper Header() шукаємо тег, який починається з <pair fit="right", який потрібно перетворити у тег left або right або center , у залежності, де потрібно , щоб було відображення.
<pair fit="right"left="@string.Format(Resources.BillHeaderOrderOpenPattern, FormatLongDateTime(order.OpenTime))"
right="@string.Format(Resources.BillHeaderTablePattern, order.Table.Number)"/>
Червоним позначено сам тег pair, оранжевим - те, що відображено зліва на шаблоні, зеленим - те, що відображено справа на шаблоні.
У результаті, ми прибрали відображення, коли було відкрите замовлення, а залишили тільки номер столу по центрі, за допомогою зміни коду у нас вийшов такий рядок:

<center>@string.Format(Resources.BillHeaderTablePattern, order.Table.Number)</center>

Фото зліва - ДО змін

Фото справа - Після змін