summaryrefslogtreecommitdiff
path: root/Form/ShopDelivery.hs
blob: bd82dea4906078c8591c5f02568e8d1d1216496d (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
module Form.ShopDelivery where

import Import
import qualified Database.Esqueleto as E
import Model.UTCTime (renderInterval)

data FormShopDelivery = FormShopDelivery
    { fpShop :: ShopId
    , fpDelivery :: DeliveryId
    }

shopDeliveryForm :: ShopId -> Maybe DeliveryId -> Html -> MForm Handler (FormResult FormShopDelivery, Widget)
shopDeliveryForm shopid mdeliveryid = renderBootstrap3 formLayout $ FormShopDelivery
    <$> pure shopid
    <*> maybe deliveryField pure mdeliveryid
  where
    deliveryField = areq (selectField deliveries) (bfs MsgDelivery) Nothing
    deliveries = do
        now <- lift getCurrentTime
        options <- runDB $
            E.select $
            E.from $ \(p, d) -> do
            E.where_ (     d E.^. DeliveryPlace E.==. p E.^. PlaceId
                     E.&&. d E.^. DeliveryFrom E.>. E.val now
                     E.&&. (E.notExists $ E.from $ \sd ->
                                E.where_ (     sd E.^. ShopDeliveryDelivery E.==. d E.^. DeliveryId
                                         E.&&. sd E.^. ShopDeliveryShop E.==. E.val shopid
                                         )
                           )
                     )
            E.orderBy [ E.asc (p E.^. PlaceIdent)
                      , E.asc (d E.^. DeliveryFrom)
                      ]
            return (p, d)
        optionsPairs $ map
            (\(p, d) -> (placeIdent (entityVal p) ++ " (" ++ renderInterval (deliveryFrom $ entityVal d) (deliveryTo $ entityVal d) ++ ")", entityKey d))
            options