module Deontic.Civil.AgencyRemedies () where import Data.Set qualified as Set import Deontic.Core.Types import Deontic.Core.Verdict import Deontic.Core.Adjudicate import Deontic.Core.Layer (Base, Proviso, Resolvable) import Deontic.Civil.Types type instance Resolvable AgencyWithdrawalAct = '[CounterpartyKnowledge, Base] instance Adjudicate AgencyWithdrawalAct '[Base] where adjudicate :: AgencyWithdrawalAct -> Facts AgencyWithdrawalAct -> Judgment '[Base] adjudicate AgencyWithdrawalAct _ Facts AgencyWithdrawalAct _ = Verdict -> ArticleRef -> Text -> Judgment '[Base] forall l. Verdict -> ArticleRef -> Text -> Judgment '[l] JBase Verdict Valid (Text -> Int -> Maybe Int -> ArticleRef ArticleRef Text "민법" Int 134 Maybe Int forall a. Maybe a Nothing) Text "본인의 추인이 있을 때까지 상대방은 본인이나 그 대리인에 대하여 철회할 수 있다." instance Adjudicate AgencyWithdrawalAct rest => Adjudicate AgencyWithdrawalAct (CounterpartyKnowledge ': rest) where adjudicate :: AgencyWithdrawalAct -> Facts AgencyWithdrawalAct -> Judgment (CounterpartyKnowledge : rest) adjudicate AgencyWithdrawalAct act Facts AgencyWithdrawalAct facts | CivilFact -> Set CivilFact -> Bool forall a. Ord a => a -> Set a -> Bool Set.member CivilFact CounterpartyKnewNoAuthority Set CivilFact Facts AgencyWithdrawalAct facts = Judgment rest -> Verdict -> ArticleRef -> Text -> Judgment (CounterpartyKnowledge : rest) forall (prev :: [*]) l. Judgment prev -> Verdict -> ArticleRef -> Text -> Judgment (l : prev) JOverride (forall act (layers :: [*]). Adjudicate act layers => act -> Facts act -> Judgment layers adjudicate @_ @rest AgencyWithdrawalAct act Facts AgencyWithdrawalAct facts) Verdict Void (Text -> Int -> Maybe Int -> ArticleRef ArticleRef Text "민법" Int 134 Maybe Int forall a. Maybe a Nothing) Text "계약 당시에 상대방이 대리권 없음을 안 때에는 철회하지 못한다." | Bool otherwise = Judgment rest -> Judgment (CounterpartyKnowledge : rest) forall (prev :: [*]) l. Judgment prev -> Judgment (l : prev) JDelegate (forall act (layers :: [*]). Adjudicate act layers => act -> Facts act -> Judgment layers adjudicate @_ @rest AgencyWithdrawalAct act Facts AgencyWithdrawalAct facts) type instance Resolvable AgentLiabilityAct = '[Proviso, Base] instance Adjudicate AgentLiabilityAct '[Base] where adjudicate :: AgentLiabilityAct -> Facts AgentLiabilityAct -> Judgment '[Base] adjudicate AgentLiabilityAct _ Facts AgentLiabilityAct _ = Verdict -> ArticleRef -> Text -> Judgment '[Base] forall l. Verdict -> ArticleRef -> Text -> Judgment '[l] JBase Verdict Void (Text -> Int -> Maybe Int -> ArticleRef ArticleRef Text "민법" Int 135 (Int -> Maybe Int forall a. a -> Maybe a Just Int 1)) Text "대리권을 증명하지 못하고 본인의 추인을 받지 못한 자는 상대방의 선택에 따라 이행 또는 손해배상의 책임이 있다." instance Adjudicate AgentLiabilityAct rest => Adjudicate AgentLiabilityAct (Proviso ': rest) where adjudicate :: AgentLiabilityAct -> Facts AgentLiabilityAct -> Judgment (Proviso : rest) adjudicate AgentLiabilityAct act Facts AgentLiabilityAct facts | CivilFact -> Set CivilFact -> Bool forall a. Ord a => a -> Set a -> Bool Set.member CivilFact CounterpartyKnewNoAuthority Set CivilFact Facts AgentLiabilityAct facts = Judgment rest -> Verdict -> ArticleRef -> Text -> Judgment (Proviso : rest) forall (prev :: [*]) l. Judgment prev -> Verdict -> ArticleRef -> Text -> Judgment (l : prev) JOverride (forall act (layers :: [*]). Adjudicate act layers => act -> Facts act -> Judgment layers adjudicate @_ @rest AgentLiabilityAct act Facts AgentLiabilityAct facts) Verdict Valid (Text -> Int -> Maybe Int -> ArticleRef ArticleRef Text "민법" Int 135 (Int -> Maybe Int forall a. a -> Maybe a Just Int 2)) Text "상대방이 대리권 없음을 안 때에는 무권대리인의 책임이 없다." | CivilFact -> Set CivilFact -> Bool forall a. Ord a => a -> Set a -> Bool Set.member CivilFact CounterpartyCouldHaveKnown Set CivilFact Facts AgentLiabilityAct facts = Judgment rest -> Verdict -> ArticleRef -> Text -> Judgment (Proviso : rest) forall (prev :: [*]) l. Judgment prev -> Verdict -> ArticleRef -> Text -> Judgment (l : prev) JOverride (forall act (layers :: [*]). Adjudicate act layers => act -> Facts act -> Judgment layers adjudicate @_ @rest AgentLiabilityAct act Facts AgentLiabilityAct facts) Verdict Valid (Text -> Int -> Maybe Int -> ArticleRef ArticleRef Text "민법" Int 135 (Int -> Maybe Int forall a. a -> Maybe a Just Int 2)) Text "상대방이 대리권 없음을 알 수 있었을 때에는 무권대리인의 책임이 없다." | CivilFact -> Set CivilFact -> Bool forall a. Ord a => a -> Set a -> Bool Set.member CivilFact AgentIsLimitedCapacity Set CivilFact Facts AgentLiabilityAct facts = Judgment rest -> Verdict -> ArticleRef -> Text -> Judgment (Proviso : rest) forall (prev :: [*]) l. Judgment prev -> Verdict -> ArticleRef -> Text -> Judgment (l : prev) JOverride (forall act (layers :: [*]). Adjudicate act layers => act -> Facts act -> Judgment layers adjudicate @_ @rest AgentLiabilityAct act Facts AgentLiabilityAct facts) Verdict Valid (Text -> Int -> Maybe Int -> ArticleRef ArticleRef Text "민법" Int 135 (Int -> Maybe Int forall a. a -> Maybe a Just Int 2)) Text "대리인이 제한능력자인 때에는 무권대리인의 책임이 없다." | Bool otherwise = Judgment rest -> Judgment (Proviso : rest) forall (prev :: [*]) l. Judgment prev -> Judgment (l : prev) JDelegate (forall act (layers :: [*]). Adjudicate act layers => act -> Facts act -> Judgment layers adjudicate @_ @rest AgentLiabilityAct act Facts AgentLiabilityAct facts)