namespace FundLab.Domain open System type FundStatus = | Empty | Active | ZeroUnits type UnitNavStatus = | HasValue of decimal | ZeroUnits type Fund = { Id: Guid Name: string Currency: string InitialCash: decimal InitialUnitNav: decimal NetAssets: decimal OutstandingUnits: decimal Status: FundStatus } module Fund = let create (name: string) (initialCash: decimal) (initialUnitNav: decimal) : Fund = { Id = Guid.NewGuid() Name = name Currency = "CNY" InitialCash = initialCash InitialUnitNav = initialUnitNav NetAssets = initialCash OutstandingUnits = 0m Status = FundStatus.Empty } let unitNavStatus (fund: Fund) : UnitNavStatus = if fund.OutstandingUnits = 0m then UnitNavStatus.ZeroUnits else UnitNavStatus.HasValue (fund.NetAssets / fund.OutstandingUnits) type OrderStatus = | Submitted | CashFrozen | UnitsFrozen | PendingNav | Confirmed | Settled | Cancelled | Failed module OrderStatus = let isConfirmed status = match status with | OrderStatus.Confirmed | OrderStatus.Settled -> true | _ -> false