Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
226 changes: 91 additions & 135 deletions src/Informedica.GenORDER.Lib/Api.fs

Large diffs are not rendered by default.

71 changes: 44 additions & 27 deletions src/Informedica.GenORDER.Lib/Medication.fs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ module Medication =
/// <param name="norm">A sequence of big rationals for normalization.</param>
/// <param name="minMax">The MinMax record containing constraints.</param>
/// <param name="dto">The Variable dto to apply constraints to.</param>
let setConstraints
let setMinMaxConstraints
(norm : ValueUnit option)
(minMax : MinMax)
(dto: Informedica.GenSolver.Lib.Variable.Dto.Dto) =
Expand Down Expand Up @@ -537,13 +537,13 @@ module Medication =

/// Apply solution constraints to a component
let setComponentSolutionConstraints (cmpDto : Order.Orderable.Component.Dto.Dto) (sl : SolutionLimit) =
cmpDto.OrderableQuantity.Constraints |> setConstraints sl.Quantities sl.Quantity
cmpDto.OrderableConcentration.Constraints |> setConstraints None sl.Concentration
cmpDto.OrderableQuantity.Constraints |> setMinMaxConstraints sl.Quantities sl.Quantity
cmpDto.OrderableConcentration.Constraints |> setMinMaxConstraints None sl.Concentration

/// Apply solution constraints to an item
let setItemSolutionConstraints (itmDto : Order.Orderable.Item.Dto.Dto) (sl : SolutionLimit) =
itmDto.OrderableQuantity.Constraints |> setConstraints sl.Quantities sl.Quantity
itmDto.OrderableConcentration.Constraints |> setConstraints None sl.Concentration
itmDto.OrderableQuantity.Constraints |> setMinMaxConstraints sl.Quantities sl.Quantity
itmDto.OrderableConcentration.Constraints |> setMinMaxConstraints None sl.Concentration

/// Set specific constraints for timed orders
let setTimedOrderConstraints (orbDto : Order.Orderable.Dto.Dto) =
Expand All @@ -570,19 +570,19 @@ module Medication =
/// Set item dose constraints based on order type
let setItemDoseConstraints (itmDto : Order.Orderable.Item.Dto.Dto) (d : Medication) (s : SubstanceItem) =
let setDoseRate (dl : DoseLimit) =
itmDto.Dose.Rate.Constraints |> setConstraints None dl.Rate
itmDto.Dose.RateAdjust.Constraints |> setConstraints None dl.RateAdjust
itmDto.Dose.Rate.Constraints |> setMinMaxConstraints None dl.Rate
itmDto.Dose.RateAdjust.Constraints |> setMinMaxConstraints None dl.RateAdjust

let setDoseQty (dl : DoseLimit) =
let zero = 0N |> createSingleValueUnitDto dl.DoseUnit

if dl.Quantity |> MinMax.isEmpty then itmDto.Dose.Quantity.Constraints.MinOpt <- zero
else
itmDto.Dose.Quantity.Constraints |> setConstraints None dl.Quantity
itmDto.Dose.Quantity.Constraints |> setMinMaxConstraints None dl.Quantity

itmDto.Dose.QuantityAdjust.Constraints |> setConstraints dl.NormQuantityAdjust dl.QuantityAdjust
itmDto.Dose.PerTime.Constraints |> setConstraints None dl.PerTime
itmDto.Dose.PerTimeAdjust.Constraints |> setConstraints dl.NormPerTimeAdjust dl.PerTimeAdjust
itmDto.Dose.QuantityAdjust.Constraints |> setMinMaxConstraints dl.NormQuantityAdjust dl.QuantityAdjust
itmDto.Dose.PerTime.Constraints |> setMinMaxConstraints None dl.PerTime
itmDto.Dose.PerTimeAdjust.Constraints |> setMinMaxConstraints dl.NormPerTimeAdjust dl.PerTimeAdjust

match d.OrderType with
| AnyOrder | ProcessOrder -> ()
Expand Down Expand Up @@ -642,24 +642,24 @@ module Medication =

let setDoseRate (dl : DoseLimit) =
if dl.Rate |> MinMax.isEmpty |> not then
cmpDto.Dose.Rate.Constraints |> setConstraints None dl.Rate
cmpDto.Dose.Rate.Constraints |> setMinMaxConstraints None dl.Rate
if dl.RateAdjust |> MinMax.isEmpty |> not then
cmpDto.Dose.RateAdjust.Constraints |> setConstraints None dl.RateAdjust
cmpDto.Dose.RateAdjust.Constraints |> setMinMaxConstraints None dl.RateAdjust

let setDoseQty (dl : DoseLimit) =
if dl.Quantity |> MinMax.isEmpty |> not then
cmpDto.Dose.Quantity.Constraints |> setConstraints None dl.Quantity
cmpDto.Dose.Quantity.Constraints |> setMinMaxConstraints None dl.Quantity
else
// dose quantities can only add up with the same unit
// so this makes sure a dose quantity has a unit and
// can be included in to the addition equation
cmpDto.Dose.Quantity.Constraints.MinOpt <- zero
if dl.QuantityAdjust |> MinMax.isEmpty |> not || dl.NormQuantityAdjust |> Option.isSome then
cmpDto.Dose.QuantityAdjust.Constraints |> setConstraints dl.NormQuantityAdjust dl.QuantityAdjust
cmpDto.Dose.QuantityAdjust.Constraints |> setMinMaxConstraints dl.NormQuantityAdjust dl.QuantityAdjust
if dl.PerTime |> MinMax.isEmpty |> not then
cmpDto.Dose.PerTime.Constraints |> setConstraints None dl.PerTime
cmpDto.Dose.PerTime.Constraints |> setMinMaxConstraints None dl.PerTime
if dl.PerTimeAdjust |> MinMax.isEmpty |> not || dl.NormPerTimeAdjust |> Option.isSome then
cmpDto.Dose.PerTimeAdjust.Constraints |> setConstraints dl.NormPerTimeAdjust dl.PerTimeAdjust
cmpDto.Dose.PerTimeAdjust.Constraints |> setMinMaxConstraints dl.NormPerTimeAdjust dl.PerTimeAdjust

match d.OrderType with
| AnyOrder | ProcessOrder -> ()
Expand Down Expand Up @@ -703,7 +703,7 @@ module Medication =
)
)

orbDto.DoseCount.Constraints |> setConstraints None d.DoseCount
orbDto.DoseCount.Constraints |> setMinMaxConstraints None d.DoseCount

match d.Quantities with
| None ->
Expand Down Expand Up @@ -732,6 +732,23 @@ module Medication =
| Some [ _; tu ] -> Some tu
| _ -> None

let incr =
match orderableUnit with
| None -> None
| Some ou ->
d.Components
|> List.choose _.Divisible
|> function
| [] -> None
| divs ->
divs
|> List.min
|> fun br -> 1N / br
|> ValueUnit.singleWithUnit ou
|> Some
|> vuToDto


let setOrbDoseRate (dl : DoseLimit option) =

match rateUnit with
Expand All @@ -752,10 +769,13 @@ module Medication =
match dl with
| None -> ()
| Some dl ->
orbDto.Dose.Rate.Constraints |> setConstraints None dl.Rate
orbDto.Dose.RateAdjust.Constraints |> setConstraints None dl.RateAdjust
orbDto.Dose.Rate.Constraints |> setMinMaxConstraints None dl.Rate
orbDto.Dose.RateAdjust.Constraints |> setMinMaxConstraints None dl.RateAdjust

let setOrbDoseQty isOnce (dl : DoseLimit option) =
// set a default increment based on the smallest product component increment
orbDto.Dose.Quantity.Constraints.IncrOpt <- incr

match dl with
| None ->
match orderableUnit with
Expand All @@ -773,8 +793,8 @@ module Medication =
| _ -> ()

| Some dl ->
orbDto.Dose.Quantity.Constraints |> setConstraints None dl.Quantity
orbDto.Dose.QuantityAdjust.Constraints |> setConstraints dl.NormQuantityAdjust dl.QuantityAdjust
orbDto.Dose.Quantity.Constraints |> setMinMaxConstraints None dl.Quantity
orbDto.Dose.QuantityAdjust.Constraints |> setMinMaxConstraints dl.NormQuantityAdjust dl.QuantityAdjust

// make sure that orderable dose quantity has constraints with a unit
if dl.Quantity |> MinMax.isEmpty then
Expand All @@ -786,7 +806,7 @@ module Medication =
| None -> ()

if not isOnce then
orbDto.Dose.PerTime.Constraints |> setConstraints None dl.PerTime
orbDto.Dose.PerTime.Constraints |> setMinMaxConstraints None dl.PerTime
// make sure that orderable dose per time has constraints with a unit
if dl.PerTime |> MinMax.isEmpty then
match orderableUnit, freqTimeUnit with
Expand All @@ -796,7 +816,7 @@ module Medication =
orbDto.Dose.PerTime.Constraints.MinIncl <- false
| _ -> ()

orbDto.Dose.PerTimeAdjust.Constraints |> setConstraints dl.NormPerTimeAdjust dl.PerTimeAdjust
orbDto.Dose.PerTimeAdjust.Constraints |> setMinMaxConstraints dl.NormPerTimeAdjust dl.PerTimeAdjust

match d.OrderType with
| AnyOrder | ProcessOrder -> ()
Expand All @@ -807,9 +827,6 @@ module Medication =
| OnceTimedOrder ->
d.Dose |> setOrbDoseRate
d.Dose |> setOrbDoseQty true
// Assume timed order always solution
orbDto.Dose.Quantity.Constraints.IncrOpt <-
1N/10N |> createSingleValueUnitDto Units.Volume.milliLiter
| DiscontinuousOrder ->
d.Dose |> setOrbDoseQty false
| TimedOrder ->
Expand Down
53 changes: 48 additions & 5 deletions src/Informedica.GenORDER.Lib/Order.fs
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,15 @@ module Order =
}


/// <summary>
/// Apply only quantity adjust constraints to a Dose
/// </summary>
let applyQuantityAdjustConstraints dos =
{ (dos |> inf) with
QuantityAdjust = dos.QuantityAdjust |> QuantityAdjust.applyConstraints
}


/// <summary>
/// Apply per time constraints to a Dose
/// </summary>
Expand Down Expand Up @@ -284,28 +293,62 @@ module Order =
/// </summary>
/// <param name="set">The function to set the value</param>
/// <param name="sch">The prescription schedulee</param>
/// <param name="setRate">If timed set rate or pertime</param>
/// <param name="dos">The Dose</param>
/// <returns>The Dose with the value set</returns>
let setDose set sch dos =
let setDose set sch setRate dos =
match sch with
| Once
| OnceTimed _ ->
| Once ->
{ (dos |> inf) with
Quantity =
dos.Quantity
|> Quantity.toOrdVar
|> set
|> Quantity
}
| Discontinuous _
| Timed _ ->
| OnceTimed _ ->
if setRate then
{ dos with
Rate =
dos.Rate
|> Rate.toOrdVar
|> set
|> Rate
}
else
{ (dos |> inf) with
Quantity =
dos.Quantity
|> Quantity.toOrdVar
|> set
|> Quantity
}
| Discontinuous _ ->
{ dos with
PerTime =
dos.PerTime
|> PerTime.toOrdVar
|> set
|> PerTime
}

| Timed _ ->
if setRate then
{ dos with
Rate =
dos.Rate
|> Rate.toOrdVar
|> set
|> Rate
}
else
{ dos with
PerTime =
dos.PerTime
|> PerTime.toOrdVar
|> set
|> PerTime
}
| Continuous _ ->
{ dos with
Rate =
Expand Down
Loading