Skip to content

Commit

Permalink
Put some records in own modules to avoid name clashes
Browse files Browse the repository at this point in the history
  • Loading branch information
ivnsch committed Nov 12, 2019
1 parent 8fe806e commit b77c824
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 67 deletions.
85 changes: 18 additions & 67 deletions src/OrderTakingDomain.hs
Expand Up @@ -10,6 +10,9 @@ import qualified Data.List as L
import Prelude hiding (lines, map)
import Data.List.NonEmpty as NEL
import Data.Time
import qualified PricedOrderLine as POL
import qualified PricedOrder as PO
import SharedTypes

-- data Foo = Foo {
-- myField :: Int
Expand All @@ -20,9 +23,6 @@ import Data.Time
-- myFunc :: Foo -> Int
-- myFunc foo = (myField :: Foo -> Int) foo -- Ambiguous occurrence "myField"

newtype OrderId = OrderId String deriving (Eq, Show)
newtype OrderLineId = OrderLineId String deriving (Eq, Show)
newtype ProductId = ProductId String deriving (Eq, Show)

data OrderLine = OrderLine {
orderLineId :: OrderLineId,
Expand All @@ -31,14 +31,6 @@ data OrderLine = OrderLine {
orderQuantity :: Int
} deriving (Show)

data PricedOrderLine = PricedOrderLine {
pricedOrderLineId :: OrderLineId,
pricedOrderId :: OrderId,
pricedProductId :: ProductId,
pricedOrderQuantity :: Int,
price :: Price
} deriving (Show)

-- data Foo = Foo {
-- lines :: [String],
-- bla :: String
Expand All @@ -49,43 +41,11 @@ data PricedOrderLine = PricedOrderLine {
orderKey :: OrderLine -> (OrderId, ProductId)
orderKey orderLine = ((orderId :: OrderLine -> OrderId) orderLine, productId orderLine) :: (OrderId, ProductId)

newtype CustomerId = CustomerId Int deriving (Show)
newtype InvoiceId = InvoiceId Int deriving (Show)
newtype ContactId = ContactId Int deriving (Show, Eq)
newtype EmailAddress = EmailAddress String deriving (Show)
newtype VerifiedEmailAddress = VerifiedEmailAddress String deriving (Show)
newtype PhoneNumber = PhoneNumber String deriving (Show)
newtype BillingAmount = BillingAmount Double deriving (Show)
newtype Price = Price Double deriving (Show)
newtype UnvalidatedAddress = UnvalidatedAddress String deriving Show
newtype ValidatedAddress = ValidatedAddress String deriving Show
-- newtype ValidatedShippingAddress = ValidatedShippingAddress String deriving Show
-- newtype ValidatedBillingAddress = ValidatedBillingAddress String deriving Show
-- newtype ValidatedOrderLine = ValidatedOrderLine String deriving Show

data ProductCode = WidgetCode String | GizmoCode String deriving (Show)
data CardType = Visa | Master deriving (Show)

data CustomerEmail = Unverfied EmailAddress | Verified VerifiedEmailAddress deriving Show

data CreditCardInfo = CreditCardInfo {
cardType :: CardType,
cardNumber :: CardType
} deriving (Show)

data ShippingAddress = ShippingAddress {
}

data BillingAddress = BillingAddress {
}

-- TODO
newtype AcknowledgmentSent = AcknowledgmentSent String
newtype OrderPlaced = OrderPlaced String
newtype BillableOrderPlaced = BillableOrderPlaced String
newtype EmailContactInfo = EmailContactInfo String deriving Show
newtype PostalContactInfo = PostalContactInfo String deriving Show
newtype CustomerInfo = CustomerInfo String deriving Show

-- data Order = Order {
-- orderId :: OrderId,
Expand All @@ -96,7 +56,7 @@ newtype CustomerInfo = CustomerInfo String deriving Show
-- amountToBill :: BillingAmount
-- }

data Order = Unvalidated UnvalidatedOrder | Validated ValidatedOrder | Priced PricedOrder
data Order = Unvalidated UnvalidatedOrder | Validated ValidatedOrder | Priced PO.PricedOrder

data UnvalidatedOrder = UnvalidatedOrder {
orderId :: String,
Expand All @@ -112,15 +72,6 @@ data ValidatedOrder = ValidatedOrder {
orderLines :: NonEmpty OrderLine
}

data PricedOrder = PricedOrder {
pricedOrderId :: OrderId,
pricedCustomerInfo :: CustomerInfo,
pricedShippingAddress :: ShippingAddress,
pricedBillingAddress :: BillingAddress,
pricedOrderLines :: NonEmpty PricedOrderLine,
pricedAmountToBill :: BillingAmount
}

data PlaceOrderEvents = PlaceOrderEvents {
acknowledgmentSent :: AcknowledgmentSent,
orderPlaced :: OrderPlaced,
Expand Down Expand Up @@ -174,50 +125,50 @@ type PlaceOrder = Command UnvalidatedOrder
-- x == y = contactId x == contactId y
-- TODO Hashable?

findOrderLine :: NonEmpty PricedOrderLine -> OrderLineId -> Maybe PricedOrderLine
findOrderLine :: NonEmpty POL.PricedOrderLine -> OrderLineId -> Maybe POL.PricedOrderLine
findOrderLine orderLines olId =
L.find (\ol -> pricedOrderLineId ol == olId) orderLines
L.find (\ol -> POL.orderLineId ol == olId) orderLines

replaceOrderLine :: NonEmpty PricedOrderLine -> OrderLineId -> PricedOrderLine -> NonEmpty PricedOrderLine
replaceOrderLine :: NonEmpty POL.PricedOrderLine -> OrderLineId -> POL.PricedOrderLine -> NonEmpty POL.PricedOrderLine
-- TODO optimize
replaceOrderLine orderLines oldId newOrderLine =
map (\ol -> if pricedOrderLineId ol == oldId then newOrderLine else ol) orderLines
map (\ol -> if POL.orderLineId ol == oldId then newOrderLine else ol) orderLines

toBillingAmount :: Price -> BillingAmount
toBillingAmount (Price value) = BillingAmount value

toPriceValue :: Price -> Double
toPriceValue (Price value) = value

calculateTotalPrice :: NonEmpty PricedOrderLine -> Price
calculateTotalPrice :: NonEmpty POL.PricedOrderLine -> Price
calculateTotalPrice orderLines =
Price $ foldr (\l a -> toPriceValue (price l) + a) 0 orderLines
Price $ foldr (\l a -> toPriceValue (POL.price l) + a) 0 orderLines

changeOrderPrice :: PricedOrder -> OrderLineId -> Price -> Maybe PricedOrder
changeOrderPrice :: PO.PricedOrder -> OrderLineId -> Price -> Maybe PO.PricedOrder
changeOrderPrice order orderLineId newPrice =
let
newOrderLines = updateOrderLinesPrice order orderLineId newPrice
in
(\nols -> order { pricedOrderLines = nols }) <$> newOrderLines
(\nols -> order { PO.orderLines = nols }) <$> newOrderLines

-- This was added after adding amountToBill to Order. changeOrderPrice is "deprecated" now.
changeOrderLinePrice :: PricedOrder -> OrderLineId -> Price -> Maybe PricedOrder
changeOrderLinePrice :: PO.PricedOrder -> OrderLineId -> Price -> Maybe PO.PricedOrder
changeOrderLinePrice order orderLineId newPrice =
let
newOrderLines = updateOrderLinesPrice order orderLineId newPrice
newTotalPrice = calculateTotalPrice <$> newOrderLines
newAmountToBill = BillingAmount . toPriceValue <$> newTotalPrice
in
(\nols natb -> order { pricedOrderLines = nols, pricedAmountToBill = natb }) <$> newOrderLines <*> newAmountToBill
(\nols natb -> order { PO.orderLines = nols, PO.amountToBill = natb }) <$> newOrderLines <*> newAmountToBill

-- Helper function to fix HLint repeated code warning
updateOrderLinesPrice :: PricedOrder -> OrderLineId -> Price -> Maybe (NonEmpty PricedOrderLine)
updateOrderLinesPrice :: PO.PricedOrder -> OrderLineId -> Price -> Maybe (NonEmpty POL.PricedOrderLine)
updateOrderLinesPrice order orderLineId newPrice =
let
orderLine = findOrderLine (pricedOrderLines order) orderLineId
newOrderLine = (\ol -> ol { price = newPrice }) <$> orderLine
orderLine = findOrderLine (PO.orderLines order) orderLineId
newOrderLine = (\ol -> ol { POL.price = newPrice }) <$> orderLine
in
replaceOrderLine (pricedOrderLines order) orderLineId <$> newOrderLine
replaceOrderLine (PO.orderLines order) orderLineId <$> newOrderLine

printQuantity qt =
case qt of
Expand Down
14 changes: 14 additions & 0 deletions src/PricedOrder.hs
@@ -0,0 +1,14 @@
module PricedOrder where

import SharedTypes
import PricedOrderLine
import Data.List.NonEmpty

data PricedOrder = PricedOrder {
orderId :: OrderId,
customerInfo :: CustomerInfo,
shippingAddress :: ShippingAddress,
billingAddress :: BillingAddress,
orderLines :: NonEmpty PricedOrderLine,
amountToBill :: BillingAmount
}
11 changes: 11 additions & 0 deletions src/PricedOrderLine.hs
@@ -0,0 +1,11 @@
module PricedOrderLine where

import SharedTypes

data PricedOrderLine = PricedOrderLine {
orderLineId :: OrderLineId,
orderId :: OrderId,
productId :: ProductId,
orderQuantity :: Int,
price :: Price
} deriving (Show)
37 changes: 37 additions & 0 deletions src/SharedTypes.hs
@@ -0,0 +1,37 @@
module SharedTypes where

newtype OrderId = OrderId String deriving (Eq, Show)
newtype OrderLineId = OrderLineId String deriving (Eq, Show)
newtype ProductId = ProductId String deriving (Eq, Show)
newtype CustomerId = CustomerId Int deriving (Show)
newtype InvoiceId = InvoiceId Int deriving (Show)
newtype ContactId = ContactId Int deriving (Show, Eq)
newtype EmailAddress = EmailAddress String deriving (Show)
newtype VerifiedEmailAddress = VerifiedEmailAddress String deriving (Show)
newtype PhoneNumber = PhoneNumber String deriving (Show)
newtype BillingAmount = BillingAmount Double deriving (Show)
newtype Price = Price Double deriving (Show)
newtype UnvalidatedAddress = UnvalidatedAddress String deriving Show
newtype ValidatedAddress = ValidatedAddress String deriving Show
-- newtype ValidatedShippingAddress = ValidatedShippingAddress String deriving Show
-- newtype ValidatedBillingAddress = ValidatedBillingAddress String deriving Show
-- newtype ValidatedOrderLine = ValidatedOrderLine String deriving Show

-- TODO
newtype AcknowledgmentSent = AcknowledgmentSent String
newtype OrderPlaced = OrderPlaced String
newtype BillableOrderPlaced = BillableOrderPlaced String
newtype EmailContactInfo = EmailContactInfo String deriving Show
newtype PostalContactInfo = PostalContactInfo String deriving Show
newtype CustomerInfo = CustomerInfo String deriving Show

data ProductCode = WidgetCode String | GizmoCode String deriving (Show)
data CardType = Visa | Master deriving (Show)

data CustomerEmail = Unverfied EmailAddress | Verified VerifiedEmailAddress deriving Show

data ShippingAddress = ShippingAddress {
}

data BillingAddress = BillingAddress {
}

0 comments on commit b77c824

Please sign in to comment.