module Hledger.Data.Types
where
import GHC.Generics (Generic)
import Control.DeepSeq (NFData)
import Control.Monad.Except (ExceptT)
import Data.Data
import Data.Decimal
import Data.Default
import Text.Blaze (ToMarkup(..))
import qualified Data.Map as M
import Data.Text (Text)
import Data.Time.Calendar
import Data.Time.LocalTime
import System.Time (ClockTime(..))
import Hledger.Utils.Regex
type SmartDate = (String,String,String)
data WhichDate = PrimaryDate | SecondaryDate deriving (Eq,Show)
data DateSpan = DateSpan (Maybe Day) (Maybe Day) deriving (Eq,Ord,Data,Generic,Typeable)
instance NFData DateSpan
type Year = Integer
type Month = Int
type Quarter = Int
type YearWeek = Int
type MonthWeek = Int
type YearDay = Int
type MonthDay = Int
type WeekDay = Int
data Period =
DayPeriod Day
| WeekPeriod Day
| MonthPeriod Year Month
| QuarterPeriod Year Quarter
| YearPeriod Year
| PeriodBetween Day Day
| PeriodFrom Day
| PeriodTo Day
| PeriodAll
deriving (Eq,Ord,Show,Data,Generic,Typeable)
instance Default Period where def = PeriodAll
data Interval =
NoInterval
| Days Int
| Weeks Int
| Months Int
| Quarters Int
| Years Int
| DayOfMonth Int
| DayOfWeek Int
deriving (Eq,Show,Ord,Data,Generic,Typeable)
instance Default Interval where def = NoInterval
instance NFData Interval
type AccountName = Text
data AccountAlias = BasicAlias AccountName AccountName
| RegexAlias Regexp Replacement
deriving (Eq, Read, Show, Ord, Data, Generic, Typeable)
instance NFData AccountAlias
data Side = L | R deriving (Eq,Show,Read,Ord,Typeable,Data,Generic)
instance NFData Side
type Quantity = Decimal
deriving instance Data (Quantity)
instance ToMarkup (Quantity)
where
toMarkup = toMarkup . show
data Price = NoPrice | UnitPrice Amount | TotalPrice Amount deriving (Eq,Ord,Typeable,Data,Generic)
instance NFData Price
data AmountStyle = AmountStyle {
ascommodityside :: Side,
ascommodityspaced :: Bool,
asprecision :: Int,
asdecimalpoint :: Maybe Char,
asdigitgroups :: Maybe DigitGroupStyle
} deriving (Eq,Ord,Read,Show,Typeable,Data,Generic)
instance NFData AmountStyle
data DigitGroupStyle = DigitGroups Char [Int]
deriving (Eq,Ord,Read,Show,Typeable,Data,Generic)
instance NFData DigitGroupStyle
type CommoditySymbol = Text
data Commodity = Commodity {
csymbol :: CommoditySymbol,
cformat :: Maybe AmountStyle
} deriving (Show,Eq,Data,Generic) --,Ord,Typeable,Data,Generic)
instance NFData Commodity
data Amount = Amount {
acommodity :: CommoditySymbol,
aquantity :: Quantity,
aprice :: Price,
astyle :: AmountStyle
} deriving (Eq,Ord,Typeable,Data,Generic)
instance NFData Amount
newtype MixedAmount = Mixed [Amount] deriving (Eq,Ord,Typeable,Data,Generic)
instance NFData MixedAmount
data PostingType = RegularPosting | VirtualPosting | BalancedVirtualPosting
deriving (Eq,Show,Typeable,Data,Generic)
instance NFData PostingType
type TagName = Text
type TagValue = Text
type Tag = (TagName, TagValue)
data ClearedStatus = Uncleared | Pending | Cleared
deriving (Eq,Ord,Typeable,Data,Generic)
instance NFData ClearedStatus
instance Show ClearedStatus where
show Uncleared = ""
show Pending = "!"
show Cleared = "*"
data Posting = Posting {
pdate :: Maybe Day,
pdate2 :: Maybe Day,
pstatus :: ClearedStatus,
paccount :: AccountName,
pamount :: MixedAmount,
pcomment :: Text,
ptype :: PostingType,
ptags :: [Tag],
pbalanceassertion :: Maybe MixedAmount,
ptransaction :: Maybe Transaction
} deriving (Typeable,Data,Generic)
instance NFData Posting
instance Eq Posting where
(==) (Posting a1 b1 c1 d1 e1 f1 g1 h1 i1 _) (Posting a2 b2 c2 d2 e2 f2 g2 h2 i2 _) = a1==a2 && b1==b2 && c1==c2 && d1==d2 && e1==e2 && f1==f2 && g1==g2 && h1==h2 && i1==i2
data GenericSourcePos = GenericSourcePos FilePath Int Int
deriving (Eq, Read, Show, Ord, Data, Generic, Typeable)
instance NFData GenericSourcePos
data Transaction = Transaction {
tindex :: Integer,
tsourcepos :: GenericSourcePos,
tdate :: Day,
tdate2 :: Maybe Day,
tstatus :: ClearedStatus,
tcode :: Text,
tdescription :: Text,
tcomment :: Text,
ttags :: [Tag],
tpostings :: [Posting],
tpreceding_comment_lines :: Text
} deriving (Eq,Typeable,Data,Generic)
instance NFData Transaction
data ModifierTransaction = ModifierTransaction {
mtvalueexpr :: Text,
mtpostings :: [Posting]
} deriving (Eq,Typeable,Data,Generic)
instance NFData ModifierTransaction
data PeriodicTransaction = PeriodicTransaction {
ptperiodicexpr :: Text,
ptpostings :: [Posting]
} deriving (Eq,Typeable,Data,Generic)
instance NFData PeriodicTransaction
data TimeclockCode = SetBalance | SetRequiredHours | In | Out | FinalOut deriving (Eq,Ord,Typeable,Data,Generic)
instance NFData TimeclockCode
data TimeclockEntry = TimeclockEntry {
tlsourcepos :: GenericSourcePos,
tlcode :: TimeclockCode,
tldatetime :: LocalTime,
tlaccount :: AccountName,
tldescription :: Text
} deriving (Eq,Ord,Typeable,Data,Generic)
instance NFData TimeclockEntry
data MarketPrice = MarketPrice {
mpdate :: Day,
mpcommodity :: CommoditySymbol,
mpamount :: Amount
} deriving (Eq,Ord,Typeable,Data,Generic)
instance NFData MarketPrice
data Journal = Journal {
jparsedefaultyear :: Maybe Year
,jparsedefaultcommodity :: Maybe (CommoditySymbol,AmountStyle)
,jparseparentaccounts :: [AccountName]
,jparsealiases :: [AccountAlias]