diff --git a/code/Angabe4.lhs b/code/Angabe4.lhs index 687aaba..dcdf41e 100644 --- a/code/Angabe4.lhs +++ b/code/Angabe4.lhs @@ -92,6 +92,42 @@ Helper functions: > month_to_str Nov = "11" > month_to_str Dez = "12" +> skonto_to_num :: Skonto -> Float +> skonto_to_num s +> | s == KeinSkonto = 0 +> | s == DreiProzent = 0.03 +> | s == FuenfProzent = 0.05 +> | otherwise = 0.1 + +> full_months::[Monat] +> full_months = [Jan, Mar, Mai, Jul, Aug, Okt, Dez] + +> is_date_valid :: Datum -> Bool +> is_date_valid d +> | monat d == Feb = +> let y = jahr d in +> let t = tag d in +> if y `mod` 4 /= 0 && (day_to_str t) > (day_to_str XXVIII) then False +> else +> if y `mod` 100 == 0 && y `mod` 400 /= 0 then False +> else +> if (day_to_str t) > (day_to_str XXIX) then False +> else True +> | (day_to_str (tag d)) > (day_to_str XXX) && not(monat d `elem` full_months) = False +> | otherwise = True + +> is_payment :: Geschaeftsvorfall -> Bool +> is_payment g = +> case g of +> Zahlung _ _ _ -> True +> _ -> False + +> is_credit :: Geschaeftsvorfall -> Bool +> is_credit g = +> case g of +> Gutschrift _ _ -> True +> _ -> False + Aufgabe A.1 > type P_Geschaeftspartner = Geschaeftspartner @@ -105,32 +141,51 @@ Aufgabe A.1 > type AP_Kassabucheintrag = (P_Geschaeftspartner,AP_Geschaeftsvorfall) > waup :: Kassabucheintrag -> AP_Kassabucheintrag +> waup (g, v) = eval_payment_sum $ eval_payment_date (g, v) -Knapp, aber gut nachvollziehbar geht waup folgendermassen vor: -... +> eval_payment_date :: Kassabucheintrag -> Kassabucheintrag +> eval_payment_date (g, v) +> | (is_payment v) && (is_date_valid (zahlung_vom v)) = +> if is_date_valid (seit g) then (g, v) +> else (g', v) +> | (is_credit v) && (is_date_valid (gutschrift_vom v)) = +> if is_date_valid (seit g) then (g, v) +> else (g', v) +> | otherwise = +> if (is_payment v) then (g', z) +> else (g', gs) +> where +> g' = GP (partner g) (correct_date (seit g)) +> z = Zahlung (brutto v) (skonto v) (correct_date (zahlung_vom v)) +> gs = Gutschrift (gutschriftsbetrag v) (correct_date (gutschrift_vom v)) +> correct_date :: Datum -> Datum +> correct_date d = d + +> eval_payment_sum :: Kassabucheintrag -> AP_Kassabucheintrag +> eval_payment_sum k = k Aufgabe A.2 -> data EuroCent = EC { euro :: Nat1, -> cent :: Nat1 +% > data EuroCent = EC { euro :: Nat1, +% > cent :: Nat1 - Nur Werte zwischen 0 und 99 fuer cent! +% Nur Werte zwischen 0 und 99 fuer cent! -> } deriving (Eq,Ord,Show) +% > } deriving (Eq,Ord,Show) -> data K_Geschaeftsvorfall = K_Zahlung { ec_netto :: EuroCent, -> zahlungsdatum' :: Datum -> } -> | K_Gutschrift { ec_gutschrift :: EuroCent, -> gutschriftsdatum' :: Datum -> } deriving (Eq,Show) +% > data K_Geschaeftsvorfall = K_Zahlung { ec_netto :: EuroCent, +% > zahlungsdatum' :: Datum +% > } +% > | K_Gutschrift { ec_gutschrift :: EuroCent, +% > gutschriftsdatum' :: Datum +% > } deriving (Eq,Show) -> newtype KonsolidiertesKassabuch -> = KKB [(P_Geschaeftspartner,K_Geschaeftsvorfall)] -> deriving (Eq,Show) +% > newtype KonsolidiertesKassabuch +% > = KKB [(P_Geschaeftspartner,K_Geschaeftsvorfall)] +% > deriving (Eq,Show) -> konsolidiere :: Kassabuch -> KonsolidiertesKassabuch +% > konsolidiere :: Kassabuch -> KonsolidiertesKassabuch Knapp, aber gut nachvollziehbar geht konsolidiere folgendermassen vor: ... @@ -138,12 +193,12 @@ Knapp, aber gut nachvollziehbar geht konsolidiere folgendermassen vor: Aufgabe A.3 -> data Saldo = Forderungssaldo { fs :: EuroCent } -> | Zahlungssaldo { zs :: EuroCent } -> | Ausgeglichen -> | Keine_Geschaeftsbeziehung deriving (Eq,Show) +% > data Saldo = Forderungssaldo { fs :: EuroCent } +% > | Zahlungssaldo { zs :: EuroCent } +% > | Ausgeglichen +% > | Keine_Geschaeftsbeziehung deriving (Eq,Show) -> saldo :: P_Geschaeftspartner -> KonsolidiertesKassabuch -> Saldo +% > saldo :: P_Geschaeftspartner -> KonsolidiertesKassabuch -> Saldo Knapp, aber gut nachvollziehbar geht saldo folgendermassen vor: ... @@ -151,9 +206,9 @@ Knapp, aber gut nachvollziehbar geht saldo folgendermassen vor: Aufgabe A.4 -> newtype SaldiertesKassabuch = SKB [(Geschaeftspartner,Saldo)] +% > newtype SaldiertesKassabuch = SKB [(Geschaeftspartner,Saldo)] -> saldiere :: Kassabuch -> SaldiertesKassabuch +% > saldiere :: Kassabuch -> SaldiertesKassabuch Knapp, aber gut nachvollziehbar geht saldiere folgendermassen vor: ...