В таких случаях для увеличения гибкости расчетов предусмотрена возможность применения для расчета пользовательских скриптов, написанных на двух языках — Vip for application и Java-Script.
Для выбора исполняемого скрипта или для редактирования существующего пользователь должен выбрать в меню Прайс-листы - Пересчет по скрипту один из подпунктов, в зависимости от используемого диалекта. После выбора пункта меню Прайс-листы - Пересчет по скрипту - Vip for application появляется окно выбора (Рис. 2), которое содержит список демонстрационных скриптов, поставляемых по умолчанию. Выполнить скрипт можно стандартными действиями (Double Click или нажатием Enter).
Редактирование скрипта осуществляется в отдельном окне (Рис. 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).
На Рис. 5 .. 10 приведены свойства классов, поставляемых вместе с примерами алгоритмов.
- Рис. 5. Свойства класса Prices
Рис. 6. Свойства класса KLPrices
Рис. 7. Свойства класса KatMC
Рис. 8. Свойства класса KatUsl
Рис. 9. Свойства класса KatParty
Рис. 10. Свойства класса SpOrder
Приложение: примеры скриптов на 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();
}