JavaScript coding of three tier discount levels

lewiso69254278

14-10-2019

Hello,

I have scripted for a three tiered discount order form, which, works with the following code:

if (xfa.resolveNode("subTotal.numTotalUnits").rawValue < xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold1").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subBelow.numUnitBelow").rawValue;

}

else if (xfa.resolveNode("subTotal.numTotalUnits").rawValue >= xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold1").rawValue && xfa.resolveNode("subTotal.numTotalUnits").rawValue < xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold2").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount1").rawValue;

}

else if (xfa.resolveNode("subTotal.numTotalUnits").rawValue >= xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold2").rawValue && xfa.resolveNode("subTotal.numTotalUnits").rawValue < xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold3").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount2").rawValue;

}

else if (xfa.resolveNode("subTotal.numTotalUnits").rawValue >= xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold3").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount3").rawValue;

}

However, the issue is that while the code above works, it only works when there are three discount levels and at that time calculates appropriately.

The three discount levels would not apply to all items ordered, therefore; I need a method to only calculate if the subsequent discount level is entered in the field.

I have tried null verification checks, however, I am not able to get it working. The null verification check should only be on the subsequent discount level, and, if present the next level needs to be checked prior to attempting a verification of the TotalUnits.

Any help would, of course, be very welcome.

Thank you in advance,

Lewis

Accepted Solutions (1)

Accepted Solutions (1)

_Bruce_Robertson

MVP

16-10-2019

Hi Lewis,

Sounds like you do need a null test, maybe something like;

var numTotalUnits = xfa.resolveNode("subTotal.numTotalUnits");

var numThreshold1 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold1");

var numThreshold2 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold2");

var numThreshold3 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold3");

if (numTotalUnits.rawValue < numThreshold1.rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subBelow.numRegularPrice").rawValue;

}

else if (!numThreshold2.isNull && (numTotalUnits.rawValue >= numThreshold1.rawValue && numTotalUnits.rawValue < numThreshold2.rawValue)){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount1").rawValue;

}

else if (!numThreshold2.isNull && !numThreshold3.isNull && (numTotalUnits.rawValue >= numThreshold2.rawValue && numTotalUnits.rawValue < numThreshold3.rawValue)){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount2").rawValue;

}

else if (!numThreshold3.isNull && (numTotalUnits.rawValue >= numThreshold3.rawValue)){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount3").rawValue;

}

Regards

Bruce

Answers (3)

Answers (3)

lewiso69254278

22-10-2019

Spoke too soon, had to make amendments to the code, need it to trigger based on the three tiers, have this so far:

var numTotalUnits = xfa.resolveNode("subTotal.numTotalUnits");

var numThreshold1 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold1");

var numThreshold2 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold2");

var numThreshold3 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold3");

var numRegularPrice = xfa.resolveNode("this.parent.parent.parent.subControls.subBelow.numRegularPrice");

var numDiscount1 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount1");

var numDiscount2 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount2");

var numDiscount3 = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount3");

if (numThreshold1.rawValue == null || numThreshold1.rawValue == ""){

this.rawValue = numRegularPrice.rawValue;

}

else if (numThreshold1.rawValue != null && numDiscount1.rawValue != null && numThreshold2.rawValue == null || numThreshold2.rawValue == "" && numDiscount2.rawValue == null || numDiscount2.rawValue == "" && (numTotalUnits.rawValue < numThreshold1.rawValue)){

this.rawValue = numRegularPrice.rawValue;

}

else if (numThreshold1.rawValue != null && numDiscount1.rawValue != null && numThreshold2.rawValue == null || numThreshold2.rawValue == "" && numDiscount2.rawValue == null || numDiscount2.rawValue == "" && (numTotalUnits.rawValue >= numThreshold1.rawValue)){

this.rawValue = numDiscount1.rawValue;

}

else if (numThreshold1.rawValue != null && numDiscount1.rawValue != null && numThreshold2.rawValue != null && numDiscount2.rawValue != null && numThreshold3.rawValue == null || numThreshold3.rawValue == "" && numDiscount3.rawValue == null || numDiscount3.rawValue == "" && (numTotalUnits.rawValue >= numThreshold1.rawValue && numTotalUnits.rawValue < numThreshold2.rawValue)){

this.rawVaue = numDiscount1.rawValue;

}

else if (numThreshold1.rawValue != null && numDiscount1.rawValue != null && numThreshold2.rawValue != null && numDiscount2.rawValue != null && numThreshold3.rawValue == null || numThreshold3.rawValue == "" && numDiscount3.rawValue == null || numDiscount3.rawValue == "" && (numTotalUnits.rawValue >= numThreshold2.rawValue)){

this.rawValue = numDiscount2.rawValue;

}

else if (numThreshold1.rawValue != null && numDiscount1.rawValue != null && numThreshold2.rawValue != null && numDiscount2.rawValue != null && numThreshold3.rawValue != null && numDiscount3.rawValue != null && (numTotalUnits.rawValue >= numThreshold2.rawValue && numTotalUnits.rawValue < numThreshold3.rawValue)){

this.rawValue = numDiscount2.rawValue;

}

else if (numThreshold1.rawValue != null && numDiscount1.rawValue != null && numThreshold2.rawValue != null && numDiscount2.rawValue != null && numThreshold3.rawValue != null && numDiscount3.rawValue != null && (numTotalUnits.rawValue >= numThreshold3.rawValue)){

this.rawValue = numDiscount3.rawValue;

}

So, in the above I need it to trigger after verifying each trigger level and as the discounts change.

The above seems to work well when all three are populated, but, does not work completely as expected for when the discounts are of only 2 levels or 1 level.

Any additional assistance is greatly appreciated.

Lewis

lewiso69254278

15-10-2019

I have modified slightly the code with a name change to a field in order to better display the requirement:

if (xfa.resolveNode("subTotal.numTotalUnits").rawValue < xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold1").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subBelow.numRegularPrice").rawValue;

}

else if (xfa.resolveNode("subTotal.numTotalUnits").rawValue >= xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold1").rawValue && xfa.resolveNode("subTotal.numTotalUnits").rawValue < xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold2").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount1").rawValue;

}

else if (xfa.resolveNode("subTotal.numTotalUnits").rawValue >= xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold2").rawValue && xfa.resolveNode("subTotal.numTotalUnits").rawValue < xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold3").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount2").rawValue;

}

else if (xfa.resolveNode("subTotal.numTotalUnits").rawValue >= xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numThreshold3").rawValue){

this.rawValue = xfa.resolveNode("this.parent.parent.parent.subControls.subVolume.numDiscount3").rawValue;

}

You will notice within the first "if" statement the value is now set to "numRegularPrice".

Any help would be well received.

Thank you,

Lewis