diff --git a/src/Informedica.GenForm.Lib/DoseRule.fs b/src/Informedica.GenForm.Lib/DoseRule.fs index bf8b73a..41cd8ed 100644 --- a/src/Informedica.GenForm.Lib/DoseRule.fs +++ b/src/Informedica.GenForm.Lib/DoseRule.fs @@ -831,7 +831,7 @@ cannot map {r} |> fromTupleInclIncl du NormQuantityAdjust = r.NormQtyAdj - |> ValueUnit.withOptionalUnit duAdj + |> ValueUnit.withOptSingleAndOptUnit duAdj QuantityAdjust = (r.MinQtyAdj, r.MaxQtyAdj) |> fromTupleInclIncl duAdj @@ -840,7 +840,7 @@ cannot map {r} |> fromTupleInclIncl duTime NormPerTimeAdjust = r.NormPerTimeAdj - |> ValueUnit.withOptionalUnit duAdjTime + |> ValueUnit.withOptSingleAndOptUnit duAdjTime PerTimeAdjust = (r.MinPerTimeAdj, r.MaxPerTimeAdj) |> fromTupleInclIncl duAdjTime diff --git a/src/Informedica.GenForm.Lib/RenalRule.fs b/src/Informedica.GenForm.Lib/RenalRule.fs index 6592fcc..97fab4e 100644 --- a/src/Informedica.GenForm.Lib/RenalRule.fs +++ b/src/Informedica.GenForm.Lib/RenalRule.fs @@ -126,12 +126,12 @@ module RenalRule = Substance = get "Substance" MinQty = get "MinQty" |> toBrOpt MaxQty = get "MaxQty" |> toBrOpt - NormQtyAdj = get "NormQtyAdj" |> String.replace " - " ";" |> toBrOpt + NormQtyAdj = get "NormQtyAdj" |> String.replace " - " ";" |> BigRational.toBrs MinQtyAdj = get "MinQtyAdj" |> toBrOpt MaxQtyAdj = get "MaxQtyAdj" |> toBrOpt MinPerTime = get "MinPerTime" |> toBrOpt MaxPerTime = get "MaxPerTime" |> toBrOpt - NormPerTimeAdj = get "NormPerTimeAdj" |> String.replace " - " ";" |> toBrOpt + NormPerTimeAdj = get "NormPerTimeAdj" |> String.replace " - " ";" |> BigRational.toBrs MinPerTimeAdj = get "MinPerTimeAdj" |> toBrOpt MaxPerTimeAdj = get "MaxPerTimeAdj" |> toBrOpt MinRate = get "MinRate" |> toBrOpt @@ -175,7 +175,7 @@ module RenalRule = |> EGFR |> Some - let fromData (data : {| AdjustUnit: string; ContDial: string; DoseRed: string; DoseText: string; DoseType: string; DoseUnit: string; FreqUnit: string; Frequencies: BigRational array; Generic: string; Indication: string; IntDial: string; IntervalUnit: string; MaxAge: BigRational option; MaxGFR: BigRational option; MaxInterval: BigRational option; MaxPerTime: BigRational option; MaxPerTimeAdj: BigRational option; MaxQty: BigRational option; MaxQtyAdj: BigRational option; MaxRate: BigRational option; MaxRateAdj: BigRational option; MinAge: BigRational option; MinGFR: BigRational option; MinInterval: BigRational option; MinPerTime: BigRational option; MinPerTimeAdj: BigRational option; MinQty: BigRational option; MinQtyAdj: BigRational option; MinRate: BigRational option; MinRateAdj: BigRational option; NormPerTimeAdj: BigRational option; NormQtyAdj: BigRational option; PerDial: string; RateUnit: string; Route: string; Source: string; Substance: string |} array) = + let fromData (data : {| AdjustUnit: string; ContDial: string; DoseRed: string; DoseText: string; DoseType: string; DoseUnit: string; FreqUnit: string; Frequencies: BigRational array; Generic: string; Indication: string; IntDial: string; IntervalUnit: string; MaxAge: BigRational option; MaxGFR: BigRational option; MaxInterval: BigRational option; MaxPerTime: BigRational option; MaxPerTimeAdj: BigRational option; MaxQty: BigRational option; MaxQtyAdj: BigRational option; MaxRate: BigRational option; MaxRateAdj: BigRational option; MinAge: BigRational option; MinGFR: BigRational option; MinInterval: BigRational option; MinPerTime: BigRational option; MinPerTimeAdj: BigRational option; MinQty: BigRational option; MinQtyAdj: BigRational option; MinRate: BigRational option; MinRateAdj: BigRational option; NormPerTimeAdj: BigRational[]; NormQtyAdj: BigRational[]; PerDial: string; RateUnit: string; Route: string; Source: string; Substance: string |} array) = data |> Array.filter (fun r -> r.Generic <> "" && @@ -295,10 +295,10 @@ module RenalRule = (r.Substance |> LimitTarget.SubstanceLimitTarget) (r.DoseRed |> DoseReduction.fromString) ((r.MinQty, r.MaxQty) |> fromTupleInclIncl du) - (r.NormQtyAdj |> ValueUnit.withOptionalUnit duAdj) + (r.NormQtyAdj |> ValueUnit.withArrayAndOptUnit duAdj) ((r.MinQtyAdj, r.MaxQtyAdj) |> fromTupleInclIncl duAdj) ((r.MinPerTime, r.MaxPerTime) |> fromTupleInclIncl duTime) - (r.NormPerTimeAdj |> ValueUnit.withOptionalUnit duAdjTime) + (r.NormPerTimeAdj |> ValueUnit.withArrayAndOptUnit duAdjTime) ((r.MinPerTimeAdj, r.MaxPerTimeAdj) |> fromTupleInclIncl duAdjTime) ((r.MinRate, r.MaxRate) |> fromTupleInclIncl duRate) ((r.MinRateAdj, r.MaxRateAdj) |> fromTupleInclIncl duAdjRate) @@ -468,6 +468,7 @@ module RenalRule = doseRule.Frequencies |> Option.map (fun f -> vu / f) ) + printfn $"== going to apply:\n{rl}\nto:\n{dl}\nwith normQtyAdj:\n{normQtyAdj}\n\n" { dl with Quantity = dl.Quantity @@ -514,5 +515,7 @@ module RenalRule = rl.RateAdjust } + |> fun x -> + printfn $"== result:\n{x}"; x ) } diff --git a/src/Informedica.GenForm.Lib/Utils.fs b/src/Informedica.GenForm.Lib/Utils.fs index 2f7e61f..f94792b 100644 --- a/src/Informedica.GenForm.Lib/Utils.fs +++ b/src/Informedica.GenForm.Lib/Utils.fs @@ -176,7 +176,7 @@ module Utils = let ageFullTerm = 37N |> ValueUnit.singleWithUnit Units.Time.week - let withOptionalUnit u v = + let withOptSingleAndOptUnit u v = match v, u with | Some v, Some u -> v @@ -185,6 +185,17 @@ module Utils = | _ -> None + let withArrayAndOptUnit u v = + if v |> Array.isEmpty then None + else + match u with + | Some u -> + v + |> ValueUnit.withUnit u + |> Some + | _ -> None + + let toString prec vu = ValueUnit.toStringDecimalDutchShortWithPrec prec vu |> String.replace ";" ", "