Прайс-листы. Пользовательские алгоритмы расчета цен

Информация о завершенных проектах развития

Модератор: ZYG

Ответить
Аватара пользователя
ZYG
топ-софт
Сообщения: 15
Зарегистрирован: Пт, 14/09/2007 10:50
Имя Фамилия: Юрий Жданович
Откуда: ТопСофт
Контактная информация:

Прайс-листы. Пользовательские алгоритмы расчета цен

Сообщение ZYG »

При выполнении некоторых нестандартных методик расчета цен учетной единицы прайса иногда требуется выполнить действия, не предусмотренные стандартной поставкой Галактики ERP.

В таких случаях для увеличения гибкости расчетов предусмотрена возможность применения для расчета пользовательских скриптов, написанных на двух языках — Vip for application и Java-Script.

Для выбора исполняемого скрипта или для редактирования существующего пользователь должен выбрать в меню Прайс-листы - Пересчет по скрипту один из подпунктов, в зависимости от используемого диалекта.
  • Рис. 1. Меню вызова скрипта
    Изображение
После выбора пункта меню Прайс-листы - Пересчет по скрипту - Vip for application появляется окно выбора (Рис. 2), которое содержит список демонстрационных скриптов, поставляемых по умолчанию.
  • Рис. 2
    Изображение
Выполнить скрипт можно стандартными действиями (Double Click или нажатием Enter).

Редактирование скрипта осуществляется в отдельном окне (Рис. 3), которое представляет собой области ввода имени скрипта и его текста, а также кнопки:
• [Проверить скрипт] — можно проверить скрипт на корректность синтаксиса;
• [Выполнить скрипт] — можно запустить скрипт на выполнение.
  • Рис. 3
    Изображение
В теле скрипта доступна глобальная переменная nRecPrice, представляющая собой ссылку на выбранный пользователем прайс-лист.

Для реализации второй части проекта реализованы функции работы с остатками и функции расчета цен и наценок прайс-листов в контексте JavaScript.
Указанные функции реализованы в интерфейсах iJS_Price и iJS_Ostatok. Их необходимо зарегистрировать в библиотеках алгоритмов
Данные интерфейсы реализуют следующие методы.

Код: Выделить всё

iJS_Price:
1.	Метод GetCountPriceNDE(cCurKlPrice, cCurPrice, dSumNDE, dSumVAL, bWithNalog)
   рассчитать цену в НДЕ в зависимости от входимости налогов'                           
   dSumNDE - сумма в НДЕ                                                               
   dSumVAL - сумма в валюте                                                            
   bWithNalog - (TRUE - налоги входят, FALSE - не входят)                             
   cCurKlPrice - ссылка на текущий прайс')                                               
   cCurPrice - ссылка на запись текущего прайса')                                       
2.	Метод GetCountPriceVAL(cCurKlPrice, cCurPrice, dSumNDE, dSumVAL, bWithNalog) 
   рассчитать цену в валюте в зависимости от входимости налогов                       
   dSumNDE - сумма в НДЕ                                                               
   dSumVAL - сумма в валюте                                                           
   bWithNalog - (TRUE - налоги входят, FALSE - не входят                              
   cCurKlPrice - ссылка на текущий прайс'                                               
   cCurPrice - ссылка на запись текущего прайса                                        
3.	Метод GetNacenPriceNDE(dTekR, dTekV, dUchR, dUchV, dZavR, dZavV, cKlPrice, cPrices)
   расчет наценок в НДЕ                                                                
   dTekR - текущая цена в НДЕ                                                          
   dTekV - текущая цена в валюте                                                       
   dUchR - учетная цена в НДЕ                                                          
   dUchV - учетная цена валюте                                                         
   dZavR - заводская цена в НДЕ                                                        
   dZavV - заводская цена в валюте                                                     
   cKlPrice - ссылка на текущий прайс                                                  
   cPrices - ссылка на текущую позицию прайса                                         
4.	Метод GetNacenPriceVAL(dTekR, dTekV, dUchR, dUchV, dZavR, dZavV, cKlPrice, cPric-es) 
   расчет наценок в валюте                                                            
   dTekR - текущая цена в НДЕ                                                          
   dTekV - текущая цена в валюте                                                       
   dUchR - учетная цена в НДЕ                                                          
   dUchV - учетная цена валюте                                                         
   dZavR - заводская цена в НДЕ                                                        
   dZavV - заводская цена в валюте                                                    
   cKlPrice - ссылка на текущий прайс                                                  
   cPrices - ссылка на текущую позицию прайса                                          
5.	Метод ClearLogPrice(cPrices, cKlPrice)                                              
   очистка лога расчета цен                                                            
   cPrices - ссылка на текущую позицию прайса                                        
   cKlPrice - ссылка на текущий прайс                                                
6.	Метод GetBasePrice()                                                                
   вызов интерфейса выбора прайс листа                                                
iJS_Ostatok:
1.	Метод InitMCInfo(dateMC)                               
   инициализация объектов работы с остатками              
   dateMC - дата формирования');                             
2.	Метод StepMCInfo(cCurThing, cCurPosVal, cCurParty)     
   расчет наличия и средней учетной цены по разрезу       
   cCurThing - ссылка на товар/услугу                    
   cCurPosVal - ссылка на валюту                          
   cCurParty - ссылка на партию                           
3.	Метод DoneMCInfo()                                     
   освобождение объекта расчета остатков


При работе с JavaScript в списке библиотек необходимо добавить библиотеку функций для работы с прайс-листами (Рис. 4).
  • Рис. 4. Список библиотек
    Изображение

На Рис. 5 .. 10 приведены свойства классов, поставляемых вместе с примерами алгоритмов.
  • Рис. 5. Свойства класса Prices
    Изображение

    Рис. 6. Свойства класса KLPrices
    Изображение

    Рис. 7. Свойства класса KatMC
    Изображение

    Рис. 8. Свойства класса KatUsl
    Изображение

    Рис. 9. Свойства класса KatParty
    Изображение

    Рис. 10. Свойства класса SpOrder
    Изображение
В Приложении приведены примеры скриптов пересчета прайс-листа по заводским ценам для Vip4App и JavaScript.

Приложение: примеры скриптов на Vip4App и JavaScript

Код: Выделить всё

Vip4App

  var order_Val: word;
  var proxy: IPriceScriptProxy;
  var nalR, nalV, nacR, nacV : Double;
  var oValFunc: ValFuncsV2;
  var par1, par2, par3, par4: variant;

  order_Val := wGetTune('Price.OtpCena');//получение настройки правил расчета

  getvipref(proxy, 'PriceScriptProxy');
  if NullVipRef(proxy)
    {
        Message(‘Не инициализирован интерфейс PriceScriptProxy’);
        Exit;
    }

  if ((getfirst proxy where nRecPrice= Prices_cklPrice) = tsOk)
    do
     {
       proxy.BasePrice = nRecPrice;
       //расчет заводской цены
       if ( proxy.Prices_Tip = 1 )
        {
          proxy.Prices_ZPrice  := proxy.KatUsl_Rascenka;
          proxy.Prices_ZVPrice := proxy.Prices_ZPrice / proxy.KlPrice_Curs;
        }
      else
        {
          if ( proxy.Prices_cParty = 0 )
            {
              proxy.Prices_ZPrice  := proxy.KatMC_CenaMC;
              proxy.Prices_ZVPrice := proxy.Prices_ZPrice / proxy.KlPrice_Curs;
            }
          else
            if ( ( proxy.KatParty_CenaZav <= 0.0 ) OR ( proxy.KatParty_cValPar = 0 ) )
              {
                proxy.Prices_ZPrice  := if(proxy.KatParty_CenaZav > 0.0, proxy.KatParty_CenaZav, proxy.KatMC_CenaMC);
                proxy.Prices_ZVPrice := proxy.Prices_ZPrice / proxy.KlPrice_Curs;
              }
            else
              {
                par1 := proxy.KatParty_cValPar;
                par2 := proxy.KatParty_CenaZav;
                par3 := if(proxy.KlPrice_TipMoney = 1, proxy.KlPrice_dCurs, proxy.KlPrice_dPrice);
                par4 := proxy.KlPrice_cVal;
                proxy.Prices_ZVPrice := oValFunc.GetAnyCurrency(par1, par2, par3, par4);

                proxy.Prices_ZPrice  := proxy.Prices_ZVPrice * proxy.KlPrice_Curs;
              }
        }
       if (order_Val = 0)
         {
           proxy.ClearLogPrice;
           proxy.GetNacenPrice(proxy.Prices_ZPrice, proxy.Prices_ZVPrice, proxy.Prices_SRPrice,
                              proxy.Prices_SRVPrice,proxy.Prices_ZPrice, proxy.Prices_ZVPrice,
                              nacR, nacV);
           proxy.GetCountPrice(proxy.Prices_ZPrice + nacR, proxy.Prices_ZVPrice + nacV, FALSE, nalR, nalV);
           proxy.Prices_Price := nalR;
           proxy.Prices_sumVal := nalV;
           Message(nalR + ' ' + nalV);
           proxy.DoUpdate;
         }
       else
         {
           proxy.ClearLogPrice;
           proxy.GetCountPrice(proxy.Prices_ZPrice, proxy.Prices_ZVPrice, FALSE, nalR, nalV);
           proxy.GetNacenPrice(nalR, nalV, proxy.Prices_SRPrice,
                              proxy.Prices_SRVPrice,proxy.Prices_ZPrice, proxy.Prices_ZVPrice,
                              nacR, nacV);
           proxy.Prices_Price :=nalR + nacR;
           proxy.Prices_sumVal := nalV + nacV;
           Message(nalR + ' ' + nalV);
           proxy.DoUpdate;
         }
         Message(proxy.Prices_nRec + ' ' + proxy.Prices_CKLPRICE);
    } //do
    while ((getnext proxy where nRecPrice = Prices_cklPrice) = tsOk);
    Message('Скрипт успешно выполнен: ' + proxy.Prices_Price);



JavaScript

ZavPrice = 0;
ZavVPrice = 0;

mPrices.SetPriceOrder(CurKlPrice())//установка ограничений
mKlPrice.setPosition(CurKlPrice())//установка позиции

for (mPrices.getFirst(); ResultOfNavigation; mPrices.getNext())
  {
    mKatUsl.setPosition(mPrices.cThing);
    mKatMC.setPosition(mPrices.cThing);
    mKatOtpEd.setPosition(mPrices.cOtpEd);
    if ( mPrices.Tip == 1 )
      {
        ZavPrice = mKatUsl.Rascenka;
        ZavVPrice = ZavPrice / mKlPrice.Curs;
      }
    else
      {
        if ( mPrices.cParty == 0 )
          {
            mKatMC.setPosition(mPrices.cThing);
            ZavPrice  = mKatMC.CenaMC;
            ZavVPrice = ZavPrice / mKlPrice.Curs;
          }
        else
          if (( mParty.CenaZav <= 0.0 ) || ( mParty.cValPar == 0 ))
            {
              if(mParty.CenaZav > 0.0)
               ZavPrice = mParty.CenaZav
              else
                ZavPrice = mKatMC.CenaMC;
                ZavVPrice = ZavPrice / mKlPrice.Curs;
            }
          else
            {
              Message('GetAnyCurrency', 0);
              if (mKlPrice.TipMoney == 1)
                param = mKlPrice.dCurs;
              else
                param = mKlPrice.dPrice;
              ZavVPrice = GetAnyCurrency(mParty.cValPar, mPar-ty.CenaZav, param, mKlPrice.cVal);
              ZavPrice  = ZavVPrice * mKlPrice.Curs;
            }
        }
  mPrices.ZavPrice = ZavPrice;
  mPrices.ZavVPrice = ZavVPrice;
  if (mPrices.Tip > 0)
    cGrNal = mKatUsl.cGrNal;
  else
    cGrNal = mKatMC.cGrNal;

  if (wGetTune('Price.OtpCena'))
    {
//выполнение реализованных функций для прайсов
      ClearLogPrice(mPrices.nRec, CurKlPrice());
      nacR = GetNacenPriceNDE(mPrices.ZavPrice, mPrices.ZavVPrice, mPrices.SrPrice, mPrices.SrVPrice, mPrices.ZavPrice,
                              mPrices.ZavVPrice, mPrices.nRec, mKlPrice.nRec);
      nacV = GetNacenPriceVAL(mPrices.ZavPrice, mPrices.ZavVPrice, mPrices.SrPrice, mPrices.SrVPrice, mPrices.ZavPrice,
                              mPrices.ZavVPrice, mPrices.nRec, mKlPrice.nRec);
      countR = GetCountPriceNDE(mKlPrice.nRec, mPrices.nRec, parseF-loat(mPrices.ZavPrice) + parseFloat(nacR), parseF-loat(mPrices.ZavVPrice) + parseFloat(nacV), false);
      countV = GetCountPriceVAL(mKlPrice.nRec, mPrices.nRec, parseF-loat(mPrices.ZavPrice) + parseFloat(nacR), parseF-loat(mPrices.ZavVPrice) + parseFloat(nacV), false);
      mPrices.Price = countR;
      mPrices.SumVal = countV;
    }
    else
      {
        ClearLogPrice(mPrices.nRec, CurKlPrice());
        countR = GetCountPriceNDE(mKlPrice.nRec, mPrices.nRec, Zav-Price, ZavVPrice, false);
        countV = GetCountPriceVAL(mKlPrice.nRec, mPrices.nRec, Zav-Price, ZavVPrice, false);
        nacR = GetNacenPriceNDE(CountR, CountV, mPrices.SrPrice, mPrices.SrVPrice, mPrices.ZavPrice,
                              mPrices.ZavVPrice, mPrices.nRec, mKlPrice.nRec);
        nacV = GetNacenPriceVAL(CountR, CountV, mPrices.SrPrice, mPrices.SrVPrice, ZavPrice,
                              ZavVPrice, mPrices.nRec, mKlPrice.nRec);
        mPrices.Price = (countR + nacR) / mKatOtpEd.Koef;
        mPrices.SumVal = (countV + nacV) / mKatOtpEd.Koef;
        mPrices.ZavPrice = ZavPrice;
        mPrices.ZavVPrice = ZavVPrice;
      }
  mPrices.rewrite();
  }
Ответить