diff --git a/base/src/expressions/parser/static_analysis.rs b/base/src/expressions/parser/static_analysis.rs index 6253d82..97840c2 100644 --- a/base/src/expressions/parser/static_analysis.rs +++ b/base/src/expressions/parser/static_analysis.rs @@ -876,6 +876,8 @@ fn get_function_args_signature(kind: &Function, arg_count: usize) -> Vec args_signature_scalars(arg_count, 0, 1), Function::Cell => args_signature_scalars(arg_count, 1, 1), Function::Info => args_signature_scalars(arg_count, 1, 1), + Function::Accrint => args_signature_scalars(arg_count, 6, 2), + Function::Accrintm => args_signature_scalars(arg_count, 4, 1), } } @@ -1139,5 +1141,7 @@ fn static_analysis_on_function(kind: &Function, args: &[Node]) -> StaticResult { Function::Sheets => scalar_arguments(args), Function::Cell => scalar_arguments(args), Function::Info => scalar_arguments(args), + Function::Accrint => scalar_arguments(args), + Function::Accrintm => scalar_arguments(args), } } diff --git a/base/src/functions/financial.rs b/base/src/functions/financial.rs index 8e11ee4..39990b7 100644 --- a/base/src/functions/financial.rs +++ b/base/src/functions/financial.rs @@ -1830,4 +1830,14 @@ impl Model { CalcResult::Number(rate * (cost - result)) } + + // ACCRINT(issue, first_interest, settlement, rate, par, frequency, [basis], [calc_method]) + pub(crate) fn fn_accrint(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + todo!() + } + + // ACCRINTM(issue, settlement, rate, par, [basis]) + pub(crate) fn fn_accrintm(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { + todo!() + } } diff --git a/base/src/functions/mod.rs b/base/src/functions/mod.rs index 53a2868..671ecb3 100644 --- a/base/src/functions/mod.rs +++ b/base/src/functions/mod.rs @@ -217,6 +217,8 @@ pub enum Function { Isoweeknum, // Financial + Accrint, + Accrintm, Cumipmt, Cumprinc, Db, @@ -313,7 +315,7 @@ pub enum Function { } impl Function { - pub fn into_iter() -> IntoIter { + pub fn into_iter() -> IntoIter { [ Function::And, Function::False, @@ -571,6 +573,8 @@ impl Function { Function::Cell, Function::Info, Function::Sheets, + Function::Accrint, + Function::Accrintm, ] .into_iter() } @@ -908,6 +912,8 @@ impl Function { "CELL" => Some(Function::Cell), "INFO" => Some(Function::Info), "SHEETS" | "_XLFN.SHEETS" => Some(Function::Sheets), + "ACCRINT" => Some(Function::Accrint), + "ACCRINTM" => Some(Function::Accrintm), _ => None, } @@ -1174,6 +1180,9 @@ impl fmt::Display for Function { Function::Cell => write!(f, "CELL"), Function::Info => write!(f, "INFO"), Function::Sheets => write!(f, "SHEETS"), + + Function::Accrint => write!(f, "ACCRINT"), + Function::Accrintm => write!(f, "ACCRINTM"), } } } @@ -1458,6 +1467,8 @@ impl Model { Function::Cell => self.fn_cell(args, cell), Function::Info => self.fn_info(args, cell), Function::Sheets => self.fn_sheets(args, cell), + Function::Accrint => self.fn_accrint(args, cell), + Function::Accrintm => self.fn_accrintm(args, cell), } } } diff --git a/base/src/test/mod.rs b/base/src/test/mod.rs index f48604f..3f59253 100644 --- a/base/src/test/mod.rs +++ b/base/src/test/mod.rs @@ -61,6 +61,7 @@ mod test_number_format; mod test_arrays; mod test_escape_quotes; mod test_extend; +mod test_fn_accrint; mod test_fn_fv; mod test_fn_round; mod test_fn_type; diff --git a/base/src/test/test_fn_accrint.rs b/base/src/test/test_fn_accrint.rs new file mode 100644 index 0000000..a33bbd5 --- /dev/null +++ b/base/src/test/test_fn_accrint.rs @@ -0,0 +1,23 @@ +#![allow(clippy::unwrap_used)] + +use crate::test::util::new_empty_model; + +#[test] +fn fn_average_accrint_simple_cases() { + let mut model = new_empty_model(); + // ACCRINT(issue, first_interest, settlement, rate, par, frequency, [basis], [calc_method]) + model._set("A1", "=ACCRINT(39508, 39691, 39569, 0.1, 1000, 2, 0)"); + model._set( + "A2", + "=ACCRINT(DATE(2008, 3, 5), 39691, 39569, 0.1, 1000, 2, 0, FALSE)", + ); + model._set( + "A3", + "=ACCRINT(DATE(2008, 4, 5), 39691, 39569, 0.1, 1000, 2, 0, TRUE)", + ); + model.evaluate(); + + assert_eq!(model._get_text("A1"), *"16.666666667"); + assert_eq!(model._get_text("A2"), *"15.555555556"); + assert_eq!(model._get_text("A3"), *"7.222222222"); +} diff --git a/xlsx/tests/calc_tests/ACCRINT_ACCRINTM.xlsx b/xlsx/tests/calc_tests/ACCRINT_ACCRINTM.xlsx new file mode 100644 index 0000000..258d35e Binary files /dev/null and b/xlsx/tests/calc_tests/ACCRINT_ACCRINTM.xlsx differ