summaryrefslogtreecommitdiff
path: root/src/FundLab.Domain/Domain.fs
blob: 9c42d5ac3c918333f6f271f91f58023d12949df5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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