Author: fanningpj
Date: Fri Feb 11 00:12:51 2022
New Revision: 1897953

URL: http://svn.apache.org/viewvc?rev=1897953&view=rev
Log:
[bug-65879] add WORKDAY.INTL function

Added:
    
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java
      - copied, changed from r1897948, 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
Modified:
    
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
    
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
    
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java

Modified: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java?rev=1897953&r1=1897952&r2=1897953&view=diff
==============================================================================
--- 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java 
(original)
+++ 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/AnalysisToolPak.java 
Fri Feb 11 00:12:51 2022
@@ -184,6 +184,7 @@ public final class AnalysisToolPak imple
         r(m, "TEXTJOIN", TextJoinFunction.instance);
         r(m, "WEEKNUM", WeekNum.instance);
         r(m, "WORKDAY", WorkdayFunction.instance);
+        r(m, "WORKDAY.INTL", WorkdayIntlFunction.instance);
         r(m, "XIRR", null);
         r(m, "XLOOKUP", XLookupFunction.instance);
         r(m, "XMATCH", XMatchFunction.instance);

Modified: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java?rev=1897953&r1=1897952&r2=1897953&view=diff
==============================================================================
--- 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
 (original)
+++ 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayCalculator.java
 Fri Feb 11 00:12:51 2022
@@ -89,6 +89,10 @@ public class WorkdayCalculator {
         // enforcing singleton
     }
 
+    public Set<Integer> getValidWeekendTypes() {
+        return weekendTypeMap.keySet();
+    }
+
     /**
      * Calculate how many workdays are there between a start and an end date, 
as excel representations, considering a range of holidays.
      *

Modified: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java?rev=1897953&r1=1897952&r2=1897953&view=diff
==============================================================================
--- 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java 
(original)
+++ 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java 
Fri Feb 11 00:12:51 2022
@@ -46,8 +46,8 @@ final class WorkdayFunction implements F
     }
 
     /**
-     * Evaluate for WORKDAY. Given a date, a number of days and a optional 
date or interval of holidays, determines which date it is past
-     * number of parametrized workdays.
+     * Evaluate for WORKDAY. Given a date, a number of days and an optional 
date or interval of holidays, determines which date it is past
+     * number of parameterized workdays.
      *
      * @return {@link ValueEval} with date as its value.
      */

Copied: 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java
 (from r1897948, 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java)
URL: 
http://svn.apache.org/viewvc/poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java?p2=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java&p1=poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java&r1=1897948&r2=1897953&rev=1897953&view=diff
==============================================================================
--- 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayFunction.java 
(original)
+++ 
poi/trunk/poi/src/main/java/org/apache/poi/ss/formula/atp/WorkdayIntlFunction.java
 Fri Feb 11 00:12:51 2022
@@ -26,33 +26,35 @@ import org.apache.poi.ss.formula.functio
 import org.apache.poi.ss.usermodel.DateUtil;
 
 /**
- * Implementation of Excel 'Analysis ToolPak' function WORKDAY()<br>
+ * Implementation of Excel 'Analysis ToolPak' function WORKDAY.INTL()<br>
  * Returns the date past a number of workdays beginning at a start date, 
considering an interval of holidays. A workday is any non
  * saturday/sunday date.
  * <p>
  * <b>Syntax</b><br>
- * <b>WORKDAY</b>(<b>startDate</b>, <b>days</b>, holidays)
+ * <b>WORKDAY</b>(<b>startDate</b>, <b>days</b>, weekendType, holidays)
  * <p>
+ * 
https://support.microsoft.com/en-us/office/workday-intl-function-a378391c-9ba7-4678-8a39-39611a9bf81d
  */
-final class WorkdayFunction implements FreeRefFunction {
+final class WorkdayIntlFunction implements FreeRefFunction {
 
-    public static final FreeRefFunction instance = new 
WorkdayFunction(ArgumentsEvaluator.instance);
+    public static final FreeRefFunction instance = new 
WorkdayIntlFunction(ArgumentsEvaluator.instance);
 
     private ArgumentsEvaluator evaluator;
 
-    private WorkdayFunction(ArgumentsEvaluator anEvaluator) {
+    private WorkdayIntlFunction(ArgumentsEvaluator anEvaluator) {
         // enforces singleton
         this.evaluator = anEvaluator;
     }
 
     /**
-     * Evaluate for WORKDAY. Given a date, a number of days and a optional 
date or interval of holidays, determines which date it is past
-     * number of parametrized workdays.
+     * Evaluate for WORKDAY.INTL. Given a date, a number of days, an optional 
weekend type
+     * and an optional date or interval of holidays, determines which date it 
is past
+     * number of parameterized workdays.
      *
      * @return {@link ValueEval} with date as its value.
      */
     public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) 
{
-        if (args.length < 2 || args.length > 3) {
+        if (args.length < 2 || args.length > 4) {
             return ErrorEval.VALUE_INVALID;
         }
 
@@ -61,13 +63,21 @@ final class WorkdayFunction implements F
 
         double start;
         int days;
+        int weekendType = 1;
         double[] holidays;
         try {
             start = this.evaluator.evaluateDateArg(args[0], srcCellRow, 
srcCellCol);
             days = (int) Math.floor(this.evaluator.evaluateNumberArg(args[1], 
srcCellRow, srcCellCol));
-            ValueEval holidaysCell = args.length == 3 ? args[2] : null;
+            if (args.length >= 3) {
+                weekendType = (int) this.evaluator.evaluateNumberArg(args[2], 
srcCellRow, srcCellCol);
+                if 
(!WorkdayCalculator.instance.getValidWeekendTypes().contains(weekendType)) {
+                   return ErrorEval.NUM_ERROR;
+                }
+            }
+            ValueEval holidaysCell = args.length >= 4 ? args[3] : null;
             holidays = this.evaluator.evaluateDatesArg(holidaysCell, 
srcCellRow, srcCellCol);
-            return new 
NumberEval(DateUtil.getExcelDate(WorkdayCalculator.instance.calculateWorkdays(start,
 days, holidays)));
+            return new NumberEval(DateUtil.getExcelDate(
+                    WorkdayCalculator.instance.calculateWorkdays(start, days, 
weekendType, holidays)));
         } catch (EvaluationException e) {
             return ErrorEval.VALUE_INVALID;
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to