NetSuite - OnValidateLine не работает

Моя функция проверки строки ниже работает только при втором нажатии кнопки «Добавить». Итак, если сумма равна 500, а я установил скидку на 100, при нажатии кнопки «Добавить» она должна быть 400. Это не работает. Если я нажму на строку еще раз, скидка будет применена дважды - сумма станет равной 300. Как мне решить эту проблему?

function OnValidateLine(type, name) {
  var count = nlapiGetLineItemCount('expense')
  var total = nlapiGetFieldValue('usertotal')

  for (var x = 1; x <= count; x++) {
    var amount = nlapiGetCurrentLineItemValue('expense', 'amount');
    var discount = nlapiGetCurrentLineItemValue('expense', 'custcolptc_discount');
    if (discount) {
      nlapiSetCurrentLineItemValue('expense', 'amount', amount - discount)
    }
    return true;
  }
  return true;
}


person MG2016    schedule 30.08.2016    source источник
comment
Есть ли причина не использовать типичные скидки NetSuite вместо кодирования для этого? Они не применимы к строкам расходов? Похоже, что здесь не происходит никакой фактической проверки, поэтому вы не рассматривали возможность переноса этого на fieldChanged вместо этого? Вы можете инициировать обновление каждый раз, когда изменяется поле Сумма или Скидка, хотя, похоже, будет гораздо больше сценариев и вариантов использования, которые вам придется обрабатывать с помощью этой логики. .   -  person erictgrubaugh    schedule 30.08.2016
comment
В NetSuite нет функции скидок для счетов поставщиков, как для счетов-фактур, поэтому мне пришлось кодировать это. Мне нужно применить скидку на уровне строки. Некоторые из наших продавцов предлагают нам скидки, поэтому нам нужен способ уменьшить это из счета. Мой код работает, но только со 2-й линии на подопечных. ОК - попробую поле изменено.   -  person MG2016    schedule 30.08.2016
comment
Только что заметил, что вы никогда не читаете x или count. Вам вообще не нужен цикл for, поскольку вы изменяете только одну строку.   -  person erictgrubaugh    schedule 30.08.2016


Ответы (1)


На самом деле вы ничего не делаете со своим циклом.

Кроме того, то, как вы это делаете, сопряжено с проблемами.

Вероятно, вам следует сделать это в событии recalc, а не в событии проверки строки.

Если бы я занимался этим, я бы, как правило, управлял «синтетической» строкой расходов, которая представляла собой сумму рассчитанных скидок. То, как вы это делаете в настоящее время, если кто-то изменит описание расходов, приведет к тому, что скидка будет применена дважды. Если вы используете строку скидок, вы просто суммируете скидки и добавляете или обновляете строку скидок.

Как правило, для клиентского сценария вам потребуется перемещать указатель для каждой строки, на которую вы смотрите. В непроверенном примере ниже поле «id?» будут столбцами памятки или учетной записи (вам все равно придется установить учетную запись):

var totalDiscount = 0;
var discountExpenseAt = 0;
for(var i = nlapiGetLineItemCount('expense'); i> 0; i--){
   if(nlapiGetLineItemValue('expense', 'id field?', i) == 'discount identifier') {
discountExpenseAt = i;
continue;
}
   totalDiscount += parseFloat(nlapiGetLineItemValue('expense', 'custcolptc_discount', i)) ||0;
}
if(totalDiscount) {
if(discountExpenseAt){
nlapiSelectCurrentLineItem('expense', discountExpenseAt);
nlapiSetCurrentLineItemValue('expense', 'amount', totalDiscount.toFixed(2));
nlapiSetCurrentLineItemValue('expense', 'id field?', 'discount identifier');
nlapiCommitCurrentLineItem('expense');
}
person bknights    schedule 30.08.2016
comment
Спасибо - я обновил свой код и удалил цикл, который, как я не осознавал, ничего не делал! Я думаю, что у меня есть то, что мне нужно сейчас - спасибо за фрагмент кода. - person MG2016; 31.08.2016