IPB

Здравствуйте, гость ( Вход | Регистрация )

> Frontol 4: прекращение поддержки. Восстановление лицензий

С 1 июля 2017 прекращена поддержка программного продукта Frontol 4
С 9 ноября 2019 прекращена поддержка программного продукта Frontol 5
пруф

С 3 августа 2017 восстановление лицензий производится ТОЛЬКО через СервисДеск
Просьба обращаться к партнерам компании для оформления заявок в СД

5 страниц V   1 2 3 > »   
Добавить ответ в эту темуОткрыть тему
Примеры создания сценариев с помощью языка Java Script
АТОЛ: Герман Бой...
сообщение 18.6.2007, 14:44
Сообщение #1


ГК «АТОЛ»
********

Группа: Главные администраторы
Сообщений: 4 002
Регистрация: 15.12.2004
Из: Москва
Пользователь №: 3



Пример №1. Использование параметра E (идентификатор события) и получение значений счетчиков в сценарии

// Пример использования идентификатора события в сценарии
function EventToText(E)
{
switch (E) {
case 1: return "Открытие чека";
case 2: return "Добавление позиции";
case 3: return "Редактирование позиции";
case 4: return "Закрытие чека";
case 5: return "Отмена чека";
case 6: return "Ввод оплаты";
case 7: return "Сторно оплаты";
case 8: return "Ввод карты";
case 9: return "Отмена карты";
case 10: return "Ввод клиента";
case 11: return "Отмена клиента";
case 12: return "Ввод ручной скидки";
}
}

// Пример обращения к значениям счетчиков в сценарии
function CountersToText(RO)
{
Text = "Всего счетчиков " + RO.Counter.Count + "\n";
Text += "Ин." +
"\tКод" +
"\tВида"+
"\tЗначение" +
"\t\"Наименование Вида\"\n";
for (RO.Counter.Index = 1; RO.Counter.Index <= RO.Counter.Count; RO.Counter.Index++)
Text += RO.Counter.Index +
"\t" + RO.Counter.Code + // Код счетчика
"\t" + RO.Counter.TypeCode + // Код вида счетчика
"\t" + RO.Counter.Value + // Значение счетчика
"\t\"" + RO.Counter.TypeName + // Наименование вида счетчика
"\"\n";
return Text;
}

// Функция, с предопределенным именем, которая будет вызвана Frontol в начале обработки события
function BeforeAct(AO, RO, E)
{
Text = "До события " + EventToText(E) + "\n" + CountersToText(RO);
AO.ShowMessage(Text); // Вывод сообщения на экран кассира
}

// Функция, с предопределенным именем, которая будет вызвана Frontol в конце обработки события
function AfterAct(AO, RO, E)
{
Text = "После события " + EventToText(E) + "\n" + CountersToText(RO);
AO.ShowMessage(Text);
}



Пример №2. Учет накоплений и скидка на их основе

Создаем сценарий на момент действия Закрытие чека

function BeforeAct(AO, RO, E)
{
}
function AfterAct(AO, RO, E)
{
RO.Counter.AddValueByTypeCode(8, RO.SummWD * 0.0004);

/* 8 - код вида счетчиков в котором будут учитываться накопления.
В этом виде должны быть счетчики, привязанные к клиентам.
RO.SummWD - это сумма чека.
0.004 - например будем накапливать по 0.4% с чека. */
}




Создаем Объект скидки, в котором указываем этот сценарий.

Теперь, в зависимости от величины накоплений, сделаем разные скидки:

Создаем Группу условий, в которой будут Условия с разными ставками.

В Условии задаем на закладке Счетчики диапазон значений и вид счетчика.

При наличии в чеке счетчика требуемого вида со значением удовлетворяющим диапазону будет начислена заданная ставкой скидка. Для этой группы условий тоже необходим Объект скидки (можно использовать тот же самый что и для сценария).


--------------------
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 18.6.2007, 14:55
Сообщение #2


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Позновательно. Предложение выкладывать сюда скрипты работающих сценариев и их описания.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 21.6.2007, 16:23
Сообщение #3


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



При введении бонусной карты скрипт подсчитывает максимальную скидку чека по минимальным ценам всех позиций и выводит сообщения со значением максимальной скидки на чек и количеством бонусов на карте.

Код
function BeforeAct(AO, RO, E)
{
if (RO.BuyCount>0)

    {var WMPrice = 0;
     var MaxSkidka = 0;
           for (RO.Pos.Index = 1;
           RO.Pos.Index <=
           RO.Pos.Count;
           RO.Pos.Index ++)

           {if (RO.Pos.Storno == 1)
             {continue;}
             else
             var WMPrice = WMPrice + RO.Pos.WareMinPrice * RO.Pos.Quantity;}

              AO.ShowMessage ("Максимальная скидка: " + (RO.SummForD - WMPrice) + " руб.")}

else AO.ShowMessage ("Введите карту после регистрации ВСЕХ покупок!");
  }

function AfterAct(AO, RO, E)
{
for (RO.Counter.Index = 1;
      RO.Counter.Index <=
      RO.Counter.Count;
      RO.Counter.Index ++)

      {if (RO.Counter.TypeCode == 1)
{AO.ShowMessage ("Баланс карты: " + RO.Counter.Value + " руб.");
AO.DisplayScroll ("Баланс карты: " + RO.Counter.Value + " руб.");}
}
}
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 26.2.2008, 23:39
Сообщение #4


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Программировать надо. На Ява-скрbпте smile.gif

Код
function BeforeAct(AO, RO, E)
{
}
function AfterAct(AO, RO, E)
{
if (RO.Card.Count != 0)
{RO.Counter.AddValueByTypeCode(//Ваш тип кода счетчика//, 1);}
}


Момент действия - закрытие чека.
Также необходимо написать еще несколько сценариев для проверок и ограничений.


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 27.11.2008, 11:06
Сообщение #5


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



скрипт проверки наличия введенной карты

Код
function BeforeAct(AO, RO, E)
{
if (RO.Card.Count != 0)
AO.ShowError ("Карта уже введена");
}

function AfterAct(AO, RO, E)
{

}


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 1.5.2009, 22:08
Сообщение #6


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Скрипты для бонусной программы.
Общая идея:
Клиент - владелец карты приводит другого клиента, которому тут же выдается дисконтная карта. Сначала вводится карта приводимого, потом приводящего. При закрытии чека карта приводящего приписывается к карте приводимого. При покупке приводимым на карты обоих записываются по 10% от суммы чека, при возврате списываются обратно. Записанные бонусы можно использовать для оплаты товаров.

При вводе карты:


Код
function BeforeAct(AO, RO, E, O)
{
if ((O.Value.substr (0, 7) != 2997777) || (O.Value.length != 13))    //Проверяем префикс карты и длину
AO.ShowError ("Карта не из этого магазина!");

if (RO.Card.Count >=2)                                               //Проверяем количество введенных в чек карт
AO.ShowError ("Ввод карты запрещен");

if (RO.Card.Count == 1)                                              //Если количество введенных карт в чеке = 1

{
   enter2ndkard = true;                                              //Разрешаем ввод 2-й карты
   Karta = O.Value.slice (7, O.Value.length);                        //Отбрасываем первые 7 знаков вводимой карты

   for (RO.Card.Index = 1;                                           //Перебираем введенные карты
        RO.Card.Index <=
        RO.Card.Count;
        RO.Card.Index ++)

      {if (RO.Card.Index == 1)                                       //Находим первую введенную карту

       for (RO.Card.Counter.Index = 1;                               //Перебираем счетчики на этой карте
            RO.Card.Counter.Index <=
            RO.Card.Counter.Count;
            RO.Card.Counter.Index ++)

         {if (RO.Card.Counter.TypeCode == 1)                         //Находим счетчик с кодом типа счетчика = 1
             {if (RO.Card.Counter.Value != 0)                        //Если он не = 0
                 enter2ndkard = false;}                              //Запрещаем ввод 2-й карты

          if (RO.Card.Counter.TypeCode == 2)                                  //Находим счетчик с кодом типа счетчика = 2
      {if ((RO.Card.Counter.Value == 0) && (enter2ndkard))                    //Если значение найденного счетчика = 0 и разрешен ввод 2-й карты
          RO.UserValues.Set ("Karta", Karta);                                 //Объявляем пользовательскую переменную с хвостом от вводимой карты
       if ((RO.Card.Counter.Value != (Karta || 0)) && (!enter2ndkard))        //Если значение найденного счетчика не равно хвосту от вводимой карты и не = 0, а первый счетчик не = 0
          AO.ShowError ("Ввод второй карты запрещен!");}}}           //Вываливаем ошибку
}
}


function AfterAct(AO, RO, E, O)
{

if (RO.Card.Count == 1)                                                                                  //Если количество введенных карт = 1

   for (RO.Counter.Index = 1;                                                                            //Перебираем счетчики на карте
        RO.Counter.Index <=
        RO.Counter.Count;
        RO.Counter.Index ++)

     {if (RO.Counter.TypeCode == 1)                                                                      //Находим счетчик с кодом типа счетчика = 1
          AO.ShowMessage ("Балланс карты: " + ((Math.round (RO.Counter.Value*100))/100) + " руб.");      //Выводим сообщение о сумме счетчика

      if (RO.Counter.TypeCode == 2)                                                                      //Находим счетчик с кодом типа счетчика = 2
      if (RO.Counter.Value != 0)                                                                         //Если он не нулевой и не null
        {KarPr = String (RO.Counter.Value);                                                              //Переводим его значение в строку
          do
          {KarPr = 0 + KarPr}                                                                            //Добиваем нулями слева
          while (KarPr.length < 6);                                                                      //До длины в 6 знаков
                                                                                                         ///////////////////////////////////////////////
         var WShell = new ActiveXObject("WScript.Shell");                                                //Программно нажимаем F8, вводим префикс карты,
             WShell.SendKeys ("^({F8})2997777" + KarPr + "~"); }}                                        //добитый нулями слева хвост карты из второго
                                                                                                         //счетчика и нажимаем ввод
}                                                                                                        //То есть программно вводим карту приведшего
                                                                                                         //Записанную на второй счетчик
function FuncAct(AO, RO)                                                                                 //////////////////////////////////////////////
{
}

function NoAction(AO, RO, POS)
{
}


297777 - префикс карты, который и не нужен и не влезал в счетчик. Отбрасывается при записи и пририсовывается при восстановлении.

При закрытии чека:


Код
function BeforeAct(AO, RO, E, O)
{
}



function AfterAct(AO, RO, E, O)
{
if (RO.Card.Count != 0)                                                              //Если количество введенных карт не = 0
{
   for (RO.Card.Index = 1;                                                           //Перебираем карты в чеке
        RO.Card.Index <=
        RO.Card.Count;
        RO.Card.Index ++)

  {
      if (RO.Card.Index == 1)                                                       //Находим первую введенную карту
   {
         for (RO.Card.Counter.Index = 1;                                            //Перебираем счетчики на первой карте
              RO.Card.Counter.Index <=
              RO.Card.Counter.Count;
              RO.Card.Counter.Index ++)


          {if (RO.Card.Counter.TypeCode == 1)                                       //Находим 1-й счетчик 1-й карты
           {if ((RO.ReceiptTypeCode == 1) || (RO.ReceiptTypeCode == 4))             //Если это чек продажи (код типа = 1) или возврата (код типа = 4)
                {RO.Card.Counter.AddValue ((RO.TotalDiscSumm)*(-1));                //Списываем с 1-го счетчика 1-й карты сумму скидки на чек
                 RO.Card.Counter.AddValue(Math.round(RO.SummWD * 10)/100);}         //Записываем в 1-й счетчик 1-й карты округленные 10% суммы чека со скидками

            if (RO.ReceiptTypeCode == 2)                                            //Если это чек возврата (код типа = 2)
               {RO.Card.Counter.AddValue(RO.TotalDiscSumm);                         //Записываем на 1-й счетчик 1-й карты сумму скидки на чек
                RO.Card.Counter.AddValue(Math.round(RO.SummWD * (-10))/100);}}      //Списываем с 1-го счетчика 1-й карты округленные 10% суммы чека со скидками


           if (RO.Card.Counter.TypeCode == 2)                                        //Находим счетчик с кодом типа счетчика = 2
              {if (RO.Card.Counter.Value == 0)                                       //Если его значение = 0, то есть карта карты приводящего нет
               {Karta = Number (RO.UserValues.Get ("Karta"));                        //Вытаскиваем пользовательскую переменную, объявленную в воде карты и переводим ее в число
                if (Karta != 0)                                                      //Если мы вытащини не 0
                RO.Card.Counter.AddValueByTypeCode (2, Karta);}}}                    //Записываем в счетчик с кодом типа счетчика = 2 хвост номера карты приведшего
   }

      if (RO.Card.Index == 2)                                                        //Находим вторую введенную карту
   {
         for (RO.Card.Counter.Index = 1;                                             //Перебираем счетчики на первой карте
              RO.Card.Counter.Index <=
              RO.Card.Counter.Count;
              RO.Card.Counter.Index ++)

            {if (RO.Card.Counter.TypeCode == 1)                                      //Если это счетчик №1
               {if ((RO.ReceiptTypeCode == 1) || (RO.ReceiptTypeCode == 4))          //Если это чек продажи (код типа = 1) или возврата (код типа = 4)
                     RO.Card.Counter.AddValue(Math.round(RO.SummWD * 10)/100);       //Записываем в 1-й счетчик 2-й карты округленные 10% суммы чека со скидками
                if (RO.ReceiptTypeCode == 2)                                         //Если это чек возврата (код типа = 2)
                    RO.Card.Counter.AddValue(Math.round(RO.SummWD * (-10))/100);}}   //Списываем с 1-го счетчика 2-й карты округленные 10% суммы чека со скидками
   }
  }
}
}

function FuncAct(AO, RO)
{
}

function NoAction(AO, RO, POS)
{
}


Скрипты можно соптимизировать, но сил и желания нет.
Может кому пригодится.


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Владимир Д.
сообщение 2.5.2009, 16:27
Сообщение #7


Разговорчивый
******

Группа: Партнеры
Сообщений: 1 214
Регистрация: 13.3.2006
Из: г.Тобольск ООО "Атрикс"
Пользователь №: 3 705



Интересная идея! +1 goodpost.gif


--------------------
г.Тобольск, т. 8-91-995-00-995
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Лаврухин Алексей
сообщение 3.12.2009, 16:33
Сообщение #8


ГК «АТОЛ»
****

Группа: Специалисты
Сообщений: 457
Регистрация: 4.12.2006
Пользователь №: 9 746



Пример решенной задачи с помощью скриптов: http://blog.atol.ru/2009/12/02/diskont-na-javascript-primer/
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Andrey_malin
сообщение 7.4.2010, 3:15
Сообщение #9


Прохожий


Группа: Пользователи
Сообщений: 46
Регистрация: 4.8.2009
Пользователь №: 17 100



Думаю будет полезно привести классический пример работы со счётчиками.
Задача: Есть карты для которых из товароучётной программы выгружается максимальная сумма покупки (что-то вроде материальной помощи или
покупки под зарплату).
Вот пример скрипта реализующего эту задачу.
Код
function BeforeAct(AO, RO, E, O)
{
for (RO.Counter.Index = 1;
      RO.Counter.Index <= RO.Counter.Count;
      RO.Counter.Index++)
      {
       switch (RO.Counter.TypeCode){                 //Здесь определяем коды используемых счётчико
              case 4: MaxLimit = RO.Counter.Value; //Счётчик содержащий максимальную сумму покупки.
                      break
              case 6: SumNakop = RO.Counter.Value; //Счётчик содержащий израсходованную сумму.
                      break         }
       }

MaxSkidka = MaxLimit - SumNakop;                 //Определяем масимальную сумму скидки на чек.

for (RO.Counter.Index = 1;                              //Расчёт значения предоставляемой скидки.
      RO.Counter.Index <= RO.Counter.Count;
      RO.Counter.Index++)
      {
       if (RO.Counter.TypeCode == 7)
          {
           if (RO.SummWD <= MaxSkidka)
              {
               RO.Counter.AddValue(-RO.Counter.Value);
               RO.Counter.AddValue(RO.SummWD);
               MaxSkidka = RO.SummWD;
              }
           else
              {
               RO.Counter.AddValue(-RO.Counter.Value);
               RO.Counter.AddValue(MaxSkidka);
              }
          }
      }
for (RO.Counter.Index = 1;                            
      RO.Counter.Index <= RO.Counter.Count;
      RO.Counter.Index++)
      {
       if (RO.Counter.TypeCode == 6)
          RO.Counter.AddValue(MaxSkidka);   //Увеличиваем значение счётчика расходования средств на сумму покупки.
      }
}


Для использования скрипта потребуется создать три счётчика, ставку скидки и условие.

Счётчики:
1: Сумма лимита из товароучётной программы (Автосоздание по карте);
2: Сумма израсходованных средств (Автосоздание карта);
3: Сумма скидки (Автосоздания нет).

Ставка скидки:
1: Тип -$, значение счётчик 3, автоматическая.

Условие:
1: Карта введена, ставка 1.

В объекте скидки указываем только Условие. Момент действия скрипта Ввод платежа.
Так же потребуется скрипт с моментом действия Ввод карты.
Код
function BeforeAct(AO, RO, E, O)
{
if (RO.Card.Count >0)                                  
   AO.ShowError("Карта уже введена!!!");

for (RO.Counter.Index =1;                                 //Проверяем наличие средств для оплаты по карте.
           RO.Counter.Index <= RO.Counter.Count;
           RO.Counter.Index++)
           {switch (RO.Counter.TypeCode) {
                   case 4:{Limit = RO.Counter.Value;
                           break}
                   case 6:{Rashod = RO.Counter.Value;
                           break}
                           }
           }
      if (Limit == Rashod)
         AO.ShowError("Лимит исчерпан!");

}
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
awerta
сообщение 2.12.2010, 17:43
Сообщение #10


Прохожий


Группа: Новички
Сообщений: 12
Регистрация: 20.11.2009
Пользователь №: 19 033



Может кому понадобиться!
Скидка на позицию, равная 20% от суммы чека или равная 100 руб., если 20 % от чека больше чем 100 руб.
С условием, что в чеке присутствует товар с минимальной ценой равной розничной, и стоимость этого товара исключается из общей суммы чека.
Плюс присутствует проверка на то, что такая скидка уже была сделана.


Код
function qwert(AO, RO, POS)
{
Summa = 0;
for (RO.Pos.Index = 1;
           RO.Pos.Index <=
           RO.Pos.Count;
           RO.Pos.Index ++)
{
if (RO.Pos.Storno == 1)
   {
   continue;
   }
else
   {
            if (RO.Pos.WareMinPrice == RO.Pos.Price)
               {

               }
            else
               {
               Summa = Summa + RO.Pos.SummForD;
               }
    }
}
for (RO.Counter.Index = 1; RO.Counter.Index <= RO.Counter.Count; RO.Counter.Index++)
    {
    if (RO.Counter.TypeCode == 3)
       {
       if (RO.Counter.Value == 0)
            {
            RO.Counter.AddValueByCode(3,1,1);
            Summa = Summa*0.2;
            if (Summa > 100)
            {
            Summa = 100;
            }
            return Summa;
            
            }
       }
    }
}
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
АТОЛ: Царюков Ро...
сообщение 2.12.2010, 17:46
Сообщение #11


Тех.поддержка
********

Группа: Администраторы
Сообщений: 58 046
Регистрация: 25.9.2008
Из: Москва
Пользователь №: 14 717



желательно делать комментарии в коде....
для чего, например нужен счетчик, к чему этот счетчик привязан и т.д....


--------------------
ответы на 90% вопросов находятся в ДОКУМЕНТАЦИИ
еще 9% ответов ТУТ
P.S.: уважайте труд наших писателей - читайте мануалы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 3.12.2010, 0:18
Сообщение #12


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Вот этот момент совсем не понял:

Цитата
if (RO.Pos.WareMinPrice == RO.Pos.Price)
{

}


Можете объяснить?


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
80Serg
сообщение 16.9.2011, 1:41
Сообщение #13


Прохожий


Группа: Пользователи
Сообщений: 3
Регистрация: 7.9.2011
Из: г.Артём, Приморский край
Пользователь №: 38 746



Здравствуйте, товарищи. На нашем предприятии возникла необходимость в такой скидке: скидка действует на определенное количество товара, например от 1 до 4 штук. Т.е если покупатель приобретает от 1-ой до 4-х штук товара, то возникает скидка. Однако, если покупатель берет 5 штук и более, скидка на первые 4 позиции не должна быть отменена. Т.е. скидка должна остаться для 4-х штук товара, но на пятую штуку и далее уже не распространяться.
Формулами и другими способами сделать не получается, поэтому предлагаю такую схему:

1. Создается Сценарий, который в зависимости от некоторого параметра будет выдавать разную скидку.
2. Создается Ставка скидки, где в качестве ставки указывается ссылка на сценарий. Ставка идет на позицию, автоматическая.
3. Создается Условие в одноименной справочнике, где прописывается Ставка и Сценарий, а самих условий нет.
4. Создается Классификатор, который косвенно будет задавать параметры скидки.
5. К классификатору привязываются товары.

Имя классификатора содержит параметры скидки и строится по следующему шаблону: НачКол_КонКол_ПроцентСкидки.
Например, классификатор с именем 1_4_10, означает, что скидка действует на товар с количеством от 1 до 4 и составляет 10% на товар.

Сценарий возникает при расчете автоматической скидки, т.е. момент действия сценария - Нет, а сам алгоритм создается в свободной процедуре NoAction, переименованной по своему усмотрению (у меня - DiscountVariable).
Итак при регистрации товара возникает сценарий автоматической скидки. В сценарии проверяется, есть ли у данного товара классификатор, если есть то это значит, что есть причина начислить скидку и параметры скидки нужно взять из наименования классификатора. Разбирается строка с именем классификатора и заполняются переменные - параметры скидки ( numBegin, numEnd, discount ). Далее по формуле считается скидка на данный товар (т.к. сценарий вызывается для каждой позиции в чеке. Кстати стоит объединение позиций). Формула такая:
ПроцентСкидкиНаТовар = ( ( ЦенаБезСкидки*ОбщееКолво – (КолвоСоСкидкой*ЦенаСоСкидкой + КолвоБезСкидки*ЦенаБезСкидки) ) / ЦенаБезСкидки*ОбщееКолво) * 100. Рассчитанная скидка возвращается в переменной TotalDisc.

Хочется еще сказать, что классификаторы загружаются из 1С. Я создал там справочник схемы скидок, каждый элемент которого соответствует классификатору. При этом во Фронтоле неизменными остаются элементы справочников Ставки, Условия, Сценарии, а классификаторы и Объекты скидок, каждый раз (при загрузке товаров) удаляются и создаются снова.

код файла goods.spr привожу ниже сценария.

Сценарий :

CODE
function BeforeAct(AO, RO, E, O)
{
}

function AfterAct(AO, RO, E, O)
{
}

function FuncAct(AO, RO)
{
}

function DiscountVariable(AO, RO, POS)

{
numBegin = 0;
numEnd = 0;
discount = 0;

param = "";
paramInt = 0;

CurrentClassifier = 0;
numFind = 0;

for (POS.Classifier.Index = 1;
POS.Classifier.Index <= POS.Classifier.Count;
POS.Classifier.Index++)
{
CurrentClassifier = POS.Classifier;
break;
}

if (CurrentClassifier != 0)
{

Name = CurrentClassifier.Name;
i = 1;
do
{
numFind = Name.search("_");
if (numFind != -1)
{
param = Name.substr(0, numFind);
Name = Name.substr(numFind + 1);
}
else
param = Name;

paramInt = parseInt(param);
if (i == 1)
numBegin = paramInt;
if (i == 2)
numEnd = paramInt;
if (i == 3)
discount = paramInt;

i++;
}
while(numFind != -1);
}

TotalDisc = 0;

WareQuantity = POS.Quantity;
WarePriceWODisc = POS.Price;
WarePriceWithDisc = WarePriceWODisc - (WarePriceWODisc * discount / 100);

WareQuantityWODisc = WareQuantity;
WareQuantityWithDisc = 0;
if (WareQuantity <= numEnd)
{
WareQuantityWODisc = 0;
WareQuantityWithDisc = WareQuantity;
}
else
{
WareQuantityWODisc = WareQuantity - numEnd;
WareQuantityWithDisc = numEnd;
}

TotalDisc =( (WarePriceWODisc * WareQuantity - (WareQuantityWithDisc * WarePriceWithDisc + WareQuantityWODisc * WarePriceWODisc ) ) / (WarePriceWODisc * WareQuantity) ) * 100;
return TotalDisc;
}



goods.spr:


CODE
##@@&&
#
$$$ADDQUANTITY
00098354;5706773223251;Ящик HOME BOX 32 л голубой РТ 2232-ГП;Ящик HOME BOX 32 л голубой РТ 2232-ГП;614,90;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00095462;4607126319229;Ящик HOUSE 60л штабелируемый оранжевый РТ9954/М-ОР;Ящик HOUSE 60л штабелируемый оранжевый РТ9954/М-ОР;288,60;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00095460;4607126319014;Ящик JUNIOR на роликах 30л красный РТ9034-КР;Ящик JUNIOR на роликах 30л красный РТ9034-КР;410,80;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00095461;4607126319045;Ящик JUNIOR на роликах 60л оранжевый РТ9046-ОРАНЖ;Ящик JUNIOR на роликах 60л оранжевый РТ9046-ОРАНЖ;494,00;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00078280;2200100584488;Ящик Multibox XS с крышкой многофункциональная флауер пауер;Ящик Multibox XS с крышкой многофункциональная флауер пауер;102,70;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00108670;4607016810720;Ящик д/игрушек 600*400*360 на колесах 4312068;Ящик д/игрушек 600*400*360 на колесах 4312068;800,80;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00108669;4607016814261;Ящик д/игрушек на кол.600*400*360 с апплик. 4313068;Ящик д/игрушек на кол.600*400*360 с апплик. 4313068;738,20;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00107499;8697444382032;Ящик д/инст.клас. 16 MANO C.O-16;Ящик д/инст.клас. 16 MANO C.O-16;480,70;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00107514;8697444384340;Ящик д/инст.клас. 3-х эт 20 MANO BL.O-20;Ящик д/инст.клас. 3-х эт 20 MANO BL.O-20;1358,50;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00108671;4607016815367;Ящик д/инструментов 510*260*270 4312560;Ящик д/инструментов 510*260*270 4312560;517,00;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00107101;4607016812502;Ящик складной с перфориров. стенками 32л. 4312282;Ящик складной с перфориров. стенками 32л. 4312282;318,10;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
00107079;4607016812090;Ящик Хобби 27*19*4см 4312285;Ящик Хобби 27*19*4см 4312285;112,80;0;0;0,1,1,0,0,0,0,1,1,,1;;;;;;1;;;1;0;;;;;;;;;;;;;;;
$$$DELETEALLCLASSIFIERLINKS
$$$DELETEALLDISCOBJECTS
$$$DELETEALLCLASSIFIERS
$$$ADDCLASSIFIERS
8;;0;2_8_6 ;;
$$$ADDDISCOBJECTS
8;;;;;;;;8;;;;;1;;;
$$$ADDCLASSIFIERS
5;;0;1_7_3 ;;
$$$ADDDISCOBJECTS
5;;;;;;;;5;;;;;1;;;
$$$ADDCLASSIFIERLINKS
5;1;00080608;
5;1;00103202;
5;1;00096178;
5;1;00085378;
5;1;00104275;
5;1;00086399;
5;1;00030047;
5;1;00070107;
5;1;00070108;
5;1;00049050;
5;1;00085377;
5;1;00086805;
5;1;00104087;
5;1;00096796;
5;1;00094931;
5;1;00096180;
5;1;00095222;
5;1;00031502;
5;1;00085712;
5;1;00080584;
5;1;00085376;
5;1;00101488;
5;1;00031504;
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 8.12.2011, 23:15
Сообщение #14


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Для начинающих ссылка на адекватный справочник по JS:

http://wdh.suncloud.ru/js01.htm


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Peter1234
сообщение 21.5.2012, 16:05
Сообщение #15


Начинающий
*

Группа: Пользователи
Сообщений: 84
Регистрация: 17.9.2006
Пользователь №: 8 850



Мой первый скрипт. Надеюсь, кому-то пригодится. Плюс будет интересно услышать комментарии от гуру.

Схема работы следующая.

1. Выпускаются карты сертификатов с какой-то нумерацией, идущей подряд.
2. Сертификатам присваивается какой-то номинал (в примере скрипта два номинала – 5000 руб. и 6000 руб.).
3. Карты продаются/выдаются клиентам без регистрации через фронтол. В моем случае просто стопку карт продали организации по безналу, а она раздала своим сотрудникам.
4. Клиенты приходят отоваривать сертификаты. Они могут набрать товара на любую сумму: меньше номинала сертификата, больше или равно. Клиенты могут одновременно отоварить два и более сертификата разных номиналов.
5. При покупке на сумму меньше номинала сертификата чек будет закрыт на сумму покупки с видом оплаты «Сертификат». При покупке на сумму, равную сертификату, чек будет закрыт по номиналу сертификата. При покупке на сумму больше номинала сертификата, будет зарегистрирована оплата на сумму сертификата, а остальное надо будет доплатить наличными или по безналу.
6. Сертификат у покупателя изымается.
7. Нигде не контролируется, что сертификат уже был отоварен. Поэтому изымать сертификат надо обязательно.

Последовательность действий:

1. Создаем сценарий с моментом действия «Ввод платежа».

Код
function inArray(data, array) {
    for (var i = 0; i < array.length; i++) {
        if (data == array[i]) return true;
    }
    return false;
}

function BeforeAct(AO, RO, E, O) {
    var certificateSumm = 0;
    var groupCode = [1, 2, 3]; // Коды групп карт, которые являются сертификатами
    var certificateValue = [5000, 5000, 6000]; // Номиналы сертификатов. К массиву обращаться по [код группы - 1]. В соответствующей ячейке будет сумма.

    // Проверим, что вводится оплата по сертификату, в нашем случае это вид оплаты с кодом 2
    if (O.Code == 2) {
        // Вычислим сумму номиналов всех сертификатов
        for (RO.Card.Index = 1; RO.Card.Index <= RO.Card.Count; RO.Card.Index++) {
            // Проверяем, является ли введенная карта сертификатом (по коду группы карт)
            if (inArray(RO.Card.GroupCode, groupCode)) {
                certificateSumm += certificateValue[RO.Card.GroupCode - 1];
            }
        }
        // Если сумма сертификатов равно 0, то отменяем оплату по сертификату
        if (certificateSumm == 0) {
            AO.ShowError("Сертификат не введен!");
        }
        // Если сумма чека больше или равна сумме сертификатов, то закрываем суммой сертификатов.
        // Если сумма чека меньше, то закрываем суммой чека.
        if (RO.SummWD >= certificateSumm) {
            RO.AddPayment(2, certificateSumm);
        } else {
            RO.AddPayment(2, RO.SummWD)
        }
        AO.Cancel()
    }
}

function AfterAct(AO, RO, E, O)
{
}

function FuncAct(AO, RO)
{
}

function NoAction(AO, RO, POS)
{
}


2. Создаем объект скидок, выбираем в «Оплата» «Сертификатом» в действии «Сценарий» - наш созданный сценарий.
3. Создаем группу карт с параметром «Авторегистрация карт», ввод «Ридером», указываем минимальный и максимальный префикс.
4. Код созданной группы будет проверяться в сценарии. По нему мы будем определять, что карта является сертификатом. В сценарии есть массив groupCode, в который надо внести все коды групп карт данных сертификатов.
5. «В Системных справочниках» в «Видах оплаты» создаем вид оплаты «Сертификатом», «Тип оплаты в ККМ» - 1, «Операция» - Нет. Сдача не выдается, денежный ящик не меняется. Код вида оплаты проверяется в сценарии тут: if (O.Code == 2). В данном случае код вида оплаты «Сертификатом» - 2.

PS. Спасибо Павлу Сусину за примеры.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 1.11.2012, 20:14
Сообщение #16


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Глубокоуважаемые коллеги!!!
Убедительная просьба обратить ваше драгоценное внимание на название темы.
Выкладывайте, пожалуйста, сюда примеры работы с внутренним программированием во Фронтоле.
Для решения ваших личных в этой области проблем, остается почти весь остальной форум!
Спасибо за понимание.


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Владимир Шалаев
сообщение 14.11.2012, 10:41
Сообщение #17


Завсегдатай
***

Группа: Пользователи
Сообщений: 210
Регистрация: 30.10.2012
Из: Москва
Пользователь №: 61 532



Существует группа карт "Накопительные карты", имеющая свой код Х.
При любой покупке, на карту добавляется сумма покупки. При достижении определенной суммы, выдается определенная скидка.
Задача: написать скрипт, который при возврате товара, вычитает цену товара из накоплений карты.
момент действия: Закрытие документа.
Функция может быть как BeforeAct, так и AfterAct.

/*Скрипт при каждом закрытии документа определяет его тип.
Если тип документа "ВОЗВРАТ", то скрипт проверяет наличие
накопительных карт в документе. Если накопительная карта найдена,
то из ее суммы накоплений вычитается сумма возврата (с учетом скидки).*/
Код
function BeforeAct(AO, RO, E, O)
{

   if(RO.ReceiptType == "ВОЗВРАТ")
   {//Если название операции "ВОЗВРАТ", то обрабатываем этот случай
        for(RO.Card.Index = 1; RO.Card.Index <= RO.Card.Count; RO.Card.Index++)
        {//Запускаем цикл по всем картам, имеющимся в документе
              if((RO.Card.GroupCode==X)) //где X - код группы накопительных карт
              {//Находим счетчик накопительных карт. Код группы таких счетчиков - X
                   for(RO.Card.Counter.Index = 1; RO.Card.Counter.Index <= RO.Card.Counter.Count; RO.Card.Counter.Index++)
                   { //Запускаем цикл по всем счетчикам карты
                         if(RO.Card.Counter.TypeName == "Накопления по картам")
                         {
                         RO.Card.Counter.AddValue(-RO.SummWD);
                         } //Окончание условия обработки счетчика "Накопления по картам"

                   } //Окончание цикла перебора всех счетчиков карты

              } //Окончание условия проверки кода группы карт (нам нужен код группы 509)

        } //Окончание цикла перебора всех карт данного документа

   } //Окончание условия обработки типа документа "ВОЗВРАТ"

} //Конец функции

function AfterAct(AO, RO, E, O)
{}
function FuncAct(AO, RO)
{}
function NoAction(AO, RO, POS)
{}
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 14.11.2012, 13:35
Сообщение #18


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Такие вещи надо писать в AfterAct
Потому что если это будет в таком виде, возможна следующая ситуация:
Проигрался BeforAct, пошла печать чека, ФР вернул ошибку, кассир жмет закрыть чек еще раз, опять проигрывается BeforAct и так далее со всеми вытекающими последствиями.


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Владимир Шалаев
сообщение 15.11.2012, 10:25
Сообщение #19


Завсегдатай
***

Группа: Пользователи
Сообщений: 210
Регистрация: 30.10.2012
Из: Москва
Пользователь №: 61 532



Цитата(POUL @ 14.11.2012, 14:35) *
Такие вещи надо писать в AfterAct
Потому что если это будет в таком виде, возможна следующая ситуация:
Проигрался BeforAct, пошла печать чека, ФР вернул ошибку, кассир жмет закрыть чек еще раз, опять проигрывается BeforAct и так далее со всеми вытекающими последствиями.

Спасибо! Это ценное замечание!!
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
POUL
сообщение 15.11.2012, 10:38
Сообщение #20


Магистр слова
********

Группа: Партнеры
Сообщений: 14 878
Регистрация: 17.2.2007
Из: Москва
Пользователь №: 10 778



Ваш Кэп.


--------------------
FireBird Service Manager
Пишу скрипты за еду. Интегрирую в программы лояльности.
ООО "B2C"

Если долго вглядываться в докуметацию, она начнет давать ответы на вопросы
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

5 страниц V   1 2 3 > » 
Добавить ответ в эту темуОткрыть тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 8.10.2022, 0:28
 Яндекс цитирования  Rambler's Top100